静态分析入门
本文对应 成长路径 工程基础:在用户态与内核侧引入 静态检查,在编译前发现一类低级错误。
用户态:clang-tidy
clang-tidy src/*.c -- -Iinclude -std=c11- 与 compile_commands.json(
bear -- make)配合更准确。 - 规则集:
bugprone-*、modernize-*按需启用。
适合 C++ 应用 / 中间件;嵌入式可仅检查主机侧仿真代码。
用户态:cppcheck
cppcheck --enable=all --suppress=missingIncludeSystem src/- 零配置成本低;误报需
.cppcheck-suppress。 - CI 中可设
--error-exitcode=1阻断合并。
内核:sparse
make C=1 CHECK="sparse" -j$(nproc)检查 用户空间 / 内核空间 指针混用、__iomem 等。
内核:Coccinelle(语义补丁)
用于大规模 API 迁移、找固定模式 bug。学习曲线陡,团队有内核维护者时价值大。
与代码评审配合
静态分析 不能 替代 嵌入式代码评审清单;二者互补。
实践清单
- 为应用工程生成
compile_commands.json并跑通一次 clang-tidy - 内核树
make C=1对修改文件跑一次 sparse