免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

C++最佳實踐 | 1. 工具 - 簡書

 覓書時代 2023-07-13 發(fā)布于河北

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

C++最佳實踐:

  1. 工具(本文)

  2. 代碼風格

  3. 安全性

  4. 可維護性

  5. 可移植性及多線程

  6. 性能

  7. 正確性和腳本

前言

C++最佳實踐: 支持Fork的編碼標準文檔

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

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

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

免責聲明

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

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

工具

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

源碼管理

對于任何軟件開發(fā)項目來說,源碼管理都是絕對必要的,如果還沒有,那就開始使用。

  • GitHub —— 允許無限制的公共存儲庫和私有存儲庫,支持最多3個協(xié)作者。

  • Bitbucket —— 允許無限制的私人存儲庫,最多5個協(xié)作者,免費。

  • SourceForge —— 僅支持托管開放源碼。

  • GitLab —— 免費提供無限的公共和私有存儲庫,包括無限的CI執(zhí)行器(CI Runner)。

  • Visual Studio Online (http://www./what-is-visual-studio-online-vs) —— 無限的公共存儲庫,私有存儲庫收費,支持git或TFVC。另外提供: 問題跟蹤、項目計劃(包括Scrum等多個敏捷模板)、集成托管構(gòu)建,所有特性都可以集成到Microsoft Visual Studio中,僅支持Windows。

構(gòu)建工具

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

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

包管理器

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

  • Conan —— 跨平臺C++依賴管理器

  • hunter —— CMake驅(qū)動的跨平臺包管理器,適用于C/C++

  • C++ Archive Network (CPPAN) —— 跨平臺C++依賴管理器

  • qpm —— Qt的包管理器

  • build2 —— 類Cargo的C++包管理器

  • Buckaroo —— 真正去中心化的跨平臺依賴管理器,適用于C/C++等等

  • Vcpkg —— 微軟C++庫管理器,支持Windows, Linux和MacOS

持續(xù)集成

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

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

  • Travis CI

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

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

    • GitHub公共存儲庫可以免費使用

  • AppVeyor

    • 支持Windows、MSVC和MinGW

    • GitHub公共存儲庫可以免費使用

  • Hudson CI / Jenkins CI

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

    • 支持Windows、OS X和Linux

    • 可以通過許多插件進行擴展

  • TeamCity

    • 對開源項目免費

  • Decent CI

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

    • 支持Windows、OS X和Linux

    • 使用ChaiScript

  • Visual Studio Online (http://www./what-is-visual-studio-online-vs)

    • 與Visual Studio Online的源代碼庫緊密集成

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

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

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

    • 通過Microsoft Team Foundation Server進行內(nèi)部安裝

  • GitLab

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

    • 有免費的共享執(zhí)行器

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

如果在GitHub上有開源、公開托管的項目:

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

編譯器

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

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

GCC / Clang

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

  • -Wall -Wextra 合理、標準

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

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

  • -Wold-style-cast 對C風格的類型轉(zhuǎn)換發(fā)出警告

  • -Wcast-align 警告有潛在性能問題的強制類型轉(zhuǎn)換

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

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

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

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

  • -Wsign-conversion 對影響到符號的類型轉(zhuǎn)換發(fā)出警告(Clang所有版本,GCC >= 4.3)

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

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

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

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

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

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

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

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

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

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

-Weffc++警告模式可能太吵了,但如果對項目適用,也可以使用。

MSVC

/permissive- —— 執(zhí)行標準一致性

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

  • /W4 一切合理的警告

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

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

  • /w14263 'function': 成員函數(shù)不重寫任何基類虛成員函數(shù)

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

  • /w14287 'operator': 無符號/負常數(shù)不匹配

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

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

  • /w14311 'variable': 指針從'type1'轉(zhuǎn)換到'type2'時被截斷

  • /w14545 逗號前的表達式計算的是缺少參數(shù)列表的函數(shù)

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

  • /w14547 'operator': 逗號前的運算符無效,預期運算符有副作用

  • /w14549 'operator': 逗號前的運算符無效,想要“運算符”嗎?

  • /w14555 表達式?jīng)]有效果,表達式預期帶有副作用

  • /w14619 pragma warning: 沒有警告號碼

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

  • /w14826 從'type1'到'type_2'的轉(zhuǎn)換會擴展符號,可能會導致意外的運行時行為

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

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

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

不建議

  • /Wall 會對標準庫中包含的文件發(fā)出警告,有太多額外的警告,因此沒什么用。

通用

一開始就設(shè)置非常嚴格的警告,在項目開始后試圖提高警告級別可能會很痛苦。

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

基于LLVM的工具

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

$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

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

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

靜態(tài)檢查

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

Coverity Scan

Coverity提供免費(開源)靜態(tài)分析工具包,可以用于與Travis CIAppVeyor集成的每個提交。

PVS-Studio

PVS-Studio是用于檢測用C、C++和C#編寫的程序源代碼中的bug的工具,對個人學術(shù)項目、開源非商業(yè)項目和個人開發(fā)者的獨立項目都是免費的,可以在Windows和Linux環(huán)境下工作。

Cppcheck

Cppcheck是免費、開源的。它努力爭取零誤報,并且做得很好。因此,應(yīng)該啟用所有警告: --enable=all。

備注:

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

  • 查找未使用的頭文件時-j不能大于1。

  • 如果需要檢查所有的代碼,請記住為帶有大量#ifdef的代碼添加--force

cppclean

cppclean是開源靜態(tài)分析器,專注于發(fā)現(xiàn)C++源代碼中導致大型代碼庫開發(fā)緩慢的問題。

CppDepend

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

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

Clang的分析程序的默認選項適用于各個平臺,可以直接通過CMake使用,也可以通過基于llvm的工具中的clang-checkclang-tidy調(diào)用。

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

clang-tidy可以通過Clang Power Tools擴展輕松的和Visual Studio一起使用。

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

可以通過/analyze命令行選項啟用,可以使用默認選項。

Flint / Flint++

FlintFlint++是根據(jù)Facebook編碼標準分析C++代碼的linter。

OCLint

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

ReSharper C++ / CLion

這兩種來自JetBrains的工具都提供了一定程度的靜態(tài)分析和自動修復功能,為開源項目負責人提供了免費許可證選項。

Cevelop

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

Qt Creator

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

clazy

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

IKOS

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

運行時檢查

代碼覆蓋率分析

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

  • Codecov

    • 與Travis CI和AppVeyor集成

    • 對于開源項目免費

  • Coveralls

    • 與Travis CI和AppVeyor集成

    • 對于開源項目免費

  • LCOV

    • 有很多配置項

  • Gcovr

  • kcov

    • 可與codecov和coveralls集成

    • 不需要特殊的編譯器flag,只需要debug符號,就可以輸出代碼覆蓋率報告

  • OpenCppCoverage

    • Windows上的開源代碼覆蓋率工具

Valgrind

Valgrind是運行時代碼分析器,可以檢測內(nèi)存泄漏、競爭條件和其他相關(guān)問題,支持各種Unix平臺。

Dr Memory

和Valgrind類似。http://www.

GCC / Clang Sanitizers

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

  • AddressSanitizer

  • MemorySanitizer

  • ThreadSanitizer

  • UndefinedBehaviorSanitizer

注意可用的sanitizer選項,包括運行時選項。https://kristerw./2018/06/useful-gcc-address-sanitizer-checks-not.html

Fuzzy分析器

如果項目接受用戶定義的輸入,可以考慮運行模糊輸入測試。

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

變異測試

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

控制流保護

MSVC的控制流保護(Control Flow Guard)增加了高性能的運行時安全檢查。

檢查STL實現(xiàn)
堆分析
忽略警告

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

在對一段代碼禁用該警告后,請確保重新啟用該警告,沒人希望禁用的警告被泄露到其他代碼中。

測試

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

為了進一步幫助執(zhí)行測試,請考慮使用某個單元測試庫,如Google Test、CatchCppUTestBoost.Test,以幫助組織測試。

單元測試

單元測試針對的是可以獨立測試的小代碼塊和獨立功能。

集成測試

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

逆向測試

不要忘記確保測試代碼中的錯誤處理,并且確保其能夠正常工作。如果目標是100%的代碼覆蓋率,很明顯這些錯誤場景也需要被覆蓋的。

調(diào)試

uftrace

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

rr

rr是一個免費、開源的反向調(diào)試器,支持C++。

其他工具

Lizard

Lizard提供了針對C++代碼庫運行復雜性分析的非常簡單的接口。

Metrix++

Metrix++可以識別并報告代碼中最復雜的部分,從而幫助我們減少復雜代碼,幫助編譯器更好的理解和優(yōu)化代碼。

ABI Compliance Checker

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

CNCC

Customizable Naming Convention Checker(可自定義的命名約定檢查器)可以報告代碼中不遵循特定命名約定的標識符。

ClangFormat

ClangFormat可以自動檢查并糾正代碼格式,以匹配組織約定??梢詤⒖?a target="_blank" style="box-sizing: border-box; color: rgb(6, 129, 208); outline: none; cursor: pointer; transition: color 0.3s ease 0s; touch-action: manipulation;">關(guān)于clang-format的系列文章。

SourceMeter

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

Bloaty McBloatface

Bloaty McBloatface是用于類unix平臺的二進制大小分析器。

你好,我是俞凡,在Motorola做過研發(fā),現(xiàn)在在Mavenir做技術(shù)工作,對通信、網(wǎng)絡(luò)、后端架構(gòu)、云原生、DevOps、CICD、區(qū)塊鏈、AI等技術(shù)始終保持著濃厚的興趣,平時喜歡閱讀、思考,相信持續(xù)學習、終身成長,歡迎一起交流學習。
微信公眾號:DeepNoMind

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多