【问题标题】:static and dynamic code analysis静态和动态代码分析
【发布时间】:2012-10-04 18:39:45
【问题描述】:

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

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

关于符号执行: 1. 哪里可以附上符号执行?我猜这取决于方法, 我想知道它们是动态分析,还是静态和动态混合分析是否可以确定。

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

我实际上正在使用 C 在此先感谢

【问题讨论】:

  • 下面的答案有什么遗漏吗?如果是,请告诉我。如果否,请将其标记为解决方案。赞恩。

标签: code-analysis static-code-analysis dynamic-analysis


【解决方案1】:

我试图给出一个简短的回答:

静态分析着眼于代码的句法结构并得出有关程序行为的结论。这些结论不一定总是正确的。

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

您还可以分析有关代码模式的代码。这样,这些工具可用于检查您是否遵守特定的编码标准。一个突出的编码标准示例是 MISRA。此编码标准用于安全关键系统并避免 C 中存在问题的构造。这样您就可以充分说明应用程序对内存泄漏、悬空指针等的鲁棒性。

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

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

这些方法非常强大,您可以从静态代码分析工具中获益良多,尤其是结合良好的编码标准。

我的软件团队发现真正令人印象深刻的一个功能是,例如当具有虚拟方法的类没有虚拟析构函数时,它将在 C++ 中告诉您。实际上很容易检查,但确实很有帮助。

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

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

抱歉 - 这已经很长了......希望它很有趣。

【讨论】:

  • 我正在开发一个商业静态分析器。恕我直言,符号执行和模型检查也是静态分析。这个答案的动态分析部分实际上解释了语义分析。
  • @ihji:象征性地运行一个程序就像为多个测试数据集并行运行它。检查模型上的谓词实际上是为一组测试数据并行执行它。确实,您会在测试文献中的“静态”下找到这两种技术。尽管如此,这两种技术都不仅查看控制流图,而且执行系统 ​​- 如上所述,它们考虑了控制流图中不可用的状态信息。
  • 我认为我们定义了“执行”的不同含义。我使用执行这个词来表示“执行编译的二进制文件”。也许您的定义更接近于“语义分析”或“估计语义”或“在分析器上解释程序”。
  • @ihji:我不想刻薄,只是想挑战你:正在运行 Java 应用程序“执行已编译的二进制文件”还是“符号执行”(使用单例每个可能的值)?
【解决方案2】:

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

静态分析采用各种形式化方法,例如抽象解释、模型检查和符号执行。一般来说,抽象解释或模型检查适用于软件验证。符号执行更适合用于查找错误。

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

为赞恩的评论添加:

也许我的解释有点混乱。

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

另一方面,当今大多数商业静态分析器积极使用的符号执行并不能保证可靠性,因为声音分析固有地会产生大量误报。为了发现错误,更重要的是减少误报,即使一些真阳性也丢失了。

总之,

  • 稳健性:没有误报

  • 完整性:没有误报

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

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

【讨论】:

  • 什么意思:模型检查适合软件验证,而符号执行更适合bug查找?模型检查已用于查找错误,请参见例如音频/视频协议的形式化建模和分析:使用 UPPAAL 的工业案例研究。
  • @Zane 我编辑了这篇文章,因为这里评论太长了:-)
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多