`

warning C4996的分析 (非原创)

 
阅读更多
warning C4996的分析
warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details.

首先,这只是一个warning,不更改也能编译通过。

micsoft对其内部函数有了更新,用最新的函数编译的程序,能够更好的 与micsoft后面的平台适应。

以下为转载

在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好像不能消除警告


1. gets_s()代替gets()
2.strcpy_s()来代替strcpy()
3.strncpy_s()代替strncpy()
4.sprintf_s()代替sprintf()
5.CString::Format(_T("字符转"))代替CString::Format("字符转")
6.strcat_s()代替strcat()
7.fopen_s()代替fopen()
8._vsnprintf_s()代替_vsnprintf()
9._ftime64_s()代替_ftime64()
10._get_tzname ()代替_tzname()
11._snwprintf_s()代替_snwprintf()
12.mbstowcs_s()代替mbstowcs()
13.wcstombs_s()代替wcstombs()
14.wcscat_s()代替wcscat()
15._wcsupr_s()代替_wcsupr()
16._wcslwr_s()代替_wcslwr()
17._wtoi()代替atoi()
-------------------------------------------------------------------------------

将过去的工程用VS2005打开的时候。你有可能会遇到一大堆的警告:warning C4996。
比如:warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

原因是Visual C++ 2005使用了更加安全的run-time library routines。
新的Security CRT functions(就是那些带有“_s”后缀的函数):
http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx

那么如何搞定这些警告呢:
方法一:手工将原来的旧函数替换成新的Security CRT functions。
方法二:屏蔽这个警告。
            在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
            #define _CRT_SECURE_NO_DEPRECATE
            或者#param warning(disable:4996)

方法二没有使用新的更安全的CRT函数,显然不是一个值得推荐的方法,可是你又不想一个一个地改。
那么还有一个更方便的方法:

在预编译头文件stdafx.h里(同样要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
在链接的时候便会自动将旧函数替换成Security CRT functions。
注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二。。。
在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE 和 _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!0显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE, 使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE。
    然而尽管如此,更好的解决方案只需要定义一个宏 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么vc将会自动替换使用他们的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. 检查所有的错误。 许多新函数相比旧函数,能返回(表示)错误信息(的数值)。

#define _AFX_SECURE_NO_WARNINGS     // MFC
#define _ATL_SECURE_NO_WARNINGS     // ATL
#define _CRT_SECURE_NO_WARNINGS     // C
#define _CRT_NONSTDC_NO_WARNINGS    // CPOSIX
#define _SCL_SECURE_NO_WARNINGS     // STL
可以在编译选项中加入这些宏,需要注意的是有的文件是单独设置了自己的编译选项,只能用#pragma warning(disable:4996)

分享到:
评论

相关推荐

    C语言的常见错误分析,初学者

    ### C语言的常见错误分析及解决方案 #### 一、变量未声明就使用 **示例代码**: ```c void main() { x = 3; y = x; } ``` **编译器提示**: - `error C2065: 'x': undeclared identifier` —— x 未声明 - `...

    C++ warning 4786 解决办法

    在C++编程中,警告(Warning)虽然不会阻止程序的编译和运行,但它们通常意味着潜在的问题,可能会影响代码的可读性、维护性和性能。`warning 4786`是C++编译器(通常是Visual C++)发出的一个特定警告,提示标识符...

    ISE中常见WARNING和ERROR及其解决方法

    这个WARNING通常发生在FPGA的时钟网络上,当一些负载不是时钟引脚而是非时钟引脚时,ISE无法使用时钟模板来路由这些负载,从而可能导致时钟偏斜(skew)增大。解决这个问题的方案包括使用FPGA EDITOR来查看哪些负载...

    Quartus II 中常见Warning 原因及解决方法

    ### Quartus II 中常见Warning 原因及解决方法 #### 1. Found clock-sensitive change during active clock edge at time &lt;time&gt; on register "&lt;name&gt;" **原因:** 当时钟敏感信号(例如数据、使能端、复位、同步...

    0error0warning.zip

    3. **分析原因**:理解为什么会出现这样的错误或警告,可能是语法错误、逻辑错误还是其他编程习惯问题。 4. **修复问题**:修改代码以消除错误或警告。 5. **测试验证**:重新编译和运行代码,确保问题已解决且不...

    php提示Warning:mysql_fetch_array() expects的解决方法

    具体分析如下: 在mysql数据库连接时碰到Warning: mysql_fetch_array() expects …错误提示,根据我的经验这个是sql返回的query为空了,我们没有加己判断直接使用了. mysql_fetch_array()函数导致的,下面我们一起来看...

    keil c语言编程常见错误分析.doc

    本文档总结了 Keil C 语言编程中常见的错误分析,涵盖了 Warning 280、Warning 206、Error 318、Error 237、Warning 16、Warning 6、Warning 206、Warning 1 和 Error 107 等错误类型,并提供了相应的解决方法。...

    QuartusII编译与仿真warning大解析

    QuartusII 编译与仿真.warning 大解析 QuartusII 编译与仿真 warning 大解析是 QuartusII 的一个重要环节,对于 FPGA 设计者来说, warning 是一个常见的问题,如何正确地处理 warning 是非常重要的。本文将对 ...

    URLy Warning (关注自己喜欢的网站更新情况) V2.02 绿色特别版

    《URLy Warning:高效监测网站更新的利器》 在当今信息爆炸的时代,我们常常需要关注多个网站以获取最新的资讯、学习资料或者商业信息。手动检查每个网站的更新显然是低效且耗时的。这时,一款名为"URLy Warning"的...

    Quartus II 调试Error和Warning及解决办法

    Quartus II 调试 Error 和 Warning 及解决办法 在 Quartus II 中,调试 Error 和 Warning 是非常常见的现象,了解这些错误和警告的原因和解决方法是非常重要的。下面我们将对这些错误和警告进行详细的解释和分析。 ...

    MDK5使用JLink调试时出现内存对齐方面的警告JLink Warning

    我的keil5是MDK524版本,在使用JLink调试时出现JLink Warning:mis-aligned memory write:address:0x20000000,numbytes:2,alignment:2(halfword-aligned)的警告。找到c:\Keil_v5\ARM\segger(Keil安装目录)下的JL2...

    keil-c语言编程常见错误分析讲课讲稿.docx

    C语言编程常见错误分析讲课讲稿 本文档讲解了C语言编程中常见的9种错误,包括未引用的局部变量、missing function-prototype、无法打开头文件、函数名称重复定义、未调用的函数、重复定义的地址、missing function-...

    URLy Warning v3.0 英文绿色免费版

    **URLy Warning v3.0 英文绿色免费版** URLy Warning是一款高效且实用的网站监测工具,专为用户设计以追踪他们关心的网站内容的更新情况。这个软件版本v3.0提供了英文界面,并且是免费的,无需安装,用户可以直接...

    Qt:解决使用png图片时,报错libpng warning: iCCP: known incorrect sRGB profile的问题

    在本文中,我们将深入探讨这个问题,分析其原因,并提供解决方案。 首先,了解色彩配置文件(ICC Profile)是至关重要的。ICC Profile是一种标准化的方法,用于定义不同设备(如显示器、打印机和扫描仪)的颜色特性...

    QT PCL显示点云时出现vtkOutputWindow和Generic Warning解决方案

    在使用PCL(Point Cloud Library)与QT结合进行点云数据可视化时,有时会遇到一些问题,例如在显示点云时出现"vtkOutputWindow"和"Generic Warning"的错误提示。这个问题通常涉及到PCL和VTK(Visualization Toolkit...

    解决方案libpng warning: iCCP: known incorrect sRGB profile.txt

    参考"解决问题:libpng warning: iCCP: known incorrect sRGB profile"[https://blog.csdn.net/WangJiankun_ls/article/details/79470739]文章,通过自己实践操作,得出结论,希望能帮助到你们

    解决 libpng warning: iCCP: known incorrect sRGB profile

    在IT领域,尤其是在图像处理和开发中,"libpng warning: iCCP: known incorrect sRGB profile" 是一个常见的问题,特别是在使用Qt库进行图像操作时。这个问题涉及到颜色配置文件(iCCP)和标准红绿蓝(sRGB)色彩...

    1996 earthquake early warning system

    2. **估计地震参数**:通过对地震波形的分析,系统能够估算出地震的规模(如里氏震级)、预期的地面运动强度以及地震波的传播方向等关键信息。 3. **预测地震影响范围**:结合地质构造信息和地震参数,可以预测哪些...

Global site tag (gtag.js) - Google Analytics