6

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

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

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

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

我实际上正在使用 C 提前谢谢

4

2 回答 2

8

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

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

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

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

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

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

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

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

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

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

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

于 2012-10-14T17:42:02.820 回答
3

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

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

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

为赞恩的评论添加:

也许我的解释有点混乱。

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

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

总之,

  • 健全性:没有假阴性

  • 完整性:没有误报

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

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

于 2015-03-12T06:09:45.710 回答