C++ 开发规范(持续更新)

不得直接使用无长度限制的字符拷贝函数

不应直接使用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是不安全的

猜你喜欢

转载自blog.csdn.net/qq_38973721/article/details/128948856
今日推荐