静态分析

静态分析是一种检查链接到已知错误的模式的代码的技术。使用此技术比代码审查耗时更少,但其检查仅限于工具中编程的检查。

检查可以包括 if 语句(if (var);)后面的不正确的分号,直到高级图算法确定变量是否未初始化。

编译器警告

启用静态分析很简单,最简单的版本已经在你的编译器中内置:

如果启用这些选项,你会注意到每个编译器都会发现其他编译器没有的错误,并且你将在特定上下文中可能有效或有效的技术上获得错误。即使 while (localBool); 不是,也可以接受 while (staticAtomicBool);

因此,与代码审查不同,你正在使用一种能够理解代码的工具,告诉你许多有用的错误,有时甚至不同意你的看法。在最后一种情况下,你可能必须在本地禁止警告。

由于上面的选项可以启用所有警告,因此它们可能会启用你不需要的警告。 (为什么你的代码应该与 C++ 98 兼容?)如果是这样,你可以简单地禁用该特定警告:

  • clang++ -Wall -Weverything -Werror -Wno-errortoaccept ...
  • g++ -Wall -Weverything -Werror -Wno-errortoaccept ...
  • cl.exe /W4 /WX /wd<no of warning>...

编译器警告在开发过程中为你提供帮助的地方,它们会使编译速度变慢。这就是为什么你可能并不总是希望默认启用它们。你可以默认运行它们,也可以使用更昂贵的支票(或所有支票)进行持续集成。

外部工具

如果你决定进行一些持续集成,那么使用其他工具并不是一件容易的事。像 clang-tidy 这样的工具有一系列检查 ,涵盖了广泛的问题,例如:

  • 实际的错误
    • 防止切片
    • 断言有副作用
  • 可读性检查
    • 误导性的缩进
    • 检查标识符命名
  • 现代化检查
    • 使用 make_unique()
    • 使用 nullptr
  • 性能检查
    • 查找不需要的副本
    • 找到效率低下的算法调用

列表可能不是那么大,因为 Clang 已经有很多编译器警告,但是它会让你更接近高质量的代码库。

其他工具

存在具有类似用途的其他工具,例如:

结论

C++存在很多静态分析工具,它们都作为外部工具在编译器中内置。试用它们并不需要花费太多时间来进行简单的设置,它们会在代码审查中发现你可能会错过的错误。