使用VS Code静态检查Android C/C++代码(clangd插件)

2023-11-16

前言

在前文使用VS Code更好的编写Android C/C++代码(C/C++插件)中主要介绍了如何更好的写代码,本文要探讨的是从“好写”到“写好”的问题–如何做静态代码检查。

在查找资料中发现了CppcheckClang-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 Settings

从上图中可以看到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中就拥有你静态代码检测功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用VS Code静态检查Android C/C++代码(clangd插件) 的相关文章

  • C语言中数据类型BYTE、WORD和DWORD的格式说明符?

    在 C 语言中 与 printf 和 scanf 函数一起使用的数据类型 BYTE WORD 和 DWORD 最合适的格式说明符是什么 我很难通过控制台显示 BPB 字段的值 例如 如果我尝试使用 lu 显示 BPB BytsPerSec
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • 初始化参数时会发生什么? C++

    void foo int i int k 7 cout lt lt k int main foo 1 2 k将输出2 我的问题是 foo 按什么顺序初始化参数并获取参数 foo 得到 2 的过程是什么 谢谢 void foo int i i
  • 为什么我的 DLL 无法注册?

    我正在 VS2005 中构建一个项目 但我的几个 DLL 无法注册 我在 Visual Studio 中收到的错误消息是 项目 错误 PRJ0019 工具从 注册 ActiveX 控件 返回错误代码 这很模糊 当我通过命令行手动注册DLL时
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 如何用C++判断一个字符串是否是数字?

    我在尝试编写一个检查字符串是否为数字的函数时遇到了很多麻烦 对于我正在编写的游戏 我只需要检查我正在读取的文件中的一行是否是数字 这样我就会知道它是否是参数 我写了下面的函数 我相信它工作得很顺利 或者我不小心编辑了它来阻止它 或者我有精神
  • Android 中的 java.util.Observable 是线程安全的吗?

    Android 中的 java util Observable 是线程安全的吗 这文档 http developer android com reference java util Observable html说只有deleteObser
  • Android 5.0 Lollipop 中屏幕固定关闭时如何收到通知?

    我有一个在后台运行的应用程序 并在手机上发生特定事件时启动活动 我发现在 Android 5 0 中 当用户使用另一个应用程序打开屏幕固定时 startActivity intent 调用将被完全忽略 我的应用程序不知道该活动尚未启动 因此
  • 正则表达式可以与 C++ 中的字符数组一起使用吗

    我正在开发一个无法使用字符串库文件的程序 而是使用字符数组 我能够使用正则表达式 并且想知道是否有办法使用正则表达式和字符数组 甚至正则表达式和单个字符 我问的原因是当我尝试在匹配中使用我的 char 数组时 xUtility 会抛出一堆来
  • C# using 语句是否执行 try/finally ?

    假设我有以下代码 private void UpdateDB QuoteDataSet dataSet Strint tableName using SQLiteConnection conn new SQLiteConnection co
  • C# 中的 H.264(或类似)编码器?

    有谁知道 C 或任何其他托管语言 的开源 H 264 编码器 我也许也可以用 python 实现 我发现的库 例如 x264 是用相当低级的 c 带有大量宏的程序 和汇编语言编写的 调整它们比我想象的要复杂得多 我的项目不关心性能或兼容性
  • MaskedTextBox 的多行掩码

    我有一个MaskedTextBox在我的 Winforms 应用程序中 我需要一个多线掩码 例如 999999 r n 999999 r n 999999 r n 00 00 0000 我读了msdn文档 http msdn microso
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 无法在云控制台中启用 Maps SDK for Android

    我在云控制台中启用适用于 Android 的 Maps SDK 时遇到此问题 https console cloud google com https console cloud google com 它会抛出以下错误 附截图 我收到错误消
  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Android BLE 扫描在后台几分钟后停止

    当我为公司开发新冠肺炎接触者追踪应用程序时 我在后台遇到了 Android 扫描停止问题 这是我尝试过的 添加前台服务 禁用手机中所有与电池相关的优化选项 启用后台运行的应用程序 测试设备 搭载 Android 10 的 Galaxy S2
  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • 使用 mupdf android 库导航到特定页面

    我如何使用 muPDF 库导航到特定页面 或者有没有办法让图书馆不记得我最后在那个pdf文件中浏览的是哪一页 Uri uri Uri parse path Intent intent new Intent MainActivity getC
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt

随机推荐

  • 设计模式中的五大原则

    设计模式是一种思想 是智慧的结晶了 它有利于我们快速构建高效 模块化 高扩展性的代码 这种思想不仅仅在c 中有 c代码中也是有很充分的使用 设计模式是前提 是重中之重 那比它更重要的是什么 是原则 面向对象设计五大原则 1 单一职责原则 S
  • 爬虫用拨号好还是HTTP爬虫ip池好?

    程序员小伙伴们 在进行爬虫时 你是否曾纠结于选择拨号还是代理 不要犯愁 今天我将与你分享一些实用的择优技巧 帮助你在爬虫之路上实现更高效的提速 一 拨号和HTTP爬虫ip的优劣势分析 1 拨号 优势 拨号具有动态HTTP的特点 每次拨号连接
  • ajax加载aspx页面,如何使用jquery ajax显示来自aspx页面的响应

    我使用ajax jquery来请求aspx页面 并且此页面显示GidView 因此响应将是网格视图的html代码 并且我将响应添加到DIV以显示结果 当我在第一次发出请求时正常工作 但第二次没有从响应中添加任何内容 尽管存在要绑定的数据 如
  • git 仓库迁移

    git 仓库迁移 文章目录 git 仓库迁移 在目标服务器建立新的git 功能仓库 设置git 仓库源 上传代码 验证是否成功 git远程仓库地址查看 在目标服务器建立新的git 功能仓库 git VM 0 5 centos git ini
  • MySQL中的IF语句使用

    MySQL中的IF语句 在 MySQL 数据库中 IF 语句是一种常见的条件控制语句 它可以根据指定的条件返回不同的结果 在本文中 我们将介绍 IF 语句的基本用法以及实际应用场景 IF函数 MySQL 提供了 IF 函数来实现 IF 语句
  • xcode4的自动完成功能(Code sense or Code Snippet)

    社区会员rainbird分享 自动完成包括两种含义 一种是输入字母的时候可以动态弹出一个列表 然后通过选择 提高输入效率 这种好像叫代码提示 Code sense 另一种就是输入几个字母的时候一回车 出来一串儿字符 Code Snippet
  • 把一个对象 转为JSON格式的方法

    List
  • svn的使用手册

    svn的使用手册 svn的使用手册 svn介绍 安装svn 安装VisualSVN server 安装TortoiseSVN 安装EclipseSVN插件 使用SVN Eclipse下使用SVN 合并冲突 分支 svn的使用手册 svn介绍
  • SpringBoot 实现定时任务

    定时任务 一 使用背景 二 定时任务的优点 三 SpringBoot 实现定时任务 3 0 项目结构 3 1 pom xml 3 2 启动类 3 3 服务类 3 4 cron表达式 3 4 1 时间范围 3 4 2 特殊字符 3 4 3 c
  • 启明云端分享

    提示 启明云端从2013年起就作为Espressif 乐鑫科技 大中华区合作伙伴 我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程 同时也用心推出了基于乐鑫的相关应用方案 希望你能第一时间了解并快速用上好的方案和产品
  • 微信支付接口常用参数及证书区分

    注意 服务商模式下 均是使用服务商的以下信息 1 证书 1 1商户api证书 v2和v3接口都需要使用 1 1 1获取方式 什么是商户API证书 如何获取商户API证书 商户api证书 里面介绍了如何获取商户证书的详细步骤 1 1 2作用
  • MyCAT 连接MySQL 8 注意事项

    一 问题产生 MyCat是一个基于MySQL协议的开源的分布式中间件 其核心是分库分表 但是目前MyCat仍主要面对MySQL 5 5 5 6 5 7版 对最新的MySQL 8尚未完全支持 需要用户对MySQL 8和MyCat的配置进行一系
  • Unity3d之Socket UDP协议

    原文地址 http blog csdn net dingkun520wy article details 49201245 一 Socket 套接字 UDP协议的特点 1 是基于无连接的协议 没有生成连接的延迟所以速度比TCP快 2 支持一
  • linux系统如何进入屏保,linux上屏保设置

    linux下屏保设置 Linux文本终端 字符界面屏保取消 在我们日常使用Linux过程中 经常遇到使用屏幕终端一段时间后 显示器关 闭 屏幕上没有任何显示 一段时间后 屏幕就会关闭 无任何显示 若此时系统死机或僵死 而且屏幕上有输出 当遇
  • 如何用js替换文本里的换行符 \n?

    如何用js替换文本里的换行符 n 有下面一段文本 在编辑器里的格式如下 div line1line2line3 div 切换到浏览器 显示如下 line1line2line3 这里我想使浏览器显示效果变成如下形式 line1 line2 l
  • python 多线程示例

    python 多线程示例 import queue import time import threading import threading from datetime import datetime 创建一个线程安全的队列 q queu
  • Moveit简单使用,在rviz中实现手动拖动-记录

    GAZEBO下载 一 首先需要准备模型文件 可以是自己的solidworks用URDF工具导出的 也可以是在网上下载的URDF文件包 1 我用的是solidworks手动导出的模型 b站博主导出SOLIDWORKS模型至URDF这个教程比较
  • 报错解决:SyntaxError: Non-UTF-8 code starting with ‘\xe7‘

    今天抓取数据时使用re对数据进行提取时遇到的问题 syntaxError Non UTF 8 code starting with xe7 意思是有的中文字符无法转成utf 8的形式 如图所示 这个是因为抓取的数据中有的中文字符识别不了 相
  • 深入理解 Spring 控制反转与依赖注入

    概览 对于 Spring 框架来说 控制反转 Inversion of Control IoC 和依赖注入 Dependency Injection DI 是个等同的概念 控制反转是通过依赖注入实现的 在这篇文章中 我们会详细介绍 IoC
  • 使用VS Code静态检查Android C/C++代码(clangd插件)

    前言 在前文使用VS Code更好的编写Android C C 代码 C C 插件 中主要介绍了如何更好的写代码 本文要探讨的是从 好写 到 写好 的问题 如何做静态代码检查 在查找资料中发现了Cppcheck和Clang Tidy等工具