Analyze C++ code quality of Store apps using Visual Studio static code analysis

Visual Studio 2015

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on

The latest version of this topic can be found at Analyze C++ code quality of Store apps using Visual Studio static code analysis.

Applies to Windows and Windows Phone](../Image/windows_and_phone_content.png "windows_and_phone_content")

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.

System_CAPS_ICON_note.jpg Note

In Visual Studio Ultimate, Visual Studio Premium, and Visual Studio Professional, you can use the full functionality of code analysis tools. See Analyzing Application Quality by Using Code Analysis Tools in the MSDN Library.

You can learn about:

Running code analysis

Analyzing and resolving code analysis warnings

Suppressing code analysis warnings

Searching and filtering code analysis results

C++ code analysis warnings

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. 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

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

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.

System_CAPS_ICON_tip.jpg Tip

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.

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.

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

Code analysis raises the following warnings for C++ code:

C6001Using Uninitialized Memory
C6011Dereferencing Null Pointer
C6029Use Of Unchecked Value
C6053Zero Termination From Call
C6059Bad Concatenation
C6063Missing String Argument To Format Function
C6064Missing Integer Argument To Format Function
C6066Missing Pointer Argument To Format Function
C6067Missing String Pointer Argument To Format Function
C6101Returning uninitialized memory
C6200Index Exceeds Buffer Maximum
C6201Index Exceeds Stack Buffer Maximum
C6270Missing Float Argument To Format Function
C6271Extra Argument To Format Function
C6272Non-Float Argument To Format Function
C6273Non-Integer Argumen To Format Function
C6274Non-Character Argument To Format Function
C6276Invalid String Cast
C6277Invalid CreateProcess Call
C6284Invalid Object Argument To Format Function
C6290Logical-Not Bitwise-And Precedence
C6291Logical-Not Bitwise-Or Precedence
C6302Invalid Character String Argument To Format Function
C6303Invalid Wide Character String Argument To Format Function
C6305Mismatched Size And Count Use
C6306Incorrect Variable Argument Function Call
C6328Potential Argument Type Mismatch
C6385Read Overrun
C6386Write Overrun
C6387Invalid Parameter Value
C6500Invalid Attribute Property
C6501Conflicting Attribute Property Values
C6503References Cannot Be Null
C6504Null On Non-Pointer
C6505MustCheck On Void
C6506Buffer Size On Non-Pointer Or Array
C6507Null Mismatch At Dereference Zero
C6508Write Access On Constant
C6509Return Used On Precondition
C6510Null Terminated On Non-Pointer
C6511MustCheck Must Be Yes Or No
C6513Element Size Without Buffer Size
C6514Buffer Size Exceeds Array Size
C6515Buffer Size On Non-Pointer
C6516No Properties On Attribute
C6517Valid Size On Non-Readable Buffer
C6518Writable Size On Non-Writable Buffer
C6519Invalid annotation: value of the 'NeedsRelease' property must be Yes or No
C6521Invalid Size String Dereference
C6522Invalid Size String Type
C6523Invalid Size String Parameter
C6525Invalid Size String Unreachable Location
C6526Invalid Size String Buffer Type
C6527Invalid annotation: 'NeedsRelease' property may not be used on values of void type
C6530Unrecognized Format String Style
C6540The use of attribute annotations on this function will invalidate all of its existing __declspec annotations
C6551Invalid size specification: expression not parsable
C6552Invalid Deref= or Notref=: expression not parsable
C6701The value is not a valid Yes/No/Maybe value
C6702The value is not a string value
C6703The value is not a number
C6704Unexpected Annotation Expression Error
C6705Expected number of arguments for annotation does not match actual number of arguments for annotation
C6706Unexpected Annotation Error for annotation
C28021The parameter being annotated must be a pointer
C28182Dereferencing NULL pointer. The pointer contains the same NULL value as another pointer did.
C28202Illegal reference to non-static member
C28203Ambiguous reference to class member.
C28205_Success_ or _On_failure_ used in an illegal context
C28206Left operand points to a struct, use '->'
C28207Left operand is a struct, use '.'
C28210Annotations for the __on_failure context must not be in explicit pre context
C28211Static context name expected for SAL_context
C28212Pointer expression expected for annotation
C28213The _Use_decl_annotations_ annotation must be used to reference, without modification, a prior declaration.
C28214Attribute parameter names must be p1...p9
C28215The typefix cannot be applied to a parameter that already has a typefix
C28216The checkReturn annotation only applies to postconditions for the specific function parameter.
C28217For function, the number of parameters to annotation does not match that found at file
C28218For function paramteer, the annotation's parameter does not match that found at file
C28219Member of enumeration expected for annotation the parameter in the annotation
C28220Integer expression expected for annotation the parameter in the annotation
C28221String expression expected for the parameter in the annotation
C28222__yes, __no, or __maybe expected for annotation
C28223Did not find expected Token/identifier for annotation, parameter
C28224Annotation requires parameters
C28225Did not find the correct number of required parameters in annotation
C28226Annotation cannot also be a PrimOp (in current declaration)
C28227Annotation cannot also be a PrimOp (see prior declaration)
C28228Annotation parameter: cannot use type in annotations
C28229Annotation does not support parameters
C28230The type of parameter has no member.
C28231Annotation is only valid on array
C28232pre, post, or deref not applied to any annotation
C28233pre, post, or deref applied to a block
C28234__at expression does not apply to current function
C28235The function cannot stand alone as an annotation
C28236The annotation cannot be used in an expression
C28237The annotation on parameter is no longer supported
C28238The annotation on parameter has more than one of value, stringValue, and longValue. Use paramn=xxx
C28239The annotation on parameter has both value, stringValue, or longValue; and paramn=xxx. Use only paramn=xxx
C28240The annotation on parameter has param2 but no param1
C28241The annotation for function on parameter is not recognized
C28243The annotation for function on parameter requires more dereferences than the actual type annotated allows
C28245The annotation for function annotates 'this' on a non-member-function
C28246The parameter annotation for function does not match the type of the parameter
C28250Inconsistent annotation for function: the prior instance has an error.
C28251Inconsistent annotation for function: this instance has an error.
C28252Inconsistent annotation for function: parameter has another annotations on this instance.
C28253Inconsistent annotation for function: parameter has another annotations on this instance.
C28254dynamic_cast<>() is not supported in annotations
C28262A syntax error in the annotation was found in function, for annotation
C28263A syntax error in a conditional annotation was found for Intrinsic annotation
C28264Result lists values must be constants.
C28267A syntax error in the annotations was found annotation in the function.
C28272The annotation for function, parameter when examining is inconsistent with the function declaration
C28273For function, the clues are inconsistent with the function declaration
C28275The parameter to _Macro_value_ is null
C28279For symbol, a 'begin' was found without a matching 'end'
C28280For symbol, an 'end' was found without a matching 'begin'
C28282Format Strings must be in preconditions
C28285For function, syntax error in parameter
C28286For function, syntax error near the end
C28287For function, syntax Error in _At_() annotation (unrecognized parameter name)
C28288For function, syntax Error in _At_() annotation (invalid parameter name)
C28289For function: ReadableTo or WritableTo did not have a limit-spec as a parameter
C28290the annotation for function contains more Externals than the actual number of parameters
C28291post null/notnull at deref level 0 is meaningless for function.
C28300Expression operands of incompatible types for operator
C28301No annotations for first declaration of function.
C28302An extra _Deref_ operator was found on annotation.
C28303An ambiguous _Deref_ operator was found on annotation.
C28304An improperly placed _Notref_ operator was found applied to token.
C28305An error while parsing a token was discovered.
C28350The annotation describes a situation that is not conditionally applicable.
C28351The annotation describes where a dynamic value (a variable) cannot be used in the condition.