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 버전의 코드 분석 도구는 코드에 일련의 일반적인 문제 및 바람직한 프로그래밍 관행의 위반 사항이 있는지 검사합니다.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 Code 편집기에서 경고를 발생시킨 코드 줄이 강조 표시됩니다.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:WarningId)가 삽입됩니다.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 함수에 부동 인수 없음Missing Float Argument To Format Function
C6271C6271 Format 함수의 추가 인수Extra Argument To Format Function
C6272C6272 Format 함수의 비부동 인수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 논리 부정 비트 AND 우선 순위Logical-Not Bitwise-And Precedence
C6291C6291 논리 부정 비트 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 역참조 0에서의 Null 불일치Null Mismatch At Dereference Zero
C6508C6508 상수에 대한 쓰기 액세스Write Access On Constant
C6509C6509 사전 조건에서 반환이 사용됨Return 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. 포인터에 다른 포인터와 동일한 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 매개 변수에 대한 주석에 value, stringValue 및 longValue 중 두 개 이상이 있습니다.The annotation on parameter has more than one of value, stringValue, and longValue. paramn=xxx를 사용하세요.Use paramn=xxx
C28239C28239 매개 변수에 대한 주석에 value, stringValue 또는 longValue와 paramn=xxx가 모두 있습니다.The annotation on parameter has both value, stringValue, or longValue; and paramn=xxx. paramn=xxx만 사용하세요.Use only paramn=xxx
C28240C28240 매개 변수에 대한 주석에 param1이 아니라 param2가 있습니다.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 기호의 경우 일치하는 'end'가 없는 'begin'이 있습니다.For symbol, a 'begin' was found without a matching 'end'
C28280C28280 기호의 경우 일치하는 'begin'이 없는 'end'가 있습니다.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 함수의 경우 역참조 수준 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.