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

4 篇文章 0 订阅

背景

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用法的博文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值