最危险: gets 使用 fgets(buf, size, stdin)。这几乎总是一个大问题! 很危险: strcpy 改为使用 strncpy。 strcat 改为使用 strncat。 sprintf 改为使用 snprintf,或者使用精度说明符。 scanf 使用精度说明符,或自己进行解析。 sscanf 使用精度说明符,或自己进行解析。 fscanf 使用精度说明符,或自己进行解析。 vfscanf 使用精度说明符,或自己进行解析。 vsprintf 改为使用 vsnprintf,或者使用精度说明符。 vscanf 使用精度说明符,或自己进行解析。 vsscanf 使用精度说明符,或自己进行解析。 streadd 确保分配的目的地参数大小是源参数大小的四倍。 strecpy 确保分配的目的地参数大小是源参数大小的四倍。 很危险(或稍小,取决于实现): realpath 分配缓冲区大小为 MAXPATHLEN。同样,手工检查参数以确保输入参数不超过 MAXPATHLEN。 syslog 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 getopt 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 getopt_long 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 getpass 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 危险: strtrns 手工检查来查看目的地大小是否至少与源字符串相等。 中等危险: getchar 如果在循环中使用该函数,确保检查缓冲区边界。 fgetc 如果在循环中使用该函数,确保检查缓冲区边界。 getc 如果在循环中使用该函数,确保检查缓冲区边界。 read 如果在循环中使用该函数,确保检查缓冲区边界。 低危险: bcopy 确保缓冲区大小与它所说的一样大。 fgets 确保缓冲区大小与它所说的一样大。 memcpy 确保缓冲区大小与它所说的一样大。 snprintf 确保缓冲区大小与它所说的一样大。 strccpy 确保缓冲区大小与它所说的一样大。 strcadd 确保缓冲区大小与它所说的一样大。 strncpy 确保缓冲区大小与它所说的一样大。 vsnprintf 确保缓冲区大小与它所说的一样大。