次の方法で共有


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

Windows と Windows Phone に適用されます

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

注意

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

このトピックの内容

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

コード分析の実行

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

コード分析警告の抑制

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

C++ code analysis warnings

コード分析の実行

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

注釈には、動的な値 (変数) が使用できない条件が記述されています。