Visual Studio 静的コード分析によるストア アプリの C++ コード品質の分析
Visual Studio express edition のコード分析ツールは、コードを調べてプログラミング上の一般的な問題や違反がないことを確認します。 コード分析の警告はコンパイラのエラーや警告とは異なります。コード分析は、有効であってもコードの作成者やコードを利用する他のユーザーにとって問題になる可能性がある特定のコード パターンを検索するからです。 また、コード分析では、テストでは検出できないコードの欠陥を見つけることができます。 開発プロセス中に定期的にコード分析ツールを実行することで、高品質なアプリを完成させることができます。
注意
Visual Studio Ultimate、Visual Studio Premium、および Visual Studio Professional では、コード分析ツールの全機能を使用できます。MSDN ライブラリの「コード分析ツールを使用したアプリケーション品質の分析」を参照してください。
このトピックの内容
以下について説明します。
コード分析の実行
Visual Studio ソリューションでコード分析を実行するには:
- [ビルド] メニューの [ソリューションでコード分析を実行] をクリックします。
プロジェクトをビルドするたびに自動的にコード分析を実行するには:
ソリューション エクスプローラーでプロジェクト名を選択し、[プロパティ] をクリックします。
プロジェクトのプロパティ ページで [コード分析]、[ビルド時に C/C++ のコード分析を有効化] の順に選択します。
ソリューションがコンパイルされ、コード分析が実行されます。 結果は、[コード分析] ウィンドウに表示されます。
コード分析警告の分析と解決
特定の警告を分析するには、[コード分析] ウィンドウで警告のタイトルを選択します。 警告が展開され、問題に関する詳細情報が表示されます。 コード分析は、可能な場合は警告につながる行番号と分析ロジックを表示します。
警告を展開すると、警告の原因となったコード行が Visual Studio のコード エディターで強調表示されます。
何が問題かを理解したら、コードを修正してそれを解決できます。 コード分析を再度実行して、[コード分析] ウィンドウに警告が表示されないこと、および修正によって新しい警告が発生しないことを確認します。
ヒント
コード分析は、[コード分析] ウィンドウから再実行できます。[分析] ボタンをクリックし、分析の範囲を選択します。ソリューション全体または選択したプロジェクトの分析を再実行できます。
コード分析警告の抑制
コード分析警告の修正を行わないことを決定する場合があります。 コードを実装したときの警告の発生確率と、警告を解決するためのコード変更の量を比較して、解決しないことを選択できます。 または、警告で使用された分析が特定のコンテキストでは不適切であると判断できます。 個々の警告を抑制して、[コード分析] ウィンドウに表示されないように設定できます。
警告を抑制するには:
詳細情報が表示されない場合は、警告のタイトルを展開します。
警告の下部にある [アクション] リンクをクリックします。
[メッセージの非表示]、[ソース内] の順に選択します。
メッセージを非表示にすると、コード行の警告を抑制する #pragma(warning:警告 ID) を挿入します。
コード分析結果の検索とフィルター処理
警告メッセージの長い一覧の検索と、複数のプロジェクトから成るソリューションの警告をフィルター処理できます。
C++ のコード分析の警告
コード分析は、C++ コードに次の警告を発生させます。
規則 |
説明 |
---|---|
初期化されていないメモリの使用 |
|
Null ポインターの逆参照 |
|
未確認の値の使用 |
|
呼び出しの 0 での終了 |
|
不適切な連結 |
|
Format 関数への文字列引数がない |
|
Format 関数への整数引数がない |
|
Format 関数へのポインター引数がない |
|
Format 関数への文字列ポインター引数がない |
|
初期化されていないメモリを返す |
|
インデックスがバッファーの最大値を超過 |
|
インデックスがスタック バッファーの最大値を超過 |
|
Format 関数への Float 引数がない |
|
Format 関数への余分な引数 |
|
Format 関数への Float でない引数 |
|
Format 関数への整数でない引数 |
|
Format 関数への文字でない引数 |
|
無効な文字列のキャスト |
|
無効な CreateProcess 呼び出し |
|
Format 関数への無効なオブジェクト引数 |
|
論理 Not とビットごとの And の優先順位 |
|
論理 Not とビットごとの Or の優先順位 |
|
Format 関数への無効な文字列引数 |
|
Format 関数への無効なワイド文字列引数 |
|
サイズと数の使用の不一致 |
|
不適切な変数引数の関数呼び出し |
|
引数の型の不一致の可能性 |
|
読み取りのオーバーラン |
|
書き込みのオーバーラン |
|
無効なパラメーター値 |
|
無効な属性プロパティ |
|
属性プロパティ値の競合 |
|
参照は Null にはできない |
|
非ポインターでの Null |
|
Void での MustCheck |
|
非ポインターまたは配列でのバッファー サイズ |
|
逆参照ゼロでの Null 不一致 |
|
定数での書き込みアクセス |
|
前提条件で使用される Return |
|
非ポインターでの Null 終了 |
|
MustCheck は Yes または No でなければならない |
|
バッファー サイズのない要素サイズ |
|
バッファー サイズが配列サイズを超過 |
|
非ポインターでのバッファー サイズ |
|
属性にプロパティがない |
|
読み取り可能でないバッファーでの有効なサイズ |
|
書き込み可能でないバッファーでの書き込み可能サイズ |
|
無効な注釈です: 'NeedsRelease' プロパティは Yes または No でなければなりません |
|
無効なサイズの文字列の逆参照 |
|
無効なサイズの文字列型 |
|
無効なサイズの文字列パラメーター |
|
無効なサイズの到達不能な場所の文字列 |
|
無効なサイズの文字列バッファー型 |
|
無効な注釈です: 'NeedsRelease' プロパティは、void 型の値では使用できません |
|
認識されない書式指定文字列スタイル |
|
この関数で属性注釈を使用すると、既存の __declspec 注釈がすべて無効となります |
|
無効なサイズ指定です: 式が解析可能ではありません |
|
無効な Deref= または Notref= です: 式が解析可能ではありません |
|
値が有効な Yes/No/Maybe 値ではありません |
|
値が文字列値ではありません |
|
値が数値ではありません |
|
予期しない注釈式エラーです |
|
想定した注釈の引数の数が、実際の注釈の引数の数と一致しません |
|
注釈に対する、予期しない注釈エラーです |
|
注釈が付けられているパラメーターはポインターである必要があります |
|
Null ポインターの逆参照 このポインターは、もう 1 つのポインターと同じ Null 値を持ちます。 |
|
静的でないメンバーへの参照が正しくありません |
|
クラス メンバーへのあいまいな参照です。 |
|
_Success_ または _On_failure_ が無効なコンテキスト内で使用されています |
|
左側のオペランドは構造体をポイントするため、'-> ' を使用します |
|
左側のオペランドは構造体であるため、'.' を使用します |
|
__on_failure コンテキストの注釈を明示的なプリ コンテキストに含めることはできません |
|
SAL_context には静的コンテキスト名が必要です |
|
注釈にはポインター式が必要です |
|
_Use_decl_annotations_ 注釈は、変更、先行する宣言なしで、参照に使用される必要があります。 |
|
属性パラメーター名は、p1...p9 である必要があります |
|
typefix は、既に typefix のあるパラメーターには適用できません |
|
checkReturn 注釈は、特定の関数パラメーターの事後条件にのみ適用されます。 |
|
関数について、注釈へのパラメーター数がファイルで検出されたものと一致しません |
|
関数パラメーターについて、注釈のパラメーターがファイルで検出されたものと一致しません |
|
注釈 (注釈のパラメーター) には列挙型のメンバーが必要です |
|
注釈 (注釈のパラメーター) には整数式が必要です |
|
注釈のパラメーターには文字列式が必要です |
|
注釈には __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' がありません |
|
書式指定文字列は、前提条件の中に存在する必要があります |
|
関数について、パラメーターに構文エラーがあります |
|
関数について、構文エラーが最後の近くにあります |
|
関数について、_At_() 注釈 (認識されないパラメーター名) に構文エラーがあります。 |
|
関数について、_At_() 注釈 (無効のパラメーター名) に構文エラーがあります。 |
|
関数について: ReadableTo または WritableTo には、パラメーターとして limit-spec がありませんでした |
|
関数の注釈は、実際のパラメーターの数より多い外部参照を含みます |
|
deref レベル 0 での post null/notnull は、関数に対して意味がありません。 |
|
演算子に対する互換性のない型の、式のオペランドです |
|
関数の最初の宣言に対して注釈がありません。 |
|
余分な _Deref_ 演算子が注釈に見つかりました。 |
|
あいまいな _Deref_ 演算子が注釈に見つかりました。 |
|
不適切に設定された _Notref_ 演算子がトークンに適用されました。 |
|
トークンの解析中にエラーが発生しました。 |
|
注釈には、条件付きで適用できない状況の説明が表示されます。 |
|
注釈には、動的な値 (変数) が使用できない条件が記述されています。 |