靜態分析 - 從介紹到集成

厭倦了無休止的程式碼審查或調試,有時您會思考如何簡化您的生活。 經過一番搜索,或偶然發現它,你可以看到神奇的短語:「靜態分析」。 讓我們看看它是什麼以及它如何與您的項目互動。

靜態分析 - 從介紹到集成
事實上,如果您用任何現代語言編寫,那麼您甚至沒有意識到,您已經透過靜態分析器運行了它。 事實上,任何現代編譯器都會提供有關程式碼中潛在問題的警告,儘管數量很少。 例如,在 Visual Studio 中編譯 C++ 程式碼時,您可能會看到以下內容:

靜態分析 - 從介紹到集成
在此輸出中我們看到變數 從未在函數中的任何地方使用過。 所以實際上,您幾乎總是使用簡單的靜態程式碼分析器。 然而,與Coverity、Klocwork或PVS-Studio等專業分析器不同,編譯器提供的警告可能僅顯示一小部分問題。

如果您不確定什麼是靜態分析以及如何實現它, 閱讀這篇文章了解有關此方法的更多資訊。

為什麼需要靜態分析?

簡而言之:加速和簡化。

靜態分析可讓您發現程式碼中的許多不同問題:從語言結構的錯誤使用到拼字錯誤。 例如,代替

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

您編寫了以下程式碼:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

正如您所看到的,最後一行有一個拼字錯誤。 例如,PVS-Studio 發出以下警告:

V537 考慮檢查「y」項使用的正確性。

如果您想了解此錯誤,請嘗試編譯器資源管理器中的現成範例:**.

正如您所理解的,並不總是能夠立即關注這些程式碼部分,因此,您可以坐下來調試一個小時,想知道為什麼一切都如此奇怪。

然而,這顯然是一個錯誤。 如果開發人員因為忘記了語言的一些微妙之處而編寫了次優程式碼怎麼辦? 或甚至在程式碼中允許它 未定義的行為? 不幸的是,這種情況非常普遍,而且大部分時間都花在調試包含拼字錯誤、典型錯誤或未定義行為的特定工作程式碼。

正是針對這些情況,靜態分析出現了。 這是開發人員的助手,他會指出程式碼中的各種問題,並在文件中解釋為什麼沒有必要這樣編寫,它會導致什麼以及如何修復它。 下面是它的範例:**.

您可以在文章中找到分析器可以偵測到的更多有趣的錯誤:

既然您已經閱讀了本文並確信靜態分析的好處,您可能想嘗試一下。 但要從哪裡開始呢? 如何將新工具整合到您目前的專案中? 以及如何向他介紹團隊? 您將在下面找到這些問題的答案。

注。 靜態分析不會取代或取消程式碼審查這樣有用的東西。 它補充了這個過程,有助於提前發現並糾正拼字錯誤、不準確和危險的設計。 專注於演算法和程式碼清晰度的程式碼審查,而不是尋找放錯位置的括號或錯誤,會更有效率。 閱讀無聊的比較函數.

0. 認識工具

一切都從試用版開始。 事實上,如果您以前從未見過該工具,則很難決定在開發過程中引入某些東西。 因此,您應該做的第一件事就是下載 試用版.

在這個階段你將學到什麼:

  • 與分析儀互動的方式有哪些;
  • 分析儀與您的開發環境相容嗎?
  • 目前您的專案中存在哪些問題?

安裝完所需的一切後,您應該做的第一件事是對整個專案進行分析(Windows, Linux, MacOS)。 對於 Visual Studio 中的 PVS-Studio,您將看到類似的圖片(可點擊):

靜態分析 - 從介紹到集成
事實上,靜態分析器通常會對具有大型程式碼庫的專案發出大量警告。 無需全部修復,因為您的專案已經在運行,這意味著這些問題並不重要。 然而,你 你可以看看最有趣的警告 並在必要時糾正它們。 為此,您需要過濾輸出並僅留下最可靠的訊息。 在 Visual Studio 的 PVS-Studio 外掛程式中,這是透過按錯誤等級和類別進行過濾來完成的。 為了獲得最準確的輸出,僅保留 и (也可點擊):

靜態分析 - 從介紹到集成
事實上,178 個警告比數千個警告更容易查看...

在選項卡中 Medium и 通常會有很好的警告,但這些類別包括那些準確性(可靠性)較低的診斷。 有關在 Windows 下工作的警告級別和選項的更多信息,請訪問:**.

成功審查最有趣的錯誤(並成功糾正它們)是值得的 抑制剩餘的警告。 這是必要的,這樣新的警告就不會被舊的警告淹沒。 另外,靜態分析器是程式設計師的助手,而不是bug列表。 🙂

1. 自動化

熟悉之後,就可以配置插件並整合到 CI 中了。 這必須在程式設計師開始使用靜態分析器之前完成。 事實上,程式設計師可能忘記啟用分析或根本不想這樣做。 為此,您需要對所有內容進行一些最終檢查,以便未經測試的程式碼無法進入一般開發分支。

在這個階段你將學到什麼:

  • 該工具提供哪些自動化選項;
  • 分析儀與您的組裝系統相容嗎?

由於完美的文檔不存在,有時您必須編寫 支持。 這是正常現象,我們很樂意為您提供協助。 🙂

現在讓我們繼續討論持續整合 (CI) 服務。 任何分析器都可以在其中實施,不會有任何嚴重問題。 為此,您需要在管道中建立一個單獨的階段,該階段通常位於建置和單元測試之後。 這是使用各種控制台實用程式完成的。 例如,PVS-Studio 提供以下實用程式:

要將分析整合到 CI 中,您需要做三件事:

  • 安裝分析儀;
  • 運行分析;
  • 交付成果。

例如,要在Linux(Debian-base)上安裝PVS-Studio,您需要執行以下命令:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

在執行 Windows 的系統上,無法從套件管理器安裝分析器,但可以從命令列部署分析器:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

您可以閱讀有關在執行 Windows 的系統上部署 PVS-Studio 的更多資訊*這裡*.

安裝後,需要直接執行分析。 但是,建議僅在編譯和測試通過後才執行此操作。 這是因為靜態分析通常需要兩倍於編譯的時間。

由於啟動方法取決於平台和專案特性,我將以 C++ (Linux) 的選項為例:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

第一個指令將執行分析,第二個指令將執行分析 信封將報告轉換為文字格式,將其顯示在螢幕上,如果有警告,則傳回非 0 的回傳代碼。 當出現錯誤訊息時,可以方便地使用這樣的機制來阻止建置。 但是,您始終可以刪除該標誌 -w 並且不要阻止包含警告的程序集。

注。 文字格式不方便。 它僅作為示例提供。 專注於一個更有趣的報告格式—FullHtml。 它允許您瀏覽程式碼。

您可以在文章中閱讀有關在 CI 上設定分析的更多資訊“PVS-Studio 和持續集成“(Windows)或”如何在 Travis CI 中設定 PVS-Studio「(Linux)。

好的,您已經在建置伺服器上配置了分析器。 現在,如果有人上傳未經測試的程式碼,驗證階段將失敗,您將能夠檢測到問題,但是,這並不完全方便,因為不是在分支合併之後檢查專案更有效,而是在此之前,在拉取請求階段。

一般來說,設定拉取請求分析與通常在 CI 上啟動分析沒有太大差異。 除了需要取得已更改文件的清單之外。 這些通常可以透過使用git查詢分支之間的差異來獲得:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

現在您需要將此文件清單作為輸入傳遞給分析器。 例如,在 PVS-Studio 中,這是使用標誌來實現的 -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

您可以找到有關分析拉取請求的更多資訊 *這裡*。 即使您的 CI 不在本文提到的服務清單中,您也會發現專門討論此類分析理論的一般部分很有用。

透過設定拉取請求分析,您可以封鎖包含警告的提交,從而建立未經測試的程式碼無法跨越的邊界。

這當然很好,但我希望能夠在一處看到所有警告。 不僅來自靜態分析器,還來自單元測試或動態分析器。 為此有各種服務和插件。 例如,PVS-Studio 有 用於整合到 SonarQube 的插件.

2. 在開發者機器上集成

現在是時候安裝和配置分析器以供日常開發使用了。 至此你已經熟悉了大部分的工作方式,所以這可以說是最簡單的部分。

作為最簡單的選擇,開發人員可以自行安裝必要的分析器。 但是,這將花費大量時間並分散他們的開發注意力,因此您可以使用安裝程式和必要的標誌來自動化此流程。 對於PVS-Studio 有各種 自動安裝的標誌。 然而,總是有套件管理器,例如 Chocolatey (Windows)、Homebrew (macOS) 或數十種適用於 Linux 的選項。

然後你需要安裝必要的插件,例如 視覺工作室, IDEA, 騎士 等。

3.日常使用

在這個階段,是時候談談在日常使用過程中加速分析儀的方法了。 整個專案的完整分析需要花費大量時間,但是我們多久一次更改整個專案的程式碼? 幾乎沒有任何重構會立即影響整個程式碼庫。 一次更改的文件數量很少超過十幾個,因此分析它們是有意義的。 對於這樣的情況有 增量分析模式。 只是不要驚慌,這不是另一個工具。 這是一種特殊模式,可讓您僅分析已變更的檔案及其依賴項,如果您在安裝了插件的 IDE 中工作,則在建置後會自動發生這種情況。

如果分析器偵測到最近更改的程式碼中存在問題,它將獨立報告此問題。 例如,PVS-Studio 將使用警報告訴您這一點:

靜態分析 - 從介紹到集成
當然,僅僅告訴開發人員使用該工具還不夠。 我們需要以某種方式告訴他們這是什麼以及它是怎樣的。 例如,這裡有關於 PVS-Studio 快速入門的文章,但您可以找到適合您喜歡的任何工具的類似教學:

此類文章提供了日常使用所需的所有信息,並且不需要花費太多時間。 🙂

即使在了解工具的階段,我們也在第一次發布期間抑制了許多警告。 不幸的是,靜態分析器並不完美,因此它們有時會給出誤報。 通常很容易抑制它們;例如,在 Visual Studio 的 PVS-Studio 外掛程式中,您只需點擊一個按鈕:

靜態分析 - 從介紹到集成
然而,你可以做的不僅僅是壓制它們。 例如,您可以向支援人員報告問題。 如果可以糾正誤報,那麼在將來的更新中,您會發現每次特定於您的程式碼庫的誤報越來越少。

公眾號

這樣我們就經歷了將靜態分析整合到開發過程中的所有階段。 儘管在 CI 上設定此類工具很重要,但運行它們的最重要位置是開發人員的電腦。 畢竟,靜態分析器不是一個在遠離你的地方說程式碼不好的法官。 相反,它是一個助手,如果你累了,它會告訴你;如果你忘記了什麼,它會提醒你。

確實,如果不經常使用,靜態分析不太可能顯著簡化開發。 畢竟,它對開發人員的主要好處不在於搜尋複雜且有爭議的程式碼部分,而是早期檢測。 同意在編輯發送測試後發現問題不僅令人不愉快,而且非常耗時。 定期使用靜態分析時,靜態分析會直接查看電腦上的每個更改,並在處理代碼時報告可疑位置。

如果您或您的同事仍然不確定是否值得實施分析器,那麼我建議您現在開始閱讀這篇文章“在開發過程中引入靜態程式碼分析器PVS-Studio的原因它解決了開發人員通常擔心的靜態分析會佔用他們的時間等問題。

靜態分析 - 從介紹到集成

如果您想與英語讀者分享這篇文章,請使用翻譯鏈接:Maxim Zvyagintsev。 靜態分析:從入門到集成.

來源: www.habr.com

添加評論