我试图给出一个简短的答案:
静态分析着眼于代码的句法结构并得出有关程序行为的结论。这些结论不一定总是正确的。
静态分析的一个典型示例是数据流分析,您可以在其中为每个语句计算used
,read
等集合。write
这将有助于找到例如未初始化的值。
您还可以分析有关代码模式的代码。这样,这些工具可用于检查您是否遵守特定的编码标准。一个突出的编码标准示例是 MISRA。该编码标准用于安全关键系统,并避免了 C 中有问题的构造。通过这种方式,您已经可以说很多关于您的应用程序对内存泄漏、悬空指针等的鲁棒性。
动态分析不仅仅查看语法,还考虑了状态信息。在符号执行中,您将关于所有变量的可能值的假设添加到语句中。
最昂贵和最强大的动态分析方法是模型检查,您可以在其中真正查看系统所有可能的执行状态。您可以将模型检查系统视为以 100% 覆盖率进行测试的系统 - 但当然有很多实际问题会阻止以这种方式检查真实系统。
这些方法非常强大,您可以从静态代码分析工具中获益良多,尤其是与良好的编码标准结合使用时。
我的软件团队发现真正令人印象深刻的一个功能是,例如,当具有虚拟方法的类没有虚拟析构函数时,它会在 C++ 中告诉您。实际上很容易检查,但确实很有帮助。
商业工具非常昂贵,但一旦您学会了如何使用它们,就物有所值。一开始的一个典型问题是你会得到很多误报,不知道从哪里寻找真正的问题。
请注意,现在 g++ 已经内置了一些这些东西,并且您可以使用免费的 pclint 之类的东西。
抱歉 - 这已经很长了......希望它很有趣。