C 语言中不安全的函数
表:C语言中不安全的函数及其解决方案
函数 | 严重性 | 解决方案 | |
---|---|---|---|
1 | gets | 最危险 | 使用 fgets(buf, size, stdin)。这几乎总是一个大问题! |
2 | strcpy | 很危险 | 改为使用 strncpy。 |
3 | strcat | 很危险 | 改为使用 strncat。 |
4 | sprintf | 很危险 | 改为使用 snprintf,或者使用精度说明符。 |
5 | scanf | 很危险 | 使用精度说明符,或自己进行解析。 |
6 | sscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
7 | fscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
8 | vfscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
9 | vsprintf | 很危险 | 改为使用 vsnprintf,或者使用精度说明符。 |
10 | vscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
11 | vsscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
12 | streadd | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
13 | strecpy | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
14 | strtrns | 危险 | 手工检查来查看目的地大小是否至少与源字符串相等。 |
15 | realpath | 很危险(或稍小,取决于实现) | 分配缓冲区大小为 MAXPATHLEN。同样,手工检查参数以确保输入参数不超过 MAXPATHLEN。 |
16 | syslog | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
17 | getopt | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
18 | getopt_long | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
19 | getpass | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
20 | getchar | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
21 | fgetc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
22 | getc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
23 | read | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
24 | bcopy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
25 | fgets | 低危险 | 确保缓冲区大小与它所说的一样大。 |
26 | memcpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
27 | snprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |
28 | strccpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
29 | strcadd | 低危险 | 确保缓冲区大小与它所说的一样大。 |
30 | strncpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
31 | vsnprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |