Validation 实现中的静态分析与符号执行

Validation 实现中的静态分析与符号执行,validation,testing,static-analysis,verification,symbolic-execution,Validation,Testing,Static Analysis,Verification,Symbolic Execution,静态分析的实现和符号执行有什么区别?静态分析是任何检查代码并对代码质量发表意见的离线计算。您可以将其应用于源代码,应用于Java/C/…的虚拟机代码。。。虚拟机指令集,甚至是二进制目标代码。没有一个静态的分析,虽然经典的编译器控制和数据流常常突出作为SA的基础机械;该术语共同适用于可能脱机使用的所有类型的机制 符号执行是一种特殊的离线计算,它通过构造表示程序在不同点的状态的公式来计算程序实际执行的近似值。之所以称之为符号,是因为近似值通常是某种公式,涉及程序变量及其值的约束 静态分析可以使用符号

静态分析的实现和符号执行有什么区别?

静态分析是任何检查代码并对代码质量发表意见的离线计算。您可以将其应用于源代码,应用于Java/C/…的虚拟机代码。。。虚拟机指令集,甚至是二进制目标代码。没有一个静态的分析,虽然经典的编译器控制和数据流常常突出作为SA的基础机械;该术语共同适用于可能脱机使用的所有类型的机制

符号执行是一种特殊的离线计算,它通过构造表示程序在不同点的状态的公式来计算程序实际执行的近似值。之所以称之为符号,是因为近似值通常是某种公式,涉及程序变量及其值的约束

静态分析可以使用符号执行并检查结果公式。或者它可能会使用一些其他技术正则表达式,经典的编译器流分析。。。或者某种组合。但是静态分析不必使用符号执行

符号执行可能仅用于显示计算的预期符号结果。根据上述定义,这不是静态分析,因为没有任何关于结果有多好的意见。或者,可以对公式进行分析,此时它将成为静态分析的一部分。实际上,可以使用其他程序分析技术来支持符号执行。变量的这个公式传播到变量x的哪个读取?这是一个流动分析通常能很好回答的问题


您可能会坚持认为静态分析是源代码上的任何离线计算,此时符号执行只是一个特例。我觉得这个定义没有什么帮助,因为它不能很好地区分用例。

静态分析是任何检查代码并对代码质量提出意见的离线计算。您可以将其应用于源代码,应用于Java/C/…的虚拟机代码。。。虚拟机指令集,甚至是二进制目标代码。没有一个静态的分析,虽然经典的编译器控制和数据流常常突出作为SA的基础机械;该术语共同适用于可能脱机使用的所有类型的机制

符号执行是一种特殊的离线计算,它通过构造表示程序在不同点的状态的公式来计算程序实际执行的近似值。之所以称之为符号,是因为近似值通常是某种公式,涉及程序变量及其值的约束

静态分析可以使用符号执行并检查结果公式。或者它可能会使用一些其他技术正则表达式,经典的编译器流分析。。。或者某种组合。但是静态分析不必使用符号执行

符号执行可能仅用于显示计算的预期符号结果。根据上述定义,这不是静态分析,因为没有任何关于结果有多好的意见。或者,可以对公式进行分析,此时它将成为静态分析的一部分。实际上,可以使用其他程序分析技术来支持符号执行。变量的这个公式传播到变量x的哪个读取?这是一个流动分析通常能很好回答的问题


您可能会坚持认为静态分析是源代码上的任何离线计算,此时符号执行只是一个特例。我觉得这个定义没有什么帮助,因为它没有很好地区分用例。

我真的很喜欢这张幻灯片。简而言之,人们喜欢将程序分析分为两大类:静态分析和动态分析。但实际上有一系列广泛的程序分析技术,从静态到动态,从手动到全自动。符号执行是一种有趣的技术,介于静态和动态分析之间,通常作为全自动方法应用


我真的很喜欢这张幻灯片。简而言之,人们喜欢将程序分析分为两大类:静态分析和动态分析。但实际上有一系列广泛的程序分析技术,从静态到动态,从手动到全自动。符号执行是一种有趣的技术,介于静态和动态分析之间,通常作为全自动方法应用


谢谢在一般情况下,哪种实现更省时?哪种实现更省时?这与实施的努力无关。你选择了一种技术/
从您拥有的一系列选择中选择架构以实现目标。但如果没有一个明确的目标声明,你就无法对其中哪一个更明智进行排名。如果你没有明确的目标,只想做最少的工作,你就什么也不做。现在,你心里可能有一个明确的任务。您将发现,无论您希望使用哪种技术,它们都需要花费大量时间从头开始构建。如果您想实现您的目标,您应该做的是以一种灵活集成的方式获得您需要的技术,以便您可以集中精力调整它们以解决您的特定问题。我的经验是,你们通常不能一起找到这些,所以我着手解决这个问题。看,我这么说是因为我的时间有限。当我阅读有关静态分析的文章,例如链接,并将其与您在中所说的内容进行比较时,我发现了一些相似之处,例如,它们都使用抽象语法树。我不清楚他们在实现和使用的技术方面有什么不同。你最好的办法是利用社区中其他人痛苦获得的理解和经验。抽象语法树是一个不错的主意,但是像大多数人那样做会增加复杂性。信不信由你,如果你不想让抽象部分产生更多的工作,你需要从具体语法树派生抽象语法树。看见但到目前为止,树木是最简单的部分;解析后的生活告诉你你在实践中需要什么,如果你想尊重你的时间有限这一事实的话。否则你会彻底改变一切,很糟糕。谢谢。在一般情况下,哪种实现更省时?哪种实现更省时?这与实施的努力无关。您可以从一系列选择中选择一种技术/体系结构来实现一个目标。但如果没有一个明确的目标声明,你就无法对其中哪一个更明智进行排名。如果你没有明确的目标,只想做最少的工作,你就什么也不做。现在,你心里可能有一个明确的任务。您将发现,无论您希望使用哪种技术,它们都需要花费大量时间从头开始构建。如果您想实现您的目标,您应该做的是以一种灵活集成的方式获得您需要的技术,以便您可以集中精力调整它们以解决您的特定问题。我的经验是,你们通常不能一起找到这些,所以我着手解决这个问题。看,我这么说是因为我的时间有限。当我阅读有关静态分析的文章,例如链接,并将其与您在中所说的内容进行比较时,我发现了一些相似之处,例如,它们都使用抽象语法树。我不清楚他们在实现和使用的技术方面有什么不同。你最好的办法是利用社区中其他人痛苦获得的理解和经验。抽象语法树是一个不错的主意,但是像大多数人那样做会增加复杂性。信不信由你,如果你不想让抽象部分产生更多的工作,你需要从具体语法树派生抽象语法树。看见但到目前为止,树木是最简单的部分;解析后的生活告诉你你在实践中需要什么,如果你想尊重你的时间有限这一事实的话。否则你会彻底改变一切,很糟糕。谢谢。你知道静态分析(例如编译器可以检测到什么样的错误,而符号执行无法检测到什么样的错误)吗?这很难说,尤其是在注释中。静态分析处理路径可行性问题,而动态分析倾向于处理路径覆盖问题。符号分析在某种程度上介于两者之间,它通过在分支处逻辑地分叉分析并求解一组可满足的约束来处理状态空间爆炸。我见过的大多数实现都在SAT/SMT解算器中花费大量的处理时间。这也很难回答,因为许多实现都是技术的混合。例如,静态分析可以是全自动的。我在这个链接中提出了新的问题:谢谢。你知道静态分析(例如编译器可以检测到什么样的错误,而符号执行无法检测到什么样的错误)吗?这很难说,尤其是在注释中。静态分析处理路径可行性问题,而动态分析倾向于处理路径覆盖问题。符号分析在某种程度上介于两者之间,它通过在分支处逻辑地分叉分析并求解一组可满足的约束来处理状态空间爆炸。我见过的大多数实现都在SAT/SMT解算器中花费大量的处理时间。这也很难回答,因为许多实现都是技术的混合。例如,静态分析可以是全自动的。我在这个链接中提出了新的问题: