C语言中,大多数的缓冲区溢出问题可以直接追溯到标准C库。罪魁祸首就是因为不进行自变量检查的、有问题的字符操作(例如:strcpy()、strcat()、sprintf()、gets()等等)。一般来讲,像“避免使用strcpy()”和“永远不使用gets()”这样严格的规则在工作中经常遇到。
一、常见问题函数及其解决方案
函数 | 严重性 | 解决方案 |
gets | 最危险 | 使用 fgets(buf, size, stdin)。这几乎总是一个大问题! |
strcpy | 很危险 | 改为使用 strncpy。 |
strcat | 很危险 | 改为使用 strncat。 |
sprintf | 很危险 | 改为使用 snprintf,或者使用精度说明符。 |
scanf | 很危险 | 使用精度说明符,或自己进行解析。 |
sscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
fscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vfscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vsprintf | 很危险 |