让我们来定义一个分析,目标是确保所有的变量都被初始化(例如在被读取之前,都有写入值)。Java编译器执行类似的分析,以检查在访问局部变量的值时,每个局部变量是否都有一个明确赋值的值。这个可以通过计算,在每个程序点那么一定被初始化的变量的集合。我们需要确定的信息,因此是一个must分析。因此,我们的抽象状态的格,是所有出现的变量的幂集合;格的偏序关系是集合的超集合关系。这意味着我们的约束是以前驱和交集的形式表达的。基于这一点,约束规则几乎可以自行确定。
只有赋值语句影响哪些变量是初始化的状态,因此其他CFG节点的约束规则同符号分析相同。
利用初始化变量分析的结果,缺陷检测工具能够知道在变量使用的位置,每一个变量的初始化情况;如果没有初始化就是错误。有一些错误是无意义的,因此可以不报告:
main() {
var x;
return x;
}