91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何確保整體代碼質(zhì)量

lhl545545 ? 來(lái)源:C語(yǔ)言與CPP編程 ? 作者:C語(yǔ)言與CPP編程 ? 2022-09-26 09:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本系列是開(kāi)源書(shū)C++ Best Practises[1]的中文版,全書(shū)從工具、代碼風(fēng)格、安全性、可維護(hù)性、可移植性、多線程、性能、正確性等角度全面介紹了現(xiàn)代C++項(xiàng)目的最佳實(shí)踐。本文是該系列的第一篇。

C++最佳實(shí)踐:

1. 工具(本文)

2. 代碼風(fēng)格

3.安全性

4.可維護(hù)性

5.可移植性及多線程

6.性能

7.正確性和腳本

前言

C++最佳實(shí)踐: 支持Fork的編碼標(biāo)準(zhǔn)文檔

本文檔旨在收集對(duì)C++最佳實(shí)踐所進(jìn)行的協(xié)作性討論,是《Effective C++》(Meyers) 和《C++ Coding Standards》(Alexandrescu, Sutter) 等書(shū)籍的補(bǔ)充。在討論如何確保整體代碼質(zhì)量的同時(shí),補(bǔ)充了一些沒(méi)有討論到的較低級(jí)別的細(xì)節(jié),并提供了具體的風(fēng)格建議。

在任何情況下,簡(jiǎn)單明了都是首選。本文所舉示例是為了說(shuō)明為什么一種選擇比另一種更受歡迎。在必要情況下,也會(huì)用文字說(shuō)明。

本文檔由Jason Turner編寫(xiě),根據(jù)知識(shí)共享署名-非商業(yè)4.0國(guó)際許可協(xié)議[2]授權(quán)。

免責(zé)聲明

本文檔的編寫(xiě)基于個(gè)人經(jīng)驗(yàn),你不需要完全同意其中的觀點(diǎn)。本文檔保存于GitHub[3]上,任何人都可以fork供自己使用,或者提交修改建議與大家分享。

本文檔啟發(fā)O'Reilly發(fā)布了視頻: Learning C++ Best Practices[4]

工具

應(yīng)該在開(kāi)發(fā)過(guò)程的早期建立用于執(zhí)行這些工具的自動(dòng)化框架,檢出源代碼、構(gòu)建和執(zhí)行測(cè)試所使用的命令不應(yīng)超過(guò)2-3個(gè),一旦測(cè)試完成,應(yīng)該對(duì)代碼的狀態(tài)和質(zhì)量有接近完整的了解。

源碼管理

對(duì)于任何軟件開(kāi)發(fā)項(xiàng)目來(lái)說(shuō),源碼管理都是絕對(duì)必要的,如果還沒(méi)有,那就開(kāi)始使用。

GitHub[5] —— 允許無(wú)限制的公共存儲(chǔ)庫(kù)和私有存儲(chǔ)庫(kù),支持最多3個(gè)協(xié)作者。

Bitbucket[6] —— 允許無(wú)限制的私人存儲(chǔ)庫(kù),最多5個(gè)協(xié)作者,免費(fèi)。

SourceForge[7] —— 僅支持托管開(kāi)放源碼。

GitLab[8] —— 免費(fèi)提供無(wú)限的公共和私有存儲(chǔ)庫(kù),包括無(wú)限的CI執(zhí)行器(CI Runner)。

Visual Studio Online[9] (http://www.visualstudio.com/what-is-visual-studio-online-vs) —— 無(wú)限的公共存儲(chǔ)庫(kù),私有存儲(chǔ)庫(kù)收費(fèi),支持git或TFVC。另外提供: 問(wèn)題跟蹤、項(xiàng)目計(jì)劃(包括Scrum等多個(gè)敏捷模板)、集成托管構(gòu)建,所有特性都可以集成到Microsoft Visual Studio中,僅支持Windows。

構(gòu)建工具

使用廣泛接受的行業(yè)標(biāo)準(zhǔn)構(gòu)建工具,可以防止在做探索、鏈接新庫(kù)、打包產(chǎn)品等等工作時(shí)重復(fù)發(fā)明輪子。例子包括:

CMake[10]

對(duì)于構(gòu)建性能,請(qǐng)考慮: https://github.com/sakra/cotire

對(duì)于增強(qiáng)可用性,請(qǐng)考慮: https://github.com/toeb/cmakepp

使用 https://cmake.org/cmake/help/v3.6/command/target_compile_features.html 作為C++標(biāo)準(zhǔn)flag

考慮使用 https://github.com/cheshirekow/cmake_format 自動(dòng)格式化CMakeLists.txt文件

CMake特定最佳實(shí)踐請(qǐng)參考后續(xù)的延伸閱讀[11]部分

cmake --build提供了平臺(tái)無(wú)關(guān)的通用編譯接口

Waf[12]

FASTBuild[13]

Ninja[14] —— 可以極大優(yōu)化大型項(xiàng)目的增量構(gòu)建時(shí)間,可以作為CMake的target。

Bazel[15] —— 基于網(wǎng)絡(luò)工件緩存和遠(yuǎn)程執(zhí)行的快速增量構(gòu)建

Buck[16] —— 類(lèi)似于Bazel,對(duì)iOSAndroid有很好的支持

gyp[17] —— 谷歌chromium的構(gòu)建工具

maiken[18] —— 具有maven配置風(fēng)格的跨平臺(tái)構(gòu)建工具

Qt Build Suite[19] —— 基于Qt的跨平臺(tái)構(gòu)建工具

meson[20] —— 快速、對(duì)用戶友好的開(kāi)源構(gòu)建系統(tǒng)

premake[21]

請(qǐng)記住,這不僅是構(gòu)建工具,也是編程語(yǔ)言。請(qǐng)盡量維護(hù)良好整潔的構(gòu)建腳本,并遵循正在使用的工具的推薦實(shí)踐。

包管理器

包管理是C++的重要主題,目前還沒(méi)有明確的贏家。請(qǐng)考慮使用包管理器來(lái)幫助跟蹤項(xiàng)目的依賴(lài)關(guān)系,從而幫助新人更容易開(kāi)始參與項(xiàng)目。

Conan[22] —— 跨平臺(tái)C++依賴(lài)管理器

hunter[23] —— CMake驅(qū)動(dòng)的跨平臺(tái)包管理器,適用于C/C++

[C++ Archive Network (CPPAN)](https://cppan.org/ "C++ Archive Network (CPPAN "C++ Archive Network (CPPAN)")") —— 跨平臺(tái)C++依賴(lài)管理器

qpm[24] —— Qt的包管理器

build2[25] —— 類(lèi)Cargo的C++包管理器

Buckaroo[26] —— 真正去中心化的跨平臺(tái)依賴(lài)管理器,適用于C/C++等等

Vcpkg[27] —— 微軟C++庫(kù)管理器,支持Windows, Linux和MacOS

持續(xù)集成

選擇了構(gòu)建工具之后,接下來(lái)需要設(shè)置持續(xù)集成環(huán)境。

在更改被推送到存儲(chǔ)庫(kù)時(shí)會(huì)觸發(fā)持續(xù)集成(CI)工具自動(dòng)構(gòu)建源代碼,可以私有部署CI工具或使用托管的CI系統(tǒng)。

Travis CI[28]

能很好的與C++一起工作

設(shè)計(jì)與GitHub一起使用

GitHub公共存儲(chǔ)庫(kù)可以免費(fèi)使用

AppVeyor[29]

支持Windows、MSVC和MinGW

GitHub公共存儲(chǔ)庫(kù)可以免費(fèi)使用

Hudson CI[30] / Jenkins CI[31]

需要Java應(yīng)用服務(wù)器

支持Windows、OS X和Linux

可以通過(guò)許多插件進(jìn)行擴(kuò)展

TeamCity[32]

對(duì)開(kāi)源項(xiàng)目免費(fèi)

Decent CI[33]

簡(jiǎn)單持續(xù)集成,可以將結(jié)果發(fā)布到GitHub

支持Windows、OS X和Linux

使用ChaiScript[34]

Visual Studio Online[35] (http://www.visualstudio.com/what-is-visual-studio-online-vs)

與Visual Studio Online的源代碼庫(kù)緊密集成

使用MSBuild (Visual Studio的構(gòu)建引擎),可在Windows、OS X和Linux上使用

提供托管的構(gòu)建代理,也允許用戶提供構(gòu)建代理

可以在Microsoft Visual Studio中控制和監(jiān)控

通過(guò)Microsoft Team Foundation Server進(jìn)行內(nèi)部安裝

GitLab[36]

使用自定義Docker鏡像,因此可用于C++

有免費(fèi)的共享執(zhí)行器

提供簡(jiǎn)單的覆蓋率結(jié)果分析

如果在GitHub上有開(kāi)源、公開(kāi)托管的項(xiàng)目:

現(xiàn)在就把Travis Ci和AppVeyor整合起來(lái)。關(guān)于如何在基于C++ cmake的應(yīng)用程序中啟用的簡(jiǎn)單示例,請(qǐng)參考: https://github.com/ChaiScript/ChaiScript/blob/master/.travis.yml

啟用覆蓋工具(Codecov或Coveralls)

啟用Coverity Scan[37]

這些工具都是免費(fèi)的,設(shè)置起來(lái)也相對(duì)容易。一旦把它們都設(shè)置好,就可以對(duì)項(xiàng)目進(jìn)行持續(xù)的構(gòu)建、測(cè)試、分析和報(bào)告,并且免費(fèi)。

編譯器

啟用所有可用、合理的告警選項(xiàng),有些告警選項(xiàng)只在啟用了優(yōu)化的情況下才有效,或者優(yōu)化級(jí)別越高,效果越好,例如GCC中的-Wnull-dereference。

應(yīng)該使用盡可能多的編譯器,每個(gè)編譯器對(duì)標(biāo)準(zhǔn)的實(shí)現(xiàn)略有不同,支持多個(gè)編譯器將有助于確保實(shí)現(xiàn)最可移植、最可靠的代碼。

GCC / Clang

-Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic

-Wall -Wextra 合理、標(biāo)準(zhǔn)

-Wshadow 如果變量聲明覆蓋了父上下文中的變量,則警告用戶

-Wnon-virtual-dtor 如果帶有虛函數(shù)的類(lèi)有非虛析構(gòu)函數(shù),則警告用戶,有助于捕獲難以跟蹤的內(nèi)存錯(cuò)誤

-Wold-style-cast 對(duì)C風(fēng)格的類(lèi)型轉(zhuǎn)換發(fā)出警告

-Wcast-align 警告有潛在性能問(wèn)題的強(qiáng)制類(lèi)型轉(zhuǎn)換

-Wunused 警告任何未使用的東西

-Woverloaded-virtual 如果重載(而不是覆蓋)虛函數(shù),則發(fā)出警告

-Wpedantic 如果使用了非標(biāo)準(zhǔn)的C++則發(fā)出警告(所有版本的GCC, Clang >= 3.2)

-Wconversion 對(duì)可能丟失數(shù)據(jù)的類(lèi)型轉(zhuǎn)換發(fā)出警告

-Wsign-conversion 對(duì)影響到符號(hào)的類(lèi)型轉(zhuǎn)換發(fā)出警告(Clang所有版本,GCC >= 4.3)

-Wmisleading-indentation 如果代碼中有縮進(jìn),但沒(méi)有對(duì)應(yīng)的代碼塊,則發(fā)出警告(僅在GCC >= 6.0中)

-Wduplicated-cond 如果if/else分支有重復(fù)條件,則發(fā)出警告(僅在GCC >= 6.0中)

-Wduplicated-branches 如果if/else分支有重復(fù)的代碼,則發(fā)出警告(僅在GCC >= 7.0中)

-Wlogical-op 在可能需要按位操作的地方使用邏輯操作時(shí)發(fā)出警告(僅在GCC中)

-Wnull-dereference 如果檢測(cè)到空解引用將發(fā)出警告(僅在GCC >= 6.0中)

-Wuseless-cast 如果執(zhí)行強(qiáng)制轉(zhuǎn)換到相同的類(lèi)型,則會(huì)發(fā)出警告(僅在GCC >= 4.8中)

-Wdouble-promotion 如果float隱式提升為double則發(fā)出警告(GCC >= 4.6, Clang >= 3.8)

-Wformat=2 對(duì)輸出格式化函數(shù)(即printf)的安全問(wèn)題發(fā)出警告

-Wlifetime 顯示對(duì)象生命周期問(wèn)題(目前只有Clang的特殊分支)

考慮使用-Weverything,并且只在需要的情況下禁用少數(shù)警告。

-Weffc++警告模式可能太吵了,但如果對(duì)項(xiàng)目適用,也可以使用。

MSVC

/permissive- —— 執(zhí)行標(biāo)準(zhǔn)一致性[38]

/W4 /w14640 —— 使用并考慮以下內(nèi)容(參見(jiàn)下面的描述)

/W4 一切合理的警告

/w14242 'identifier': 從'type1'到'type1'的轉(zhuǎn)換,可能丟失數(shù)據(jù)

/w14254 'operator': 從“type1:field_bits”到“type2:field_bits”的轉(zhuǎn)換,可能丟失數(shù)據(jù)

/w14263 'function': 成員函數(shù)不重寫(xiě)任何基類(lèi)虛成員函數(shù)

/w14265 'classname': 類(lèi)有虛函數(shù),但析構(gòu)函數(shù)不是該類(lèi)的虛實(shí)例,可能無(wú)法正確析構(gòu)

/w14287 'operator': 無(wú)符號(hào)/負(fù)常數(shù)不匹配

/we4289 nonstandard extension used: 'variable': 在for循環(huán)中聲明的循環(huán)控制變量在for循環(huán)作用域之外使用

/w14296 'operator': 表達(dá)式總是'布爾值(boolean_value)'

/w14311 'variable': 指針從'type1'轉(zhuǎn)換到'type2'時(shí)被截?cái)?/p>

/w14545 逗號(hào)前的表達(dá)式計(jì)算的是缺少參數(shù)列表的函數(shù)

/w14546 逗號(hào)前的函數(shù)調(diào)用缺少參數(shù)列表

/w14547 'operator': 逗號(hào)前的運(yùn)算符無(wú)效,預(yù)期運(yùn)算符有副作用

/w14549 'operator': 逗號(hào)前的運(yùn)算符無(wú)效,想要“運(yùn)算符”嗎?

/w14555 表達(dá)式?jīng)]有效果,表達(dá)式預(yù)期帶有副作用

/w14619 pragma warning: 沒(méi)有警告號(hào)碼

/w14640 在線程不安全的靜態(tài)成員初始化時(shí)啟用警告

/w14826 從'type1'到'type_2'的轉(zhuǎn)換會(huì)擴(kuò)展符號(hào),可能會(huì)導(dǎo)致意外的運(yùn)行時(shí)行為

/w14905 寬字符串字面量轉(zhuǎn)換為'LPSTR'

/w14906 字符串字面量轉(zhuǎn)換為'LPWSTR'

/w14928 非法的拷貝初始化,已隱式應(yīng)用多個(gè)用戶定義轉(zhuǎn)換

不建議

/Wall 會(huì)對(duì)標(biāo)準(zhǔn)庫(kù)中包含的文件發(fā)出警告,有太多額外的警告,因此沒(méi)什么用。

通用

一開(kāi)始就設(shè)置非常嚴(yán)格的警告,在項(xiàng)目開(kāi)始后試圖提高警告級(jí)別可能會(huì)很痛苦。

考慮使用將警告視為錯(cuò)誤的設(shè)置,例如MSVC中的/Wx,以及GCC/Clang中的-Werror。

基于LLVM的工具

基于LLVM的工具與能夠輸出編譯命令數(shù)據(jù)庫(kù)的構(gòu)建系統(tǒng)(例如cmake)配合得最好,例如:

$cmake-DCMAKE_EXPORT_COMPILE_COMMANDS=ON.

如果沒(méi)用這樣的構(gòu)建系統(tǒng),可以考慮Build EAR[39],它可以與現(xiàn)有構(gòu)建系統(tǒng)掛鉤,并生成編譯命令數(shù)據(jù)庫(kù)。

CMake現(xiàn)在也提供了在正常編譯期間調(diào)用```clang-tidy```[40]的內(nèi)置支持。

include-what-you-use[41], 示例結(jié)果[42]

clang-modernize[43], 示例結(jié)果[44]

clang-check[45]

clang-tidy[46]

靜態(tài)檢查

最好的選擇是將靜態(tài)分析器作為自動(dòng)化構(gòu)建系統(tǒng)的一部分運(yùn)行,cppcheck和clang可以滿足免費(fèi)選項(xiàng)的要求。

Coverity Scan

Coverity[47]提供免費(fèi)(開(kāi)源)靜態(tài)分析工具包,可以用于與Travis CI[48]和AppVeyor[49]集成的每個(gè)提交。

PVS-Studio

PVS-Studio[50]是用于檢測(cè)用C、C++和C#編寫(xiě)的程序源代碼中的bug的工具,對(duì)個(gè)人學(xué)術(shù)項(xiàng)目、開(kāi)源非商業(yè)項(xiàng)目和個(gè)人開(kāi)發(fā)者的獨(dú)立項(xiàng)目都是免費(fèi)的,可以在Windows和Linux環(huán)境下工作。

Cppcheck

Cppcheck[51]是免費(fèi)、開(kāi)源的。它努力爭(zhēng)取零誤報(bào),并且做得很好。因此,應(yīng)該啟用所有警告: --enable=all。

備注:

為了正確工作,需要格式完整的頭文件路徑,所以在使用前不要忘記傳遞: --check-config。

查找未使用的頭文件時(shí)-j不能大于1。

如果需要檢查所有的代碼,請(qǐng)記住為帶有大量#ifdef的代碼添加--force。

cppclean

cppclean[52]是開(kāi)源靜態(tài)分析器,專(zhuān)注于發(fā)現(xiàn)C++源代碼中導(dǎo)致大型代碼庫(kù)開(kāi)發(fā)緩慢的問(wèn)題。

CppDepend

CppDepend[53]通過(guò)分析和可視化代碼依賴(lài)關(guān)系、定義設(shè)計(jì)規(guī)則、進(jìn)行影響分析以及比較不同版本的代碼,簡(jiǎn)化了對(duì)復(fù)雜C/C++代碼庫(kù)的管理,對(duì)開(kāi)源貢獻(xiàn)者是免費(fèi)的。

Clang的靜態(tài)分析器

Clang的分析程序的默認(rèn)選項(xiàng)適用于各個(gè)平臺(tái),可以直接通過(guò)CMake使用[54],也可以通過(guò)基于llvm的工具[55]中的clang-check和clang-tidy調(diào)用。

此外,CodeChecker[56]可以作為clang的靜態(tài)分析前端。

clang-tidy可以通過(guò)Clang Power Tools[57]擴(kuò)展輕松的和Visual Studio一起使用。

MSVC的靜態(tài)分析器

可以通過(guò)/analyze命令行選項(xiàng)[58]啟用,可以使用默認(rèn)選項(xiàng)。

Flint / Flint++

Flint[59]和Flint++[60]是根據(jù)Facebook編碼標(biāo)準(zhǔn)分析C++代碼的linter。

OCLint

OCLint[61]是免費(fèi)、自由、開(kāi)源的靜態(tài)代碼分析工具,可以通過(guò)許多不同的方式提高C++代碼的質(zhì)量。

ReSharper C++ / CLion

這兩種來(lái)自JetBrains[62]的工具都提供了一定程度的靜態(tài)分析和自動(dòng)修復(fù)功能,為開(kāi)源項(xiàng)目負(fù)責(zé)人提供了免費(fèi)許可證選項(xiàng)。

Cevelop

基于Eclipse的Cevelop[63] IDE提供了各種靜態(tài)分析和重構(gòu)/代碼修復(fù)工具。例如,可以用C++的constexprs替換宏,重構(gòu)命名空間(提取/內(nèi)聯(lián)using,限定名稱(chēng)),并將代碼重構(gòu)為C++11的統(tǒng)一初始化語(yǔ)法。Cevelop是免費(fèi)的。

Qt Creator

Qt Creator可以插入clang靜態(tài)分析器。

clazy

clazy[64]是基于clang的分析Qt使用情況的工具。

IKOS

IKOS[65]是開(kāi)源靜態(tài)分析器,由NASA開(kāi)發(fā)。它以抽象解釋為基礎(chǔ),用C++編寫(xiě),使用LLVM為C和C++提供了分析器。源代碼可以在Github[66]上找到。

運(yùn)行時(shí)檢查

代碼覆蓋率分析

覆蓋率分析工具應(yīng)該在測(cè)試執(zhí)行時(shí)運(yùn)行,以確保整個(gè)應(yīng)用程序都被測(cè)到。不幸的是,覆蓋率分析需要禁用編譯器優(yōu)化,這將導(dǎo)致測(cè)試執(zhí)行時(shí)間大大延長(zhǎng)。

Codecov[67]

與Travis CI和AppVeyor集成

對(duì)于開(kāi)源項(xiàng)目免費(fèi)

Coveralls[68]

與Travis CI和AppVeyor集成

對(duì)于開(kāi)源項(xiàng)目免費(fèi)

LCOV[69]

有很多配置項(xiàng)

Gcovr[70]

kcov[71]

可與codecov和coveralls集成

不需要特殊的編譯器flag,只需要debug符號(hào),就可以輸出代碼覆蓋率報(bào)告

OpenCppCoverage[72]

Windows上的開(kāi)源代碼覆蓋率工具

Valgrind

Valgrind[73]是運(yùn)行時(shí)代碼分析器,可以檢測(cè)內(nèi)存泄漏、競(jìng)爭(zhēng)條件和其他相關(guān)問(wèn)題,支持各種Unix平臺(tái)。

Dr Memory

和Valgrind類(lèi)似。http://www.drmemory.org

GCC / Clang Sanitizers

這些工具提供了許多與Valgrind相同的特性,但內(nèi)置在編譯器中,易于使用,并提供問(wèn)題報(bào)告。

AddressSanitizer

MemorySanitizer

ThreadSanitizer

UndefinedBehaviorSanitizer

注意可用的sanitizer選項(xiàng),包括運(yùn)行時(shí)選項(xiàng)。https://kristerw.blogspot.com/2018/06/useful-gcc-address-sanitizer-checks-not.html

Fuzzy分析器

如果項(xiàng)目接受用戶定義的輸入,可以考慮運(yùn)行模糊輸入測(cè)試。

這些工具都使用覆蓋率報(bào)告來(lái)尋找新的代碼執(zhí)行路徑,并嘗試為代碼提供新的輸入。它們可以發(fā)現(xiàn)崩潰、掛起以及一些沒(méi)有被考慮到的輸入。

american fuzzy lop[74]

LibFuzzer[75]

KLEE[76] —— 可以為單獨(dú)的函數(shù)提供模糊測(cè)試

變異測(cè)試

這些工具獲取在單元測(cè)試運(yùn)行期間執(zhí)行的代碼,并改變執(zhí)行的代碼。如果測(cè)試在有突變的情況下仍然通過(guò),那可能意味著在測(cè)試套件中存在有缺陷的測(cè)試。

Dextool Mutate[77]

MuCPP[78]

mull[79]

CCMutator[80]

控制流保護(hù)

MSVC的[控制流保護(hù)(Control Flow Guard)](https://msdn.microsoft.com/en-us/library/windows/desktop/mt637065%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 "控制流保護(hù)(Control Flow Guard "控制流保護(hù)(Control Flow Guard)")")增加了高性能的運(yùn)行時(shí)安全檢查。

檢查STL實(shí)現(xiàn)

_GLIBCXX_DEBUG與GCC的libstdc++的實(shí)現(xiàn)。參見(jiàn)Krister的博客文章[81]。

堆分析

https://epfl-vlsc.github.io/memoro —— 一個(gè)詳細(xì)的堆分析器

忽略警告

如果團(tuán)隊(duì)一致認(rèn)為編譯器或分析器對(duì)不正確或不可避免的錯(cuò)誤發(fā)出警告,則團(tuán)隊(duì)需要盡可能只在最小的范圍內(nèi)禁用特定的錯(cuò)誤警告。

在對(duì)一段代碼禁用該警告后,請(qǐng)確保重新啟用該警告,沒(méi)人希望禁用的警告被泄露到其他代碼中[82]。

測(cè)試

上面提到的CMake有一個(gè)用于執(zhí)行測(cè)試的內(nèi)置框架,請(qǐng)確保使用的任何構(gòu)建系統(tǒng)都能夠執(zhí)行內(nèi)置測(cè)試。

為了進(jìn)一步幫助執(zhí)行測(cè)試,請(qǐng)考慮使用某個(gè)單元測(cè)試庫(kù),如Google Test[83]、Catch[84]、CppUTest[85]或Boost.Test[86],以幫助組織測(cè)試。

單元測(cè)試

單元測(cè)試針對(duì)的是可以獨(dú)立測(cè)試的小代碼塊和獨(dú)立功能。

集成測(cè)試

對(duì)于提交的每個(gè)特性或bug修復(fù),都應(yīng)該啟用測(cè)試。參見(jiàn)上文介紹的代碼覆蓋率分析。這些測(cè)試比單元測(cè)試級(jí)別更高,但仍然應(yīng)該被限制在單個(gè)特性的范圍內(nèi)。

逆向測(cè)試

不要忘記確保測(cè)試代碼中的錯(cuò)誤處理,并且確保其能夠正常工作。如果目標(biāo)是100%的代碼覆蓋率,很明顯這些錯(cuò)誤場(chǎng)景也需要被覆蓋的。

調(diào)試

uftrace

uftrace[87]可以用來(lái)生成程序執(zhí)行的函數(shù)調(diào)用圖。

rr

rr[88]是一個(gè)免費(fèi)、開(kāi)源的反向調(diào)試器,支持C++。

其他工具

Lizard

Lizard[89]提供了針對(duì)C++代碼庫(kù)運(yùn)行復(fù)雜性分析的非常簡(jiǎn)單的接口。

Metrix++

Metrix++[90]可以識(shí)別并報(bào)告代碼中最復(fù)雜的部分,從而幫助我們減少?gòu)?fù)雜代碼,幫助編譯器更好的理解和優(yōu)化代碼。

ABI Compliance Checker

ABI Compliance Checker[91] (ACC)可以分析兩個(gè)庫(kù)版本,并生成關(guān)于API和C++ ABI變化的詳細(xì)兼容性報(bào)告,可以幫助庫(kù)開(kāi)發(fā)人員發(fā)現(xiàn)無(wú)意的破壞性更改,以確保向后兼容性。

CNCC

Customizable Naming Convention Checker[92](可自定義的命名約定檢查器)可以報(bào)告代碼中不遵循特定命名約定的標(biāo)識(shí)符。

ClangFormat

ClangFormat[93]可以自動(dòng)檢查并糾正代碼格式,以匹配組織約定??梢詤⒖缄P(guān)于clang-format的系列文章[94]。

SourceMeter

SourceMeter[95]提供了免費(fèi)版本,可以為代碼提供許多不同的度量,也可以調(diào)用cppcheck。

Bloaty McBloatface

Bloaty McBloatface[96]是用于類(lèi)unix平臺(tái)的二進(jìn)制大小分析器。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4791

    瀏覽量

    90065
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77121
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73976

原文標(biāo)題:C++最佳實(shí)踐 | 1. 工具

文章出處:【微信號(hào):C語(yǔ)言與CPP編程,微信公眾號(hào):C語(yǔ)言與CPP編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    何為高質(zhì)量代碼?如何寫(xiě)出高質(zhì)量代碼?

    懂得“數(shù)據(jù)結(jié)構(gòu)與算法” 寫(xiě)出高效的代碼,懂得“設(shè)計(jì)模式”寫(xiě)出高質(zhì)量代碼。
    發(fā)表于 08-02 09:44 ?1411次閱讀
    何為高<b class='flag-5'>質(zhì)量</b>的<b class='flag-5'>代碼</b>?如何寫(xiě)出高<b class='flag-5'>質(zhì)量</b><b class='flag-5'>代碼</b>?

    SMT來(lái)料質(zhì)檢:確保電子生產(chǎn)質(zhì)量的關(guān)鍵

    ,保障公司產(chǎn)品的整體質(zhì)量水平。 二、電子元器件的檢查 電子元件來(lái)料檢查是確保產(chǎn)品質(zhì)量和生產(chǎn)穩(wěn)定性不可或缺的步驟,旨在早期識(shí)別并解決原材料問(wèn)題,以維持生產(chǎn)的順暢和產(chǎn)品的可靠性。檢查流程包括以下幾個(gè)
    發(fā)表于 01-07 16:16

    如何提高嵌入式代碼質(zhì)量?

    嵌入式代碼質(zhì)量是至關(guān)重要的。本文將探討如何通過(guò)有效的開(kāi)發(fā)方法和工具來(lái)提高嵌入式代碼質(zhì)量,以確保系統(tǒng)的可靠性和可維護(hù)性。 理解嵌入式系
    發(fā)表于 01-15 10:48

    淺談?dòng)绊懽枞驾斔蛶?b class='flag-5'>整體帶芯質(zhì)量的因素

    分析了骨架材料、捻線質(zhì)量、編織結(jié)構(gòu)等幾個(gè)影響整體帶芯質(zhì)量的因素,介紹了整體帶芯質(zhì)量的途徑和方法。
    發(fā)表于 02-04 13:39 ?12次下載

    Softcopy ruler整體圖像質(zhì)量視覺(jué)評(píng)測(cè)新方法

    利用軟件工具定量分析數(shù)字成像系統(tǒng)的性能可以?xún)?yōu)化整體圖像質(zhì)量,故這種方法可以把不同屬性的測(cè)量結(jié)果結(jié)合起來(lái),最終預(yù)測(cè)出整體質(zhì)量
    發(fā)表于 02-18 10:14 ?1607次閱讀

    如何才能度量JavaScript的代碼質(zhì)量

    為了讓計(jì)算精度上升到最高,客觀質(zhì)量分析以程序化的方式對(duì)代碼進(jìn)行分析。這項(xiàng)任務(wù)可以使用編程工具完成,這些工具能夠在多種情況下評(píng)估代碼,根據(jù)各項(xiàng)指標(biāo)得到最終的質(zhì)量得分。本節(jié)介紹了靜態(tài)
    發(fā)表于 08-27 17:29 ?0次下載
    如何才能度量JavaScript的<b class='flag-5'>代碼</b><b class='flag-5'>質(zhì)量</b>

    微軟是如何確保代碼質(zhì)量的呢?

    微軟代碼評(píng)審是一種被廣泛采用的工程實(shí)踐。成千上萬(wàn)的工程師認(rèn)為這是一個(gè)偉大的最佳實(shí)踐。大多數(shù)高績(jī)效團(tuán)隊(duì)花費(fèi)大量時(shí)間進(jìn)行代碼評(píng)審。
    的頭像 發(fā)表于 05-29 14:08 ?3501次閱讀
    微軟是如何<b class='flag-5'>確保</b><b class='flag-5'>代碼</b><b class='flag-5'>質(zhì)量</b>的呢?

    測(cè)試是確保代碼正確的唯一方法

      衡量整個(gè)測(cè)試過(guò)程的有效性對(duì)于開(kāi)發(fā)高保證軟件至關(guān)重要。了解需要加強(qiáng)測(cè)試的地方以及測(cè)試過(guò)程中存在的差距對(duì)于改進(jìn)代碼整體過(guò)程和質(zhì)量至關(guān)重要,并且隨著工具越來(lái)越專(zhuān)注于應(yīng)用程序領(lǐng)域,這種需求也會(huì)增加。
    的頭像 發(fā)表于 06-19 10:45 ?1458次閱讀
    測(cè)試是<b class='flag-5'>確保</b><b class='flag-5'>代碼</b>正確的唯一方法

    測(cè)試是確保代碼正確的唯一方法

      衡量整個(gè)測(cè)試過(guò)程的有效性對(duì)于開(kāi)發(fā)高保證軟件至關(guān)重要。了解需要加強(qiáng)測(cè)試的地方以及測(cè)試過(guò)程中存在的差距對(duì)于改進(jìn)代碼整體過(guò)程和質(zhì)量至關(guān)重要,并且隨著工具越來(lái)越專(zhuān)注于應(yīng)用程序領(lǐng)域,這種需求也會(huì)增加。
    的頭像 發(fā)表于 07-09 07:19 ?1180次閱讀
    測(cè)試是<b class='flag-5'>確保</b><b class='flag-5'>代碼</b>正確的唯一方法

    靜態(tài)分析:對(duì)代碼質(zhì)量至關(guān)重要

      讓我們從顯而易見(jiàn)的事情開(kāi)始:靜態(tài)分析本身并不是靈丹妙藥。它不能保證復(fù)雜的軍事嵌入式應(yīng)用程序中的高代碼質(zhì)量、安全性或安全性。靜態(tài)分析也不能確保您的應(yīng)用程序滿足為程序定義的功能要求。
    的頭像 發(fā)表于 11-01 09:30 ?1003次閱讀

    幾種檢查代碼質(zhì)量的利器介紹

    工欲善其事,必先利其器,因此,這篇文章給大家介紹幾種檢查代碼質(zhì)量的利器,Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs
    的頭像 發(fā)表于 11-02 11:04 ?2041次閱讀

    靜態(tài)分析:對(duì)代碼質(zhì)量至關(guān)重要

      讓我們從顯而易見(jiàn)的事情開(kāi)始:靜態(tài)分析本身并不是靈丹妙藥。它不能保證復(fù)雜的軍事嵌入式應(yīng)用程序中的高代碼質(zhì)量、安全性或安全性。靜態(tài)分析也不能確保您的應(yīng)用程序滿足為程序定義的功能要求。
    的頭像 發(fā)表于 11-08 14:10 ?1021次閱讀

    探究Harmony底座OpenHarmony的代碼質(zhì)量改進(jìn)

    探究Harmony底座OpenHarmony的代碼質(zhì)量改進(jìn)
    的頭像 發(fā)表于 04-03 15:23 ?1665次閱讀
    探究Harmony底座OpenHarmony的<b class='flag-5'>代碼</b><b class='flag-5'>質(zhì)量</b>改進(jìn)

    DevOps中的質(zhì)量門(mén)工作原理,以及靜態(tài)代碼分析Klocwork和Perforce Helix QAC在質(zhì)量門(mén)中的實(shí)踐應(yīng)用

    質(zhì)量門(mén)”正如其名:它們?cè)谲浖_(kāi)發(fā)生命周期(SDLC)的各個(gè)階段充當(dāng)質(zhì)量里程碑(或 "門(mén)檻"),防止不良代碼通過(guò),從而確保交付高質(zhì)量的軟件。
    的頭像 發(fā)表于 07-29 15:12 ?1479次閱讀

    如何確保選擇的貼片電容質(zhì)量

    在電子元器件市場(chǎng)中,貼片電容作為基礎(chǔ)元件,其質(zhì)量直接關(guān)系到電路的穩(wěn)定性和可靠性。面對(duì)市場(chǎng)上琳瑯滿目的產(chǎn)品,如何確保選擇的貼片電容質(zhì)量上乘,成為工程師和采購(gòu)人員關(guān)注的焦點(diǎn)。以下將從外觀檢測(cè)、性能測(cè)試
    的頭像 發(fā)表于 08-22 17:32 ?981次閱讀
    如何<b class='flag-5'>確保</b>選擇的貼片電容<b class='flag-5'>質(zhì)量</b>?