Visual Studio 静的コード分析によるストア アプリの C++ コード品質の分析

Windows と Windows Phone に適用

Visual Studio express edition のコード分析ツールは、コードを調べてプログラミング上の一般的な問題や違反がないことを確認します。 コード分析の警告はコンパイラのエラーや警告とは異なります。コード分析は、有効であってもコードの作成者やコードを利用する他のユーザーにとって問題になる可能性がある特定のコード パターンを検索するからです。 また、コード分析では、テストでは検出できないコードの欠陥を見つけることができます。 開発プロセス中に定期的にコード分析ツールを実行することで、高品質なアプリを完成させることができます。

注意

Visual Studio Ultimate、Visual Studio Premium、および Visual Studio Professional では、コード分析ツールの全機能を使用できます。 MSDN ライブラリの「コード分析ツールを使用したアプリケーション品質の分析」を参照してください。

このトピックの内容

以下について説明します。

コード分析の実行

コード分析警告の分析と解決

コード分析警告の抑制

コード分析結果の検索とフィルター処理

C++ のコード分析の警告

コード分析の実行

Visual Studio ソリューションでコード分析を実行するには:

  • [ビルド] メニューの [ソリューションでコード分析を実行] をクリックします。

    プロジェクトをビルドするたびに自動的にコード分析を実行するには:

  1. ソリューション エクスプローラーでプロジェクト名を選択し、[プロパティ] をクリックします。

  2. プロジェクトのプロパティ ページで [コード分析]、[ビルド時に C/C++ のコード分析を有効化] の順に選択します。

    ソリューションがコンパイルされ、コード分析が実行されます。 結果は、[コード分析] ウィンドウに表示されます。

    [コード分析] ウィンドウ

コード分析警告の分析と解決

特定の警告を分析するには、[コード分析] ウィンドウで警告のタイトルを選択します。 警告が展開され、問題に関する詳細情報が表示されます。 コード分析は、可能な場合は警告につながる行番号と分析ロジックを表示します。

展開されたコード分析の警告

警告を展開すると、警告の原因となったコード行が Visual Studio のコード エディターで強調表示されます。

強調表示されたソース コード

問題を理解した後は、コード内で解決できます。 その後、コード分析に戻り、[コード分析] ウィンドウに警告が表示されなくなったことと、修正によって新たな警告が発生していないことを確認します。

ヒント

コード分析は、[コード分析] ウィンドウから再実行できます。 [分析] ボタンをクリックし、分析の範囲を選択します。 ソリューション全体または選択したプロジェクトの分析を再実行できます。

コード分析警告の抑制

コード分析警告の修正を行わないことを決定する場合があります。 コードを実装したときの警告の発生確率と、警告を解決するためのコード変更の量を比較して、解決しないことを選択できます。 または、警告で使用された分析が特定のコンテキストでは不適切であると判断できます。 個々の警告を抑制して、[コード分析] ウィンドウに表示されないように設定できます。

警告を抑制するには:

  1. 詳細情報が表示されない場合は、警告のタイトルを展開します。

  2. 警告の下部にある [アクション] リンクをクリックします。

  3. [メッセージの非表示]、[ソース内] の順に選択します。

    メッセージを非表示にすると、コードの該当行に対して警告を抑制する#pragma(warning:警告 ID) が挿入されます。

警告メッセージの長い一覧の検索と、複数のプロジェクトから成るソリューションの警告をフィルター処理できます。

[コード分析] ウィンドウの検索とフィルター処理

C++ のコード分析の警告

コード分析は、C++ コードに次の警告を発生させます。

ルール 説明
C6001 初期化されていないメモリの使用
C6011 Null ポインターの逆参照
C6029 未確認の値の使用
C6053 呼び出しの 0 での終了
C6059 不適切な連結
C6063 Format 関数への文字列引数がない
C6064 Format 関数への整数引数がない
C6066 Format 関数へのポインター引数がない
C6067 Format 関数への文字列ポインター引数がない
C6101 初期化されていないメモリを返す
C6200 インデックスがバッファーの最大値を超過
C6201 インデックスがスタック バッファーの最大値を超過
C6270 Format 関数への Float 引数がない
C6271 Format 関数への余分な引数
C6272 Format 関数への Float でない引数
C6273 Format 関数への整数でない引数
C6274 Format 関数への文字でない引数
C6276 無効な文字列のキャスト
C6277 無効な CreateProcess 呼び出し
C6284 Format 関数への無効なオブジェクト引数
C6290 論理 Not とビットごとの And の優先順位
C6291 論理 Not とビットごとの Or の優先順位
C6302 Format 関数への無効な文字列引数
C6303 Format 関数への無効なワイド文字列引数
C6305 サイズと数の使用の不一致
C6306 不適切な変数引数の関数呼び出し
C6328 引数の型の不一致の可能性
C6385 読み取りのオーバーラン
C6386 書き込みのオーバーラン
C6387 無効なパラメーター値
C6500 無効な属性プロパティ
C6501 属性プロパティ値の競合
C6503 参照は Null にはできない
C6504 非ポインターでの Null
C6505 Void での MustCheck
C6506 非ポインターまたは配列でのバッファー サイズ
C6507 逆参照ゼロでの Null 不一致
C6508 定数での書き込みアクセス
C6509 前提条件で使用される Return
C6510 非ポインターでの Null 終了
C6511 MustCheck は Yes または No でなければならない
C6513 バッファー サイズのない要素サイズ
C6514 バッファー サイズが配列サイズを超過
C6515 非ポインターでのバッファー サイズ
C6516 属性にプロパティがない
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 ポインターの逆参照 このポインターは、もう 1 つのポインターと同じ Null 値を持ちます。
C28202 静的でないメンバーへの参照が正しくありません
C28203 クラス メンバーへのあいまいな参照です。
C28205 Success\ または On_failure\ が無効なコンテキスト内で使用されています
C28206 左側のオペランドは構造体をポイントするため、'-> ' を使用します
C28207 左側のオペランドは構造体であるため、'.' を使用します
C28210 __on_failure コンテキストの注釈を明示的なプリ コンテキストに含めることはできません
C28211 SAL_context には静的コンテキスト名が必要です
C28212 注釈にはポインター式が必要です
C28213 Use_decl_annotations\ 注釈は、変更、先行する宣言なしで、参照に使用される必要があります。
C28214 属性パラメーター名は、p1...p9 である必要があります
C28215 typefix は、既に typefix のあるパラメーターには適用できません
C28216 checkReturn 注釈は、特定の関数パラメーターの事後条件にのみ適用されます。
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 書式指定文字列は、前提条件の中に存在する必要があります
C28285 関数について、パラメーターに構文エラーがあります
C28286 関数について、構文エラーが最後の近くにあります
C28287 関数について、At\() 注釈 (認識されないパラメーター名) に構文エラーがあります
C28288 関数について、At\() 注釈 (無効のパラメーター名) に構文エラーがあります
C28289 関数について: ReadableTo または WritableTo には、パラメーターとして limit-spec がありませんでした
C28290 関数の注釈は、実際のパラメーターの数より多い外部参照を含みます
C28291 deref レベル 0 での post null/notnull は、関数に対して意味がありません。
C28300 演算子に対する互換性のない型の、式のオペランドです
C28301 関数の最初の宣言に対して注釈がありません。
C28302 余分な Deref\ 演算子が注釈に見つかりました。
C28303 あいまいな Deref\ 演算子が注釈に見つかりました。
C28304 不適切に設定された Notref\ 演算子がトークンに適用されました。
C28305 トークンの解析中にエラーが発生しました。
C28350 注釈には、条件付きで適用できない状況の説明が表示されます。
C28351 注釈には、動的な値 (変数) が使用できない条件が記述されています。