不得直接使用无长度限制的字符拷贝函数
不应直接使用legacy的字符串拷贝、输入函数,如strcpy、strcat、sprintf、wcscpy、mbscpy等
这些函数的特征是:可以输出一长串字符串,而不限制长度
如果环境允许,应当使用其_s安全版本替代,或者使用n版本函数(如:snprintf,vsnprintf)
若使用形如sscanf之类的函数时,在处理字符串输入时应当通过%10s这样的方式来严格限制字符串长度,同时确保字符串末尾有\0
如果环境允许,应当使用_s安全版本
但是注意,虽然MSVC 2015时默认引入结尾为0版本的snprintf
(行为等同于C99定义的snprintf
)
但更早期的版本中,MSVC的snprintf
可能是_snprintf
的宏
而_snprintf
是不保证\0结尾的
因此,在使用n系列拷贝函数时,要确保正确计算缓冲区长度
同时,如果你不确定是否代码在各个编译器下都能确保末尾有0时,建议可以适当增加1字节输入缓冲区
并将其置为\0,以保证输出的字符串结尾一定有\0
// Good
char buf[101] = {0};
snprintf(buf, sizeof(buf) - 1, "foobar ...", ...);
一些需要注意的函数,例如strncpy和_snprintf是不安全的