静态分析入门

本文对应 成长路径 工程基础:在用户态与内核侧引入 静态检查,在编译前发现一类低级错误。


用户态:clang-tidy

clang-tidy src/*.c -- -Iinclude -std=c11
  • compile_commands.jsonbear -- 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

延伸阅读