Lint

我們使用 clang-ddy 對 Lint C++ 程式碼,致力確保存放區顯示警告。Linter 是在根層級 .clang-tidy 檔案中設定。開發人員不應在較低層級建立其他設定檔,因為這會導致樹狀結構中的不一致。

如何 Lint

fx lint 是 Fuchsia 指令碼,可在常見的指令列介面中納入語言專屬的 Linter。此工具會根據您指定的選項收集檔案清單,並比對 Linter 來分隔檔案,然後執行每個必要的 Linter。clang-tidy 用於 C 和 C++ 檔案。

如果沒有任何其他引數,fx lint 會檢查最新 Git 修訂版本中的檔案,並透過 Linter 傳遞檔案:

fx lint

如要限制 Lint 僅以 C++ 進行程式碼檢查,請新增雙破折號 (--),並在後方加上檔案模式,例如:

fx lint -- '*.cc' '*.cpp'

如要透過 Linter 執行特定的 GN 目標,請使用:

fx lint --target=<target>

如要檢查目前工作目錄下的所有檔案,請新增 --all。我們通常不建議從頂層 fuchsia 目錄執行 fx lint --all,這項作業可能需要數小時才能完成。確定您擁有 cd 的最佳頂層目錄,以便符合分析需求。例如:

(cd <your/subdir>; fx lint --all -- '*.cc')

您也可以新增 --fix,以便自動為部分 (而非全部) 警告產生修正內容。

如需其他選項和範例,請參閱工具本身。如需 fx lint 的最新說明文件 (包括範例),請執行:

fx lint --help

隱藏警告

在違規行中加入 // NOLINT(<check_name>)// NOLINTNEXTLINE(<check_name>) 註解,即可隱藏任何警告。您也可以透過編輯根層級的 .clang-tidy 檔案,完全停用存放區中的檢查功能。

支票

已啟用多個檢查類別,其中特定檢查功能已停用,原因如下。已啟用的檢查類別清單如下:

  • bugprone-*
  • clang-diagnostic-*
  • google-*
  • misc-*
  • modernize-
  • performance-*
  • readability-*

這份清單會列出我們特別針對檢查停用的原因:

  • clang-diagnostic-unused-command-line-argument - ninja 產生的編譯資料庫包含連接器引數,因此會為每個檔案觸發這則警告,並觸發這則警告
  • misc-noexcept* - Fuchsia 不使用 C++ 例外狀況
  • misc-non-private-member-variables-in-classes - 我們禁止結合私人和公開成員加入的類別/結構,但所有公開性質均可通過。
  • modernize-deprecated-headers - Fuchsia 使用舊式 C 標頭
  • modernize-use-nodiscard - 通常未用於 Fuchsia 程式碼集
  • modernize-raw-string-literal:檢查建議轉換 \xFF 常值,我們希望能保留逸出形式。
  • modernize-return-braced-init-list - 擔心傳回用於建構函式引數的初始化清單是否容易讀取,建議您明確使用建構函式
  • modernize-use-emplace - 啟用 IgnoreImplicitConstructors 選項,以便遵循「Abseil Tip of the Week #112」。
  • modernize-use-equals-delete - 正在標記所有 TEST_F 值
  • modernize-use-trailing-return-type - Fuchsia C++ 程式碼通常會使用定義函式的 int foo() 樣式,而非這項檢查建議的 auto foo() -> int 樣式。
  • readability-implicit-bool-conversion - Fuchsia C++ 程式碼通常使用隱含指標和數字的隱含布林值量級
  • readability-isolate-declaration - Zircon 程式碼通常會使用配對宣告。
  • readability-uppercase-literal-suffix - Fuchsia C++ 程式碼選擇不對此套用樣式。

靜態分析

嚴格來說,這不是程式碼檢查,但 Clang 靜態分析工具可以執行深度分析來找出錯誤。詳情請參閱「靜態分析」一文。