clang-tidy——静态代码分析框架

clang-tidy介绍

clang-tidy是一个基于clang的静态代码分析框架,支持C++/C/Objective-C。

它是一个功能更强大的lint工具。绝大部分lint工具只能在出现问题的代码地方给出提示,之后需要人为修改,而clang-tidy则能够自动修复功能(当然这个如何修复需要该check作者提供);并且clang-tidy采用模块化设计,非常容易扩展。如果用户想往clang-tidy添加一个新的检测功能,只需要编写一个clang-tidy check实现(如何编写一个clang-tidy check以后将会有一章详细介绍),每一个check检测一种问题,例如检测某个违反Code style的模式,检测某些API不正确使用的方法等等。

clang-tidy check可以检测各式各样的问题:

  • 检测违反代码规范的代码模式(header guard不满足,include头文件顺序错误);
  • 找出不容易在编译时发现的代码错误(把int赋值给std::string, 变量定义在头文件);
  • 把deprecated的API替换成新的API,modernize模块典型例子,把C++03的代码自动转换成C++11的代码(for-range-loop, auto, nullptr, overriede, default);

Google code style提供了cpplint脚本,用于检测代码中违反code style的地方。clang-tidy也支持检测代码中违反Google code style的地方(google-*check), 它们之间有什么区别?cpplint是一个python的脚本,它是采用正则表达式匹配出违反code style的代码, 所以它能检测的功能会受限于正则表达式,它不能够检测所有的违反code style的地方,并且还会有False positive和True positive;而clang-tidy则是基于抽象语法树(AST)对源文件进行分析,相比之下,是在分析的结果更加准确,能检测的问题也更多。

这两者各有优缺点,clang-tidy需要对源代码进行语法分析(编译源文件),所以它需要知道源文件的编译命令,对于依赖较多较大的文件,花费时间会较长;cpplint则不需要源文件编译,对文件内容进行正则匹配,运行会更快。

clang-tidy每次只针对一个编译单元(TranslationUnit, 可简单理解成1个.cpp文件)进行静态分析,因此,它只能查找出一个编译单元里面的代码问题,对于那种只在跨编译单元出现的问题,就无能为力了。

现在clang-tidy实现有100+个check,请查看list列表。根据check不同种类(从check名字的前缀就能知道哪一类),分为如下几大类:

  • boost 检测boost库API使用问题
  • cert 检测CERT的代码规范
  • cpp-core-guidelines 检测是否违反cpp-core-guidelines
  • google 检测是否违反google code style
  • llvm 检测是否违反llvm code style
  • readability 检测代码上相关问题,但又不明确属于任何代码规范的
  • misc 其它一些零碎的check
  • mpi 检测MPI API问题
  • modernize 把C++03代码转换成C++11代码,使用C++11新特性
  • performance 检测performance相关问题

clang-tidy使用

clang-tidy是一个命令行工具,可以在官网下载编译好的二进制包。 我写了一个clang-tools-prebuilt的npm包,可以通过npm install clang-tools-prebuilt的命令下载(仅支持MacOS, Linux)。

// 列出所有的check
$ clang-tidy -list-checks
// 找出simple.cc中所有没有用到的using declarations. 后面的`--`表示这个文件不在compilation database里面,可以直接单独编译;
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/simple.cc --// 找出simple.cc中所有没有用到的using declarations并自动fix(删除掉)
$ clang-tidy -checks="-*,misc-unused-using-decls" -fix path/to/simple.cc --// 找出a.c中没有用到的using declarations. 这里需要path/to/project/compile_commands.json存在
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/project/a.cc

分析项目中的y编译单元,clang-tidy首先要知道如何编译单元(该编译单元的编译命令),它从目录下查找compliation database,这个database就是compile_commands.json文件,里面包含该项目中所有的编译单元的编译命令。在使用之前要导出这个文件。目前已经有工具帮我们做了这项工作。

  • 如果是cmake的项目,通过cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources命令导出;
  • 如果是GYP项目,通过ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.json
  • 如果是make项目,使用Bear工具;

一次命令只能分析一个文件太麻烦,要分析整个项目的所有文件?run_clang_tidy.py脚本正是你想要的,通过多进程的方法对整个项目文件进行分析。

clang-tidy——静态代码分析框架相关推荐

  1. 静态代码分析工具汇总

    静态代码扫描,借用一段网上的原文解释一下(这里叫静态检查):"静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码 ...

  2. 【翻译】Google在构建静态代码分析工具方面的经验教训

    软件bug耗费开发者和软件公司大量的时间和金钱. 以2014年为例,被广泛使用的SSL协议实现中的一个("goto fail")bug导致可接受无效的SSL证书,另外一个与日期格式 ...

  3. PVS-Studio C/C++/C++11 静态代码分析工具

    PVS-Studio C/C++/C++11 静态代码分析工具 静态代码分析仪是一种检测代码缺陷.分析对比 商业代码的工具,它分析源代码和它生成的目标 文件,但并不实际运行源代码.应用于对安全性. 稳 ...

  4. 在SDLC中使用静态代码分析的最佳实践

    http://vultrace.cn更多精彩,尽在个人博客. 文章翻译自ncc group的论文,论文超长预警,请耐心观看. Best Practices for the use of Static ...

  5. 静态代码分析工具列表分析---代码分析工具列表(30款工具)

    本文是一个静态代码分析工具的清单,共有30个工具.包括4个.NET工具.2个Ada工具.7个C++工具.4个Java工具.2个JavaScript工具.1个Opa工具.2个Packaging工具.3个 ...

  6. 静态代码分析工具清单:开源篇(各语言)

    本文是一个静态代码分析工具的清单,共有26个工具.包括4个.NET工具.2个Ada工具.7个C++工具.4个Java工具.2个JavaScript工具.1个Opa工具.2个Packaging工具.3个 ...

  7. 静态代码分析工具清单:开源篇

    http://hao.jobbole.com/static_code_analysis_tool_list_opensource_lang/?utm_source=blog.jobbole.com&a ...

  8. 静态代码分析工具列表--常用静态代码分析工具介绍

    代码检测简介 本文是一个静态代码分析工具的清单,但是为公司产品需要付费使用.共有37个公司,有些公司包含多个工具.其中27个公司有多语言 工具,1个公司为PHP工具.2个公司为.NET工具.1个公司为 ...

  9. 鉴释人物丨专访首席技术官陈新中:三十年磨一“鉴”, 打造静态代码分析行业标杆

    陈新中,鉴释联合创始人兼首席技术官 作为鉴释联合创始人兼首席技术官,陈新中领导鉴释在中国的核心研发团队,并负责静态代码分析工具的开发.这些工具都被开发人员.测试人员.质量保证专家和高级 IT 管理层用 ...

最新文章

  1. 【c语言】判断是否为友好数
  2. 将 iPhone 定位设置在法国,手机速度就能迅速提升?
  3. 推荐一篇讲解各种debug技术的文章,相当不错!
  4. android手机电话铃声设置,安卓手机铃声怎么设置
  5. 【VBS】一款无聊的 Visual Basic Script 表白程序
  6. 谁说烟草公司做不好数字化转型!通过BI工具,一年节约成本79万
  7. 计算机专业自我总结1000字,计算机专业自我鉴定范文1000字
  8. 使用next.js完成从开发到部署
  9. (数组) leetcode 189. Rotate Array
  10. JQuery Form AjaxSubmit(options)在Asp.net中的应用注意事项
  11. 菜鸟的Hadoop快速入门
  12. Linux上安装RePlace
  13. 使用BMfont制作含有中文图片的.fnt格式字体合图
  14. PX4 编译报错问题解决方法、PX4切换固定版本编译
  15. 怎么把png格式图片转换成jpg格式?
  16. keil5的安装详解(看完必会,不会你打我)
  17. Blender图解教程:多边形建模命令 之 合并顶点(Merge)
  18. 01-初识Node.js
  19. 被用户满意度坑的经历
  20. 对淘宝秒杀程序的实践【2022.9】

热门文章

  1. [电路]13-结点电压法
  2. Java_Collection集合与Map集合的理解与应用
  3. PID算法:位置式PID和增量式PID
  4. tomcat的详细介绍
  5. Pruning 系列 (十)Pruning VGG 实战
  6. img图片标签更改src并刷新
  7. 【狂神说】JavaWeb笔记整理 | SMBMS项目 | 文件上传和邮件发送
  8. chmod: changing permissions of ‘xxx‘: Operation not permitted
  9. axure 8 表格合并_Python办公自动化(六)|自动更新表格,告别繁琐
  10. python最大整数值,关于python:长整数的最大值