clang-tidy——静态代码分析框架
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——静态代码分析框架相关推荐
- 静态代码分析工具汇总
静态代码扫描,借用一段网上的原文解释一下(这里叫静态检查):"静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码 ...
- 【翻译】Google在构建静态代码分析工具方面的经验教训
软件bug耗费开发者和软件公司大量的时间和金钱. 以2014年为例,被广泛使用的SSL协议实现中的一个("goto fail")bug导致可接受无效的SSL证书,另外一个与日期格式 ...
- PVS-Studio C/C++/C++11 静态代码分析工具
PVS-Studio C/C++/C++11 静态代码分析工具 静态代码分析仪是一种检测代码缺陷.分析对比 商业代码的工具,它分析源代码和它生成的目标 文件,但并不实际运行源代码.应用于对安全性. 稳 ...
- 在SDLC中使用静态代码分析的最佳实践
http://vultrace.cn更多精彩,尽在个人博客. 文章翻译自ncc group的论文,论文超长预警,请耐心观看. Best Practices for the use of Static ...
- 静态代码分析工具列表分析---代码分析工具列表(30款工具)
本文是一个静态代码分析工具的清单,共有30个工具.包括4个.NET工具.2个Ada工具.7个C++工具.4个Java工具.2个JavaScript工具.1个Opa工具.2个Packaging工具.3个 ...
- 静态代码分析工具清单:开源篇(各语言)
本文是一个静态代码分析工具的清单,共有26个工具.包括4个.NET工具.2个Ada工具.7个C++工具.4个Java工具.2个JavaScript工具.1个Opa工具.2个Packaging工具.3个 ...
- 静态代码分析工具清单:开源篇
http://hao.jobbole.com/static_code_analysis_tool_list_opensource_lang/?utm_source=blog.jobbole.com&a ...
- 静态代码分析工具列表--常用静态代码分析工具介绍
代码检测简介 本文是一个静态代码分析工具的清单,但是为公司产品需要付费使用.共有37个公司,有些公司包含多个工具.其中27个公司有多语言 工具,1个公司为PHP工具.2个公司为.NET工具.1个公司为 ...
- 鉴释人物丨专访首席技术官陈新中:三十年磨一“鉴”, 打造静态代码分析行业标杆
陈新中,鉴释联合创始人兼首席技术官 作为鉴释联合创始人兼首席技术官,陈新中领导鉴释在中国的核心研发团队,并负责静态代码分析工具的开发.这些工具都被开发人员.测试人员.质量保证专家和高级 IT 管理层用 ...
最新文章
- 【c语言】判断是否为友好数
- 将 iPhone 定位设置在法国,手机速度就能迅速提升?
- 推荐一篇讲解各种debug技术的文章,相当不错!
- android手机电话铃声设置,安卓手机铃声怎么设置
- 【VBS】一款无聊的 Visual Basic Script 表白程序
- 谁说烟草公司做不好数字化转型!通过BI工具,一年节约成本79万
- 计算机专业自我总结1000字,计算机专业自我鉴定范文1000字
- 使用next.js完成从开发到部署
- (数组) leetcode 189. Rotate Array
- JQuery Form AjaxSubmit(options)在Asp.net中的应用注意事项
- 菜鸟的Hadoop快速入门
- Linux上安装RePlace
- 使用BMfont制作含有中文图片的.fnt格式字体合图
- PX4 编译报错问题解决方法、PX4切换固定版本编译
- 怎么把png格式图片转换成jpg格式?
- keil5的安装详解(看完必会,不会你打我)
- Blender图解教程:多边形建模命令 之 合并顶点(Merge)
- 01-初识Node.js
- 被用户满意度坑的经历
- 对淘宝秒杀程序的实践【2022.9】
热门文章
- [电路]13-结点电压法
- Java_Collection集合与Map集合的理解与应用
- PID算法:位置式PID和增量式PID
- tomcat的详细介绍
- Pruning 系列 (十)Pruning VGG 实战
- img图片标签更改src并刷新
- 【狂神说】JavaWeb笔记整理 | SMBMS项目 | 文件上传和邮件发送
- chmod: changing permissions of ‘xxx‘: Operation not permitted
- axure 8 表格合并_Python办公自动化(六)|自动更新表格,告别繁琐
- python最大整数值,关于python:长整数的最大值