C++ Core Guidelines 검사기 사용

C++ 핵심 지침은 C++ 전문가 및 디자이너가 만든 C++의 코딩에 대한 지침, 규칙 및 모범 사례의 이식 가능한 집합입니다. Visual Studio는 현재 C++용 코드 분석 도구의 일부로 이러한 규칙의 하위 집합을 지원합니다. 핵심 지침 검사ers는 기본적으로 Visual Studio 2017 및 Visual Studio 2019에 설치됩니다. Visual Studio 2015용 NuGet 패키지로 사용할 수 있습니다.

C++ 핵심 지침 프로젝트

Bjarne Stroustrup 및 기타 사용자가 만든 C++ 핵심 지침은 최신 C++를 안전하고 효과적으로 사용하기 위한 가이드입니다. 지침은 정적 형식 안전성 및 리소스 안전을 강조합니다. 언어에서 오류가 발생하기 쉬운 부분을 제거하거나 최소화하는 방법을 식별합니다. 또한 코드를 더 간단하고 안정적으로 만들고 성능을 향상하는 방법을 제안합니다. 이러한 지침은 기본 표준 C++ 재단에 의해 제공됩니다. 자세한 내용은 설명서, C++ 핵심 지침을 참조하고 GitHub의 C++ 핵심 지침 설명서 프로젝트 파일에 액세스합니다.

코드 분석에서 C++ Core Check 지침 사용

C++ Core Check 규칙의 하위 집합은 Microsoft 네이티브 권장 규칙 집합에 포함됩니다. 코드 분석을 사용할 때 기본적으로 실행되는 규칙 집합입니다.

프로젝트에서 코드 분석을 사용하도록 설정하려면

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다.

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

  3. 빌드 검사 상자에서 코드 분석 사용 상자를 선택합니다.

Property page for Code Analysis General settings.

더 많은 Core Check 규칙을 사용하도록 설정하려면 드롭다운 목록을 열고 포함할 규칙 집합을 선택합니다.

Dropdown for additional C++ Core Check rule sets.

C++ Core Check 규칙의 하위 집합은 Microsoft 네이티브 권장 규칙 집합에 포함됩니다. Microsoft 코드 분석을 사용할 때 기본적으로 실행되는 규칙 집합입니다.

프로젝트에서 코드 분석을 사용하도록 설정하려면 다음을 수행합니다.

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다.

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

  3. 빌드코드 분석 사용 및 Microsoft 코드 분석 사용 속성을 설정합니다.

지원되는 모든 C++ Core Check 규칙을 실행하도록 선택하거나 실행할 자체 하위 집합을 선택할 수도 있습니다.

더 많은 Core Check 규칙을 사용하도록 설정하려면

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다.

  2. 구성 속성>코드 분석>Microsoft 속성 페이지를 선택합니다.

  3. 활성 규칙 드롭다운 목록을 열고 여러 규칙 집합 선택을 선택합니다.

  4. 규칙 집합 추가 또는 제거 대화 상자에서 포함할 규칙 집합을 선택합니다.

예제

다음은 C++ Core Check 규칙에서 찾을 수 있는 몇 가지 문제의 예입니다.

// CoreCheckExample.cpp
// Add CppCoreCheck package and enable code analysis in build for warnings.

int main()
{
    int arr[10];           // warning C26494
    int* p = arr;          // warning C26485

    [[gsl::suppress(bounds.1)]] // This attribute suppresses Bounds rule #1
    {
        int* q = p + 1;    // warning C26481 (suppressed)
        p = q++;           // warning C26481 (suppressed)
    }

    return 0;
}

이 예제에서는 C++ Core Check 규칙에서 찾을 수 있는 몇 가지 경고를 보여 줍니다.

  • C26494는 Type.5 규칙입니다. 항상 개체를 초기화합니다.

  • C26485는 Rule Bounds.3: 배열-포인터 감쇠가 없습니다.

  • C26481은 Bounds.1 규칙입니다. 포인터 산술 연산을 사용하지 마세요. 대신 span을 사용합니다.

C++ Core Check 코드 분석 규칙 집합을 설치하고 사용하도록 설정한 다음, 이 코드를 컴파일합니다. 코드 분석은 처음 두 경고를 출력하고 세 번째 경고를 표시하지 않습니다. Visual Studio 2015의 예제 코드에서 빌드 출력은 다음과 같습니다.

1>------ Build started: Project: CoreCheckExample, Configuration: Debug Win32 ------
1>  CoreCheckExample.cpp
1>  CoreCheckExample.vcxproj -> C:\Users\username\documents\visual studio 2015\Projects\CoreCheckExample\Debug\CoreCheckExample.exe
1>  CoreCheckExample.vcxproj -> C:\Users\username\documents\visual studio 2015\Projects\CoreCheckExample\Debug\CoreCheckExample.pdb (Full PDB)
c:\users\username\documents\visual studio 2015\projects\corecheckexample\corecheckexample\corecheckexample.cpp(6): warning C26494: Variable 'arr' is uninitialized. Always initialize an object. (type.5: http://go.microsoft.com/fwlink/p/?LinkID=620421)
c:\users\username\documents\visual studio 2015\projects\corecheckexample\corecheckexample\corecheckexample.cpp(7): warning C26485: Expression 'arr': No array to pointer decay. (bounds.3: http://go.microsoft.com/fwlink/p/?LinkID=620415)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

C++ 핵심 지침은 더 안전하고 안전한 코드를 작성하는 데 도움이 됩니다. 그러나 규칙 또는 프로필을 적용해서는 안 되는 인스턴스를 찾을 수 있습니다. 코드에서 직접 표시하지 않는 것은 쉽습니다. 이 특성을 사용하여 [[gsl::suppress]] C++ Core Check가 다음 코드 블록에서 규칙 위반을 감지하고 보고하지 못하도록 할 수 있습니다. 개별 문을 표시하여 특정 규칙을 표시하지 않을 수 있습니다. 특정 규칙 번호를 포함하지 않고 작성 [[gsl::suppress(bounds)]] 하여 전체 경계 프로필을 표시하지 않을 수도 있습니다.

지원되는 규칙 집합

C++ 핵심 지침 검사에 새 규칙이 추가되면 기존 코드에 대해 생성되는 경고 수가 증가할 수 있습니다. 미리 정의된 규칙 집합을 사용하여 사용하도록 설정할 규칙 종류를 필터링할 수 있습니다. Visual Studio C++ Core Check 참조에서 대부분의 규칙에 대한 참조 문서를 찾을 수 있습니다.

15.3 이러한 규칙은 Visual Studio 2017 버전 15.3에 처음 등장했습니다.
15.5 이러한 규칙은 Visual Studio 2017 버전 15.5에 처음 등장했습니다.
15.6 이러한 규칙은 Visual Studio 2017 버전 15.6에 처음 등장했습니다.
15.7 이러한 규칙은 Visual Studio 2017 버전 15.7에 처음 등장했습니다.
16.0 이러한 규칙은 Visual Studio 2019 버전 16.0에 처음 등장했습니다.
16.3 이러한 규칙은 Visual Studio 2019 버전 16.3에 처음 등장했습니다.

경고를 하나 또는 몇 개의 그룹으로 제한하도록 선택할 수 있습니다. 네이티브 최소 및 네이티브 권장 규칙 집합에는 C++ Core Check 규칙 및 기타 PREfast 검사 포함됩니다.

사용 가능한 규칙 집합을 보려면 프로젝트 속성 대화 상자를 엽니다. 속성 페이지 대화 상자에서 구성 속성>코드 분석>일반 속성 페이지를 선택합니다. 그런 다음 규칙 집합 콤보 상자에서 드롭다운을 열어 사용 가능한 규칙 집합을 확인합니다. 규칙 집합의 사용자 지정 조합을 빌드하려면 여러 규칙 집합 선택을 선택합니다. 규칙 집합 추가 또는 제거 대화 상자에는 선택할 수 있는 규칙이 나열됩니다. Visual Studio 에서 규칙 집합을 사용하는 방법에 대한 자세한 내용은 규칙 집합을 사용하여 실행할 C++ 규칙을 지정하는 방법을 참조하세요.

사용 가능한 규칙 집합을 보려면 프로젝트 속성 대화 상자를 엽니다. 속성 페이지 대화 상자에서 구성 속성>코드 분석>Microsoft 속성 페이지를 선택합니다. 그런 다음 활성 규칙 콤보 상자에서 드롭다운을 열어 사용 가능한 규칙 집합을 확인합니다. 규칙 집합의 사용자 지정 조합을 빌드하려면 여러 규칙 집합 선택을 선택합니다. 규칙 집합 추가 또는 제거 대화 상자에는 선택할 수 있는 규칙이 나열됩니다. Visual Studio 에서 규칙 집합을 사용하는 방법에 대한 자세한 내용은 규칙 집합을 사용하여 실행할 C++ 규칙을 지정하는 방법을 참조하세요.

매크로

C++ 핵심 지침 검사기는 코드에서 경고의 전체 범주를 더 쉽게 표시하지 않도록 하는 매크로를 정의하는 헤더 파일과 함께 제공됩니다.

ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS

이러한 매크로는 규칙 집합에 해당하며 공백으로 구분된 경고 번호 목록으로 확장됩니다. 적절한 pragma 구문을 사용하여 프로젝트 또는 코드 섹션에 흥미로운 효과적인 규칙 집합을 구성할 수 있습니다. 다음 예제에서 코드 분석은 누락된 상수 한정자에 대해서만 경고합니다.

#include <CppCoreCheck\Warnings.h>
#pragma warning(disable: ALL_CPPCORECHECK_WARNINGS)
#pragma warning(default: CPPCORECHECK_CONST_WARNINGS)

특성

Microsoft C++ 컴파일러는 특성에 대한 [[gsl::suppress]] 지원이 제한되어 있습니다. 함수 내의 식 및 블록 문에 대한 경고를 표시하지 않는 데 사용할 수 있습니다.

// Suppress only warnings from the 'r.11' rule in expression.
[[gsl::suppress(r.11)]] new int;

// Suppress all warnings from the 'r' rule group (resource management) in block.
[[gsl::suppress(r)]]
{
    new int;
}

// Suppress only one specific warning number.
// For declarations, you might need to use the surrounding block.
// Macros are not expanded inside of attributes.
// Use plain numbers instead of macros from the warnings.h.
[[gsl::suppress(26400)]]
{
    int *p = new int;
}

명령줄 옵션을 사용하여 분석 표시 안 함

#pragmas 대신 파일의 속성 페이지에서 명령줄 옵션을 사용하여 프로젝트 또는 단일 파일에 대한 경고를 표시하지 않을 수 있습니다. 예를 들어 파일에 대해 경고 C26400을 사용하지 않도록 설정하려면 다음을 수행합니다.

  1. 솔루션 탐색기 파일을 마우스 오른쪽 단추클릭하고 속성을 선택합니다.

  2. 속성 페이지 대화 상자에서 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. 추가 옵션 편집 상자에서 .를 추가/wd26400합니다.

명령줄 옵션을 사용하여 파일을 지정하여 파일에 대한 모든 코드 분석을 일시적으로 사용하지 않도록 설정할 수 있습니다 /analyze-. '/analyze-'를 사용하여 '/analyze'를 재정의하는 D9025 경고가 표시되며 나중에 코드 분석을 다시 사용하도록 설정하도록 미리 알 수 있습니다.

특정 프로젝트 파일에서 C++ 핵심 지침 검사기 사용

경우에 따라 포커스가 있는 코드 분석을 수행하고 Visual Studio IDE를 계속 사용하는 것이 유용합니다. 대규모 프로젝트에 대해 다음 샘플 시나리오를 시도해 보세요. 빌드 시간을 절약하고 결과를 더 쉽게 필터링할 수 있습니다.

  1. 명령 셸에서 환경 변수를 esp.extension 설정합니다.

  2. 이 변수를 상속하려면 명령 셸에서 Visual Studio를 엽니다.

  3. 프로젝트를 로드하고 해당 속성을 엽니다.

  4. 코드 분석을 사용하도록 설정하고 적절한 규칙 집합을 선택하지만 코드 분석 확장을 사용하도록 설정하지 마세요.

  5. C++ 핵심 지침 검사기를 사용하여 분석하려는 파일로 이동하여 해당 속성을 엽니다.

  6. 구성 속성>C/C++>명령줄>추가 옵션을 선택하고 추가 /analyze:plugin EspXEngine.dll

  7. 미리 컴파일된 헤더를 사용하지 않도록 설정합니다(구성 속성>C/C++>미리 컴파일된 헤더). 확장 엔진이 미리 컴파일된 헤더(PCH)에서 내부 정보를 읽으려고 시도할 수 있기 때문에 필요합니다. PCH가 기본 프로젝트 옵션으로 컴파일된 경우 호환되지 않습니다.

  8. 프로젝트를 다시 빌드합니다. 공통 PREFast 검사 모든 파일에서 실행되어야 합니다. C++ Core Guidelines Checker는 기본적으로 사용하도록 설정되지 않으므로 C++ Core Guidelines Checker를 사용하도록 구성된 파일에서만 실행해야 합니다.

Visual Studio 외부에서 C++ 핵심 지침 검사기를 사용하는 방법

자동화된 빌드에서 C++ 핵심 지침 검사 사용할 수 있습니다.

MSBuild

네이티브 코드 분석 검사er(PREfast)는 사용자 지정 대상 파일에 의해 MSBuild 환경에 통합됩니다. 프로젝트 속성을 사용하여 사용하도록 설정하고 C++ 핵심 지침 검사기(PREfast 기반)를 추가할 수 있습니다.

  <PropertyGroup>
    <EnableCppCoreCheck>true</EnableCppCoreCheck>
    <CodeAnalysisRuleSet>CppCoreCheckRules.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>

파일을 가져오기 전에 이러한 속성을 추가해야 합니다 Microsoft.Cpp.targets . 특정 규칙 집합을 선택하거나 사용자 지정 규칙 집합을 만들 수 있습니다. 또는 다른 PREfast 검사 포함하는 기본 규칙 집합을 사용합니다.

C++ Core Checker는 지정된 파일에서만 실행할 수 있습니다. 앞에서 설명한 것과 동일한 방법을 사용하지만 MSBuild 파일을 사용합니다. 환경 변수는 다음 항목을 사용하여 설정할 수 있습니다.BuildMacro

<ItemGroup>
    <BuildMacro Include="Esp_Extensions">
      <EnvironmentVariable>true</EnvironmentVariable>
      <Value>CppCoreCheck.dll</Value>
    </BuildMacro>
</ItemGroup>

프로젝트 파일을 수정하지 않으려면 명령줄에서 속성을 전달할 수 있습니다.

msbuild /p:EnableCppCoreCheck=true /p:RunCodeAnalysis=true /p:CodeAnalysisRuleSet=CppCoreCheckRules.ruleset ...

MSBuild가 아닌 프로젝트

MSBuild를 사용하지 않는 빌드 시스템을 사용하는 경우에도 검사er를 실행할 수 있습니다. 이를 사용하려면 코드 분석 엔진 구성의 일부 내부 사항을 숙지해야 합니다. 이후 버전의 Visual Studio에서는 이러한 내부를 지원하지 않습니다.

코드 분석에는 몇 가지 환경 변수 및 컴파일러 명령줄 옵션이 필요합니다. 컴파일러의 특정 경로를 검색하고 디렉터리를 포함할 필요가 없도록 네이티브 도구 명령 프롬프트 환경을 사용하는 것이 좋습니다.

  • 환경 변수

    • set esp.extensions=cppcorecheck.dll 그러면 엔진에 C++ 핵심 지침 모듈을 로드하도록 지시합니다.
    • Visual Studio 2019에서는 환경 변수를 esp.annotationbuildlevel 설정하면 가양성으로 발생할 수 있으므로 더 이상 환경 변수를 설정하지 않는 것이 좋습니다. 예기치 않은 결과가 표시되면 사용자 환경에서 이 변수를 제거합니다.
    • set caexcludepath=%include% 표준 헤더에서 발생하는 경고를 사용하지 않도록 설정하는 것이 좋습니다. 여기에 더 많은 경로(예: 프로젝트의 공통 헤더 경로)를 추가할 수 있습니다.
  • 명령줄 옵션

    • /analyze코드 분석을 사용하도록 설정합니다(사용 및 /analyze:quiet사용 /analyze:only 고려).
    • /analyze:plugin EspXEngine.dll 이 옵션은 코드 분석 확장 엔진을 PREfast에 로드합니다. 이 엔진은 차례로 C++ 핵심 지침 검사기를 로드합니다.

지침 지원 라이브러리 사용

GSL(지침 지원 라이브러리)은 핵심 지침을 따르는 데 도움이 되도록 설계되었습니다. GSL에는 오류가 발생하기 쉬운 구문을 더 안전한 대안으로 대체할 수 있는 정의가 포함되어 있습니다. 예를 들어 매개 변수 쌍을 T*, length 형식으로 span<T> 바꿀 수 있습니다. GSL 프로젝트는 GitHub에서 https://github.com/Microsoft/GSL사용할 수 있습니다. 라이브러리는 오픈 소스이므로 원본을 보거나 메모를 작성하거나 참가할 수 있습니다. vcpkg 패키지 관리자를 사용하여 라이브러리를 로컬로 다운로드하고 설치할 수도 있습니다.

Visual Studio 2015 프로젝트에서 C++ Core Check 지침 사용

Visual Studio 2015를 사용하는 경우 C++ Core Check 코드 분석 규칙 집합은 기본적으로 설치되지 않습니다. Visual Studio 2015에서 C++ Core Check 코드 분석 도구를 사용하도록 설정하려면 다른 단계가 필요합니다. Microsoft는 NuGet 패키지를 사용하여 Visual Studio 2015 프로젝트를 지원합니다. 패키지의 이름은 Microsoft.CppCoreCheck이며 .http://www.nuget.org/packages/Microsoft.CppCoreCheck 이 패키지를 사용하려면 업데이트 1이 설치된 Visual Studio 2015 이상이 필요합니다.

또한 패키지는 다른 패키지를 종속성인 GSL(헤더 전용 지침 지원 라이브러리)으로 설치합니다. GSL은 GitHub에서 https://github.com/Microsoft/GSL사용할 수도 있습니다.

Visual Studio 2015 내에서 코드 분석 규칙이 로드되는 방식 때문에 검사 각 C++ 프로젝트에 NuGet 패키지를 설치 Microsoft.CppCoreCheck 해야 합니다.

Visual Studio 2015에서 프로젝트에 Microsoft.CppCoreCheck 패키지를 추가하려면

  1. 솔루션 탐색기 마우스 오른쪽 단추를 클릭하여 패키지를 추가할 솔루션에서 프로젝트의 상황에 맞는 메뉴를 엽니다. NuGet 패키지 관리를 선택하여 NuGet 패키지 관리자 엽니다.

  2. NuGet 패키지 관리자 창에서 Microsoft.CppCoreCheck를 검색합니다.

    Nuget Package Manager window showing the CppCoreCheck package.

  3. Microsoft.CppCoreCheck 패키지를 선택한 다음 설치 단추를 선택하여 프로젝트에 규칙을 추가합니다.

    NuGet 패키지는 프로젝트에서 코드 분석을 사용하도록 설정할 때 호출되는 MSBuild .targets 파일을 프로젝트에 추가합니다. 이 파일은 .targets Visual Studio Code 분석 도구에 C++ Core Check 규칙을 다른 확장명으로 추가합니다. 패키지가 설치되면 속성 페이지 대화 상자를 사용하여 릴리스된 규칙과 실험적 규칙을 사용하거나 사용하지 않도록 설정할 수 있습니다.

참고 항목