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

来源:互联网 发布:企业级网络交换机 编辑:程序博客网 时间:2024/06/05 02:43
规则:声明的每一个对象都必须具有正确的存储期。对象的生命周期是程序执行的一部分,在此期间保证对象保留存储空间。任何形式的访问已经超出生命周期的行为都是未定义的。引用超出生命周期的对象,可能导致攻击者执行任意代码。规则:在使用前声明表示符,不要隐含类型。规则:不要声明具有冲突链接类别的表示符。规则:使用正确语法声明灵活数组成员,例如柔性数组。规则:避免在结构体填充中泄漏信息。例如从内核态到用户态,我们需要给因为内存对齐而产生的空挡一个填充,防止泄漏内核信息。解决方案:序列化填充,架构依赖,结构打包。规则:不要创建形同函数或者对象的不兼容声明。规则:不要在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/
0 0
原创粉丝点击