致C++完美主義者:使用Visual Studio新工具分析你的代碼

官宣IntelliSense Code Linter for C++

在Visual Studio 2019 v16.6 Preview 2中,我們高興的宣佈一項針對C++開發者的新功能:IntelliSense Code Linter for C++。這項新功能旨在幫助C++開發者在編寫代碼的時候能快速定位和修正可能存在的代碼缺陷。它會在你編寫代碼的時候,在編輯器中以下劃線的方式,實時地的顯示代碼中存在的問題並給出建議的修改措施。

有圖有真相

致C++完美主義者:使用Visual Studio新工具分析你的代碼

這項新功能構建在Visual Studio現有的C++ IntelliSense基礎之上。

這意味著,代碼掃描將比之前的後臺代碼分析更快,從而更早地給出分析結果。

為了確保IntelliSense組件以儘可能快的速度運行,舊版的linter組件主要關注在那些很容易被發現的問題上。

新版本的linter將作為現有代碼分析工具(例如MSVC的後臺代碼分析或者Clang-Tidy)的一個重要補充,同時可以對複雜的代碼場景進行分析處理。

你可以在Visual Studio的[工具-選項]菜單中打開這個預覽版功能,如下圖所示:

致C++完美主義者:使用Visual Studio新工具分析你的代碼

設計目標

當我們考慮要怎麼做才能實現出一個比較好的代碼分析工具時,我們將如下的幾個目標作為Linter的設計目標。

1) 我們希望Linter能儘可能地找出那些讓C++開發者感到意外的代碼缺陷,尤其是來自其他語言的開發者。通過這樣的代碼檢查,可以使某些C++語言功能的學習曲線變得平滑。

2) 這個工具應該可以提供針對具體問題的建議。就像IntelliSense可以偵測出可能會導致構建失敗的語法錯誤一樣,Linter應該可以幫助您在代碼構建之前就識別並修復邏輯和運行時錯誤。

3) Linter應該能找出那些可以被解決的問題。雖然最終這只是代碼風格和哲學問題,但總的來說,它們只關注導致實際Bug的代碼缺陷。

會進行哪些代碼檢查

我們根據上面提到的三個設計目標,我們在Preview 2版本中實現了以下的幾個代碼檢查。

Arithmetic Overflow

此代碼檢查將查找:使用32位數據類型進行算術運算,然後賦值給更寬的類型的情況。將一個32位的變量分配給更寬的類型,可以很好地表明開發者認為變量的值可能超出32位類型的範圍。在C++中,表達式將被認為32位的,這可能會算術溢出,然後將溢出後的值賦值給更寬的類型變量。

致C++完美主義者:使用Visual Studio新工具分析你的代碼

Integer Division Assigned to Floating Point

此代碼檢查將查找:將整數除法的結果賦值給一個浮點數的情況。將一個表達式賦值給一個浮點類型,可以很好地表明開發者想要結果的小數部分。在C++中,會先對整數除法求值,並且在將結果分配給浮點類型之前,捨棄小數部分。

致C++完美主義者:使用Visual Studio新工具分析你的代碼

Logical/Bitwise Mismatch

此代碼檢查將查找:將邏輯運算符與整數值一起使用或將按位運算符與布爾值一起使用的情況。在C ++中,由於存在隱式轉換而允許這樣做,但是這種做法容易出錯,並且會降低代碼的可讀性。

致C++完美主義者:使用Visual Studio新工具分析你的代碼

Assignment/Equality Mismatch

在條件表達式中使用賦值運算符在語法上是正確的,但在邏輯上可能是錯誤。此代碼檢查將會查找在條件語句中將一個常量分配給變量的情況。這幾乎總是不正確的,因為它會導致條件語句始終為true或false。

致C++完美主義者:使用Visual Studio新工具分析你的代碼

Accidental Copy

C++中的auto關鍵字是一個很棒的功能,尤其是在和模板代碼打交道時。這個關鍵字有一種很微妙的行為,會讓一些C++開發者混淆或輕易忽略。auto不會推斷出引用,因此,如果將返回引用的表達式賦值給了一個聲明的變量,則會導致變量複製。雖然這並不總是一個錯誤,但是我們想幫助開發人員意識到當前語句會導致複製,儘管有時可能這是並不是開發者想要的。

致C++完美主義者:使用Visual Studio新工具分析你的代碼

Uninitialized Local

默認情況下,C++中的內置類型變量沒有是不會被初始化的。這可能導致運行時不確定的行為。這項代碼檢查的實現是非常激進的,它會在沒有變量已聲明但是沒有初始化的情況下發出警告。

致C++完美主義者:使用Visual Studio新工具分析你的代碼

接下來

新的Linter仍在開發中,下面列出了一些將來版本中會出現的新功能。

1) 配置:當前這個功能只能被整體的啟用或禁用。目前還不能支持啟用/禁用或更改某個檢查的嚴重級別。

2) 禁用某些警告:許多代碼分析工具可以按實例裡禁用警告。這通常是通過在源代碼中使用註釋(例如使用#pragma或代碼註釋)來實現,但是當前Linter還不支持這種功能。

3) 與其他代碼分析工具集成:Linter檢查目前只能在IDE中運行,因此它不能作為持續集成流程中的一部分。如果有這種集成需求,則需要繼續使用基於編譯器的代碼分析工具(例如,MSVC和Clang-Tidy)。

當啟用[後臺代碼分析]後,您可能會從MSVC或Clang-Tidy的代碼分析中看到綠色的波浪提示,這將導致它與編輯器中的Linter檢查出現重疊,進而你會看到重複的檢查結果。

總結

有段時間,我還認真地研究過一個C++的Linter插件。

那個時候,需要手動在Visual Studio中進行配置才能使用。

後來怎麼著了:寫代碼的時間都不夠了,哪有什麼功夫對代碼進行分析吶。

生活真是不易啊!


分享到:


相關文章: