코드 분석을 위한 샘플 C++ 프로젝트

다음 절차에서는 연습 샘플을 만드는 방법을 보여 줍니다. 오류에 대한 C/C++ 코드 분석 이 절차에서는 다음을 생성합니다.

  • CppDemo라는 Visual Studio 솔루션입니다.

  • CodeDefects라는 정적 라이브러리 프로젝트입니다.

  • Annotations라는 정적 라이브러리 프로젝트입니다.

절차에서는 헤더에 대해 코드를 제공하고, 정적 라이브러리에 대해 .cpp 파일을 제공합니다.

CppDemo 솔루션 및 CodeDefects 프로젝트 만들기

  1. Visual Studio를 열고 새 프로젝트 만들기를 선택합니다 .

  2. 새 프로젝트 만들기 대화 상자에서 언어 필터를 C++변경합니다.

  3. Windows 데스크톱 마법사를 선택하고 다음 단추를 선택합니다.

  4. 새 프로젝트 구성 페이지의 프로젝트 이름 텍스트 상자에 CodeDefects를 입력합니다.

  5. 솔루션 이름 텍스트 상자에 CppDemo를 입력합니다.

  6. 만들기를 선택합니다.

  7. Windows 데스크톱 프로젝트 대화 상자에서 애플리케이션 유형을정적 라이브러리(.lib)로 변경합니다.

  8. 추가 옵션에서 빈 프로젝트를 선택합니다.

  9. 확인을 선택하여 솔루션 및 프로젝트를 만듭니다.

  1. Visual Studio를 엽니다. 메뉴 모음에서 파일>새로 만들기>프로젝트를 선택합니다.

  2. 새 프로젝트 대화 상자에서 Visual C++>Windows 데스크톱을 선택합니다.

  3. Windows 데스크톱 마법사를 선택합니다.

  4. 이름 텍스트 상자에 CodeDefects를 입력합니다.

  5. 솔루션 이름 텍스트 상자에 CppDemo를 입력합니다.

  6. 확인을 선택합니다.

  7. Windows 데스크톱 프로젝트 대화 상자에서 애플리케이션 유형을정적 라이브러리(.lib)로 변경합니다.

  8. 추가 옵션에서 빈 프로젝트를 선택합니다.

  9. 확인을 선택하여 솔루션 및 프로젝트를 만듭니다.

  1. Visual Studio를 엽니다. 메뉴 모음에서 파일>새로 만들기>프로젝트를 선택합니다.

  2. 새 프로젝트 대화 상자에서 템플릿>Visual C++>Win32를 선택합니다.

  3. Win32 콘솔 애플리케이션을 선택합니다.

  4. 이름 텍스트 상자에 CodeDefects를 입력합니다.

  5. 솔루션 이름 텍스트 상자에 CppDemo를 입력합니다.

  6. 확인을 선택합니다.

  7. Win32 애플리케이션 마법사 대화 상자에서 다음 단추를 선택합니다.

  8. 애플리케이션 유형을 정적 라이브러리로 변경합니다.

  9. 추가 옵션에서 미리 컴파일된 헤더의 선택을 취소합니다.

  10. 마침을 선택하여 솔루션 및 프로젝트를 만듭니다.

CodeDefects 프로젝트에 헤더 및 원본 파일 추가

  1. 솔루션 탐색기 CodeDefects를 확장합니다.

  2. 마우스 오른쪽 단추를 클릭하여 헤더 파일의 상황에 맞는 메뉴를 엽니다. 추가>새 항목을 선택합니다.

  3. 새 항목 추가 대화 상자에서 Visual C++>Code를 선택한 다음 헤더 파일(.h)을 선택합니다.

  4. 이름 편집 상자에 Bug.h를 입력한 다음 추가 단추를 선택합니다.

  5. Bug.h에 대한 편집 창에서 내용을 선택하고 삭제합니다.

  6. 다음 코드를 복사하여 편집기에서 Bug.h 파일에 붙여넣습니다.

    #pragma once
    
    #include <windows.h>
    
    // Function prototypes
    bool CheckDomain(wchar_t const *);
    HRESULT ReadUserAccount();
    
    // These constants define the common sizes of the
    // user account information throughout the program
    const int USER_ACCOUNT_LEN = 256;
    const int ACCOUNT_DOMAIN_LEN = 128;
    
  7. 솔루션 탐색기 마우스 오른쪽 단추를 클릭하여 소스 파일의 상황에 맞는 메뉴를 엽니다. 추가>새 항목을 선택합니다.

  8. 새 항목 추가 대화 상자에서 C++ 파일(.cpp)을 선택합니다.

  9. 이름 편집 상자에 Bug.cpp를 입력한 다음 추가 단추를 선택합니다.

  10. 다음 코드를 복사하여 편집기에서 Bug.cpp 파일에 붙여넣습니다.

    #include "Bug.h"
    
    // the user account
    wchar_t g_userAccount[USER_ACCOUNT_LEN] = { L"domain\\user" };
    int len = 0;
    
    bool CheckDomain(wchar_t const* domain)
    {
        return (wcsnlen_s(domain, USER_ACCOUNT_LEN) > 0);
    }
    
    HRESULT ReadUserAccount()
    {
        return S_OK;
    }
    
    bool ProcessDomain()
    {
        wchar_t* domain = new wchar_t[ACCOUNT_DOMAIN_LEN];
        // ReadUserAccount gets a 'domain\user' input from
        //the user into the global 'g_userAccount'
        if (ReadUserAccount())
        {
            // Copies part of the string prior to the '\'
            // character onto the 'domain' buffer
            for (len = 0; (len < ACCOUNT_DOMAIN_LEN) && (g_userAccount[len] != L'\0'); len++)
            {
                if (g_userAccount[len] == L'\\')
                {
                    // Stops copying on the domain and user separator ('\')
                    break;
                }
                domain[len] = g_userAccount[len];
            }
            if ((len = ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
            {
                // '\' was not found. Invalid domain\user string.
                delete[] domain;
                return false;
            }
            else
            {
                domain[len] = L'\0';
            }
            // Process domain string
            bool result = CheckDomain(domain);
    
            delete[] domain;
            return result;
        }
        return false;
    }
    
    int path_dependent(int n)
    {
        int i;
        int j;
        if (n == 0)
            i = 1;
        else
            j = 1;
        return i + j;
    }
    
  11. 메뉴 모음에서 파일>모두 저장을 차례로 선택합니다.

주석 프로젝트 추가 및 정적 라이브러리로 구성

  1. 솔루션 탐색기 CppDemo를 마우스 오른쪽 단추로 클릭하여 상황에 맞는 메뉴를 엽니다. 새 프로젝트 추가>를 선택합니다.

  2. 새 프로젝트 추가 대화 상자에서 Windows 데스크톱 마법사를 선택한 다음 다음 단추를 선택합니다.

  3. 새 프로젝트 구성 페이지의 프로젝트 이름 텍스트 상자에 주석을 입력한 다음 만들기를 선택합니다.

  4. Windows 데스크톱 프로젝트 대화 상자에서 애플리케이션 유형을정적 라이브러리(.lib)로 변경합니다.

  5. 추가 옵션에서 빈 프로젝트를 선택합니다.

  6. 확인을 선택하여 프로젝트를 만듭니다.

  1. 솔루션 탐색기 CppDemo를 마우스 오른쪽 단추로 클릭하여 상황에 맞는 메뉴를 엽니다. 새 프로젝트 추가>를 선택합니다.

  2. 새 프로젝트 추가 대화 상자에서 Visual C++>Windows Desktop을 선택합니다.

  3. Windows 데스크톱 마법사를 선택합니다.

  4. 이름 텍스트 상자에 주석을 입력한 다음 확인을 선택합니다.

  5. Windows 데스크톱 프로젝트 대화 상자에서 애플리케이션 유형을정적 라이브러리(.lib)로 변경합니다.

  6. 추가 옵션에서 빈 프로젝트를 선택합니다.

  7. 확인을 선택하여 프로젝트를 만듭니다.

  1. 솔루션 탐색기 CppDemo를 마우스 오른쪽 단추로 클릭하여 상황에 맞는 메뉴를 엽니다. 새 프로젝트 추가>를 선택합니다.

  2. 새 프로젝트 추가 대화 상자에서 Visual C++>Win32를 선택합니다.

  3. Win32 콘솔 애플리케이션을 선택합니다.

  4. 이름 텍스트 상자에 주석을 입력합니다.

  5. 확인을 선택합니다.

  6. Win32 애플리케이션 마법사 대화 상자에서 다음 단추를 선택합니다.

  7. 애플리케이션 유형을 정적 라이브러리로 변경합니다.

  8. 추가 옵션에서 미리 컴파일된 헤더의 선택을 취소합니다.

  9. 마침을 선택하여 프로젝트를 만듭니다.

주석 프로젝트에 헤더 파일 및 원본 파일 추가

  1. 솔루션 탐색기 주석을 확장합니다.

  2. 마우스 오른쪽 단추를 클릭하여 주석 아래의 헤더 파일에 대한 상황에 맞는 메뉴를 엽니다. 추가>새 항목을 선택합니다.

  3. 새 항목 추가 대화 상자에서 Visual C++>Code를 선택한 다음 헤더 파일(.h)을 선택합니다.

  4. 이름 편집 상자에 annotations.h를 입력한 다음 추가 단추를 선택합니다.

  5. annotations.h에 대한 편집 창에서 내용을 선택하고 삭제합니다.

  6. 다음 코드를 복사하여 편집기에서 annotations.h 파일에 붙여넣습니다.

    #pragma once
    #include <sal.h>
    
    struct LinkedList
    {
        struct LinkedList* next;
        int data;
    };
    
    typedef struct LinkedList LinkedList;
    
    _Ret_maybenull_ LinkedList* AllocateNode();
    
  7. 솔루션 탐색기 마우스 오른쪽 단추를 클릭하여 주석 아래의 원본 파일에 대한 상황에 맞는 메뉴를 엽니다. 추가>새 항목을 선택합니다.

  8. 새 항목 추가 대화 상자에서 C++ 파일(.cpp)을 선택합니다.

  9. 이름 편집 상자에 annotations.cpp를 입력한 다음 추가 단추를 선택합니다.

  10. 다음 코드를 복사하여 편집기에서 annotations.cpp 파일에 붙여넣습니다.

    #include "annotations.h"
    #include <malloc.h>
    
    _Ret_maybenull_ LinkedList* AllocateNode()
    {
        LinkedList* result = static_cast<LinkedList*>(malloc(sizeof(LinkedList)));
        return result;
    }
    
    LinkedList* AddTail(LinkedList* node, int value)
    {
        // finds the last node
        while (node->next != nullptr)
        {
            node = node->next;
        }
    
        // appends the new node
        LinkedList* newNode = AllocateNode();
        newNode->data = value;
        newNode->next = 0;
        node->next = newNode;
    
        return newNode;
    }
    
  11. 메뉴 모음에서 파일>모두 저장을 차례로 선택합니다.

이제 솔루션이 완성되고 오류 없이 빌드됩니다.

참고 항목

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