共用方式為


使用 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 中的使用程式碼分析工具進行應用程式品質分析

本主題內容

您將學習到關於下列事項:

執行程式碼分析

分析和解決程式碼分析警告

隱藏程式碼分析警告

搜尋和篩選程式碼分析結果

C++ 程式碼分析警告

執行程式碼分析

在您的 Visual Studio 方案中執行程式碼分析:

  • 在 [建置] 功能表上,選擇 [針對方案執行程式碼分析]。

在您每次建立專案時自動執行程式碼分析:

  1. 在 [方案總管] 中選擇專案名稱,然後選擇 [屬性]。

  2. 在專案屬性頁面中,選擇 [程式碼分析],然後選擇 [建置時啟用 C/C++ 的程式碼分析]。

方案已編譯並且執行程式碼分析。結果隨即顯示在 [程式碼分析] 視窗中。

[程式碼分析] 視窗

分析和解決程式碼分析警告

若要分析特定警告,請在 [程式碼分析] 視窗中選擇警告的標題。展開警告以顯示問題的詳細資訊。可能的話,程式碼分析會顯示行號,以及導致警告的分析邏輯。

展開的程式碼分析警告

當您展開警告時,會在 Visual Studio 程式碼編輯器中反白顯示造成警告的程式碼行數。

反白顯示的原始程式碼

在您了解問題之後,您就可以在程式碼中解決。然後重新執行程式碼分析,以確定 [程式碼分析] 視窗中不會再出現警告,而且您的修正尚未引發新的警告。

提示

您可以從 [程式碼分析] 視窗重新執行程式碼分析。選擇 [分析] 按鈕,然後選擇要分析的範圍。您可以在整個方案或選取的專案上重新執行分析。

隱藏程式碼分析警告

有時候您可能決定不修正程式碼分析警告。您可能會判斷解決這項警告需要太多重新編碼,而在任何實際實作程式碼時會有問題發生的可能性。或是,您可能會認為警告中使用的分析對於特定內容是不適當的。您可以隱藏個別的警告,使之不再出現於 [程式碼分析] 視窗中。

隱藏警告:

  1. 如果未顯示詳細資訊,則展開警告的標題。

  2. 選擇警告下方的 [動作] 連結。

  3. 選擇 [隱藏訊息],然後選擇 [在原始程式檔中]。

隱藏訊息插入 #pragma(warning:WarningId),隱藏程式碼行的警告。

搜尋和篩選程式碼分析結果

您可以在多專案方案中搜尋警告訊息的詳細清單,以及篩選警告。

搜尋與篩選程式碼分析視窗

C++ 程式碼分析警告

程式碼分析引發 C++ 程式碼的下列警告:

規則

描述

C6001

使用的記憶體尚未初始化

C6011

取值的指標為 Null

C6029

使用的值未經確認

C6053

呼叫中的零結尾

C6059

不正確的串連

C6063

遺漏格式函式的字串引數

C6064

遺漏格式函式的整數引數

C6066

遺漏格式函式的指標引數

C6067

遺漏格式函式的字串指標引數

C6101

傳回未初始化的記憶體

C6200

索引超出緩衝區上限

C6201

索引超出堆疊緩衝區上限

C6270

遺漏格式函式的浮點引數

C6271

格式函式的多餘引數

C6272

格式函式的非浮點引數

C6273

格式函式的非整數引數

C6274

格式函式的非字元引數

C6276

無效的字串轉型

C6277

無效的 CreateProcess 呼叫

C6284

格式函式的物件引數無效

C6290

邏輯 NOT 位元 AND 優先順序

C6291

邏輯 NOT 位元 OR 優先順序

C6302

格式函式的字元字串引數無效

C6303

格式函式的寬字元字串引數無效

C6305

大小和計數用法不符

C6306

不正確的變數引數函式呼叫

C6328

引數型別可能不符

C6385

讀取滿溢

C6386

寫入滿溢

C6387

無效的參數值

C6500

無效的屬性 (Attribute) 屬性 (Property)

C6501

衝突的屬性 (Attribute) 屬性 (Property) 值

C6503

參考不能是 Null

C6504

非指標上的 Null

C6505

Void 上的 MustCheck

C6506

非指標或陣列上的緩衝區大小

C6507

位於取值零的 Null 不符

C6508

寫入存取常數

C6509

先前的條件所用的 Return

C6510

非指標上的 Null Terminated

C6511

MustCheck 必須為 Yes 或 No

C6513

不含緩衝區大小的元素大小

C6514

緩衝區大小超過陣列大小

C6515

非指標上的緩衝區大小

C6516

屬性 (Attribute) 上沒有屬性 (Property)

C6517

不能讀取的緩衝區上的有效大小

C6518

不能寫入的緩衝區上的可寫入大小

C6519

無效的註釋: 'NeedsRelease' 屬性的值必須為 Yes 或 No

C6521

無效的大小字串取值

C6522

無效的大小字串型別

C6523

無效的大小字串參數

C6525

無效的大小字串不可能執行到的位置

C6526

無效的大小字串緩衝區型別

C6527

無效的註釋: 'NeedsRelease' 屬性不能用於 void 型別的值

C6530

無法辨認的格式字串樣式

C6540

在這個函式上使用屬性註釋會使其所有現有的 __declspec 註釋無效

C6551

無效的大小規格: 無法分析運算式

C6552

無效的 Deref= 或 Notref=: 無法分析運算式

C6701

值不是有效的 Yes/No/Maybe 值

C6702

值不是字串值

C6703

值不是數字

C6704

未預期的註釋運算式錯誤

C6705

註釋的預期引數數目不符合註釋的實際引數數目

C6706

註釋發生未預期的註釋錯誤

C28021

所標註的參數必須是指標

C28182

取值的指標為 Null。指標與另一個指標包含同樣的 NULL 值。

C28202

非靜態成員的參考不合法

C28203

類別成員的參考模稜兩可。

C28205

在不合法的內容中使用了 _Success_ 或 _On_failure_ used

C28206

左運算元指向結構,請使用 '->'

C28207

左運算元是結構,請使用 '.'

C28210

__on_failure 內容的註釋不能在明確 pre context 中

C28211

SAL_context 需要靜態內容名稱

C28212

註釋需要指標運算式

C28213

_Use_decl_annotations_ 註釋必須不需修改就能用來參考預先宣告。

C28214

屬性參數名稱必須是 p1...p9

C28215

typefix 不能套用到已經有 typefix 的參數

C28216

checkReturn 註釋只能套用到特定函式參數的 postconditions。

C28217

函式的註釋參數數目不符合在檔案中找到的數目

C28218

函式參數的註釋參數不符合在檔案中找到的參數

C28219

註釋中標註的參數需要列舉的成員

C28220

註釋中標註的參數需要整數運算式

C28221

註釋中的參數需要字串運算式

C28222

註釋需要 __yes、__no 或 __maybe

C28223

找不到註釋、參數需要的語彙基元/識別項

C28224

註釋需要參數

C28225

在註釋中找不到正確數目的必要參數

C28226

註釋不能也是 PrimOp (在目前宣告中)

C28227

註釋不能也是 PrimOp (參閱之前的宣告)

C28228

註釋參數: 不能在註釋中使用型別

C28229

註釋不支援參數

C28230

參數的型別沒有成員。

C28231

註釋只在陣列上有效

C28232

pre、post 或 deref 未套用到任何註釋

C28233

pre、post 或 deref 已套用到區塊

C28234

__at 運算式未套用到目前函式

C28235

函式無法單獨做為註釋

C28236

註釋不能用在運算式中

C28237

不再支援參數的註釋

C28238

參數的註釋有值、stringValue 和 longValue 中的一個以上。請使用 paramn=xxx

C28239

參數的註釋同時有值、stringValue 或 longValue; 以及 paramn=xxx。請只使用 paramn=xxx

C28240

參數的註釋有 param2 但沒有 param1

C28241

無法辨認參數的函式註釋

C28243

參數的函式註釋需要的取值多於實質型別註釋允許的範圍

C28245

函式的註釋在非成員函式上標註 'this'

C28246

函式的參數註釋不符合參數的型別

C28250

函式的註釋不一致: 之前的執行個體有錯誤。

C28251

函式的註釋不一致: 這個執行個體有錯誤

C28252

函式的註釋不一致: 參數在這個執行個體上有其他註釋。

C28253

函式的註釋不一致: 參數在這個執行個體上有其他註釋。

C28254

註釋中不支援 dynamic_cast<>()

C28262

在註釋的函式中發現註釋有語法錯誤

C28263

發現內建註釋的條件式註釋有語法錯誤

C28264

結果清單值必須是常數。

C28267

發現函式中的註釋有語法錯誤。

C28272

檢查時,函式、參數的註釋與函式宣告不一致

C28273

函式的線索與函式宣告不一致

C28275

_Macro_value_ 的參數是 null

C28279

找到符號的 'begin',但沒有相符的 'end'

C28280

找到符號的 'end',但沒有相符的 'begin'

C28282

格式字串必須在 preconditions 中

C28285

函式的參數有語法錯誤

C28286

函式靠近結束處有語法錯誤

C28287

函式的 _At_() 註釋中有語法錯誤 (無法辨認的參數名稱)

C28288

函式的 _At_() 註釋中有語法錯誤 (無效的參數名稱)

C28289

對於函式: ReadableTo 或 WritableTo 沒有有限的規格做為參數

C28290

函式的註釋包含的外部符號比實際的參數數目多

C28291

對函式而言,deref 層級 0 的 post null/notnull 沒有意義。

C28300

運算子的運算式運算元型別不相容

C28301

函式的第一個宣告沒有註釋。

C28302

在註釋中發現額外的 _Deref_ 運算子。

C28303

發現註釋有模擬兩可的 _Deref_ 運算子。

C28304

發現有位置不正確的 _Notref_ 運算子套用到語彙基元。

C28305

分析語彙基元時發現錯誤。

C28350

註釋描述了條件不適用的狀況。

C28351

註釋描述了不能在條件中使用動態值 (變數) 的狀況。