C++ の主要なガイドライン チェッカーを使用します。Using the C++ Core Guidelines checkers

C++ の主要なガイドラインは、ポータブル ガイドライン、ルール、および C++ の専門家とデザイナーで作成された C++ で記述に関するベスト プラクティスのセットです。The C++ Core Guidelines are a portable set of guidelines, rules, and best practices about coding in C++ created by C++ experts and designers. 現在、visual Studio は、c++ のコード分析ツールの一部としてこれらの規則のサブセットをサポートします。Visual Studio currently supports a subset of these rules as part of its code analysis tools for C++. コア ガイドライン チェッカーが Visual Studio 2017 で既定でインストールされVisual Studio 2015 用の NuGet パッケージとして入手できますです。The core guideline checkers are installed by default in Visual Studio 2017, and are available as a NuGet package for Visual Studio 2015.

プロジェクトの C++ の主要なガイドラインThe C++ Core Guidelines Project

Bjarne stroustrup 共著やその他のユーザーによって作成された、C++ コア ガイドラインは、安全で効果的に最新の C++ を使用します。Created by Bjarne Stroustrup and others, the C++ Core Guidelines are a guide to using modern C++ safely and effectively. ガイドラインは、静的な型の安全性とリソースの安全性を強調します。The Guidelines emphasize static type safety and resource safety. 削除するか、言語のエラーを起こしやすい部分を最小限に抑える方法を特定し、信頼性の高い方法でパフォーマンスとコードを簡素化する方法を提案します。They identify ways to eliminate or minimize the most error-prone parts of the language, and suggest how to make your code simpler and more performant in a reliable way. 次のガイドラインは、標準の C++ Foundation によって保持されます。These guidelines are maintained by the Standard C++ Foundation. 詳細については、ドキュメントを参照してください。 C++ コア ガイドライン、C++ の主要なガイドラインのドキュメントのプロジェクト ファイルにアクセスしGitHubです。To learn more, see the documentation, C++ Core Guidelines, and access the C++ Core Guidelines documentation project files on GitHub.

コード分析のコアを確認して C++ ガイドラインを有効にします。Enable the C++ Core Check guidelines in Code Analysis

選択して、プロジェクトでコード分析を有効にすることができます、ビルドに対するコード分析を有効にするのチェック ボックス、コード分析のセクションで、プロパティ ページのダイアログ ボックスプロジェクトです。You can enable code analysis on your project by selecting the Enable Code Analysis on Build checkbox in the Code Analysis section of the Property Pages dialog for your project.

コード分析の全般設定のプロパティ ページ

C++ コアの確認規則は、コード分析が有効になっているときに実行される既定の規則セットの拡張機能です。The C++ Core Check rules are extensions to the default rule sets that run when code analysis is enabled. C++ コア チェックの規則では、開発中であるため一部のルールが準備されて、およびいくつか、すべてのコードで使用する準備ができていない可能性がありますがわかりやすくします。Because the C++ Core Check rules are under development, some rules are well established, and some may not be ready for use on all code, but may still be informative. ルールは、次の 2 つのグループに分けられます: リリースし、実験用です。The rules are divided into two groups: released and experimental. プロジェクトのプロパティでリリースされたか、実験用の規則を実行するかどうかを選択できます。You can choose whether to run the released or experimental rules in the properties for your project.

コード分析の拡張機能設定のプロパティ ページ

有効にするにまたは C++ コアの確認規則セットを無効にする、開く、プロパティ ページプロジェクトのダイアログ。To enable or disable the C++ Core Check rule sets, open the Property Pages dialog for your project. 構成プロパティ、展開コード分析拡張です。Under Configuration Properties, expand Code Analysis, Extensions. 横にドロップダウン リストで制御を有効にする C++ Core のチェック (リリース済み) またはを有効にする C++ コアを確認 (します試験段階) を選択はいまたはいいえです。In the dropdown control next to Enable C++ Core Check (Released) or Enable C++ Core Check (Experimental), choose Yes or No. 選択OKまたは適用して変更を保存します。Choose OK or Apply to save your changes.

使用例Examples

C++ コア チェックの規則を検索する問題のいくつかの例を次に示します。Here's an example of some of the issues that the C++ Core Check rules can find:

// 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++ コア チェックの規則を検索する警告のいくつかを示します。This example demonstrates a few of the warnings that the C++ Core Check rules can find:

  • C26494 はルール Type.5: 常にオブジェクトを初期化します。C26494 is rule Type.5: Always initialize an object.

  • C26485 はルール Bounds.3: 配列とポインター減衰しません。C26485 is rule Bounds.3: No array-to-pointer decay.

  • C26481 はルール Bounds.1: ポインター演算を使用しません。C26481 is rule Bounds.1: Don't use pointer arithmetic. 代わりに、span を使用してください。Use span instead.

    コード分析のコアを確認して C++ ruleset はインストールされている、このコードをコンパイルすると、最初の 2 つの警告は、出力が、3 番目の抑制を有効になっている場合。If the C++ Core Check code analysis rulesets are installed and enabled when you compile this code, the first two warnings are output, but the third is suppressed. コード例のビルド出力を次に示します。Here's the build output from the example code:

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++ の主要なガイドラインより、安全なコードを作成するのに役立つは。The C++ Core Guidelines are there to help you write better and safer code. ただし場合は、ルール、またはプロファイルを適用しないようにするインスタンスがある場合は、簡単に、コード内で直接抑制です。However, if you have an instance where a rule or a profile shouldn't be applied, it's easy to suppress it directly in the code. 使用することができます、gsl::suppressを検出して、次のコード ブロック内の規則の違反をレポートから C++ Core のチェックを保持する属性。You can use the gsl::suppress attribute to keep C++ Core Check from detecting and reporting any violation of a rule in the following code block. 特定のルールを抑制する個々 のステートメントをマークすることができます。You can mark individual statements to suppress specific rules. 記述して、境界プロファイル全体を抑制することができますも[[gsl::suppress(bounds)]]特定のルールの数を含めずにします。You can even suppress the entire bounds profile by writing [[gsl::suppress(bounds)]] without including a specific rule number.

規則セットのサポートSupported rule sets

C++ コア ガイドライン チェックには、新しい規則が追加されるの既存のコードを生成する警告の数を増やすことがあります。As new rules are added to the C++ Core Guidelines Checker, the number of warnings that are produced for pre-existing code may increase. 有効にするためのルールの種類をフィルター処理、定義済みの規則セットを使用できます。You can use predefined rule sets to filter which kinds of rules to enable. ほとんどのルールのリファレンス トピックでは、下にあるVisual Studio C コア チェック リファレンスです。Reference topics for most rules are under Visual Studio C++ Core Check Reference.

Visual Studio 2017 15.3 のバージョンの時点でサポートされている規則セットは次のとおりがあります。As of Visual Studio 2017 version 15.3, the supported rule sets are:

1 つまたはいくつかのグループの警告を制限することができます。You can choose to limit warnings to just one or a few of the groups. ネイティブ最小ネイティブ推奨ルール セットには、他の PREfast チェックだけでなく C++ コア チェック ルールが含まれます。The Native Minimum and Native Recommended rule sets include C++ Core Check rules in addition to other PREfast checks. 確認には、使用可能なルール セット、プロジェクトのプロパティ ダイアログを開き、次のように選択しますコード Analysis\General、にあるボックスを開き、規則セットコンボ ボックス、および選択複数の規則セットの選択To see the available rule sets, open the Project Properties dialog, select Code Analysis\General, open the dropdown in the Rule Sets combo-box, and pick Choose multiple rule sets. 詳細については、Visual Studio でのルール セットを使用して、次を参照してください。ルール セットのコード分析規則のグループを使用してです。For more information about using Rule Sets in Visual Studio, see Using Rule Sets to Group Code Analysis Rules.

[マクロ]Macros

C++ の主要なガイドライン チェックをコードで警告のカテゴリ全体を抑制するより簡単にするマクロを定義するヘッダー ファイルが付属します。The C++ Core Guidelines Checker comes with a header file, which defines macros that make it easier to suppress entire categories of warnings in code:

ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS

これらのマクロは、規則セットに対応し、警告番号のスペースで区切られた一覧に展開します。These macros correspond to the rule sets and expand into a space-separated list of warning numbers. 適切なプラグマ コンストラクトを使用すると、プロジェクトの興味深いは、有効な一連の規則またはコードのセクションを構成できます。By using the appropriate pragma constructs, you can configure the effective set of rules that is interesting for a project or a section of code. 次の例では、コード分析に関する注意事項についてのみ定数修飾子がありません。In the following example, code analysis warns only about missing constant modifiers:

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

属性Attributes

Microsoft Visual C コンパイラでは、属性を抑制する、GSL の制限付きサポートがします。The Microsoft Visual C++ compiler has a limited support for the GSL suppress attribute. 式および関数の内部でのブロックのステートメントで警告を抑制するために使用されます。It can be used to suppress warnings on expression and block statements inside of a function.

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

// Supress 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 may 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;
}

コマンド ライン オプションを使用して分析を抑制します。Suppressing analysis by using command-line options

#Pragmas、代わりに、プロジェクトまたはファイルを 1 つの警告を抑制する、ファイルのプロパティ ページでコマンド ライン オプションを使用できます。Instead of #pragmas, you can use command-line options in the file's property page to suppress warnings for a project or a single file. たとえば、警告を無効にするため、ファイルの 26400。For example, to disable the warning 26400 for a file:

1) ファイルを右クリックしてソリューション エクスプ ローラーRight-click the file in Solution Explorer

2) 選択プロパティ |C または C++ |コマンドラインChoose Properties|C/C++|Command Line

3) 追加オプションウィンドウで、追加/wd26400です。In the Additional Options window, add /wd26400.

指定して、ファイルのすべてのコード分析を一時的に無効にするコマンド ライン オプションを使用することができます/analyze-です。You can use the command-line option to temporarily disable all code analysis for a file by specifying /analyze-. これにより、警告が生成されます。 D9025 をオーバーライドする '/analyze' と '/analyze -'、をが後でコード分析を再び有効にすることを知らせます。This produces warning D9025 overriding '/analyze' with '/analyze-', which reminds you to re-enable code analysis later.

特定のプロジェクト ファイルでは、C++ コア ガイドライン チェックを有効にします。Enabling the C++ Core Guidelines Checker on specific project files

Do 重点を置いてコードの分析やまだ Visual Studio IDE を使用する役に立つ場合があります。Sometimes it may be useful to do focused code analysis and still use the Visual Studio IDE. ビルド時間を節約し、結果をフィルター処理を容易にできるように、大規模なプロジェクトの次のサンプル シナリオを使用できます。The following sample scenario can be used for large projects to save build time and to make it easier to filter results:

  1. コマンド シェルで次のように設定します。、esp.extensionesp.annotationbuildlevel環境変数。In the command shell set the esp.extension and esp.annotationbuildlevel environment variables.
  2. これらの変数を継承するには、コマンド シェルから Visual Studio を起動します。To inherit these variables, start Visual Studio from the command shell.
  3. プロジェクトを読み込むし、そのプロパティを開きます。Load your project and open its properties.
  4. コード分析を有効にする、適切なルール セットの選択がコード分析の拡張機能を有効にしません。Enable code analysis, pick the appropriate rule sets, but do not enable code analysis extensions.
  5. C++ の主要なガイドライン チェッカーで分析し、そのプロパティを開くファイルに移動します。Go to the file you want to analyze with the C++ Core Guidelines Checker and open its properties.
  6. 選択C/c++ \Command 行オプションし、追加 /analyze:plugin EspXEngine.dllChoose C/C++\Command Line Options and add /analyze:plugin EspXEngine.dll
  7. プリコンパイル済みヘッダーの使用を無効にする (C/c++ \Precompiled ヘッダー)。Disable the use of precompiled header (C/C++\Precompiled Headers). これは、拡張機能エンジンは、プリコンパイル済みヘッダー (PCH); からその内部情報の読み取りを試行可能性があります。PCH は、既定のプロジェクトのオプションでコンパイルされた場合、に互換性がないです。This is necessary because the extensions engine may attempt to read its internal information from the precompiled header (PCH); if the PCH compiled with default project options, it will not be compatible.
  8. プロジェクトをリビルドします。Rebuild the project. 一般的な PREFast チェックは、すべてのファイルに対して実行する必要があります。The common PREFast checks should run on all files. C++ の主要なガイドライン チェッカーが既定で有効でないために必要があります、これを使用するように構成ファイルでのみ実行します。Because the C++ Core Guidelines Checker is not enabled by default, it should only run on the file that is configured to use it.

Visual Studio の外部では、C++ コア ガイドライン チェッカーの使用方法How to use the C++ Core Guidelines Checker outside of Visual Studio

自動ビルドで、C++ の主要なガイドラインのチェックを行うこともできます。You can use the C++ Core Guidelines checks in automated builds.

MSBuildMSBuild

ネイティブ コード分析チェッカー (PREfast) は、カスタム ターゲット ファイルでの MSBuild 環境に統合されます。The Native Code Analysis checker (PREfast) is integrated into MSBuild environment by custom targets files. プロジェクトのプロパティを使用して、有効にし、(PREfast に基づきます) を C++ コア ガイドライン チェックを追加することができます。You can use project properties to enable it, and add the C++ Core Guidelines Checker (which is based on PREfast):

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

Microsoft.Cpp.targets ファイルをインポートする前にこれらのプロパティを追加することを確認してください。Make sure you add these properties before the import of the Microsoft.Cpp.targets file. 特定のルール セットを選択またはカスタム規則セットを作成したりその他の PREfast チェックを含む既定の規則セットを使用できます。You can pick specific rule sets or create a custom rule set or use the default rule set that includes other PREfast checks.

同じアプローチを使用して、指定したファイルでのみ C++ コア チェッカーを実行することができます前に説明した、ただし、MSBuild ファイルを使用します。You can run the C++ Core Checker only on specified files by using the same approach as described earlier, but using MSBuild files. 使用して、環境変数を設定することができます、BuildMacro項目。The environment variables can be set by using the BuildMacro item:

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

プロジェクト ファイルを変更しない場合は、コマンドラインでプロパティを渡すことができます。If you don’t want to modify the project file, you can pass properties on the command line:

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

非 MSBuild プロジェクトNon-MSBuild projects

MSBuild に依存しないビルド システムを使用する場合、チェックを実行することもできますが、コード分析エンジンの構成の一部の内部構造について理解する必要があります。If you use a build system that doesn’t rely on MSBuild you can still run the checker, but you need to get familiar with some internals of the Code Analysis engine configuration. これらの内部構造は、今後サポートされる保証はありません。These internals are not guaranteed to be supported in the future.

いくつかの環境変数を設定して、コンパイラの適切なコマンド ライン オプションを使用する必要があります。You have to set a few environment variables and use proper command-line options for the compiler. コンパイラの特定のパスを検索、ディレクトリなどを含める必要があるないように、「Native Tools コマンド プロンプト」環境下で動作することをお勧めします。It is better to work under the "Native Tools Command Prompt" environment so that you don’t have to search for specific paths for the compiler, include directories, etc.

  1. 環境変数Environment variables
    • set esp.extensions=cppcorecheck.dll これは、主要なガイドラインを C++ モジュールを読み込むエンジンを指示します。set esp.extensions=cppcorecheck.dll This tells the engine to load the C++ Core Guidelines module.
    • set esp.annotationbuildlevel=ignore これには、SAL 注釈を処理するロジックが無効にします。set esp.annotationbuildlevel=ignore This disables the logic that processes SAL annotations. 注釈は、C++ コア ガイドライン チェックで、コード分析に影響しない。 ただし、処理時間 (場合によって長時間)。Annotations don’t affect code analysis in the C++ Core Guidelines Checker, yet their processing takes time (sometimes a long time). この設定は、省略可能だが強くお勧めします。This setting is optional, but highly recommended.
    • set caexcludepath=%include% 標準ヘッダーで起動される警告を無効にすることを強くお勧めします。set caexcludepath=%include% We highly recommend that you disable warnings which fire on standard headers. たとえば、プロジェクトの一般的なヘッダーへのパス、ここでは、複数のパスを追加できます。You can add more paths here, for example the path to the common headers in your project.
  2. コマンド ライン オプションCommand line options
    • /analyze コード分析を有効 (も使用を検討して/analyze: のみと/analyze: quiet)。/analyze Enables code analysis (consider also using /analyze:only and /analyze:quiet).
    • /analyze:plugin EspXEngine.dll このオプションでは、コード分析の拡張機能エンジンを PREfast に読み込みます。/analyze:plugin EspXEngine.dll This option loads the Code Analysis Extensions engine into the PREfast. このエンジンは、さらに、C++ の主要なガイドライン チェッカーを読み込みます。This engine, in turn, loads the C++ Core Guidelines Checker.

ガイドライン サポート ライブラリを使用します。Use the Guideline Support Library

ガイドライン サポート ライブラリは、主要なガイドラインに従う役立つ設計されています。The Guideline Support Library is designed to help you follow the Core Guidelines. GSL には、安全な代替関数とエラーが発生しやすい構成要素を交換するのに便利な定義が含まれます。The GSL includes definitions that let you replace error-prone constructs with safer alternatives. たとえば、置き換えることができます、T*, lengthでパラメーターのペア、span<T>型です。For example, you can replace a T*, length pair of parameters with the span<T> type. GSL については、「 http://www.nuget.org/packages/Microsoft.Gslです。The GSL is available at http://www.nuget.org/packages/Microsoft.Gsl. ライブラリは、ソースの表示、コメントの作成、または投稿ためにのオープン ソース、です。The library is open-source, so you can view the sources, make comments, or contribute. プロジェクトが存在する https://github.com/Microsoft/GSLです。The project can be found at https://github.com/Microsoft/GSL.

Visual Studio 2015 のプロジェクトで C++ コア チェックのガイドラインを使用します。Use the C++ Core Check guidelines in Visual Studio 2015 projects

Visual Studio 2015 を使用する場合、C++ コア確認コード分析規則セットは既定ではインストールされていません。If you use Visual Studio 2015, the C++ Core Check code analysis rule sets are not installed by default. Visual Studio 2015 でのコアを確認して C++ コード分析ツールを有効にする前に、は、追加の手順を実行する必要があります。You must perform some additional steps before you can enable the C++ Core Check code analysis tools in Visual Studio 2015. Microsoft では、Nuget パッケージを使用して、Visual Studio 2015 のプロジェクトのサポートを提供します。Microsoft provides support for Visual Studio 2015 projects by using a Nuget package. パッケージが Microsoft.CppCoreCheck をという名前でありで利用可能な http://www.nuget.org/packages/Microsoft.CppCoreCheckです。The package is named Microsoft.CppCoreCheck, and it is available at http://www.nuget.org/packages/Microsoft.CppCoreCheck. このパッケージは、少なくとも Visual Studio 2015 Update 1 と共にインストールされているがある必要があります。This package requires you have at least Visual Studio 2015 with Update 1 installed.

パッケージには、依存関係が、ヘッダーのみガイドライン サポート ライブラリ (GSL) として別のパッケージもインストールされます。The package also installs another package as a dependency, a header-only Guideline Support Library (GSL). Github で利用可能な GSL も https://github.com/Microsoft/GSLです。The GSL is also available on GitHub at https://github.com/Microsoft/GSL.

コード分析ルールが読み込まれるため、Visual Studio 2015 内でチェックする C++ プロジェクトごとに Microsoft.CppCoreCheck NuGet パッケージをインストールする必要があります。Because of the way the code analysis rules are loaded, you must install the Microsoft.CppCoreCheck NuGet package into each C++ project that you want to check within Visual Studio 2015.

Visual Studio 2015 でプロジェクトに Microsoft.CppCoreCheck パッケージを追加するにはTo add the Microsoft.CppCoreCheck package to your project in Visual Studio 2015

  1. ソリューション エクスプ ローラー、右クリックして、パッケージを追加するソリューションで、プロジェクトのショートカット メニューを表示します。In Solution Explorer, right-click to open the context menu of your Project in the Solution that you want to add the package to. 選択NuGet パッケージの管理を開くには、 NuGet Package Managerです。Choose Manage NuGet Packages to open the NuGet Package Manager.

  2. NuGet Package Managerウィンドウで、Microsoft.CppCoreCheck を検索します。In the NuGet Package Manager window, search for Microsoft.CppCoreCheck.

    Nuget パッケージ マネージャー ウィンドウでは、CppCoreCheck パッケージを示しています。

  3. Microsoft.CppCoreCheck パッケージを選択し、、インストールをプロジェクトにルールを追加するボタンをクリックします。Select the Microsoft.CppCoreCheck package and then choose the Install button to add the rules to your project.

    NuGet パッケージを追加、追加の MSBuild .targetsファイルをプロジェクトでコード分析を有効にしたときに呼び出されるプロジェクト。The NuGet package adds an additional MSBuild .targets file to your project that is invoked when you enable code analysis on your project. これは、 .targetsファイル拡張機能の追加として、Visual Studio コード分析ツールに C++ コア チェックの規則を追加します。This .targets file adds the C++ Core Check rules as an additional extension to the Visual Studio code analysis tool. パッケージがインストールされている場合は、有効にするにまたは解放され、実験用のルールを無効にするプロパティ ページ ダイアログを使用できます。When the package is installed, you can use the Property Pages dialog to enable or disable the released and experimental rules.

関連項目See Also

Visual Studio の C++ コア チェック参照です。Visual Studio C++ Core Check Reference.