您的位置:首页 > 编程语言 > C语言/C++

C++ 编码军规(001):不要使用包含可变参数列表的函数

2017-01-23 15:32 696 查看

背景

C++编码军规源自我司内部C++编程规范,我司属于跨国医疗企业,研发生产大型治疗型医疗设备,对安全性的要求极高,稍有不慎都有可能造成灾难性的医疗事故。作为设备控制代码对安全性和可靠性的要求自然很高。C++编码军规列举了开发高安全性和高可靠性C++代码的一些建议和规定,具有很好的参考建议。

军规:不要使用包含可变参数列表的函数

Never use functions that have varible argument lists

解读

对于一些含有不确定参数(如varargs)的函数,例如printf,CString::Format等,会避开C++的强大的类型检查。例如对于以下示例代码,则会产生崩溃甚至更坏的情况:

#include <stdio.h>
int main(int argc, char *argv[])
{
char c = 'a';
printf("No type checking %s", c);
return 0;
}


程序运行结果:

Segmentation fault


对于上述代码,程序在编译期间编译器没有产生任何的警告或错误,但这么写的的确确是错了,printf的格式化字符串%s期望的是一个字符串却给定了一个字符,然而由于printf的参数是可变参数列表,C++无法在程序编译期间做类型检查,直到程序运行时才崩溃。这样的bug很难发现和定位,也是非常不安全的。

最佳实践

作为类似于printf之类的替代,我们在程序中想要输出信息或者格式化字符串时,可以采用类型安全的一些方案,比如标准库的stringstream 或者boost库的format。关于stringstream的用法请参考博主关于ostringstream用法的博文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息