静态分析
静态分析是一种检查链接到已知错误的模式的代码的技术。使用此技术比代码审查耗时更少,但其检查仅限于工具中编程的检查。
检查可以包括 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 已经有很多编译器警告,但是它会让你更接近高质量的代码库。
其他工具
存在具有类似用途的其他工具,例如:
- visual studio 静态分析仪作为外部工具
- clazy ,一个用于检查 Qt 代码的 Clang 编译器插件
结论
C++存在很多静态分析工具,它们都作为外部工具在编译器中内置。试用它们并不需要花费太多时间来进行简单的设置,它们会在代码审查中发现你可能会错过的错误。