0%

【论文笔记】Compiler Validation via Equivalence Modulo Inputs

原文:Compiler Validation via Equivalence Modulo Inputs (PLDI’14)

Equivalence Modulo Inputs (EMI)

  • 给定程序$P$和一组输入值$I$,由$I$可生成一组程序集合$\mathcal{P}$,使得$\mathcal{P}$中每个程序$Q$都等价于$P$ modulo $I$:$\forall i \in I, Q(i) = P(i) $。则集合$\mathcal{P}$可用于对任意一个编译器$Comp$进行差分测试(differential testing),若存在某个$i \in I$和$Q \in \mathcal{P}$,使得$Comp(P)(i) \neq Comp(Q)(i)$,则该编译器存在bug。

  • 核心思想:尽管$Q$只在输入集合$I$上与程序$P$语义等价,但编译器及其使用的静态分析和优化算法应该能为$Q$生成能在$I$上完全运行正确的中间代码。$P$和$Q$在数据流和控制流上可能很不同,经编译器优化后生成的代码也很不同,但结果应该完全一致。

    emi

  • 生成EMI 变体的策略

    • 在$P$上运行输入集合$I$,获得运行轨迹,随机在未执行代码上做剪枝、插入、修改操作(假设$P$是一个确定的程序)

编译器的两类bug:

  • 导致编译器崩溃
  • 生成错误代码(更加严重)
    • 导致正确的程序运行有bug
    • 难以发现