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

报错信息

![](https://img-

blog.csdnimg.cn/direct/218c2230a902464f9adc8a2257729f2b.png)

C4996	'scanf': This function or variable may be unsafe. 
Consider using scanf_s instead. To disable deprecation, 
use _CRT_SECURE_NO_WARNINGS. See online help for details.	
Project1	F:\VS_Project\Project1\hello.c	15		

“scanf”:此函数或变量可能不安全。考虑改用scanf_S。要禁用弃用,
请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助

解释:VS认为C中的部分函数不安全,就推荐使用自己的函数代替。

原因

根本原因:C语言的函数不够严谨,没有做安全检查。

#include <stdio.h>


int main() {

    char str[6] = { 0 };
    scanf("%s", str);
    return 0;
    
}

我们以上述代码为例子,就是定义一个字符数组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,在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,避免了数组或者缓冲区溢出。

解决方法

方法一

方法一是最简单的方法,就是在代码的第一行加一个预处理。

#define _CRT_SECURE_NO_WARNINGS 1
//定义_CRT_SECURE_NO_WARNINGS这个是1(真)

缺点是每次写C文件都需要这么添加一次!

方法二

方法二就是使用微软发明的安全函数。

scanf_s() 的最后一个参数用来指明数组或者缓冲区的大小,假设它的值为 n,那么最多只允许读取 n-1 个字符(因为最后要存储 ’\0’
结束符),多出来的字符就不再读取了,这样就可以避免读入过多的字符。

char str[4] = {0};
scanf_s("%s", str,4);

//缺点:比如跨平台性不好,scanf_s这个函数在别的编译器就运行不了

方法三

方法三就是自定义预处理器

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

![](https://img-
blog.csdnimg.cn/direct/12afc82a0ec54af89e85f7987e688e8e.png)![](https://img-
blog.csdnimg.cn/direct/194be9f6c01f4770a808f8e856139f56.png)

方法四

方法四就是取消安全检查

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

方法五

方法五就是修改newc++file.cpp文件

首先我们需要找见VS的安装位置,在桌面快捷方式右键,点击打开文件所在位置。

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

找见 newc++file.cpp文件,右键记事本打开,在第一行写入

#define _CRT_SECURE_NO_WARNINGS 1 

保存即可,那么下一次登录VS,创建.c文件的时候,VS就会自动帮我们在第一行写入

#define _CRT_SECURE_NO_WARNINGS 1 

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

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

扫码领取

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值