C/C++ 代码审查:编译器静态与动态分析工具实践
前言 作为 C/C++ 开发者,你手上最强大的代码审查工具不是某个第三方软件,而是你每天都在用的编译器本身。GCC 和 Clang 都内置了完整的静态分析和动态分析能力,零成本、零额外依赖。 本文聚焦两类工具: 静态分析(不运行程序):编译器警告、GCC -fanalyzer、Clang Static Analyzer (--analyze / scan-build)、clang-tidy 动态分析(运行程序时捕获问题):AddressSanitizer (ASan)、ThreadSanitizer (TSan)、MemorySanitizer (MSan)、UndefinedBehaviorSanitizer (UBSan) cppcheck、Valgrind 等第三方工具仅在文末作对比参考。 第一部分:静态分析(编译器自带) 1.1 编译器警告:零成本第一道防线 警告不是可选的,-Werror 是 CI 和本地开发的底线(发布构建可以酌情关闭,避免新编译器版本引入的新警告中断发布流程)。 推荐的最小警告集(GCC 和 Clang 通用) # 所有构建必开 -Wall -Wextra -Wpedantic -Werror # 推荐再加这些 # 注意:GCC 中 -Wconversion 不包含有符号/无符号隐式转换,需单独加 -Wsign-conversion # Clang 中 -Wconversion 默认包含两者 -Wshadow -Wconversion -Wsign-conversion -Wnull-dereference -Wformat=2 -Wundef -Wunused -Wcast-align -Wcast-qual -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast GCC 特有警告 选项 起始版本 说明 -Weffc++ 很早 Effective C++ 规则集 -Wstringop-overflow=4 GCC 11 字符串操作溢出(需 -O2 才触发,级别 1-4,数字越大越严格) -Wdangling-reference GCC 13 悬垂引用检测 -Wstrict-overflow=5 GCC 4.x 有符号整数溢出假设(需 -O2 才触发,级别 1-5) -Warray-bounds 很早 数组越界(需 -O2 才触发) Clang 特有警告 选项 说明 -Weverything 启用所有警告(不要在 CI 用,新警告会断构建) -Wno-c++98-compat 忽略 C++98 兼容性(现代项目通常不需要) -Wdocumentation Doxygen 文档注释格式检查 -Wthread-safety 线程安全注解检查(代码中需加注解) 1.2 GCC -fanalyzer:路径敏感静态分析 GCC 10 引入,GCC 11 完全重写。基于符号执行,能发现跨函数、跨路径的深度 Bug。 ...