关于C语言内存溢出风险

1.strcpy函数
原型声明:char strcpy(char dest, const char *src);
头文件:#include 和 #include
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

隐患说明:当src的长度大于dest分配到的空间,就会出现内存溢出
应当使用strncpy,而避免使用strcpy

2.sscanf函数
int sscanf (const char *str,const char * format,…);
sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数 据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。
返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 返回0表示失败 否则,表示正确格式化数据的个数

当format用到%s或者%[]等要注意内存溢出

char array[10] = {0};
隐患写法: scanf("%s", array); 
最优写法: scanf("%9s", array);
隐患写法: scanf("%[]", array); 
最优写法: scanf("%9[]", array);

3.sprintf函数
函数功能:格式化字符串,将格式化的数据写入字符串中。
函数原型:int sprintf(char *buffer, const char *format, [argument]…)
参数:
(1)buffer:是char类型的指针,指向写入的字符串指针;
(2)format:格式化字符串,即在程序中想要的格式;
(3)argument:可选参数,可以为任意类型的数据;
函数返回值:buffer指向的字符串的长度;

sprintf(array, "Hello World!");  
当 "Hello World!"的数据长度比array的内存空间大,则会导致内存溢出
应当尽量使用snprintf,避免使用sprintf

4.strncmp函数
strncmp是不会造成内存溢出的,但是有可能比较长度存在隐患

隐患写法:strncmp(array,"helloworld",strlen("helloworld"));
当array[]="helloworldhelloworld",对比也能通过
最优写法1:strncmp(array,"helloworld",strlen("helloworld")+1);
最优写法2:strcmp(array,"helloworld");

你可能感兴趣的:(关于C语言内存溢出风险)