使用 Visual Studio 程式碼分析來分析 Windows 市集應用程式的 C++ 程式碼品質
Microsoft Visual Studio Express 2012 for Windows 8 中的程式碼分析工具會檢查您的程式碼是否有常見問題,以及是否違反良好的程式設計作法。程式碼分析警告與編譯器錯誤和警告不同,因為程式碼分析會搜尋有效的特定程式碼模式,但仍然可以為您或使用您程式碼的其他人建立問題。程式碼分析也可以尋找難以透過測試發現的程式碼缺失。在開發過程中定期執行程式碼分析工具,可以提升已完成應用程式的品質。
![]() |
---|
在 Visual Studio Ultimate 2012、Visual Studio Premium 2012 及 Visual Studio Professional 2012 中,您可以使用程式碼分析的完整功能。請參閱 MSDN Library 中的使用程式碼分析工具進行應用程式品質分析。 |
本主題內容
您將學習到關於下列事項:
執行程式碼分析
在您的 Visual Studio 方案中執行程式碼分析:
- 在 [建置] 功能表上,選擇 [針對方案執行程式碼分析]。
在您每次建立專案時自動執行程式碼分析:
在 [方案總管] 中選擇專案名稱,然後選擇 [屬性]。
在專案屬性頁面中,選擇 [程式碼分析],然後選擇 [建置時啟用 C/C++ 的程式碼分析]。
方案已編譯並且執行程式碼分析。結果隨即顯示在 [程式碼分析] 視窗中。
分析和解決程式碼分析警告
若要分析特定警告,請在 [程式碼分析] 視窗中選擇警告的標題。展開警告以顯示問題的詳細資訊。可能的話,程式碼分析會顯示行號,以及導致警告的分析邏輯。
當您展開警告時,會在 Visual Studio 程式碼編輯器中反白顯示造成警告的程式碼行數。
在您了解問題之後,您就可以在程式碼中解決。然後重新執行程式碼分析,以確定 [程式碼分析] 視窗中不會再出現警告,而且您的修正尚未引發新的警告。
提示
您可以從 [程式碼分析] 視窗重新執行程式碼分析。選擇 [分析] 按鈕,然後選擇要分析的範圍。您可以在整個方案或選取的專案上重新執行分析。
隱藏程式碼分析警告
有時候您可能決定不修正程式碼分析警告。您可能會判斷解決這項警告需要太多重新編碼,而在任何實際實作程式碼時會有問題發生的可能性。或是,您可能會認為警告中使用的分析對於特定內容是不適當的。您可以隱藏個別的警告,使之不再出現於 [程式碼分析] 視窗中。
隱藏警告:
如果未顯示詳細資訊,則展開警告的標題。
選擇警告下方的 [動作] 連結。
選擇 [隱藏訊息],然後選擇 [在原始程式檔中]。
隱藏訊息插入 #pragma(warning:WarningId),隱藏程式碼行的警告。
搜尋和篩選程式碼分析結果
您可以在多專案方案中搜尋警告訊息的詳細清單,以及篩選警告。
C++ 程式碼分析警告
程式碼分析引發 C++ 程式碼的下列警告:
規則 |
描述 |
---|---|
使用的記憶體尚未初始化 |
|
取值的指標為 Null |
|
使用的值未經確認 |
|
呼叫中的零結尾 |
|
不正確的串連 |
|
遺漏格式函式的字串引數 |
|
遺漏格式函式的整數引數 |
|
遺漏格式函式的指標引數 |
|
遺漏格式函式的字串指標引數 |
|
傳回未初始化的記憶體 |
|
索引超出緩衝區上限 |
|
索引超出堆疊緩衝區上限 |
|
遺漏格式函式的浮點引數 |
|
格式函式的多餘引數 |
|
格式函式的非浮點引數 |
|
格式函式的非整數引數 |
|
格式函式的非字元引數 |
|
無效的字串轉型 |
|
無效的 CreateProcess 呼叫 |
|
格式函式的物件引數無效 |
|
邏輯 NOT 位元 AND 優先順序 |
|
邏輯 NOT 位元 OR 優先順序 |
|
格式函式的字元字串引數無效 |
|
格式函式的寬字元字串引數無效 |
|
大小和計數用法不符 |
|
不正確的變數引數函式呼叫 |
|
引數型別可能不符 |
|
讀取滿溢 |
|
寫入滿溢 |
|
無效的參數值 |
|
無效的屬性 (Attribute) 屬性 (Property) |
|
衝突的屬性 (Attribute) 屬性 (Property) 值 |
|
參考不能是 Null |
|
非指標上的 Null |
|
Void 上的 MustCheck |
|
非指標或陣列上的緩衝區大小 |
|
位於取值零的 Null 不符 |
|
寫入存取常數 |
|
先前的條件所用的 Return |
|
非指標上的 Null Terminated |
|
MustCheck 必須為 Yes 或 No |
|
不含緩衝區大小的元素大小 |
|
緩衝區大小超過陣列大小 |
|
非指標上的緩衝區大小 |
|
屬性 (Attribute) 上沒有屬性 (Property) |
|
不能讀取的緩衝區上的有效大小 |
|
不能寫入的緩衝區上的可寫入大小 |
|
無效的註釋: 'NeedsRelease' 屬性的值必須為 Yes 或 No |
|
無效的大小字串取值 |
|
無效的大小字串型別 |
|
無效的大小字串參數 |
|
無效的大小字串不可能執行到的位置 |
|
無效的大小字串緩衝區型別 |
|
無效的註釋: 'NeedsRelease' 屬性不能用於 void 型別的值 |
|
無法辨認的格式字串樣式 |
|
在這個函式上使用屬性註釋會使其所有現有的 __declspec 註釋無效 |
|
無效的大小規格: 無法分析運算式 |
|
無效的 Deref= 或 Notref=: 無法分析運算式 |
|
值不是有效的 Yes/No/Maybe 值 |
|
值不是字串值 |
|
值不是數字 |
|
未預期的註釋運算式錯誤 |
|
註釋的預期引數數目不符合註釋的實際引數數目 |
|
註釋發生未預期的註釋錯誤 |
|
所標註的參數必須是指標 |
|
取值的指標為 Null。指標與另一個指標包含同樣的 NULL 值。 |
|
非靜態成員的參考不合法 |
|
類別成員的參考模稜兩可。 |
|
在不合法的內容中使用了 _Success_ 或 _On_failure_ used |
|
左運算元指向結構,請使用 '->' |
|
左運算元是結構,請使用 '.' |
|
__on_failure 內容的註釋不能在明確 pre context 中 |
|
SAL_context 需要靜態內容名稱 |
|
註釋需要指標運算式 |
|
_Use_decl_annotations_ 註釋必須不需修改就能用來參考預先宣告。 |
|
屬性參數名稱必須是 p1...p9 |
|
typefix 不能套用到已經有 typefix 的參數 |
|
checkReturn 註釋只能套用到特定函式參數的 postconditions。 |
|
函式的註釋參數數目不符合在檔案中找到的數目 |
|
函式參數的註釋參數不符合在檔案中找到的參數 |
|
註釋中標註的參數需要列舉的成員 |
|
註釋中標註的參數需要整數運算式 |
|
註釋中的參數需要字串運算式 |
|
註釋需要 __yes、__no 或 __maybe |
|
找不到註釋、參數需要的語彙基元/識別項 |
|
註釋需要參數 |
|
在註釋中找不到正確數目的必要參數 |
|
註釋不能也是 PrimOp (在目前宣告中) |
|
註釋不能也是 PrimOp (參閱之前的宣告) |
|
註釋參數: 不能在註釋中使用型別 |
|
註釋不支援參數 |
|
參數的型別沒有成員。 |
|
註釋只在陣列上有效 |
|
pre、post 或 deref 未套用到任何註釋 |
|
pre、post 或 deref 已套用到區塊 |
|
__at 運算式未套用到目前函式 |
|
函式無法單獨做為註釋 |
|
註釋不能用在運算式中 |
|
不再支援參數的註釋 |
|
參數的註釋有值、stringValue 和 longValue 中的一個以上。請使用 paramn=xxx |
|
參數的註釋同時有值、stringValue 或 longValue; 以及 paramn=xxx。請只使用 paramn=xxx |
|
參數的註釋有 param2 但沒有 param1 |
|
無法辨認參數的函式註釋 |
|
參數的函式註釋需要的取值多於實質型別註釋允許的範圍 |
|
函式的註釋在非成員函式上標註 'this' |
|
函式的參數註釋不符合參數的型別 |
|
函式的註釋不一致: 之前的執行個體有錯誤。 |
|
函式的註釋不一致: 這個執行個體有錯誤 |
|
函式的註釋不一致: 參數在這個執行個體上有其他註釋。 |
|
函式的註釋不一致: 參數在這個執行個體上有其他註釋。 |
|
註釋中不支援 dynamic_cast<>() |
|
在註釋的函式中發現註釋有語法錯誤 |
|
發現內建註釋的條件式註釋有語法錯誤 |
|
結果清單值必須是常數。 |
|
發現函式中的註釋有語法錯誤。 |
|
檢查時,函式、參數的註釋與函式宣告不一致 |
|
函式的線索與函式宣告不一致 |
|
_Macro_value_ 的參數是 null |
|
找到符號的 'begin',但沒有相符的 'end' |
|
找到符號的 'end',但沒有相符的 'begin' |
|
格式字串必須在 preconditions 中 |
|
函式的參數有語法錯誤 |
|
函式靠近結束處有語法錯誤 |
|
函式的 _At_() 註釋中有語法錯誤 (無法辨認的參數名稱) |
|
函式的 _At_() 註釋中有語法錯誤 (無效的參數名稱) |
|
對於函式: ReadableTo 或 WritableTo 沒有有限的規格做為參數 |
|
函式的註釋包含的外部符號比實際的參數數目多 |
|
對函式而言,deref 層級 0 的 post null/notnull 沒有意義。 |
|
運算子的運算式運算元型別不相容 |
|
函式的第一個宣告沒有註釋。 |
|
在註釋中發現額外的 _Deref_ 運算子。 |
|
發現註釋有模擬兩可的 _Deref_ 運算子。 |
|
發現有位置不正確的 _Notref_ 運算子套用到語彙基元。 |
|
分析語彙基元時發現錯誤。 |
|
註釋描述了條件不適用的狀況。 |
|
註釋描述了不能在條件中使用動態值 (變數) 的狀況。 |