在VS2005下编译代码,有时会遇到类似如下的警告: warning C4996: 'strcat' was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函数已过时(deprecated)<需要用新的函数来替代>,但看着实在别扭,且看看ms为什么要设置成这样。
搜索了一下ms的网站,找到了结果。ms认为以前的c/c++库中有一部分函数不够安全,希望程序员可以使用他们的替代安全库(Safe Library)来避免不必要的隐患。 整个原文请点击以下链接访问:Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries
在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE 和 _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE, 使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE。
然而尽管如此,更好的解决方案只需要定义一个宏CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么VS将会自动替换使用他们的Safe Library来代替C/C++标准库(如strcat将被strcat_f来取代)。
即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代码将依旧不够安全, 对此,ms提出了如下10点建议:
1. 不要认为 strcpy_s 和 strncpy_s( 以及其他的字符串函数)(在空间不够的时候)会自动终止拷贝(truncate截断,不截断则意味着溢出).如果需要自动截断,请使用strncpy_s (同时使用_TRUNCATE作为长度参数)。
2. 记住fopen_s缺省是独占模式。如需共享使用文件,应该使用_sopen。
3. 别忘了_dupenv_s, 它将比_getenv_s更容易使用,因为它能自动分配一个正确长度的内存(buffer)。
4. 在scanf_s中小心参数顺序。
5. 确定printf_s中格式字符串的正确。
6. 使用_countof(x)来取代sizeof(x)/sizeof(element). _countof将会正确的计算元素个数,而且如果x是一个指针,编译器将会发出一个警告(来提醒程序员,仅针对C++编译)
7. 记住所有的sizes(大小,非长度)都是使用characters(字符,unicode下一个字符占2个byte)作为单位,而不是bytes(字节).
8. 记住所有的sizes(大小,非长度,缘由同上)包含了字符串结束符'/0'(即别忘了很多情况下size需要+1)。
9. 调试的时候监视数据0xfd。 (在调试版本下)0xfd将会被填充在数据(buffer,通常是字符串)的结尾处。如果运行非你所愿,可能会得到一个长度错误。
10. 检查所有的错误。 许多新函数相比旧函数,能返回(表示)错误信息(的数值)。
————————————————————————————————————————————————
PS:定义宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES好像不能消除警告