博客 阅读时间 3 分钟

为什么您应该真正关心 C/C++ 静态分析?

分享本文
Why should you care about C/C++ static analysis?

许多资源都讨论过使用静态分析工具的好处,以及它们如何帮助您改进代码库。它们告诉您使用这些工具能获得什么。但您是否问过自己:不使用它们,您会失去什么?

举个例子,比如重复释放指针导致的内存损坏,它可能引发随机崩溃。要找出这类问题,可能需要几个小时到几天的时间。C/C++ 中存在许多类似的高风险问题,尤其是与内存损坏相关的问题。单个问题造成的损失可能从几美元到数千美元不等。

问题的影响还取决于程序的性质:控制机器的嵌入式应用程序中出现问题,与绘图应用程序崩溃,其后果完全不同。有时,单个问题可能造成数百万甚至数十亿美元的损失,例如阿丽亚娜 5 号火箭,一个 Bug 就造成了 70 亿美元的损失。

如果使用静态分析工具,您会失去什么?

让我们以Cppcheck为例;它主要检测编译器通常检测不到的那类 Bug。这个工具能报告许多有意思的错误。

下载只需不到一分钟,配置大约需要 20 分钟;分析过程从几分钟到几小时不等,但在此期间您可以自由地做其他工作。分析完成后,您可能会得到数千个潜在问题;一开始,您可以只关注优先级最高的错误。

最后,使用免费的静态分析工具,您只损失30 分钟,就能得到一份潜在问题清单,而这些问题可能会让您损失数千美元。

对于商业工具,您损失的不仅是时间:还得付费购买。也就是说,您还会损失金钱。假设您花 1000 美元购买了一个工具,它帮您找到了一个原本需要开发者两三天才能发现的问题。一名 C/C++ 开发者三天的工作成本可能超过 1000 美元——当然这取决于公司所在地。但如果把单个问题的隐性成本考虑进去,您可能会惊讶于一个看似简单的问题会给公司带来多大的损失。网上有许多关于简单问题造成高昂代价的故事。

以下是一些免费的静态分析工具:

CppCheck(免费):Cppcheck 提供了许多检查项;以下是其中一部分:

  • 越界检查
  • 异常安全检查
  • 内存泄漏检测
  • 对使用已过时函数发出警告
  • 检查对STL 的不当使用
  • 检查未初始化的变量和未使用的函数

Clang(免费):是一个 C/C++ 编译器;它的诊断信息非常有价值,您可能会对它报告的相关问题感到惊讶。这些问题可能涉及:

  • 过时用法
  • 类型转换问题
  • 初始化问题
  • OpenMP 问题等等。

Clang-tidy(免费):是一个基于 Clang 的 C++"代码检查"(linter) 工具。它的目标是提供一个可扩展的框架,用于诊断和修复典型的编程错误,如风格违规、接口误用,或可通过静态分析推断出的 Bug。clang-tidy采用模块化设计,并为编写新检查项提供了便捷的接口。这里是 clang-tidy 的检查项列表。

还有许多其他静态分析工具。有些很容易试用,而另一些则需要您联系供应商申请试用版。

如果您能抽出 30 分钟试试 Cppcheck,这段时间很可能花得非常值得。

总结

最好结合多种 C++ 工具来检测代码库中的问题:有些工具检测 Bug,另一些还能检测容易滋生 Bug 的隐患。您可以从免费工具入手,检查它们报告的问题。

分享本文