繁体   English   中英

静态和动态代码分析

[英]static and dynamic code analysis

我发现了关于这个主题的几个问题,并且所有这些问题都有很多参考,但我仍然没有清楚的想法,因为大多数参考文献都是关于具体工具而不是关于分析的一般概念。 因此我有一些问题:

关于静态分析:1。我想有一个参考,或者总结哪些技术是成功的,并且现在更具相关性。 2.他们真正可以做些什么来发现错误,我们可以做一个摘要,还是取决于工具?

关于符号执行:1。哪里可以包含符号执行? 我想根据方法,我想知道它们是动态分析,还是静态和动态分析的组合,如果可以确定的话。

我发现了在工具中区分两种不同技术的问题,即使我认为我知道理论上的差异。

我实际上是在提前与C合作

我想简单回答一下:

静态分析着眼于代码的语法结构,并得出关于程序行为的结论。 这些结论必须始终不正确。

静态分析的典型示例是数据流分析,您可以在其中计算每个语句的usedreadwrite等集合。 这将有助于找到例如未初始化的值。

您还可以分析有关代码模式的代码。 这样,这些工具可用于检查您是否符合特定的编码标准。 一个突出的编码标准示例是MISRA。 此编码标准用于安全关键系统,并避免使用C语言中存在问题的结构。这样,您就已经可以说很多关于应用程序对内存泄漏,悬空指针等的健壮性。

动态分析不仅仅考虑语法,而是考虑状态信息。 在符号执行中,您将向语句添加有关所有变量的可能值的假设。

最昂贵和最强大的动态分析方法是模型检查,您可以在其中查看系统的所有可能的执行状态。 您可以将模型检查系统视为以100%覆盖率进行测试的系统 - 但是当然存在许多阻止以这种方式检查实际系统的实际问题。

这些方法非常强大,您可以从静态代码分析工具中获得很多,特别是与良好的编码标准相结合时。

我的软件团队发现的一个功能非常令人印象深刻,例如它会在C ++中告诉您何时使用虚方法的类没有虚拟析构函数。 事实很容易检查,但真的很有帮助。

商业工具非常昂贵,但是一旦你学会了如何使用它们就值钱。 一开始的典型问题是你会得到很多误报,并且不知道在哪里寻找真正的问题。

请注意,现在g ++已经内置了一些这样的东西,你可以使用免费的pclint之类的东西。

对不起 - 这已经很久了...希望它很有趣。

术语“静态分析”意味着分析实际上不运行代码。 另一方面,“动态分析”运行代码并且还需要某些类型的实际测试输入。 这就是定义。 而已。

静态分析采用各种形式方法,如抽象解释,模型检查和符号执行。 通常,抽象解释或模型检查适用于软件验证。 符号执行更适合于查找错误的目的。

象征性的执行分为静态分析。 但是,有一种称为concolic execution的混合方法,它使用符号执行和动态测试。

为Zane的评论添加:

也许我的解释有点混乱。

软件验证和错误发现之间的区别在于分析是否合理。 例如,当我们说缓冲区溢出分析仪是声音时,这意味着分析仪必须报告所有可能的缓冲区溢出。 如果分析器没有报告任何内容,则证明目标程序中没有缓冲区溢出。 因为模型检查是保证健全性的方法,所以它主要用于软件验证。

另一方面,当今最商业化的静态分析仪主动使用的符号执行并不能保证稳健性,因为声音分析固有地发布了大量的误报。 为了发现错误,即使某些真阳性也丢失,减少误报也更为重要。

综上所述,

  • 健全:没有假阴性

  • 完整性:没有误报

  • 软件验证:健全性比完整性更重要

  • 发现错误:完整性比健全更重要

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM