C标准库中有一些函数存在副作用。虽然这些函数功能强大,但是如果忽略他们的副作用,会让整个应用不稳定。初期运行良好的代码,到了项目晚期,时不时崩溃。
一、字符串缓冲区溢出
函数 | 严重性 | 解决方案 |
strcpy | 很危险 | 改为使用 strncpy。 |
strcat | 很危险 | 改为使用 strncat。 |
sprintf | 很危险 | 改为使用 snprintf,或者使用精度说明符。 |
scanf | 很危险 | 使用精度说明符,或自己进行解析。 |
sscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
fscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vfscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vsprintf | 很危险 | 改为使用 vsnprintf,或者使用精度说明符。 |
vscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vsscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
streadd | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
strecpy | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
strtrns | 危险 | 手工检查来查看目的地大小是否至少与源字符串相等。 |
realpath | 很危险(或稍小,取决于实现) | 分配缓冲区大小为 MAXPATHLEN。同样,手工检查参数以确保输入参数不超过 MAXPATHLEN。 |
syslog | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getopt | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getopt_long | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getpass | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getchar | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
fgetc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
getc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
read | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
bcopy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
fgets | 低危险 | 确保缓冲区大小与它所说的一样大。 |
memcpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
snprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |
strccpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
strcadd | 低危险 | 确保缓冲区大小与它所说的一样大。 |
strncpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
vsnprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |
1、strcpy
原型声明:char *strcpy(char* dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回:指向dest的指针。
在实际开发中,由于src大小会变化,往往不能时刻保证dest有足够空间,导致写入内容超过dest边界,侵入下一个变量。
二、输入缓冲区溢出
gets | 最危险 | 使用 fgets(buf, size, stdin)。 |
三、内部使用全局变量导致线程不安全
rand | 产生随机整数 | 1 | rand_r |
strtok | 字符串split | 1 | strtok_r |
四、函数返回静态变量的地址
asctime | asc时间 | 2 | asctime_r |
ctime | 时间戳 | 2 | ctime_r |
gethostbyaddr | 返回主机信息 | 2 | gethostbyaddr_r |
gethostbyname | 返回主机信息 | 2 | gethostbyname_r |
inet_ntoa | 转成IP | 2 | 暂无 |
localtime | 返回本地时间 | 2 | localtime_r |
参考资料:
http://www.voidcn.com/article/p-whckshnh-uk.html C语言中不安全的函数以及解决方案
https://vimsky.com/article/3185.html C语言线程安全:不可重入函数汇总
https://www.w3cschool.cn/cadvance/am9q1j5y.html C语言 一些不安全的库函数
http://www.360doc.com/content/11/0610/16/6295074_126040631.shtml C中不安全的函数
https://www.cnblogs.com/qintangtao/archive/2013/01/28/2879792.html C语言中不安全的函数以及解决方案
https://blog.csdn.net/u014465639/article/details/71155515 C中不安全的函数以解决办法汇总
https://baike.baidu.com/item/strcpy/5494519?fr=aladdin strcpy百度百科