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.
在Visual Studio 2005 C++编译器上,当我的代码使用fopen和此类调用时,我收到以下警告.
1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1> Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
Run Code Online (Sandbox Code Playgroud)
我该如何防止这种情况?
我在我的简单MFC窗口应用程序中编译错误,该应用程序由向导生成,包含几行代码:
错误C4996:'strncpy':此函数或变量可能不安全.请考虑使用strncpy_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS.详细信息请参见在线帮助.
我设置 Configuration Properties>>C/C++>>Preporocessor>>Preprocessor Definitions>> _CRT_NONSTDC_NO_WARNINGS
但这没有帮助.我有另一个非常接近的项目,在这个地方只生成警告,它没有_CRT_NONSTDC_NO_WARNINGS定义.
只有项目之间的差异是向导中的几个不同选项.
为什么_CRT_NONSTDC_NO_WARNINGS对第一个项目没有帮助,为什么第二个项目在没有这个定义的情况下编译没有问题?
我正在将一些代码移植到Windows,而Microsoft编译器(Visual C++ 8)告诉我这strerror()是不安全的.
撇开微软所有安全字符串中的烦恼因素,我实际上可以看到一些已弃用的函数是危险的.但我无法理解可能出现的问题strerror().它需要一个code(int),并返回相应的字符串,如果该代码未知,则返回空字符串.
危险在哪里?
在C中有一个很好的选择吗?
C++中有一个很好的替代品吗?
[编辑]
得到了一些很好的答案,现在理解一些实现可能疯狂到实际写入一个共同的共享缓冲区 - 在单线程中不安全的重入,没关系线程之间! - 我的问题不再是"为什么我不能使用它,有什么替代方案?" "C和/或C++中是否有任何体面,简洁的替代品?"
提前致谢
我最初使用Microsoft/visual c ++编译器编写了一个作业,但我的课程要求我使用G ++在unix上运行和编译
但是,strncpy_s不能使用g ++编译,我的特定程序的任何解决方法?
这是使用它的代码段:
void PhoneNumber::setName(const char name[])
{
strncpy_s(_name, name, MAX_NAME_LENGTH);
}
Run Code Online (Sandbox Code Playgroud) c++ ×3
c ×2
deprecated ×2
visual-c++ ×2
coding-style ×1
fopen ×1
g++ ×1
security ×1
strncpy ×1
tr24731 ×1
warnings ×1