静态分析和符号执行的实现有什么区别?
答案 0 :(得分:2)
静态分析是任何检查代码并产生关于代码质量的意见的离线计算。您可以将其应用于源代码,Java / C#/ ...虚拟机指令集的虚拟机代码,甚至二进制目标代码。没有"一个"静态分析(尽管经典的编译器控制和数据流通常是SA的基础机制);该术语共同适用于可以脱机使用的所有类型的机制。
符号执行是一种特定的离线计算,它通过构造表示不同点的程序状态的公式来计算程序实际执行的某些近似值。它被称为"象征性的"因为近似通常是某种涉及程序变量和对其值的约束的公式。
静态分析可以使用符号执行并检查生成的公式。或者它可能使用一些其他技术(正则表达式,经典编译器流分析,......)或某种组合。但静态分析不必使用符号执行。
符号执行可以仅用于显示计算的预期符号结果。根据上述定义,这不是静态分析,因为没有任何关于结果有多好的意见。或者,可以对公式进行分析,此时它将成为静态分析的一部分。实际上,人们可以使用其他程序分析技术来支持符号执行("变量的这个公式被传播到变量x的读取?"这个问题通常通过流程分析很好地回答)。 / p>
您可能会坚持静态分析是对源代码的任何离线计算,此时符号执行只是一种特殊情况。我不觉得这个定义有用,因为它不能很好地区分用例。
答案 1 :(得分:1)
我非常喜欢Julian Cohen's Contemporary Automatic Program Analysis talk的幻灯片。简而言之,人们喜欢将程序分析分为两大类静态和动态分析。但实际上有广泛的程序分析技术,从静态到动态,手动到全自动。符号执行是一种有趣的技术,介于静态和动态分析之间,通常用作全自动方法。