Share via


연습: C/C++ 코드의 오류 분석

이 연습에서는 C/C++ 코드용 코드 분석 도구를 사용하여 C/C++ 코드에 잠재된 코드 오류를 분석하는 방법을 보여 줍니다.

이 연습에서는 코드 분석 도구를 사용하여 C/C++ 코드에 잠재된 코드 오류를 분석하는 과정을 단계별로 설명합니다.

다음 단계를 완료합니다.

  • 네이티브 코드에 대해 코드 분석을 실행합니다.

  • 코드 오류 경고를 분석합니다.

  • 경고를 오류로 처리합니다.

  • 소스 코드에 주석을 지정하여 코드 오류 분석을 향상시킵니다.

사전 요구 사항

  • Visual Studio Premium 또는 Visual Studio Ultimate

  • 데모 샘플의 복사본

  • C/C++에 대한 기본적 이해

네이티브 코드에 대해 코드 분석을 실행하려면

  1. Visual Studio에서 Demo 솔루션을 엽니다.

    솔루션 탐색기에 Demo 솔루션이 열립니다.

  2. 빌드 메뉴에서 솔루션 다시 빌드를 클릭합니다.

    오류나 경고가 표시되지 않고 솔루션이 빌드됩니다.

  3. 솔루션 탐색기에서 CodeDefects 프로젝트를 선택합니다.

  4. 프로젝트 메뉴에서 속성을 선택합니다.

    CodeDefects 속성 페이지 대화 상자가 표시됩니다.

  5. 코드 분석을 클릭합니다.

  6. 빌드할 때 C/C++에 코드 분석 사용 확인란을 클릭합니다.

  7. CodeDefects 프로젝트를 다시 빌드합니다.

    오류 목록에 코드 분석 경고가 표시됩니다.

코드 오류 경고를 분석하려면

  1. 보기 메뉴에서 오류 목록을 클릭합니다.

    Visual Studio에서 선택한 개발자 프로필에 따라 보기 메뉴의 다른 창을 가리킨 다음 오류 목록을 클릭해야 할 수도 있습니다.

  2. 오류 목록에서 다음 경고를 두 번 클릭합니다.

    경고 C6230: 의미 체계가 다른 형식 간의 암시적 캐스팅입니다. 부울 컨텍스트에서 HRESULT를 사용하고 있습니다.

    bool ProcessDomain() 함수에 경고를 발생시킨 줄이 코드 편집기에 표시됩니다. 이 경고는 부울 결과가 필요한 'if' 문에 HRESULT를 사용하고 있음을 나타냅니다.

  3. SUCCEEDED 매크로를 사용하여 이 경고를 해결합니다. 해당 코드는 다음 코드와 유사해야 합니다.

    if (SUCCEEDED (ReadUserAccount()) )
    
  4. 오류 목록에서 다음 경고를 두 번 클릭합니다.

    경고 C6282: 잘못된 연산자: 테스트 컨텍스트에서 상수를 할당했습니다. ==를 사용하려고 했습니까?

  5. 같음 테스트를 수행하여 이 경고를 해결합니다. 코드는 다음과 같아야 합니다.

    if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
    

경고를 오류로 처리하려면

  1. Bug.cpp 파일에서 파일 시작 부분에 다음 #pragma 문을 추가하여 경고 C6001을 오류로 처리합니다.

    #pragma warning (error: 6001)
    
  2. CodeDefects 프로젝트를 다시 빌드합니다.

    오류 목록에 C6001이 오류로 표시됩니다.

  3. i 및 j를 0으로 초기화하여 오류 목록에 있는 나머지 두 개의 C6001 오류를 해결합니다.

  4. CodeDefects 프로젝트를 다시 빌드합니다.

    경고나 오류가 표시되지 않고 프로젝트가 빌드됩니다.

annotation.c에서 소스 코드 주석 오류를 해결하려면

  1. 솔루션 탐색기에서 Annotations 프로젝트를 선택합니다.

  2. 프로젝트 메뉴에서 속성을 선택합니다.

    Annotations 속성 페이지 대화 상자가 표시됩니다.

  3. 코드 분석을 클릭합니다.

  4. 빌드할 때 C/C++에 코드 분석 사용 확인란을 선택합니다.

  5. Annotations 프로젝트를 다시 빌드합니다.

  6. 오류 목록에서 다음 경고를 두 번 클릭합니다.

    경고 C6011: NULL 포인터 'newNode'를 역참조하고 있습니다.

    이 경고는 호출자가 반환 값을 검사함에 따라 오류가 발생했음을 나타냅니다. 이 경우 AllocateNode를 호출하면 NULL 값이 반환될 수 있습니다. AllocateNode의 함수 선언에 대해서는 annotations.h 헤더 파일을 참조하십시오.

  7. annotations.cpp 파일을 엽니다.

  8. 이 경고를 해결하려면 'if' 문을 사용하여 반환 값을 테스트합니다 해당 코드는 다음 코드와 유사해야 합니다.

    if (NULL != newNode)

    {

    newNode->data = value;

    newNode->next = 0;

    node->next = newNode;

    }

  9. Annotations 프로젝트를 다시 빌드합니다.

    경고나 오류가 표시되지 않고 프로젝트가 빌드됩니다.

소스 코드 주석을 사용하려면

  1. 이 예제와 같이 Pre 및 Post 조건을 사용하여 AddTail 함수의 정식 매개 변수와 반환 값에 주석을 지정합니다.

    [returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail

    (

        [SA_Pre(Null=SA_Maybe)] LinkedList* node,

        int value

     )

  2. Annotations 프로젝트를 다시 빌드합니다.

  3. 오류 목록에서 다음 경고를 두 번 클릭합니다.

    경고 C6011: NULL 포인터 'node'를 역참조하고 있습니다.

    이 경고는 함수에 전달된 노드가 null일 수 있음을 나타내며 해당 경고가 발생한 줄 번호가 함께 표시됩니다.

  4. 이 경고를 해결하려면 'if' 문을 사용하여 반환 값을 테스트합니다 해당 코드는 다음 코드와 유사해야 합니다.

      . . .
      LinkedList *newNode = NULL; 
      if (NULL == node)
      {
           return NULL;
          . . .
      }
    
  5. Annotations 프로젝트를 다시 빌드합니다.

    경고나 오류가 표시되지 않고 프로젝트가 빌드됩니다.

참고 항목

작업

연습: 관리 코드의 코드 오류 분석