对于大型C/C++项目,一般是分模块开发的方式进行,代码量数十万或者更多。由于代码量的激增以及开发人员众多,代码出现bug的概率也随之增加。其中一部分问题是非执行过程引起的静态问题,如内存泄露、内存越界、野指针、逻辑模糊、死锁等等,在发布代码前可以借助一些检测工具进行代码分析,以排除静态bug。除了检查代码静态bug外,还可以判断代码复杂度、代码质量、代码执行效率等等,作为提高代码质量的依据。
静态代码分析的作用
静态代码分析是指无需运行被测代码,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。统计证明,在整个软件开发生命周期中,30% 至 50% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
在C++项目开发过程中,因为其为编译执行语言,语言规则要求较高,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。所以C++ 静态代码分析工具能够帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省开发成本。
静态代码分析工具的优势 :
- 帮助代码设计人员更专注于分析和解决代码设计缺陷。
- 减少在代码人工检查上花费的时间,提高软件可靠性并节省开发成本。
- 自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
主流业内C++静态代码分析工具横向对比
序号 | 名称 | 跨平台性 | 是否收费 | 流行度 | 能否自定义及扩展 | 主要特点 | 能否与SonarQube或GitLab集成 |
---|---|---|---|---|---|---|---|
1 | cppcheck | Windows/linux | free | 主流 | 能扩展、能自定义 | 侧重点于检查代码的逻辑 支持的一些检查包括: 1.变量检查 2.数组越界的界限检查 3.类检查(如:未使用的函数、变量初始化和内存复制) 4.Open Group中弃用或替代函数的使用 5.异常安全检查,如内存分配使用、析构函数检查等 6.内存泄漏,例如由于未进行解分配而丢失范围 7.资源泄漏,如忘记关闭文件句柄 8.标准模板库函数和习语的无效使用 9.使用unusedFunction选项消除死代码 杂项文体和性能错误 … (说明:其在静态扫描工具比对中,在内存泄漏的检测中表现较好) | 能直接与sonar-cxx集成 |
2 | cpplint | Windows/linux | free | 主流 | 能扩展、能自定义 | 侧重于代码风格的检查,检查代码是否符合 Google C++ Style Guide可定制规则,一般与 cppcheck 配合使用,能覆盖绝大部分静态代码检测项 | 能直接与sonar-cxx集成 |
3 动态代码扫描工具
valgrind dr.memory
4 实例
cpplint使用:
cppcheck使用: