C++静态代码分析工具横向对比
C++静态代码分析工具横向对比
1 前言
静态代码分析是指无需运行被测代码,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
在C++项目开发过程中,因为其为编译执行语言,语言规则要求较高,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。所以C++ 静态代码分析工具能够帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省开发成本。
静态代码分析工具的优势 :
1. 自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 减少在代码人工检查上花费的时间,提高软件可靠性并节省开发成本。
2 主流业内C++静态代码分析工具横向对比
序号 | 名称 | 流行度 | 跨平台性 | 是否收费 | 能否与SonarQube或GitLab集成 | 能否自定义及扩展 | 主要特点 |
1 | cppcheck | 主流 | Windows/linux | free | 能直接与sonar-cxx集成 | 能扩展、能自定义 | 侧重点于检查代码的逻辑 支持的一些检查包括: 1.动变量检查 2.数组越界的界限检查 3.类检查(如:未使用的函数、变量初始化和内存复制) 4.Open Group中弃用或替代函数的使用 5.异常安全检查,如内存分配使用、析构函数检查等 6.内存泄漏,例如由于未进行解分配而丢失范围 7.资源泄漏,如忘记关闭文件句柄 8.标准模板库函数和习语的无效使用 9.使用unusedFunction选项消除死代码 杂项文体和性能错误 ...(说明:其在静态扫描工具比对中,在内存泄漏的检测中表现较好) |
2 | cpplint | 主流 | windows/linux/mac os | free | 通过格式转换与sonar-cxx集成 | 能扩展、能自定义 | 侧重于代码风格的检查 检查代码是否符合 Google C++ Style Guide 可定制规则,主流几个大厂均在使用,一般与 cppcheck 配合使用,能覆盖绝大部分静态代码检测项 |
3 | coverity | 主流 | windows/linux/mac os | 付费 | 暂未发现集成方式 | 商业软件/难扩展/能自定义 | 1. 在主流静态代码扫描工具中,其功能比较全面,价格也较贵。 2. 在准确性、规则覆盖上较其他单项静态扫描工具有优势。 3. 但其也有漏报率较多,在联网情况下,可能出现泄漏代码的问题。如离线情况,可不考虑。 |
4 | pclint | 主流 | Windows/linux | 付费 | 能直接与sonar-cxx集成 | 商业软件/难扩展 | 1. 在主流静态代码扫描工具对比中,其规则总数是最多的,扫描效率亦较高 2. 但在准确率上面,较其他工具要低,对这方面有严格要求的话,慎用。 |
5 | clang | 主流 | linux/mac os | free | 暂未发现集成方式 | 能扩展 | 1. 可扩展为 clang-tidy,用于诊断和修复典型的编程错误,如样式违规、界面错误或通过静态分析推导出的BUG。 2. 其本身与 GCC 高度兼容,可作为其替代方案。 |
6 | PVS-Studio | 一般 | windows/linux/mac os | 付费 | 能直接与sonarqube集成 | 商业软件/难扩展 | 相对于其它免费开源的静态检测工具,其功能完备性更加明显,在价位上也较 Coverity 要低。 相对于其它免费开源的静态检测工具,其有如下独特点: 1. 与Visual Studio 2010-2019的简单无缝集成 2. 可以定时检查 3. 可直接将结果存储为 HTML 4. 分析提交、合并和提取请求——可以将分析器配置为仅分析修改后的文件。 5. 可对最近N天内修改过的文件进行分析。 |
7 | tscancode | 腾讯自研 | windows/linux/mac os | free | 待研究 | 可扩展 | 在准确率和扫描速率上较其他静态扫描工具有优势,但其实腾讯内部自研,规则项还是较少。 支持的一些检查包括: 1.空指针检查,包含可疑的空指针,判空后解引用比如Crash等共3类subid检查。 2.数据越界,Sprintf_S越界共1类subid检查。 3.内存泄漏,分配和释放不匹配同1类subid检查。 4.逻辑错误,重复的代码分支,bool类型和INT进行比较,表达式永远True或者false等共18类检查。 5.可疑代码检查,if判断中含有可疑的=号,自由变量返回局部变量等共计15类检查。 6.运算错误,判断无符号数小于0,对bool类型进行++自增等,共计11类检查。 |
3 动态代码扫描工具
valgrind dr.memory
4 参考文档
1. C&C++代码编译和分析工具探究 |
2. List of tools for static code analysis |
3. 国内外主流静态分析类工具汇总 |
4. 静态代码分析工具汇总 |
5. 腾讯测试团队-C++代码质量扫描主流工具深度比较 |
6. 代码静态检测 |
7. PVS-Studio Analyzer |