规则:
声明的每一个对象都必须具有正确的存储期。
对象的生命周期是程序执行的一部分,在此期间保证对象保留存储空间。任何形式的访问已经超出生命周期的行为都是未定义的。
引用超出生命周期的对象,可能导致攻击者执行任意代码。
规则:
在使用前声明表示符,不要隐含类型。
规则:
不要声明具有冲突链接类别的表示符。
规则:
使用正确语法声明灵活数组成员,例如柔性数组。
规则:
避免在结构体填充中泄漏信息。例如从内核态到用户态,我们需要给因为内存对齐而产生的空挡一个填充,防止泄漏内核信息。
解决方案:序列化填充,架构依赖,结构打包。
规则:
不要创建形同函数或者对象的不兼容声明。
规则:
不要在switch语句第一个标签之前声明变量。
规则:
不要依赖求值顺序以避免负作用。函数调用参数的求值顺序没有规定,可能以任何顺序发生。
规则:
不要通过非易失性引用访问易失性对象。volatile 不具有传递性。
规则:
不要读取未初始化的内存。如果具有自动存储持续时间的对象没有明确的初始化,其值是不确定的。
规则:
不要对NULL指针进行解引用,这是未定义行为,标准中尚未说明。
规则:
不要修改具有临时生命周期的对象。C11:修改临时生命周期的对象是未定义行为。
规则:
不要将指针转换为更严格对齐的指针类型。例如不同类型对象可能有不同的对齐,指针被转换为void在转换成别的类型,对齐规则会改变。
解决方案:使用中间对象,使用C11 的alignas() 转换表示符。
规则:
不要通过不兼容类型的指针访问变量。
规则:
不要修改常量对象。
规则:
不要比较填充数据。不同情况下,填充数据并不确定是否都初始化。
规则:
使用restrict 限定的指针时避免未定义。指示指针访问的位移方式,同一个内存中有两个访问方式就会未定行为。
规则:
不要向sizeof _Alignof _Generic 传递有负作用的操作数。
规则:
不要在选择语句中执行赋值。
C/C++ 代码安全(二)
最新推荐文章于 2023-06-03 16:25:22 发布