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用法的博文。相关文章推荐
- [zz]c++可变参数函数使用
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
- C++关于类成员函数在参数列表后加const的作用,以及使用条件
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
- 今天学习了关于C++ 中可变参数个数函数的使用!
- C使用 stdarg 宏来实现函数的可变参数列表
- 【转】C++可变参数列表处理宏va_list、va_start、va_end的使用
- c++函数的可变参数的使用
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- C++可变参数列表处理宏va_list、va_start、va_end的使用
- 改善C++ 程序的150个建议学习之建议15:尽量不要使用可变参数
- C/C++里面使用的可变参数函数
- Effective JavaScript Item 22 使用arguments来创建接受可变参数列表的函数
- Matlab中使用varargin来实现参数可变的函数
- c/c++支持可变参数的函数
- 可变长度函数参数的原理及使用
- 函数可变参数va_list、va_start、va_arg、va_end原理及使用方法
- C和C++中处理个数可变的可选参数的函数和宏
- 可变参数的函数 start va_arg va_end 的使用和原理
- 关于C++中函数指针的使用(包含对typedef用法的讨论)