当前位置: 首页 > C, C/C++ > 正文

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

规则:

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

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

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

规则:

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

规则:

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

规则:

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

规则:

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

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

规则:

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

规则:

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

规则:

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

规则:

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

规则:

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

规则:

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

规则:

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

规则:

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

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

规则:

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

规则:

不要修改常量对象。

规则:

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

规则:

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

规则:

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

规则:

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

本文固定链接: http://zmrlinux.com/2016/08/27/cc-%e4%bb%a3%e7%a0%81%e5%ae%89%e5%85%a8%ef%bc%88%e4%ba%8c%ef%bc%89/ | Kernel & Me

该日志由 root 于2016年08月27日发表在 C, C/C++ 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C/C++ 代码安全(二) | Kernel & Me