scanf和scanf_s、strcpy和strcpy_s、strncpy、gets

来源:互联网 发布:下载自选股软件 编辑:程序博客网 时间:2024/04/29 15:33

在使用vs的时候,使用scanf和strcpy以及gets函数都会报错,说这几个函数存在安全问题。下面来看看到底会出现什么问题,以及安全的函数该如何写。
1、scanf和scanf_s
scanf在读取的时候不检查边界,可能造成内存访问越界,例如分配了5个字节的空间,但是读入了7个字节。

char str[5]={'\0'};scanf("%s",str);如果输入为7个字节1234567,那么后面的67都会被写到别的空间去。#scanf_s("%s",str,5);最多读取4个字节,最后一个参数表示缓冲区大小,表示最多读取多少个字节。

2、strcpy和strcpy_s
strcpy依据源字符串的’\0’作为结束标志的,不检查目标位置的大小,如果目标不够就会产生溢出问题。

char str[5];strcpy(str,"hello world");像这样就会产生溢出问题strcpy_s(str,12,"hello world");很奇怪的是打印出来的str居然是hello world,而且这么用在vs中也会出现错误,可以去试试。第二个参数表示目标缓冲区大小,但又必须大于等于源字符串长度+1(结尾放'\0'),所以这个函数只能完全拷贝源串。要想部分拷贝只能用strncpy_s。

3、strncpy_s
这个函数可以部分拷贝。

char str[5];strncpy_s(str,5,"hello world",4);表示从源拷贝4个字节到5个字节的目标空间

4、gets
gets不检查字符串的大小,必须遇到换行符或文件结尾才会结束输入,容易造成缓存溢出的安全问题,可以用fgets代替。

char str[5];fgets(str,6,stdin);表示从键盘读入5个字符
0 0
原创粉丝点击