연습: 오류에 대한 C/C++ 코드 분석

이 연습에서는 잠재적인 코드 결함에 대한 C/C++ 코드를 분석하는 방법을 보여 줍니다. C/C++ 코드에 대한 코드 분석 도구를 사용합니다.

이 연습에서는 다음을 수행합니다.

  • 네이티브 코드에서 코드 분석을 실행합니다.
  • 코드 결함 경고를 분석합니다.
  • 경고를 오류로 처리합니다.
  • 코드 결함 분석을 개선하기 위해 소스 코드에 주석을 추가합니다.

필수 조건

네이티브 코드에 대한 코드 분석 실행

네이티브 코드에서 코드 결함 분석을 실행하려면

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

    이제 CppDemo 솔루션이 솔루션 탐색기 채웁니다.

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

    솔루션은 오류 또는 경고 없이 빌드됩니다.

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

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

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

  5. 코드 분석 속성 페이지를 선택합니다.

  6. 빌드에서 코드 분석 사용 속성을 예변경합니다. 확인을 선택하여 변경 내용을 저장합니다.

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

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

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

    이제 CppDemo 솔루션이 솔루션 탐색기 채웁니다.

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

    솔루션은 오류 또는 경고 없이 빌드됩니다.

    참고 항목

    Visual Studio 2017에서는 IntelliSense 엔진에 가짜 경고 E1097 unknown attribute "no_init_all" 가 표시되어 있을 수 있습니다. 이 경고는 무시해도 됩니다.

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

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

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

  5. 코드 분석 속성 페이지를 선택합니다.

  6. 빌드 검사 코드 분석 사용 상자를 선택합니다. 확인을 선택하여 변경 내용을 저장합니다.

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

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

코드 결함 경고를 분석하려면

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

    이 메뉴 항목이 표시되지 않을 수 있습니다. Visual Studio에서 선택한 개발자 프로필에 따라 달라집니다. 보기 메뉴에서 다른 창을가리킨 다음 오류 목록을 선택해야 할 수 있습니다.

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

    C6230: 의미상 서로 다른 형식 간의 암시적 캐스트: 부울 컨텍스트에서 HRESULT 사용

    코드 편집기에서는 함수 bool ProcessDomain()내에서 경고를 발생시킨 줄을 표시합니다. 이 경고는 부울 결과가 예상되는 'if' 문에서 사용되고 있음을 나타냅니다 HRESULT . HRESULT가 함수에서 반환되는 경우 성공을 나타내지만 부울 값으로 변환되면 로 계산되기 false때문에 S_OK 일반적으로 실수입니다.

  3. 반환 값이 SUCCEEDED 성공을 나타내는 시점으로 true 변환되는 매크로를 HRESULT 사용하여 이 경고를 수정합니다. 코드는 다음 코드와 유사해야 합니다.

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

    C6282: 잘못된 연산자: 부울 컨텍스트에서 상수 할당입니다. 대신 '=='를 사용하는 것이 좋습니다.

  5. 같음을 테스트하여 이 경고를 수정합니다. 코드는 다음 코드와 유사해야 합니다.

    if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
    
  6. 초기화 i 하여 오류 목록에서 C6001 경고를 다시 기본 수정하고 j 0으로 수정합니다.

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

    프로젝트가 경고나 오류 없이 빌드됩니다.

소스 코드 주석 경고 수정

annotation.c에서 소스 코드 주석 경고를 사용하도록 설정하려면

  1. 솔루션 탐색기 주석 프로젝트를 선택합니다.

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

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

  3. 코드 분석 속성 페이지를 선택합니다.

  4. 빌드에서 코드 분석 사용 속성을 예변경합니다. 확인을 선택하여 변경 내용을 저장합니다.

  1. 솔루션 탐색기 주석 프로젝트를 선택합니다.

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

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

  3. 코드 분석 속성 페이지를 선택합니다.

  4. 빌드 검사 코드 분석 사용 상자를 선택합니다. 확인을 선택하여 변경 내용을 저장합니다.

annotation.c에서 소스 코드 주석 경고를 수정하려면

  1. 주석 프로젝트를 다시 빌드합니다.

  2. 빌드 메뉴에서 주석에서 코드 분석 실행을 선택합니다.

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

    C6011: NULL 포인터 'newNode'를 역참조합니다.

    이 경고는 호출자가 반환 값을 검사 실패했음을 나타냅니다. 이 경우 호출에서 NULL 값을 반환할 AllocateNode 수 있습니다. 에 대한 함수 선언 AllocateNode은 annotations.h 헤더 파일을 참조하세요.

  4. 커서는 경고가 발생한 annotations.cpp 파일의 위치에 있습니다.

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

    LinkedList* newNode = AllocateNode();
    if (nullptr != newNode)
    {
        newNode->data = value;
        newNode->next = 0;
        node->next = newNode;
    }
    
  6. 주석 프로젝트를 다시 빌드합니다.

    프로젝트가 경고나 오류 없이 빌드됩니다.

소스 코드 주석을 사용하여 더 많은 문제 검색

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

  1. 포인터 값이 null일 수 있음을 나타내기 위해 함수 AddTail 의 형식 매개 변수 및 반환 값에 주석을 추가합니다.

    _Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
    
  2. 빌드 메뉴에서 솔루션에서 코드 분석 실행을 선택합니다.

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

    C6011: NULL 포인터 'node'를 역참조합니다.

    이 경고는 함수에 전달된 노드가 null일 수 있음을 나타냅니다.

  4. 이 경고를 수정하려면 함수 시작 부분에 'if' 문을 사용하여 전달된 값을 테스트합니다. 코드는 다음 코드와 유사해야 합니다.

    if (nullptr == node)
    {
         return nullptr;
    }
    
  5. 빌드 메뉴에서 솔루션에서 코드 분석 실행을 선택합니다.

    이제 프로젝트는 경고나 오류 없이 빌드됩니다.

참고 항목

연습: 관리 코드의 코드 오류 분석
C/C++에 대한 코드 분석