# 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 | 低危险 | 确保缓冲区大小与它所说的一样大。 |