C++安全编码:变量

变量

指针变量、表示资源描述符的变量、BOOL变量声明必须赋予初值

为了贯彻零开销原则(C++之父Bjarne在设计C++语言时所遵循的原则之一,“无须为未使用的东西付出代价”),编译器一般不会对一般变量进行初始化,也包含指针,所以负责初始化指针变量的只有程序员自己。

使用未初始化的指针时,非常危险,因为指针指向内存空间,所以程序员容易通过未初始化的指针改写该指针随机指向的存储区域,而由此产生的后果是不确定的

全局变量和静态变量的默认值是0,局部变量的默认值不确定。

由于局部变量的默认值都是不确定的:使用随机指针,后果不确定(往往比较严重)、bool变量导致分支错误、资源描述符导致操作文件异常;
相关网址介绍:
C/C++中已初始化/未初始化全局/静态/局部变量/常量在内存中的位置
c++堆、栈、局部变量、全局变量

指向资源句柄或描述符的变量,在资源释放后立即赋予新值

资源释放后,对应的变量应该立即赋予新值,防止后续又被重新引用。例外:如果释放语句刚好在变量作用域的最后一行,可以不进行赋值。

有如下好处

  • 双重释放指针时避免崩溃。(释放空指针不会引起错误)
  • 避免重用已释放的指针。(如果是赋值为空,只是将重复使用这种错误行为转换为崩溃或者隐藏了起来。这个做法其实有些争议,因为一旦隐藏了起来,出现问题后,很难进行debug。)
unsigned char *msg = NULL;
free(msg);
msg = 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值