SSA静态单赋值概念理解

SSA即静态单赋值,是一种中间表示形式,在程序正文中,每个变量只有一个定值。这个(静态的)定值可能位于一个可(动态)执行的多次循环中。静态单赋值几种形式:

(1) 当每个变量只有一个定值时,数据流分析和优化算法可以变得更简单。

(2) 如果一个变量有 N 个使用和 N 个定值,代码中可能是n+m条语句。表示定值-使用链所需要空间(和时间)和 N·M 成正比——即成平方增大。

(3) 静态单赋值形式中,变量的使用和定值可以与控制流图的必经节点结

构进行联系,从而简化诸如冲突图等算法。

(4) 源程序中的同一个变量的不相关使用在 SSA 形式中变成了不同的变量,从而删除了它们之间不必要的关系。

SSA是一种高效的数据流分析技术,运用在编译技术和代码静态分析技术中。目前几乎所有的现代编译器,如GCC、Open64、LLVM都有SSA技术的支持,不仅仅是编译器,Jikes RVM,、HotSpot JVM、.Net的Mono、Python的Pypy、 Andoroid的Dalvik,这些虚拟机/解释器中的Just-in-Time Compiler也有了SSA的支持。 Firefox的下一代JavaScript引擎IonMonkey中,也将为其JIT引入SSA。可以看到,几乎所有热门的语言所用的热门编译器/解释器/虚拟机中都有了SSA。在SSA中间表示中,可以保证每个被使用的变量都有唯一的定义,即SSA能带来精确的“使用—定义”关系。许多利用“使用—定义”关系的优化就能更精确、更彻底、更高效。

在代码静态检测技术上,可以发现下面集中如:

  1. 常量传播
  2. 未初始化变量
  3. 全局变量与局部变量重名

那么对于复杂的指针、数组之类的访存,SSA应该如何处理呢?数组和指针使得检测器无法确定define和use的具体变量。

给出了一种定义方式,通过引入maydef,mayuse和zero version使得检测器能对别名(即指针和数组)存在的程序做SSA分析。若通过指针为其所指区域赋值,就在此处插入maydef,表示可能对变量做了定义。同理,对使用指针所指向区域的值的,就插入一个mayuse。 因为无法确定指针所指向的到底是哪个变量,为了正确性,需要对所有变量都插入maydef动作。同样mayuse也是针对所有变量的。

当指针操作较多时,这种方式就会引入过多的新变量版本。因此就增加了zero version。 zero version的作用就是尽量把maydef所带来的版本数降低。将那些很可能不会别名的都使用相同的zero version。 比如某个变量通过maydef产生了一个新版本之后,若还会有新的maydef操作,则直接生成zero version,不再生成新的version。

本资料是根据多方资料,整理而成。

(完)

你可能感兴趣的:(代码安全)