C/C++ 代码安全(二)

规则:

声明的每一个对象都必须具有正确的存储期。

对象的生命周期是程序执行的一部分,在此期间保证对象保留存储空间。任何形式的访问已经超出生命周期的行为都是未定义的。

引用超出生命周期的对象,可能导致攻击者执行任意代码。

规则:

在使用前声明表示符,不要隐含类型。

规则:

不要声明具有冲突链接类别的表示符。

规则:

使用正确语法声明灵活数组成员,例如柔性数组。

规则:

避免在结构体填充中泄漏信息。例如从内核态到用户态,我们需要给因为内存对齐而产生的空挡一个填充,防止泄漏内核信息。

解决方案:序列化填充,架构依赖,结构打包。

规则:

不要创建形同函数或者对象的不兼容声明。

规则:

不要在switch语句第一个标签之前声明变量。

规则:

不要依赖求值顺序以避免负作用。函数调用参数的求值顺序没有规定,可能以任何顺序发生。

规则:

不要通过非易失性引用访问易失性对象。volatile 不具有传递性。

规则:

不要读取未初始化的内存。如果具有自动存储持续时间的对象没有明确的初始化,其值是不确定的。

规则:

不要对NULL指针进行解引用,这是未定义行为,标准中尚未说明。

规则:

不要修改具有临时生命周期的对象。C11:修改临时生命周期的对象是未定义行为。

规则:

不要将指针转换为更严格对齐的指针类型。例如不同类型对象可能有不同的对齐,指针被转换为void在转换成别的类型,对齐规则会改变。

解决方案:使用中间对象,使用C11 的alignas() 转换表示符。

规则:

不要通过不兼容类型的指针访问变量。

规则:

不要修改常量对象。

规则:

不要比较填充数据。不同情况下,填充数据并不确定是否都初始化。

规则:

使用restrict 限定的指针时避免未定义。指示指针访问的位移方式,同一个内存中有两个访问方式就会未定行为。

规则:

不要向sizeof _Alignof _Generic  传递有负作用的操作数。

规则:

不要在选择语句中执行赋值。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值