变量定义未使用就再次赋值
这条规则属于数据流分析规则,主要关注变量值的操作逻辑是否合理正确,如果不符合逻辑,就有可能隐藏代码问题。代码示例见表4。
表4 变量定义未使用就再次赋值代码示例表
if elseif分支语句末尾缺少else分支
这条规则属于控制流分析规则,主要关注程序的结构。需要在代码解析的基础上提取程序的控制流信息,程序的控制流用于决定分配给变量的特定值可能传播到程序的哪些部分。
如果存在某条路径中变量值与预期不一致,就有可能隐藏代码问题。代码示例见表5。
表5 if elseif分支语句末尾缺少else分支代码示例表
使用未初始化变量
程序在执行过程中变量位于内存中,内存中供用户使用的存储空间分为三部分:程序区、静态存储区、动态存储区。
全局变量全部存储在静态存储区;动态存储区主要存放:函数的形参、自动变量(没有加static的局部变量)、函数调用的现场保护和返回值。
在使用动态存储区变量前如果未对其赋初值就直接使用,由于变量值不确定,可能会发生无法预知的错误。代码示例见表6。
表6 使用未初始化变量代码示例表
数据类型不一致引入的隐式类型转换
当赋值变量与被赋值变量类型不相同时,需要进行数据类型转换的相关检查规则。
一般情况下,数据的类型的转换通常是由编译系统自动进行的,不需要人工干预,这种类型转换称为隐式类型转换。
但如果程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式转换。
图1 编译器自动提升规则 C语言编译器数据类型提升规则可以归纳为从长度小的数据类型向长度大的数据类型提升,称为向上转换;反之,称为向下转换。编译器自动转换规则见图1所示。
|