以下函数使用均可能产生内存泄漏,修改使用函数可更严谨。
原函数 | 改变方式 |
gets | 使用 fgets(buf, size, stdin) |
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 | 确保缓冲区大小与它所说的一样大。 |