ISO C委员会(ISO/IEC JTC1/SC21/WG14)已发布TR 24731-1,正在研究TR 24731-2:
TR 24731-1:C库的扩展第一部分:边界检查接口
WG14正在研究更安全的C库函数.该TR旨在通过添加具有缓冲区长度的额外参数来修改现有程序.最新草案见N1225号文件.理由是在N1173号文件中.这将成为技术报告类型2.
TR 24731-2:C库的扩展 - 第二部分:动态分配功能
WG14正在研究更安全的C库函数.该TR面向使用动态分配而不是缓冲区长度的额外参数的新程序.最新草案见N1337号文件.这将成为技术报告类型2.
在上一个问题的模型中,我询问了所谓的安全库折旧,我发现自己同样对于为什么fopen()应该被弃用感到困惑.
该函数接受两个C字符串,并返回FILE*ptr,或者在失败时返回NULL.线程安全问题/字符串溢出问题在哪里?或者是别的什么?
提前致谢
所以我想问一下这两者有什么区别.如果有的话.在大学里我接受过教学,我使用的是scanf,但是在我的个人电脑上,视觉工作室一直在发送这个警告.
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
Run Code Online (Sandbox Code Playgroud)
我必须将所有scanf更改为scanf_s,否则程序将无法构建.(我从2013年开始使用ms visual studio的最新版本)
我正在研究用于Windows平台的遗留代码.当我编译代码时VS2013,它会发出以下警告:
错误C4996:'
fopen':此函数或变量可能不安全.考虑fopen_s改用.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详情请参见在线帮助."
它也会给出一个熟悉的警告sprintf.sprintf_s由于缓冲区溢出,我理解比sprintf更安全.
但是如何使fopen_s更安全fopen,因为fopen不接受缓冲区就没有缓冲区溢出的可能性.任何人都可以提供一个fopen不安全的案件,fopen_s是否安全?
我发现strncpy_s()在VS2013下定义为
errno_t __cdecl strncpy_s
(
_Out_writes_z_(_SizeInBytes) char * _Dst,
_In_ rsize_t _SizeInBytes,
_In_reads_or_z_(_MaxCount) const char * _Src,
_In_ rsize_t _MaxCount
);
Run Code Online (Sandbox Code Playgroud)
rsize_t 是:
typedef size_t rsize_t;
Run Code Online (Sandbox Code Playgroud)
我认为这是Visual Studio的一个技巧.但是,我发现此功能在此页面上定义如下
errno_t strncpy_s
(
char *restrict dest,
rsize_t destsz,
const char *restrict src,
rsize_t count
);
Run Code Online (Sandbox Code Playgroud)
为什么rsize_t定义在这里?如果size_t在这里使用怎么办?有什么特殊情况可以使用rsize_t吗?
我有一个使用的C程序sprintf_s.它在Windows中运行良好,但是当我在Linux中编译我的代码时,它会出现以下错误:
sprintf_s was not declared in this scope.
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何解决?
Visual Studio抱怨fopen.我无法找到更改它的正确语法.我有:
FILE *filepoint = (fopen(fileName, "r"));
Run Code Online (Sandbox Code Playgroud)
至
FILE *filepoint = (fopen_s(&,fileName, "r"));
Run Code Online (Sandbox Code Playgroud)
第一个参数的其余部分是什么?
我创建了一个小应用程序,通过使用带参数的用户定义函数来查找最大数量.当我运行它时,它会显示此消息
错误1错误C4996:'scanf':此函数或变量可能不安全.请考虑使用scanf_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.
我该怎么做才能解决这个问题?
这是我的代码
#include<stdio.h>
void findtwonumber(void);
void findthreenumber(void);
int main() {
int n;
printf("Fine Maximum of two number\n");
printf("Fine Maximum of three number\n");
printf("Choose one:");
scanf("%d", &n);
if (n == 1)
{
findtwonumber();
}
else if (n == 2)
{
findthreenumber();
}
return 0;
}
void findtwonumber(void)
{
int a, b, max;
printf("Enter a:");
scanf("%d", &a);
printf("Enter b:");
scanf("%d", &b);
if (a>b)
max = a;
else
max = b;
printf("The max is=%d", max);
}
void findthreenumber(void)
{
int a, …Run Code Online (Sandbox Code Playgroud) 我正试图在MSVC 2017下找到C11标准中包含的strerrorlen_s功能头.我需要它来为错误消息分配空间.代码如下:strerror_s
auto size = strerrorlen_s(errno) + 1;
char* errorReason = (char*)alloca(size);
strerror_s(errorReason, size, errno);
std::ostringstream oss;
oss << "Cannot open: " << fileName << " Reason: " << errorReason;
throw std::runtime_error(oss.str());
Run Code Online (Sandbox Code Playgroud)
在文档中有以下字样:
与所有边界检查函数一样,如果
__STDC_LIB_EXT1__由实现定义并且用户在包含之前定义__STDC_WANT_LIB_EXT1__整数常量1,则仅保证strerror_s和strerrorlen_s可用string.h.
MSVC 2017没有定义__STDC_LIB_EXT1__,似乎__STDC_WANT_LIB_EXT1__在包含之前定义string.h没有效果.虽然strerror_s可以.
strerrorlen_s在现有的Windows与MSVC 2017年?strerror_s在Windows下是否是线程安全的,因为在Linux下它似乎不是并且如果需要线程安全必须使用strerror_r,但它在Windows上不可用?这是我死的简单虚拟代码:
#include <errno.h>
int main(void)
{
errno_t e;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这令人惊讶地引发了这个错误:
main.c:5:5: error: use of undeclared identifier 'errno_t'
errno_t x;
^
Run Code Online (Sandbox Code Playgroud)
我开始遵循这些跟踪:当编译器看到<...>包含时,它将首先查看/usr/include我找到errno.h文件的位置.实际上它除了许可评论之外还有一行,它是:
#include <sys/errno.h>
Run Code Online (Sandbox Code Playgroud)
现在,/usr/include/sys在errno.h我发现以下几行:
#include <sys/cdefs.h>
#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
#include <sys/_types/_errno_t.h>
#endif
Run Code Online (Sandbox Code Playgroud)
而在/usr/include/_types中_errno_t.h,我发现这一点:
typedef int errno_t;
Run Code Online (Sandbox Code Playgroud)
所以看起来,它就在那里,它是整数类型的别名,也是它的一部分errno.h- 就像它应该的那样.
那为什么不包括在内呢?为什么编译器会引发未声明的标识符错误?
提前致谢!
相关信息:
Compiler:
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)`
Compiler flags:
-std=c11 -I/usr/include/sys -I/usr/local/include
Run Code Online (Sandbox Code Playgroud)
宏变量 …