房产网站制作方案,大型房地产网站建设方案,网络架构拓扑图,wordpress新闻门户VS2017、VS2019等安全函数scanf_s问题#xff1a;
scanf()、gets()、fgets()、strcpy()、strcat() 等都是C语言自带的函数#xff0c;它们都是标准函数#xff0c;但是它们都有一个缺陷#xff0c;就是不安全#xff0c;可能会导致数组溢出或者缓冲区溢出#xff0c;让黑…VS2017、VS2019等安全函数scanf_s问题
scanf()、gets()、fgets()、strcpy()、strcat() 等都是C语言自带的函数它们都是标准函数但是它们都有一个缺陷就是不安全可能会导致数组溢出或者缓冲区溢出让黑客有可乘之机从而发起“缓冲区溢出”攻击。
scanf_s()、gets_s()、fgets_s()、strcpy_s()、strcat_s() 是微软自己发明的安全函数它们仅适用于 VS在其它编译器下无效。这些安全函数在读取或操作字符串时要求指明长度这样一来过多的字符就会被过滤掉避免了数组或者缓冲区溢出。
比如scanf()与scanf_s()比较 scanf() 在读取字符串时不会检查字符个数它不知道数组或缓冲区到底能容纳多少个字符例如
char buf[5]{0};
scanf(“%s”, buf);当用户输入abcdeABCDE这10个字符时scanf() 会全部读取并放入 buf 中不过 buf 最多只能存储 5 个字符不足以容纳用户输入的全部数据所以多出来的 5 个字符就会使用 buf 后面的内存而 buf 后面的内存可能没有使用权限或者已经被别的数据占用这就导致程序在运行时可能会出现不可预知的错误。
最要命的是这种错误只能等到程序运行时才能检测出来在编译期间根本无法检测一旦检测出来只有一种后果就是程序被操作系统终止也就是我们常说的“程序崩溃”。
更改上面的代码使用 scanf_s() 代替 scanf()
char buf[5] {0};
scanf_s(“%s”, buf, 5);scanf_s() 最后一个参数用来指明数组或者缓冲区的大小假设它的值为 n那么最多只允许读取 n-1 个字符因为最后要存储’\0’多出来的字符就不再读取了这样就可以避免读入过多的字符。与 scanf() 相比scanf_s() 显然更加安全。
但是安全函数不利于大家学习它们不但使用麻烦而且也不被绝大多数教程采用。另外安全函数是微软自己发明的只适用于 VS 编译器在其他编译器下无效。
取消强制使用安全函数 我们通过对 VS 做适当的设置让它不再强制使用安全函数从而可以使用 scanf()、gets()、fgets()、strcpy()、strcat() 等C语言的标准函数去编程。
VS 之所以会提示使用安全函数是因为它进行了SDL检查安全性开发生命周期检查只要将它取消就可以了。
菜单栏中选择 “项目 -- xxx属性”或者直接按下组合键“AltF7” 选择“C/C -- SDL检查”将“是”改为“否”重新运行就行了。 摘自http://c.biancheng.net/view/473.html