使用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插件) 的相关文章

  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 设计模式中的五大原则

    设计模式是一种思想 是智慧的结晶了 它有利于我们快速构建高效 模块化 高扩展性的代码 这种思想不仅仅在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等工具