Visual Studio 静的コード分析による UWP アプリの C++ のコード品質の分析Analyze C++ code quality of UWP apps using Visual Studio static code analysis

Windows と Windows Phone に適用Applies to Windows and Windows Phone

Visual Studio express edition のコード分析ツールは、コードを調べてプログラミング上の一般的な問題や違反がないことを確認します。The code analysis tool in Visual Studio express editions examines your code for a set of common problems and violations of good programming practice. コード分析の警告はコンパイラのエラーや警告とは異なります。コード分析は、有効であってもコードの作成者やコードを利用する他のユーザーにとって問題になる可能性がある特定のコード パターンを検索するからです。Code analysis warnings differ from compiler errors and warnings because code analysis searches for specific code patterns that are valid but could still create issues for you or other people who use your code. また、コード分析では、テストでは検出できないコードの欠陥を見つけることができます。Code analysis can also find defects in your code that are difficult to discover through testing. 開発プロセス中に定期的にコード分析ツールを実行することで、高品質なアプリを完成させることができます。Running the code analysis tool at regular intervals during your development process can enhance the quality of your completed app.

注意

Visual Studio Ultimate、Visual Studio Premium、および Visual Studio Professional では、コード分析ツールの全機能を使用できます。In Visual Studio Ultimate, Visual Studio Premium, and Visual Studio Professional, you can use the full functionality of code analysis tools. MSDN ライブラリの「コード分析ツールを使用したアプリケーション品質の分析」を参照してください。See Analyzing Application Quality by Using Code Analysis Tools in the MSDN Library.

このトピックの内容In this topic

以下について説明します。You can learn about:

コード分析の実行Running code analysis

コード分析警告の分析と解決Analyzing and resolving code analysis warnings

コード分析警告の抑制Suppressing code analysis warnings

コード分析結果の検索とフィルター処理Searching and filtering code analysis results

C++ のコード分析の警告C++ code analysis warnings

コード分析の実行Running code analysis

Visual Studio ソリューションでコード分析を実行するには:To run code analysis on your Visual Studio solution:

  • [ビルド] メニューの [ソリューションでコード分析を実行] をクリックします。On the Build menu, choose Run Code Analysis on Solution.

    プロジェクトをビルドするたびに自動的にコード分析を実行するには:To automatically run code analysis each time you build a project:

  1. ソリューション エクスプローラーでプロジェクト名を選択し、[プロパティ] をクリックします。Choose the project name in Solution Explorer and then choose Properties.

  2. プロジェクトのプロパティ ページで [コード分析][ビルド時に C/C++ のコード分析を有効化] の順に選択します。In the project property page, choose Code Analysis and then choose Enable Code Analysis for C/C++ on Build.

    ソリューションがコンパイルされ、コード分析が実行されます。The solution is compiled and code analysis runs. 結果は、[コード分析] ウィンドウに表示されます。Results appear in the Code Analysis window.

    [コード分析] ウィンドウCode Analysis window

コード分析警告の分析と解決Analyzing and resolving code analysis warnings

特定の警告を分析するには、[コード分析] ウィンドウで警告のタイトルを選択します。To analyze a specific warning, choose the title of the warning in the Code Analysis window. 警告が展開され、問題に関する詳細情報が表示されます。The warning expands to display detailed information about the issue. コード分析は、可能な場合は警告につながる行番号と分析ロジックを表示します。When possible, code analysis displays the line number and analysis logic that led to the warning.

展開されたコード分析の警告Expanded code analysis warning

警告を展開すると、警告の原因となったコード行が Visual Studio のコード エディターで強調表示されます。When you expand a warning, the lines of code that caused the warning are highlighted in the Visual Studio code editor.

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

問題を理解した後は、コード内で解決できます。After you understand the problem, you can resolve it in your code. その後、コード分析に戻り、[コード分析] ウィンドウに警告が表示されなくなったことと、修正によって新たな警告が発生していないことを確認します。Then rerun code analysis to make sure that the warning no longer appears in the Code Analysis window, and that your fix has not raised new warnings.

ヒント

コード分析は、[コード分析] ウィンドウから再実行できます。You can rerun code analysis from the Code Analysis window. [分析] ボタンをクリックし、分析の範囲を選択します。Choose the Analyze button and then choose the scope of the analysis. ソリューション全体または選択したプロジェクトの分析を再実行できます。You can rerun analysis on the entire solution or on a selected project.

コード分析警告の抑制Suppressing code analysis warnings

コード分析警告の修正を行わないことを決定する場合があります。There are times when you might decide not to fix a code analysis warning. コードを実装したときの警告の発生確率と、警告を解決するためのコード変更の量を比較して、解決しないことを選択できます。You might decide that resolving the warning requires too much recoding in relation to the probability that the issue will arise in any real-world implementation of your code. または、警告で使用された分析が特定のコンテキストでは不適切であると判断できます。Or you might believe that the analysis that is used in the warning is inappropriate for the particular context. 個々の警告を抑制して、[コード分析] ウィンドウに表示されないように設定できます。You can suppress individual warnings so that they no longer appear in the Code Analysis window.

警告を抑制するには:To suppress a warning:

  1. 詳細情報が表示されない場合は、警告のタイトルを展開します。If the detailed information is not displayed, expand the title of the warning.

  2. 警告の下部にある [アクション] リンクをクリックします。Choose the Actions link at the bottom of the warning.

  3. [メッセージの非表示][ソース内] の順に選択します。Choose to Suppress Message and then choose In Source.

    メッセージを非表示にすると、コードの該当行に対して警告を抑制する#pragma(warning:警告 ID) が挿入されます。Suppressing a message inserts #pragma(warning:WarningId) that suppresses the warning for the line of code.

警告メッセージの長い一覧の検索と、複数のプロジェクトから成るソリューションの警告をフィルター処理できます。You can search long lists of warning messages and you can filter warnings in multi-project solutions.

[コード分析] ウィンドウの検索とフィルター処理Search and filter the code analysis window

C++ のコード分析の警告C++ code analysis warnings

コード分析は、C++ コードに次の警告を発生させます。Code analysis raises the following warnings for C++ code:

ルールRule 説明Description
C6001C6001 初期化されていないメモリの使用Using Uninitialized Memory
C6011C6011 Null ポインターの逆参照Dereferencing Null Pointer
C6029C6029 未確認の値の使用Use Of Unchecked Value
C6053C6053 呼び出しの 0 での終了Zero Termination From Call
C6059C6059 不適切な連結Bad Concatenation
C6063C6063 Format 関数への文字列引数がないMissing String Argument To Format Function
C6064C6064 Format 関数への整数引数がないMissing Integer Argument To Format Function
C6066C6066 Format 関数へのポインター引数がないMissing Pointer Argument To Format Function
C6067C6067 Format 関数への文字列ポインター引数がないMissing String Pointer Argument To Format Function
C6101C6101 初期化されていないメモリを返すReturning uninitialized memory
C6200C6200 インデックスがバッファーの最大値を超過Index Exceeds Buffer Maximum
C6201C6201 インデックスがスタック バッファーの最大値を超過Index Exceeds Stack Buffer Maximum
C6270C6270 Format 関数への Float 引数がないMissing Float Argument To Format Function
C6271C6271 Format 関数への余分な引数Extra Argument To Format Function
C6272C6272 Format 関数への Float でない引数Non-Float Argument To Format Function
C6273C6273 Format 関数への整数でない引数Non-Integer Argumen To Format Function
C6274C6274 Format 関数への文字でない引数Non-Character Argument To Format Function
C6276C6276 無効な文字列のキャストInvalid String Cast
C6277C6277 無効な CreateProcess 呼び出しInvalid CreateProcess Call
C6284C6284 Format 関数への無効なオブジェクト引数Invalid Object Argument To Format Function
C6290C6290 論理 Not とビットごとの And の優先順位Logical-Not Bitwise-And Precedence
C6291C6291 論理 Not とビットごとの Or の優先順位Logical-Not Bitwise-Or Precedence
C6302C6302 Format 関数への無効な文字列引数Invalid Character String Argument To Format Function
C6303C6303 Format 関数への無効なワイド文字列引数Invalid Wide Character String Argument To Format Function
C6305C6305 サイズと数の使用の不一致Mismatched Size And Count Use
C6306C6306 不適切な変数引数の関数呼び出しIncorrect Variable Argument Function Call
C6328C6328 引数の型の不一致の可能性Potential Argument Type Mismatch
C6385C6385 読み取りのオーバーランRead Overrun
C6386C6386 書き込みのオーバーランWrite Overrun
C6387C6387 無効なパラメーター値Invalid Parameter Value
C6500C6500 無効な属性プロパティInvalid Attribute Property
C6501C6501 属性プロパティ値の競合Conflicting Attribute Property Values
C6503C6503 参照は Null にはできないReferences Cannot Be Null
C6504C6504 非ポインターでの NullNull On Non-Pointer
C6505C6505 Void での MustCheckMustCheck On Void
C6506C6506 非ポインターまたは配列でのバッファー サイズBuffer Size On Non-Pointer Or Array
C6507C6507 逆参照ゼロでの Null 不一致Null Mismatch At Dereference Zero
C6508C6508 定数での書き込みアクセスWrite Access On Constant
C6509C6509 前提条件で使用される ReturnReturn Used On Precondition
C6510C6510 非ポインターでの Null 終了Null Terminated On Non-Pointer
C6511C6511 MustCheck は Yes または No でなければならないMustCheck Must Be Yes Or No
C6513C6513 バッファー サイズのない要素サイズElement Size Without Buffer Size
C6514C6514 バッファー サイズが配列サイズを超過Buffer Size Exceeds Array Size
C6515C6515 非ポインターでのバッファー サイズBuffer Size On Non-Pointer
C6516C6516 属性にプロパティがないNo Properties On Attribute
C6517C6517 読み取り可能でないバッファーでの有効なサイズValid Size On Non-Readable Buffer
C6518C6518 書き込み可能でないバッファーでの書き込み可能サイズWritable Size On Non-Writable Buffer
C6519C6519 無効な注釈です: 'NeedsRelease' プロパティは Yes または No でなければなりませんInvalid annotation: value of the 'NeedsRelease' property must be Yes or No
C6521C6521 無効なサイズの文字列の逆参照Invalid Size String Dereference
C6522C6522 無効なサイズの文字列型Invalid Size String Type
C6523C6523 無効なサイズの文字列パラメーターInvalid Size String Parameter
C6525C6525 無効なサイズの到達不能な場所の文字列Invalid Size String Unreachable Location
C6526C6526 無効なサイズの文字列バッファー型Invalid Size String Buffer Type
C6527C6527 無効な注釈です: 'NeedsRelease' プロパティは、void 型の値では使用できませんInvalid annotation: 'NeedsRelease' property may not be used on values of void type
C6530C6530 認識されない書式指定文字列スタイルUnrecognized Format String Style
C6540C6540 この関数で属性注釈を使用すると、既存の __declspec 注釈がすべて無効となりますThe use of attribute annotations on this function will invalidate all of its existing __declspec annotations
C6551C6551 無効なサイズ指定です: 式が解析可能ではありませんInvalid size specification: expression not parsable
C6552C6552 無効な Deref= または Notref= です: 式が解析可能ではありませんInvalid Deref= or Notref=: expression not parsable
C6701C6701 値が有効な Yes/No/Maybe 値ではありませんThe value is not a valid Yes/No/Maybe value
C6702C6702 値が文字列値ではありませんThe value is not a string value
C6703C6703 値が数値ではありませんThe value is not a number
C6704C6704 予期しない注釈式エラーですUnexpected Annotation Expression Error
C6705C6705 想定した注釈の引数の数が、実際の注釈の引数の数と一致しませんExpected number of arguments for annotation does not match actual number of arguments for annotation
C6706C6706 注釈に対する、予期しない注釈エラーですUnexpected Annotation Error for annotation
C28021C28021 注釈が付けられているパラメーターはポインターである必要がありますThe parameter being annotated must be a pointer
C28182C28182 Null ポインターの逆参照Dereferencing NULL pointer. このポインターは、もう 1 つのポインターと同じ Null 値を持ちます。The pointer contains the same NULL value as another pointer did.
C28202C28202 静的でないメンバーへの参照が正しくありませんIllegal reference to non-static member
C28203C28203 クラス メンバーへのあいまいな参照です。Ambiguous reference to class member.
C28205C28205 Success\ または On_failure\ が無効なコンテキスト内で使用されていますSuccess\ or On_failure\ used in an illegal context
C28206C28206 左側のオペランドは構造体をポイントするため、'-> ' を使用しますLeft operand points to a struct, use '->'
C28207C28207 左側のオペランドは構造体であるため、'.' を使用しますLeft operand is a struct, use '.'
C28210C28210 __on_failure コンテキストの注釈を明示的なプリ コンテキストに含めることはできませんAnnotations for the __on_failure context must not be in explicit pre context
C28211C28211 SAL_context には静的コンテキスト名が必要ですStatic context name expected for SAL_context
C28212C28212 注釈にはポインター式が必要ですPointer expression expected for annotation
C28213C28213 Use_decl_annotations\ 注釈は、変更、先行する宣言なしで、参照に使用される必要があります。The Use_decl_annotations\ annotation must be used to reference, without modification, a prior declaration.
C28214C28214 属性パラメーター名は、p1...p9 である必要がありますAttribute parameter names must be p1...p9
C28215C28215 typefix は、既に typefix のあるパラメーターには適用できませんThe typefix cannot be applied to a parameter that already has a typefix
C28216C28216 checkReturn 注釈は、特定の関数パラメーターの事後条件にのみ適用されます。The checkReturn annotation only applies to postconditions for the specific function parameter.
C28217C28217 関数について、注釈へのパラメーター数がファイルで検出されたものと一致しませんFor function, the number of parameters to annotation does not match that found at file
C28218C28218 関数パラメーターについて、注釈のパラメーターがファイルで検出されたものと一致しませんFor function paramteer, the annotation's parameter does not match that found at file
C28219C28219 注釈 (注釈のパラメーター) には列挙型のメンバーが必要ですMember of enumeration expected for annotation the parameter in the annotation
C28220C28220 注釈 (注釈のパラメーター) には整数式が必要ですInteger expression expected for annotation the parameter in the annotation
C28221C28221 注釈のパラメーターには文字列式が必要ですString expression expected for the parameter in the annotation
C28222C28222 注釈には __yes、__no、または __maybe が必要です__yes, __no, or __maybe expected for annotation
C28223C28223 注釈に必要なトークン/識別子、パラメーターがありませんDid not find expected Token/identifier for annotation, parameter
C28224C28224 注釈にはパラメーターが必要ですAnnotation requires parameters
C28225C28225 注釈に正しい数の必須パラメーターがありませんDid not find the correct number of required parameters in annotation
C28226C28226 注釈は、PrimOp (現在の宣言内) になることもできませんAnnotation cannot also be a PrimOp (in current declaration)
C28227C28227 注釈は、PrimOp (前の宣言を参照) になることもできませんAnnotation cannot also be a PrimOp (see prior declaration)
C28228C28228 注釈パラメーター: 注釈内で型を使用することはできませんAnnotation parameter: cannot use type in annotations
C28229C28229 注釈はパラメーターをサポートしませんAnnotation does not support parameters
C28230C28230 パラメーターの型にはメンバーがありません。The type of parameter has no member.
C28231C28231 注釈は配列でのみ有効ですAnnotation is only valid on array
C28232C28232 pre、post、または deref は注釈に適用されませんpre, post, or deref not applied to any annotation
C28233C28233 pre、post、または deref はブロックに適用されますpre, post, or deref applied to a block
C28234C28234 _at 式は現在の関数に適用されません__at expression does not apply to current function
C28235C28235 関数は注釈として独立できませんThe function cannot stand alone as an annotation
C28236C28236 注釈は式内で使用できませんThe annotation cannot be used in an expression
C28237C28237 パラメーターの注釈は、もうサポートされていませんThe annotation on parameter is no longer supported
C28238C28238 パラメーターの注釈には、複数の値、stringValue、および longValue が含まれています。The annotation on parameter has more than one of value, stringValue, and longValue. paramn=xxx を使用してくださいUse paramn=xxx
C28239C28239 パラメーターの注釈には、両方の値、stringValue、または longValue、さらに paramn=xxx が含まれます。The annotation on parameter has both value, stringValue, or longValue; and paramn=xxx. paramn=xxx のみを使用してくださいUse only paramn=xxx
C28240C28240 パラメーターの注釈は、param2 を含みますが param1 は含みませんThe annotation on parameter has param2 but no param1
C28241C28241 パラメーターの関数の注釈は認識されませんThe annotation for function on parameter is not recognized
C28243C28243 パラメーターの関数の注釈には、注釈が付けられた実際の型に許可された数よりも多くの逆参照が必要ですThe annotation for function on parameter requires more dereferences than the actual type annotated allows
C28245C28245 関数に対する注釈は、非メンバー関数上で 'this' に注釈を付けます。The annotation for function annotates 'this' on a non-member-function
C28246C28246 関数に対するパラメーターの注釈が、パラメーターの型に一致しませんThe parameter annotation for function does not match the type of the parameter
C28250C28250 関数に対する一貫性のない注釈: 前のインスタンスにはエラーが含まれます。Inconsistent annotation for function: the prior instance has an error.
C28251C28251 関数に対する一貫性のない注釈: 前のインスタンスにはエラーが含まれます。Inconsistent annotation for function: this instance has an error.
C28252C28252 関数に対する一貫性のない注釈: パラメーターは、このインスタンスについて他の注釈を含みます。Inconsistent annotation for function: parameter has another annotations on this instance.
C28253C28253 関数に対する一貫性のない注釈: パラメーターは、このインスタンスについて他の注釈を含みます。Inconsistent annotation for function: parameter has another annotations on this instance.
C28254C28254 dynamic_cast<>() は、注釈ではサポートされませんdynamic_cast<>() is not supported in annotations
C28262C28262 注釈での構文エラーが関数の注釈で見つかりましたA syntax error in the annotation was found in function, for annotation
C28263C28263 条件付き注釈での構文エラーが、組み込みの注釈で見つかりましたA syntax error in a conditional annotation was found for Intrinsic annotation
C28264C28264 結果リストの値は定数である必要があります。Result lists values must be constants.
C28267C28267 注釈での構文エラーが、関数の注釈で見つかりました。A syntax error in the annotations was found annotation in the function.
C28272C28272 検査中の関数とパラメーターに対する注釈に関数宣言との一貫性がありませんThe annotation for function, parameter when examining is inconsistent with the function declaration
C28273C28273 関数について、手がかりには関数宣言との一貫性がありません。For function, the clues are inconsistent with the function declaration
C28275C28275 Macro_value\ のパラメーターは null ですThe parameter to Macro_value\ is null
C28279C28279 シンボルについて、'begin' はありましたが、対応する 'end' がありませんFor symbol, a 'begin' was found without a matching 'end'
C28280C28280 シンボルについて、'end' はありましたが、対応する 'begin' がありませんFor symbol, an 'end' was found without a matching 'begin'
C28282C28282 書式指定文字列は、前提条件の中に存在する必要がありますFormat Strings must be in preconditions
C28285C28285 関数について、パラメーターに構文エラーがありますFor function, syntax error in parameter
C28286C28286 関数について、構文エラーが最後の近くにありますFor function, syntax error near the end
C28287C28287 関数について、At\() 注釈 (認識されないパラメーター名) に構文エラーがありますFor function, syntax Error in At\() annotation (unrecognized parameter name)
C28288C28288 関数について、At\() 注釈 (無効のパラメーター名) に構文エラーがありますFor function, syntax Error in At\() annotation (invalid parameter name)
C28289C28289 関数について: ReadableTo または WritableTo には、パラメーターとして limit-spec がありませんでしたFor function: ReadableTo or WritableTo did not have a limit-spec as a parameter
C28290C28290 関数の注釈は、実際のパラメーターの数より多い外部参照を含みますthe annotation for function contains more Externals than the actual number of parameters
C28291C28291 deref レベル 0 での post null/notnull は、関数に対して意味がありません。post null/notnull at deref level 0 is meaningless for function.
C28300C28300 演算子に対する互換性のない型の、式のオペランドですExpression operands of incompatible types for operator
C28301C28301 関数の最初の宣言に対して注釈がありません。No annotations for first declaration of function.
C28302C28302 余分な Deref\ 演算子が注釈に見つかりました。An extra Deref\ operator was found on annotation.
C28303C28303 あいまいな Deref\ 演算子が注釈に見つかりました。An ambiguous Deref\ operator was found on annotation.
C28304C28304 不適切に設定された Notref\ 演算子がトークンに適用されました。An improperly placed Notref\ operator was found applied to token.
C28305C28305 トークンの解析中にエラーが発生しました。An error while parsing a token was discovered.
C28350C28350 注釈には、条件付きで適用できない状況の説明が表示されます。The annotation describes a situation that is not conditionally applicable.
C28351C28351 注釈には、動的な値 (変数) が使用できない条件が記述されています。The annotation describes where a dynamic value (a variable) cannot be used in the condition.