靜態分析

靜態分析是一種檢查連結到已知錯誤的模式的程式碼的技術。使用此技術比程式碼審查耗時更少,但其檢查僅限於工具中程式設計的檢查。

檢查可以包括 if 語句(if (var);)後面的不正確的分號,直到高階圖演算法確定變數是否未初始化。

編譯器警告

啟用靜態分析很簡單,最簡單的版本已經在你的編譯器中內建:

如果啟用這些選項,你會注意到每個編譯器都會發現其他編譯器沒有的錯誤,並且你將在特定上下文中可能有效或有效的技術上獲得錯誤。即使 while (localBool); 不是,也可以接受 while (staticAtomicBool);

因此,與程式碼審查不同,你正在使用一種能夠理解程式碼的工具,告訴你許多有用的錯誤,有時甚至不同意你的看法。在最後一種情況下,你可能必須在本地禁止警告。

由於上面的選項可以啟用所有警告,因此它們可能會啟用你不需要的警告。 (為什麼你的程式碼應該與 C++ 98 相容?)如果是這樣,你可以簡單地禁用該特定警告:

  • clang++ -Wall -Weverything -Werror -Wno-errortoaccept ...
  • g++ -Wall -Weverything -Werror -Wno-errortoaccept ...
  • cl.exe /W4 /WX /wd<no of warning>...

編譯器警告在開發過程中為你提供幫助的地方,它們會使編譯速度變慢。這就是為什麼你可能並不總是希望預設啟用它們。你可以預設執行它們,也可以使用更昂貴的支票(或所有支票)進行持續整合。

外部工具

如果你決定進行一些持續整合,那麼使用其他工具並不是一件容易的事。像 clang-tidy 這樣的工具有一系列檢查 ,涵蓋了廣泛的問題,例如:

  • 實際的錯誤
    • 防止切片
    • 斷言有副作用
  • 可讀性檢查
    • 誤導性的縮排
    • 檢查識別符號命名
  • 現代化檢查
    • 使用 make_unique()
    • 使用 nullptr
  • 效能檢查
    • 查詢不需要的副本
    • 找到效率低下的演算法呼叫

列表可能不是那麼大,因為 Clang 已經有很多編譯器警告,但是它會讓你更接近高質量的程式碼庫。

其他工具

存在具有類似用途的其他工具,例如:

結論

C++存在很多靜態分析工具,它們都作為外部工具在編譯器中內建。試用它們並不需要花費太多時間來進行簡單的設定,它們會在程式碼審查中發現你可能會錯過的錯誤。