Visual Studio对不安全函数的报错——C4996错误

雁过留声  金牌会员 | 2024-7-17 20:34:21 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 836|帖子 836|积分 2508

报错信息



  1. C4996        'scanf': This function or variable may be unsafe.
  2. Consider using scanf_s instead. To disable deprecation,
  3. use _CRT_SECURE_NO_WARNINGS. See online help for details.       
  4. Project1        F:\VS_Project\Project1\hello.c        15               
  5. “scanf”:此函数或变量可能不安全。考虑改用scanf_S。要禁用弃用,
  6. 请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助
  7. 解释:VS认为C中的部分函数不安全,就推荐使用自己的函数代替。
复制代码
原因

根本原因:C语言的函数不够严谨,没有做安全查抄。
  1. #include <stdio.h>
  2. int main() {
  3.     char str[6] = { 0 };
  4.     scanf("%s", str);
  5.     return 0;
  6.    
  7. }
复制代码
 我们以上述代码为例子,就是定义一个字符数组str,用scanf 将敲的内容输入到 str 的数组里。
   C语言是没有字符串这个类型的,字符串存在字符数组里
  str 定义的数组是6个大小,scanf() 在读取字符串时不会查抄字符个数,它不知道数组或缓冲区到底能容纳多少个字符,当输入过多的时候程序就瓦解了,这就是所谓的不安全函数。尤其是这种错误只能比及程序运行时才能检测出来,在编译期间根本无法检测;一旦检测出来只有一种后果,就是程序被操作系统终止,也就是我们常说的“程序瓦解”。
scanf()、gets()、fgets_s()、strcpy()、strcat()等都是C语言自带的定语字符操作的函数,它们都是标准函数,但是它们都有一个缺陷,就是不安全,可能会导致数组溢出大概缓冲区溢出,可以通过  "缓冲区溢出"  来进行攻击。
scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 是微软发明的安全函数,它们仅实用于 VS,在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,克制了数组大概缓冲区溢出。

解决方法

方法一

方法一是最简朴的方法,就是在代码的第一行加一个预处理。
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. //定义_CRT_SECURE_NO_WARNINGS这个是1(真)
复制代码
缺点是每次写C文件都需要这么添加一次!

方法二

方法二就是利用微软发明的安全函数。
scanf_s() 的最后一个参数用来指明数组大概缓冲区的大小,假设它的值为 n,那么最多只允许读取 n-1 个字符(因为最后要存储 ’\0’ 结束符),多出来的字符就不再读取了,这样就可以克制读入过多的字符。
  1. char str[4] = {0};
  2. scanf_s("%s", str,4);
  3. //缺点:比如跨平台性不好,scanf_s这个函数在别的编译器就运行不了
复制代码

 方法三

方法三就是自定义预处理器
在项目-->属性-->C/C++-->预处理器-->预处理器定义(分号代表多个定义,将_CRT_SECURE_NO_WARNINGS复制进去)应用即可。

 

方法四

方法四就是取消安全查抄
在C文件-->属性-->C/C++-->SDL查抄(改为否就行),固然运行的时候程序会有警告,但是不影响运行。就是把VS的安全警告取消了。

方法五

方法五就是修改newc++file.cpp文件
起首我们需要找见VS的安装位置,在桌面快捷方式右键,点击打开文件地点位置。

这样,我们就找见了VS的安装位置,然后 VC-->vcprojectitems-->newc++file.cpp。

 

 

找见 newc++file.cpp文件,右键记事本打开,在第一行写入
  1. #define _CRT_SECURE_NO_WARNINGS 1
复制代码
生存即可,那么下一次登录VS,创建.c文件的时候,VS就会自动帮我们在第一行写入
  1. #define _CRT_SECURE_NO_WARNINGS 1
复制代码
 

在用记事本打开newc++file.cpp文件,可能会提示权限不够,解决方法就是提高当前系统登任命户的权限。具体操作如下:右键——属性——安全——编辑——点击当前系统用户——允许完全控制。

 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表