前言
在前文使用VS Code更好的编写Android C/C++代码(C/C++插件)中主要介绍了如何更好的写代码,本文要探讨的是从“好写”到“写好”的问题–如何做静态代码检查。
在查找资料中发现了Cppcheck和Clang-Tidy等工具,Cppcheck的介绍网上资料很多,本文主要探索Clang-Tidy。
clang-tidy的使用
介绍
从官网中获取到简介:
clang-tidy是基于clang的C++静态检查工具。其目的是提供一个可扩展的框架,用于诊断和修复典型的编程错误,例如样式冲突,接口滥用或可以通过静态分析得出的错误。clang-tidy是模块化的,并提供了用于编写新支票的便捷界面。
由于官网的介绍比较难理解,下面参考前人的研究,在深入研究Clang(十三) clang-tidy简介中总结了clang-tidy简介。
-
clang-tidy是基于AST的静态检查工具。因为它基于AST,所以要比基于正则表达式的静态检查工具更为精准,但是带来的缺点就是要比基于正则表达式的静态检查工具慢一点。也是因为它基于AST,所以clang-tidy运行的时候需要知道编译命令。
-
clang-tidy不仅仅可以做静态检查,还可以做一些修复工作。
-
clang-tidy通过添加check来添加检查规则,目前已经有一系列的check:Extra Clang Tools 10 documentation 通过clang-tidy -list-checks会列出默认开启的的check,clang-tidy-tidy -list-checks -checks=* 会列出所有的check。
-
clang-tidy因为需要知道编译命令,所以必须通过compile_commands.json获取编译命令。
在深入研究Clang(十四) clang-tidy的使用中总结了clang-tidy的使用。
-
clang-tidy在Clang/LLVM的预编译发布包主目录/bin目录之下。
例如:以clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04发布包为例,clang-tidy位于:clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang-tidy。
-
clang-tidy的运行依赖于compile_commands.json。可以通过“-checks=”来设定检查规则。或者不使用“-checks=”选项,而在项目主目录之下添加.clang-tidy文件,在里面编写项目的检查规则,这种方式更加适合对整个项目进行定制化的规则编写。.clang-tidy文件并不是必须放在主目录之下,只是通常放在主目录之下方便对整个项目进行检查。
-
clang-tidy的检查规则编写的时候,规则名称前面带有“-”的是让该规则失效,规则名称直接写的是要使用该规则。
此时我们知道了如何使用clang-tidy来做静态代码检查,以及大概的原理,但是具体代码检查的风格,我们现在还未指定。
.clang-tidy
的设置
突然想到在使用Android Studio
编写C/C++时,里面有代码提示和检查的功能。下面我们来看下Android Studio
是如何做到的。
从上图中可以看到Android Studio
正是使用了clang-tidy
。
Android Studio
中又使用了CLion的默认配置。
所以我们也可以使用CLion的默认配置的来作为基础配置。.clang-tidy
文件的内容大致如下:
Checks: >
*,
-android-*,
-bugprone-bool-pointer-implicit-conversion,
-bugprone-exception-escape,
-cert-dcl16-c,
-cert-dcl50-cpp
...
总结:Android Studio
对C/C++的开发非常友好,槽点就是使用Android Studio
有时会内存爆炸。此时可以在命令行使用clang-tidy xxx.cpp
来检查代码了,下面介绍如果在VS Code中也拥有此功能。
VS Code clangd插件的使用
继续探索发现了vscode clangd插件vscode-clangd。
介绍
clangd理解您的C++代码,并向您的编辑器添加了一些智能功能:代码完成,编译错误,定位定义等等。 clangd是一种语言服务器,可以通过插件与许多编辑器一起使用。
clangd基于Clang C ++编译器,并且是LLVM项目的一部分。
安装
首先在VS Code中安装clangd扩展,安装后,扩展会主动安装clangd软件包,若安装失败,可手动安装。
Ubuntu平台安装命令:sudo apt-get install clangd-10
,其它平台请参考安装clangd。
项目设置
为了理解您的源代码,clangd需要知道您的编译参数。
默认情况下,clangd会假定您的代码构建为clang some_file.cc
,并且您可能会因丢失#included
文件等而收到虚假错误。可以使用compile_commands.json
解决此问题。
该文件为项目中的每个源文件提供编译命令。它通常由工具生成。Clangd将在您搜索的文件的父目录中查找。
注意:我们在使用VS Code更好的编写Android C/C++代码(C/C++插件)中说明了Android项目如何生成compile_commands.json
文件。
特点
具体特点可以参考官方文档,我们主要探索其中clang-tidy
的功能。
使用clangd为VS Code提供C/C ++语言IDE功能:
- 代码完成
- 编译错误和警告
- 定义和交叉引用
- 包括管理
- 代码格式
- 简单重构
其中还提到:
Errors, warnings, and clang-tidy
输入时会显示代码错误(均为红色的波浪形下划线,并在“问题”面板中)。 这些与clang编译器产生的相同,并且可以自动应用建议的修复程序。
支持大多数clang-tidy检查(可以使用.clang-tidy文件启用这些检查)。
从介绍来看提供的功能和C/C++插件非常类似。但其中还集成了clang-tidy的功能,这正是我们需要的。
总结:1、首先VS Code clangd插件;2、再安装clangd软件包;3、在项目中生成compile_commands.json
文件。以上完成后,在VS Code中就拥有你静态代码检测功能。