30.靜態代碼分析工具clang-tidy

文章目錄

    • 基本介紹
    • 安裝`clang-tidy`
    • 使用`clang-tidy`
    • 配置文件和格式文件
      • 配置文件
      • 格式文件
      • 使用配置文件和格式化文件
    • 在代碼中設置排除`clang-tidy`檢測
      • reference


歡迎訪問個人網絡日志🌹🌹知行空間🌹🌹


基本介紹

clang-tidy 是一個基于 clang 的 C++ “linter” 工具。其作用主要是用來檢查和修正代碼中的典型編程問題,像代碼風格/接口誤用/通過靜態分析可定位到的bugclang-tidy模塊化功能做的很好,有預留接口,非常便于實現新的代碼檢查功能。

安裝clang-tidy

直接編譯安裝LLVM工程,包含子工程構建,編譯安裝的bin路徑下有clang-tidy工具。

LLVM編譯安裝的詳細步驟可以參考這里

使用clang-tidy

clang-tidy 是一個基于 LibTooling 的工具,如果您為項目設置編譯命令數據庫,則使用起來會更容易(有關如何執行此操作的示例,請參閱如何為 LLVM 設置工具)。源碼對應的編譯命令數據庫保存在compile-command.json文件中,這個文件中其實保存的是每個可執行文件的構建命令,現在很多工具可以自動生成這個文件,例如對于使用CMake管理的工程,只需要在編譯的時候帶上參數cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON即可在build目錄下生成compile-command.json文件,在執行.clang-tidy命令時設置-p={project}/build即可。

可以在命令行添加--符號,以不使用編譯命令而時使用編譯選項來定制檢測規則,用來實現單個文件的格式檢測:

clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...

-I參數指定要包含的頭文件路徑

clang-tidy有其自己的檢測器,也可以使用Clang的靜態分析器,每一項檢測都有其自己的名字,使用-checks參數可以指定要進行哪些檢測,它指定了逗號分隔的正向和反向規則,正向規則指定了要添加的檢測子集,反向規則指定了要移除的規則。示例:

clang-tidy -checks='-*,modernize-*' test.cpp --
  • -checks指定要進行哪些檢測,-*表示移除所有檢測,modernize-*表示保留modernize開頭的所有檢測。-checks支持的參數有:
checks名稱前綴說明
abseil-Google Abseil相關的檢測
altera-針對FPGAOpenCL相關的檢測
android-Android相關檢測
boost-Boost庫相關檢測
clang-analyzer-Clang Static Analyzer檢測

更多檢測名稱前綴參考:

1.https://clang.llvm.org/extra/clang-tidy/index.html#using-clang-tidy

配置文件和格式文件

配置文件

clang-tidy提供了一個配置文件,可以指定要使用的檢測器、檢測器的參數等。配置文件使用YAML語法編寫,一般放在當前工程目錄下,文件名為.clang-tidy

# 指定要使用的檢測器
Checks: '-*,modernize-*,performance-*'# 指定檢測器的參數
CheckOptions:- key: 'modernize-use-nullptr.NullPtrBeforeZero'value: '0'

格式文件

clang-tidy命令的--format-style=參數,需要.clang-format文件作為參數來設置修復格式化代碼的樣式。

--format-style=可選的值有:

  • ‘none’,默認值,關閉格式化
  • ‘file’,設置此值clang-tidy會使用最近父目錄下的.clang-format文件來設置格式化的樣式
  • '{ }'指定格式化選項,例如:-format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
  • ‘llvm’, ‘google’, ‘webkit’, ‘mozilla’

一個簡單的.clang-format文件的內容:

Language:        Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: false
AlignOperands: true

使用配置文件和格式化文件

對于單個文件,通過命令行可以直接來運行:

clang-tidy -format-style='file' -config-file=.clang-tidy -p ../build/debug test_clang.cpp

對于工程中有很多文件,寫成shell腳本的形式為:

#!/bin/bashfunction main() {local project_dirproject_dir=$(git rev-parse --show-toplevel)cd "$project_dir" || exit 1local srcssrcs=$(git ls-files src crossdock |grep -E -v 'thrift-gen|Test\.cpp' |grep -E '\.cpp$')local cmdfor src in $srcs; docmd="clang-tidy -p=build"cmd+=" -checks=\"-clang-diagnostic-unused-command-line-argument\" "cmd+=" $src"echo "$cmd"eval "$cmd"done
}main

在代碼中設置排除clang-tidy檢測

對于工程中的代碼,有時候可以確認代碼是正常的,但是不滿足clang-tidy的規則,這個時候需要增加設置使目標代碼免除檢測。

通用抑制檢測的機制:

  • 對于一行,使用NOLINT注釋:

int main(int argc, char** argv) // NOLINT
{return 0;
}
  • 下一行免除檢測
// NOLINTNEXTLINEint main(int argc, char** argv)
{return 0;
}
  • 設置一段代碼免除檢測
int main(int argc, char** argv)
{// NOLINTBEGINint x;int y;// NOLINTENDreturn 0;
}

上面的NOLINT注釋后可以接參數,設置具體要避免哪些規則的檢測:


int main(int argc, char** argv)
{// NOLINTBEGIN(google*)int x;int y;int array[10]; // NOLINT(*-avoid-c-arrays)// NOLINTEND(google*)return 0;
}

reference

1.https://clang.llvm.org/extra/clang-tidy/index.html#using-clang-tidy

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14924.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDBC總結

目錄 JDBC(java database connection) JDBC連接數據庫步驟: 1. 在項目中添加jar文件,如圖所示 2.加載驅動類 向數據庫中插入數據代碼示例: 第一種: 第二種: 查詢操作 : 第一種: 第二種: JDBC(java database connection) java數據庫連接.api(應用程序編程接口) ,可…

Java中的垃圾回收機制

在Java編程語言中,垃圾回收(Garbage Collection, GC)機制是內存管理的一個核心部分。它的主要目標是自動釋放那些不再被程序使用的對象所占用的內存空間,從而防止內存泄漏,并確保程序的穩定運行。下面,我將…

一文講清!傳統企業的進銷存管理難題該怎么解決?

有沒有開源的進銷存軟件啊? 確實,市面上存在不少開源的進銷存軟件。但客觀地講,開源軟件往往面臨著安全隱患,因為代碼公開,容易成為黑客攻擊的目標。此外,開源軟件的功能模塊通常較為固定,難以…

初出茅廬的小李博客之MQTT.fx客戶端接入EMQX Platform

EMQX Platform 概覽 EMQX Platform 是 EMQ 推出的一款面向物聯網領域的 MQTT 消息中間件產品。作為全球首個 MQTT 5.0 消息云服務,EMQX Platform 提供了一站式運維代管、獨有隔離環境的 MQTT 消息服務。在萬物互聯的時代,EMQX Platform 可以幫助您快速構…

python數據類型之列表

目錄 1.創建列表 2.列表基礎操作 常用操作 對列表元素順序隨機打亂 列表下標和切片 字符串分割為列表 列表位移 列表切片替換 3.列表內置方法 4.列表排序 簡單排序 使用key參數按指定規則排序 二維列表排序 自定義排序規則函數 5.列表排序算法 選擇排序 柱狀圖…

C# 利用Xejen框架源碼,我們來開發一個基于Dapper技術的數據庫通用的幫助訪問類,通過Dapper的增刪改查,可以訪問Sqlite數據庫

Dapper 是一個輕量級的對象關系映射(ORM)工具,適用于 .NET 平臺。它由 Stack Overflow 團隊開發,旨在提供簡單、高效的數據訪問功能。與其他重量級 ORM(如 Entity Framework)相比,Dapper 更加輕…

基于Python圖像增強算法:低光增強+圖像修復+超分辨率重建

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 在圖像處理與計算機視覺領域,圖像增強技術是提高圖像質量和可用性的重要手段。在實…

單片機io擴展

輸入輸出擴展 i2c擴展 方案1:PCF8575 PCF8575雙向IO口擴展模塊 16位輸入輸出I2C通訊 單片機級聯擴展板 方案2:PCA955A 輸出擴展 74HC595 io口擴展模塊輸出口擴展 參考鏈接 中微愛芯發[2004] 1號           簽發人: (szlcsc.com)https://…

? Vscode和Idea都可以使用的-AI插件(官方-百度出的)

? Vscode和Idea都可以使用的-AI插件(官方-百度出的) 最新AI特別火,給大家推薦一下最新出的VScode插件,輔助我們寫代碼! 1、下載地址: > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

jmeter中Ultimate Thread Group設計梯度壓測場景

Ultimate Thread Group Ultimate Thread Group 線程組是模擬波浪式壓測或者階梯式負載壓測 1、Start Threads Count:線程數量 2、Initial Delay,sec:每組開始添加到測試執行之前的延遲(xx秒開始啟動線程) 3、Startu…

python中的線程并行

文章目錄 1. 單線程2. 線程池ThreadPoolExecutor 1. 單線程 現在有1154張圖片需要順時針旋轉后保存到本地,一般使用循環1154次處理,具體代碼如下所示,img_paths中存儲1154個圖片路徑,該代碼段耗時約用97ms。 t1time.time() for …

Python筑基之旅-MySQL數據庫(四)

目錄 一、數據表操作 1、新增記錄 1-1、用mysql-connector-python庫 1-2、用PyMySQL庫 1-3、用PeeWee庫 1-4、用SQLAlchemy庫 2、刪除記錄 2-1、用mysql-connector-python庫 2-2、用PyMySQL庫 2-3、用PeeWee庫 2-4、用SQLAlchemy庫 3、修改記錄 3-1、用mysql-conn…

Java輕松轉換Markdown文件到Word和PDF文檔

Markdown 憑借其簡潔易用的特性,成為創建和編輯純文本文檔的常用選擇。但某些時候我們需要更加精致的展示效果,例如在專業分享文檔或打印成離線使用的紙質版時,就需要將Markdown文件以其他固定的文檔格式呈現。通過將 Markdown 轉換為 Word 和…

OpenHarmony實戰開發——網絡組件axios可以在OpenHarmony上使用了

什么是axios 上古瀏覽器頁面在向服務器請求數據時,因為返回的是整個頁面的數據,頁面都會強制刷新一下,這對于用戶來講并不是很友好。并且我們只是需要修改頁面的部分數據,但是從服務器端發送的卻是整個頁面的數據,十分…

高效寫代碼java-推薦插件1(格式轉化 ConverterX )-日后待更新

ConverterX 主要功能:格式轉化 字符串格式轉換 日期轉換 Json格式轉義 字符格式 快捷鍵 ctrl shiftS Upper(CODEEASE)字符串全部變成大寫Lower(codeease)字符串全部變成小寫Camel(codeEase)字符串變成小駝峰ClassCaemel(CodeEase)字符串變成大駝峰UnderlineUpper(CODE_EAS…

項目管理:Jira,禪道,GitHub Issues對比

Jira、禪道(ZenTao)和GitHub Issues都是項目管理工具,但它們在功能、適用場景和特性上有所不同。以下是它們之間的對比: 功能: Jira:是一款強大的項目管理工具,適用于各種項目,尤其…

Vue3組件間通信通過回調函數傳遞數據

Vue3組件間通信通過回調函數傳遞數據 一、前言1、使用場景2、實現方法1. 父組件中定義回調方法2. 子組件中觸發回調方法 二、結論 一、前言 在 Vue 3 中,組件之間的通信是一個重要的主題。在許多情況下,你可能需要從子組件向父組件傳遞數據或觸發父組件…

python實用系列:按順序重命名文件

啊,好久沒更博客了,今天偶然想換個桌面壁紙,于是上網搜了兩個比較滿意的桌面壁紙,都是壓縮包: 當我想要給他們放到我的桌面壁紙文件里的時候患了難,因為他們的名字有相同的: anime文件夾里邊&a…

揭秘!亞馬遜、Vinted賣家如何借助自養號測評實現爆單?

?作為一名跨境賣家,你一定夢想著能夠在亞馬遜上實現爆單,讓產品火爆銷售。下面就分享五個秘訣,幫助你實現這個夢想: 1. 優質產品:首先,確保你的產品質量優秀,能夠滿足消費者的需求。品質好的產…

基于Matlab使用BP神經網絡進行電力系統短期負荷預測

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 電力系統的短期負荷預測對于電力調度和能源管理具有至關重要的作用。通過準確地預測電力負荷&…