Finding Deep Compiler Bugs via Guided Stochastic Program Mutation
背景知识
Markov Chain Monte Carlo(MCMC)
- Monte Carlo:在目标分布 p ( X ) p(X) p(X)定义的高维空间 X \mathcal{X} X中进行采样的方法
- 马尔可夫链:下一个状态只和当前状态相关,且分布为 q ( X t + 1 ∣ X t ) q(X_{t+1}|X_t) q(Xt+1∣Xt)
- MCMC:在 X \mathcal{X} X中使用马尔可夫链来进行抽样,这允许从重要地区提取更多样本
- Metropolis-Hasting(MH): A ( X → X ∗ ) = m i n ( 1 , p ( X ∗ ) q ( X ∣ X ∗ ) p ( X ) q ( X ∗ ∣ X ) ) \mathcal{A}(X \to X^*) = min(1, \frac{p(X^*)q(X|X^*)}{p(X)q(X^*|X)}) A(X→X∗)=min(1,p(X)q(X∗∣X)p(X∗)q(X∣X∗))
- Metropolis: A ( X → X ∗ ) = m i n ( 1 , p ( X ∗ ) p ( X ) ) \mathcal{A}(X \to X^*) = min(1, \frac{p(X^*)}{p(X)}) A(X→X∗)=min(1,p(X)p(X∗))
实施
距离函数(基于控制流图)
△ ( Q ; P ) = α ∗ d ( V Q , V P ) + β ∗ d ( E Q , E P ) − γ ∗ ∣ Q − P ∣ \triangle (Q;P) = \alpha * d(V_Q,V_P) + \beta * d(E_Q,E_P) - \gamma * |Q - P| △(Q;P)=α∗d(VQ,VP)+β∗d(EQ,EP)−γ∗∣Q−P∣
MCMC Sampling
- 当应用于优化时,MCMC采样器更经常地从目标值较高的区域提取样本 (ones with larger program distances)
- 将目标函数转换为密度分布 p ( Q ; P ) = 1 Z e x p ( σ △ ( Q ; P ) ) p(Q;P) = \frac{1}{Z} exp(\sigma \triangle(Q;P)) p(Q;P)=Z1exp(σ△(Q;P))
- 转换概率: A ( Q → Q ∗ ; P ) = m i n ( 1 , e x p ( σ ( △ ( Q ∗ ; P ) − △ ( Q ; P ) ) ) q ( Q ∣ Q ∗ ) q ( Q ∗ ∣ Q ) ) \mathcal{A}(Q \to Q^*;P) = min(1, exp(\sigma (\triangle(Q^*;P) - \triangle(Q;P))) \frac{q(Q|Q^*)}{q(Q^*|Q)}) A(Q→Q∗;P)=min(1,exp(σ(△(Q∗;P)−△(Q;P)))q(Q∗∣Q)q(Q∣Q∗))
插入新的代码
- 广度优先遍历,统计变量
- 使用“while(0);”替代被删除的代码,保证程序是可以遍历的,利于采样
Athena
Extracting Statement Candidates
- stmt-extractor(tool)
- LLVM’s Libtooling library
Proposing Variants
- Transformation
- Statement Renaming
- Discussion
- 搜索空间不对称
实验
- 数据:Csmith
- 候选程序:种子程序中的语句
- 最好的选择:随机采样