在 VS(Visual Studio)下编译C语言程序,如果使用了 scanf()、gets()、strcpy()、strcat() 等与字符串读取或操作有关的函数,有时候VS会报错,提示该函数可能不安全,并且建议替换为带有_s后缀的安全函数,如下图所示:

什么是安全函数(safe function)

scanf()、gets()、fgets()、strcpy()、strcat() 等都是C语言自带的函数,它们都是标准函数,但是它们都有一个缺陷,就是不安全,可能会导致数组溢出或者缓冲区溢出,让黑客有可乘之机,从而发起“缓冲区溢出”攻击。

scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 是微软自己发明的安全函数,它们仅适用于 VS,在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度,这样一来,过多的字符就会被过滤掉,避免了数组或者缓冲区溢出。

下面我们以 scanf_s() 为例来讲解。

scanf() 在读取字符串时不会检查字符个数,它不知道数组或缓冲区到底能容纳多少个字符,例如:

  1. char buf[5]={0};
  2. scanf(“%s”, buf);

当用户输入abcdeABCDE这10个字符时,scanf() 会全部读取,并放入 buf 中,不过 buf 最多只能存储 5 个字符,不足以容纳用户输入的全部数据,所以多出来的 5 个字符就会使用 buf 后面的内存,而 buf 后面的内存可能没有使用权限,或者已经被别的数据占用,这就导致程序在运行时可能会出现不可预知的错误。

最要命的是,这种错误只能等到程序运行时才能检测出来,在编译期间根本无法检测;一旦检测出来只有一种后果,就是程序被操作系统终止,也就是我们常说的“程序崩溃”。

更改上面的代码,使用 scanf_s() 代替 scanf():

  1. char buf[5] = {0};
  2. scanf_s(“%s”, buf, 5);

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

但是,安全函数不利于大家学习,它们不但使用麻烦,而且也不被绝大多数教程采用。另外,安全函数是微软自己发明的,只适用于 VS 编译器,在其他编译器下无效。

如何取消安全函数的限制

我们通过对 VS 做适当的设置,让它不再强制使用安全函数,从而可以使用 scanf()、gets()、fgets()、strcpy()、strcat() 等C语言的标准函数去编程。

VS 之所以会提示使用安全函数,是因为它进行了SDL检查(安全性开发生命周期检查),只要将它取消就可以了。

1) 菜单栏中选择 “项目 --> xxx属性”(xxx为创建的项目名称),或者直接按下组合键“Alt+F7”,如下图所示:

2) 此时会弹出如下图所示的一个对话框,选择“C/C++ --> SDL检查”,将“是”改为“否”,如下图所示:

3、最后点击“确定”按钮,重新运行程序,你会发现程序可以正常运行了。

另外,VS2010、VS2015 等低版本的 VS 可以在创建项目之处就取消 SDL 检查(如下图所示),但是到了 VS2017 时就不行了,创建项目时没有这个选项了,只能在创建项目完成以后再按照以上步骤取消 SDL 检查。

解决VS'scanf':this function or variable may be unsafe.`(VS安全函数问题)相关推荐

  1. 解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

    我用的是visual studio 2019,提示出错.用下面第5种办法,完美解决问题... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  2. VS编译器提示:C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead.的解决方法

    博主在使用VS2019编译器运行c代码时控制台提示:错误 C4996 'scanf': This function or variable may be unsafe. Consider using ...

  3. 错误C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. 最高效解决办法!!

    VS2015运行出错报告:严重性    代码说明项目文件行禁止显示状态    错误    C4996    'scanf': This function or variable may be unsa ...

  4. VS2013运行报错error C4996: 'scanf': This function or variable may be unsafe.

    报错内容: 1>------ Build started: Project: 约瑟夫问题, Configuration: Debug Win32 ------ 1> 约瑟夫问题.cpp 1 ...

  5. 警告 1 warning C4996: ‘scanf‘: This function or variable may be unsafe.

    警告 1 warning C4996: 'scanf': This function or variable may be unsafe. 下午教妹妹学习C语言的过程中使用scanf函数出现了一个警告 ...

  6. C4996 scanf:This function or variable may be unsafe. / C6031 返回值被忽略.

    C4996 scanf:This function or variable may be unsafe. C6031 返回值被忽略 问题:在VS2019中直接输入 scanf("-" ...

  7. C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead.

    报文: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'scanf': This function or variable may be unsafe. Consider usi ...

  8. C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead.错误提示

    最近在在使用visual studio创建C语言的时候遇到的错误: 如下: C4996 'scanf': This function or variable may be unsafe. Consid ...

  9. VS编译错误C4996 'scanf': This function or variable may be unsafe.

    最近用VS编写代码时,老碰到这个错误: C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s i ...

最新文章

  1. android中的Json一
  2. mysql 相除 取整数位,psql除法保留小数,实现向上取整和向下取整操作_PostgreSQL_数据库...
  3. 在linux上安装mysql5.6,在linux(Centos 7以上版本亲测)上安装mysql5.6
  4. mac安装了多版本php 卸载,mac 安装多版本PHP
  5. 基于集成提升和 Bagging 的地下水潜力预测机器学习模型文件阅读
  6. 计算机硬盘驱动器越大,计算机基础知识1.3摘要.doc
  7. 20-spring学习-Spring MVC基本操作
  8. 不是没想过放弃,就觉得还能再坚持
  9. Qt4_读取和写入文本
  10. 商汤携手迅达,全面打造“AI+电梯“,实现全流程安全智能自动化管理
  11. Eclipse 反编译之 JadClipse
  12. 数学建模——BP神经网络模型Python代码
  13. PXE安装windows系统,pxe-e55:ProxyDhcp service did not reply to request on port 4011
  14. 鸿蒙系统反应很快吗,EMUI11对比未成形的鸿蒙系统反应速度:速度差距较大,但细节赢了...
  15. 当老师退出伽卡他卡教师端,但是还没下课时,程序一直提示连接失败真的很烦,下面和大家分享一下怎么退出伽卡他卡
  16. 光敏传感器实验报告_光敏传感器光电特性测量实验分析报告.ppt
  17. vue-baidu-api地图标记点(自定义标记图标),设置标记点的优先级
  18. 一文看尽2020上半年阿里、腾讯、百度入选AI顶会论文
  19. 非苹果机安装 Mac OS X 全教程~~~~转
  20. 万能商标--“35类”

热门文章

  1. ubuntu php7 memcache,linux上安装php7 memcache扩展
  2. python在线投票系统讲解_在线投票系统功能分析
  3. php中一级标题和二级标题,什么是一级标题,一二三标题格式举例
  4. u-boot的Makefile分析
  5. WSAGetLastError
  6. linux下C语言中的flock函数用法
  7. WINCE 网卡控制
  8. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式
  9. python如何进行格式化输出变量_Python变量格式化输出实现原理解析
  10. AE开发右键缩放至图层