我发现了关于这个主题的几个问题,并且所有这些问题都有很多参考,但我仍然没有清楚的想法,因为大多数参考文献都是关于具体的工具,而不是关于一般的概念。分析。因此我有一些问题:
关于静态分析: 1.我希望有一个参考,或总结哪些技术是成功的,现在更具相关性。 2.他们真正能够发现错误,我们可以做一个摘要,还是取决于工具?
关于符号执行: 1.哪里可以附上象征性执行?我猜这取决于方法, 我想知道它们是动态分析,还是静态和动态分析的混合,如果可以确定的话。
我找到了区分工具中两种不同技术的问题,即使我认为我知道理论上的差异。
我实际上在和C合作 提前致谢
答案 0 :(得分:8)
我想简短回答一下:
静态分析着眼于代码的语法结构,并得出有关程序行为的结论。这些结论必须始终不正确。
静态分析的典型示例是数据流分析,您可以为每个语句计算used
,read
,write
等集合。这有助于找到例如未初始化的价值观。
您还可以分析有关代码模式的代码。这样,这些工具可用于检查您是否符合特定的编码标准。一个突出的编码标准示例是MISRA。这种编码标准用于安全关键系统,避免了C语言中的问题构造。这样你就已经可以说很多关于你的应用程序对内存泄漏,悬空指针等的健壮性。
动态分析不是仅考虑语法,而是考虑状态信息。在符号执行中,您将对所有变量的可能值添加假设。
最昂贵,最强大的动态分析方法是模型检查,您可以在其中查看系统的所有可能执行状态。您可以将模型检查系统视为一个100%覆盖率测试的系统 - 但当然有许多实际问题会阻止以这种方式检查实际系统。
这些方法功能非常强大,您可以从静态代码分析工具中获益良多,特别是在与良好的编码标准相结合时。
我的软件团队发现的功能非常令人印象深刻,例如当具有虚方法的类没有虚拟析构函数时,它将在C ++中告诉您。事实很容易检查,但真的很有帮助。
商业工具非常昂贵,但是一旦你学会了如何使用它们就值钱。一开始的典型问题是你会得到很多误报,并且不知道在哪里寻找真正的问题。
请注意,现在g ++已经内置了一些这样的东西,并且你可以使用像pclint这样的免费内容。
抱歉 - 这已经很久了......希望它很有意思。
答案 1 :(得分:2)
术语"静态分析"表示分析实际上不运行代码。另一方面,"动态分析"运行代码,还需要一些真正的测试输入。这就是定义。没什么。
静态分析采用各种形式方法,如抽象解释,模型检查和符号执行。通常,抽象解释或模型检查适用于软件验证。符号执行更适合于查找错误。
符号执行 分类为静态分析。但是,有一种称为concolic execution的混合方法,它使用符号执行和动态测试。
添加了Zane的评论:
也许我的解释有点混乱。
软件验证和错误发现之间的区别在于分析是否合理。例如,当我们说缓冲区溢出分析仪是合理的时,这意味着分析仪必须报告所有可能的缓冲区溢出。如果分析器没有报告任何内容,则证明目标程序中没有缓冲区溢出。因为模型检查是保证健全性的方法,所以它主要用于软件验证。
另一方面,当今最商业化的静态分析仪积极使用的符号执行并不能保证稳健性,因为声音分析固有地发出大量误报。为了发现错误,即使某些真阳性也被丢失,减少误报也更为重要。
总之,
健全性:没有漏报
完整性:没有误报
软件验证:健全性比完整性更重要
发现错误:完整性比健全性更重要