Použití kontrolních mechanismů C++ Core Guidelines

C++ Core Guidelines je přenosná sada pokynů, pravidel a osvědčených postupů pro kódování v jazyce C++ vytvořených odborníky a návrháři jazyka C++. Visual Studio v současné době podporuje podmnožinu těchto pravidel jako součást nástrojů pro analýzu kódu pro C++. Základní nástroje pro kontrolu obecných zásad se ve výchozím nastavení instalují v sadě Visual Studio 2017 a Visual Studio 2019. Jsou k dispozici jako balíček NuGet pro Visual Studio 2015.

Projekt C++ Core Guidelines

Vytvořili jsme Bjarne Stroustrup a další, pokyny pro C++ Core Guidelines jsou vodítkem k bezpečnému a efektivnímu používání moderního jazyka C++. Pokyny zvýrazňují bezpečnost statického typu a bezpečnost prostředků. Identifikují způsoby, jak eliminovat nebo minimalizovat nejvíce náchylné k chybám částí jazyka. Také navrhují, jak zjednodušit, spolehlivější a výkon vašeho kódu. Tyto pokyny spravuje standard C++ Foundation. Další informace najdete v dokumentaci, pokynech pro C++ Core Guidelines a přístup k souborům projektu dokumentace C++ Core Guidelines na GitHubu.

Povolení pokynů pro kontrolu jádra C++ v analýze kódu

Podmnožina pravidel kontroly jádra C++ je součástí sady pravidel Microsoft Native Recommended. Je to sada pravidel, která se spouští ve výchozím nastavení, když je povolená analýza kódu.

Povolení analýzy kódu v projektu

  1. Otevřete dialogové okno Stránky vlastností projektu.

  2. Vyberte stránku vlastností analýzy kódu konfigurace>.

  3. Zaškrtněte políčko Povolit analýzu kódu při sestavení.

Property page for Code Analysis General settings.

Pokud chcete povolit další pravidla základní kontroly, otevřete rozevírací seznam a zvolte, které sady pravidel chcete zahrnout:

Dropdown for additional C++ Core Check rule sets.

Podmnožina pravidel kontroly jádra C++ je součástí sady pravidel Microsoft Native Recommended. Je to sada pravidel, která se spouští ve výchozím nastavení, když je povolená analýza kódu Microsoftu.

Povolení analýzy kódu v projektu:

  1. Otevřete dialogové okno Stránky vlastností projektu.

  2. Vyberte stránku vlastností analýzy kódu konfigurace>.

  3. Nastavte možnost Povolit analýzu kódu při sestavení a povolte vlastnosti analýzy kódu společnosti Microsoft.

Můžete také zvolit spuštění všech podporovaných pravidel kontroly jádra C++ nebo můžete vybrat vlastní podmnožinu, kterou chcete spustit:

Povolení dalších pravidel základní kontroly

  1. Otevřete dialogové okno Stránky vlastností projektu.

  2. Vyberte stránku vlastností Analýzy kódu konfigurace>microsoftu.>

  3. Otevřete rozevírací seznam Aktivní pravidla a vyberte Vybrat více sad pravidel.

  4. V dialogovém okně Přidat nebo odebrat sady pravidel zvolte, které sady pravidel chcete zahrnout.

Příklady

Tady je příklad některých problémů, které můžou najít pravidla kontroly jádra C++:

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

Tento příklad ukazuje několik upozornění, která můžou najít pravidla kontroly jádra C++:

  • C26494 je rule Type.5: Vždy inicializovat objekt.

  • C26485 je pravidlo Bounds.3: Bez rozpadu pole na ukazatel.

  • C26481 je pravidlo Bounds.1: Nepoužívejte aritmetické aritmetické ukazatele. Místo toho použijte span.

Nainstalujte a povolte sady pravidel analýzy kódu C++ Core a pak tento kód zkompilujte. Analýza kódu vypíše první dvě upozornění a potlačí třetí. Tady je výstup sestavení z ukázkového kódu v sadě 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 ==========

K dispozici jsou pokyny pro C++ Core Guidelines, které vám pomůžou psát lepší a bezpečnější kód. Můžete ale najít instanci, ve které by se nemělo použít pravidlo nebo profil. Je snadné ho potlačit přímo v kódu. Atribut můžete použít [[gsl::suppress]] k tomu, aby nástroj C++ Core Check detekoval a hlásil jakékoli porušení pravidla v následujícím bloku kódu. Můžete označit jednotlivé příkazy, které potlačí konkrétní pravidla. Celý profil hranic můžete dokonce potlačit zápisem [[gsl::suppress(bounds)]] bez zahrnutí konkrétního čísla pravidla.

Podporované sady pravidel

Při přidání nových pravidel do nástroje C++ Core Guidelines Checker se může zvýšit počet upozornění generovaných pro již existující kód. Pomocí předdefinovaných sad pravidel můžete filtrovat, které typy pravidel se mají povolit. Referenční články pro většinu pravidel najdete v sadě Visual Studio C++ Core Check Reference.

15.3 Tato pravidla se poprvé objevila v sadě Visual Studio 2017 verze 15.3
15.5 Tato pravidla se poprvé objevila v sadě Visual Studio 2017 verze 15.5
15.6 Tato pravidla se poprvé objevila v sadě Visual Studio 2017 verze 15.6
15.7 Tato pravidla se poprvé objevila v sadě Visual Studio 2017 verze 15.7
16.0 Tato pravidla se poprvé objevila v sadě Visual Studio 2019 verze 16.0
16.3 Tato pravidla se poprvé objevila v sadě Visual Studio 2019 verze 16.3

Můžete se rozhodnout omezit upozornění jenom na jednu nebo několik skupin. Nativní minimální a nativní doporučené sady pravidel zahrnují pravidla kontroly C++ Core a další kontroly PREfast.

Pokud chcete zobrazit dostupné sady pravidel, otevřete dialogové okno Vlastnosti projektu. V dialogovém okně Stránky vlastností vyberte >stránku vlastností vlastnosti Obecné analýzy kódu konfigurace.> Potom otevřete rozevírací seznam v poli se seznamem Sady pravidel a zobrazte dostupné sady pravidel. Pokud chcete vytvořit vlastní kombinaci sad pravidel, vyberte Vybrat více sad pravidel. Dialogové okno Přidat nebo odebrat sady pravidel obsahuje seznam pravidel, ze které si můžete vybrat. Další informace o používání sad pravidel v sadě Visual Studio naleznete v tématu Použití sad pravidel k určení pravidel jazyka C++, která se mají spustit.

Pokud chcete zobrazit dostupné sady pravidel, otevřete dialogové okno Vlastnosti projektu. V dialogovém okně Stránky vlastností vyberte stránku vlastností Microsoftu pro analýzu> vlastností vlastností konfigurace.> Potom otevřete rozevírací seznam v poli se seznamem Aktivní pravidla a zobrazte dostupné sady pravidel. Pokud chcete vytvořit vlastní kombinaci sad pravidel, vyberte Vybrat více sad pravidel. Dialogové okno Přidat nebo odebrat sady pravidel obsahuje seznam pravidel, ze které si můžete vybrat. Další informace o používání sad pravidel v sadě Visual Studio naleznete v tématu Použití sad pravidel k určení pravidel jazyka C++, která se mají spustit.

Makra

Nástroj C++ Core Guidelines Checker obsahuje soubor hlaviček, který definuje makra, která usnadňují potlačení celých kategorií upozornění v kódu:

ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS

Tato makra odpovídají sadám pravidel a rozšiřují seznam čísel upozornění oddělených mezerami. Pomocí vhodných konstruktorů pragma můžete nakonfigurovat efektivní sadu pravidel, která jsou zajímavá pro projekt nebo oddíl kódu. V následujícím příkladu analýza kódu varuje pouze o chybějících modifikátorech konstant:

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

Atributy

Kompilátor Jazyka Microsoft C++ má pro atribut omezenou podporu [[gsl::suppress]] . Dá se použít k potlačení upozornění na výraz a příkazy bloku uvnitř funkcí.

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

Potlačení analýzy pomocí možností příkazového řádku

Místo #pragmas můžete pomocí možností příkazového řádku na stránce vlastností souboru potlačit upozornění pro projekt nebo jeden soubor. Pokud chcete například zakázat upozornění C26400 pro soubor:

  1. Klikněte pravým tlačítkem myši na soubor v Průzkumník řešení a zvolte Vlastnosti.

  2. V dialogovém okně Stránky vlastností vyberte stránku vlastností>vlastnosti C/C++>Příkazového řádku konfigurace.

  3. Do textového pole Další možnosti přidejte /wd26400.

Pomocí možnosti příkazového řádku můžete dočasně zakázat všechny analýzy kódu pro soubor zadáním /analyze-. Zobrazí se upozornění D9025 přepisující /analyze pomocí /analyze-, které vám připomene, že budete později znovu povolit analýzu kódu.

Povolení nástroje C++ Core Guidelines Checker pro konkrétní soubory projektu

Někdy je užitečné provádět zaměřenou analýzu kódu a stále používat integrované vývojové prostředí sady Visual Studio. Vyzkoušejte následující ukázkový scénář pro velké projekty. Může ušetřit čas sestavení a usnadnit filtrování výsledků:

  1. V příkazovém prostředí nastavte proměnnou esp.extension prostředí.

  2. Pokud chcete tuto proměnnou dědit, otevřete visual Studio z příkazového prostředí.

  3. Načtěte projekt a otevřete jeho vlastnosti.

  4. Povolte analýzu kódu, vyberte odpovídající sady pravidel, ale nepovolujte rozšíření analýzy kódu.

  5. Přejděte k souboru, který chcete analyzovat pomocí nástroje C++ Core Guidelines Checker, a otevřete jeho vlastnosti.

  6. Zvolte Vlastnosti>konfigurace C/C++>Další možnosti příkazového řádku>a přidejte/analyze:plugin EspXEngine.dll

  7. Zakažte použití předkompilované hlavičky (Vlastnosti>konfigurace C/C++>Předkompilované hlavičky). Je nutné, protože modul rozšíření se může pokusit přečíst své interní informace z předkompilované hlavičky (PCH). Pokud byl PCH zkompilován s výchozími možnostmi projektu, nebude kompatibilní.

  8. Znovu sestavte projekt. Běžné kontroly PREFast by se měly spouštět na všech souborech. Vzhledem k tomu, že nástroj C++ Core Guidelines Checker není ve výchozím nastavení povolený, měl by běžet jenom na souboru, který je nakonfigurovaný tak, aby ho používal.

Jak používat nástroj C++ Core Guidelines Checker mimo Visual Studio

Kontroly C++ Core Guidelines můžete použít v automatizovaných buildech.

MSBuild

Kontrola nativní analýzy kódu (PREfast) je integrovaná do prostředí MSBuild vlastními cílovými soubory. Vlastnosti projektu můžete použít k jeho povolení a přidat nástroj C++ Core Guidelines Checker (který je založený na prEfast):

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

Před importem Microsoft.Cpp.targets souboru nezapomeňte tyto vlastnosti přidat. Můžete vybrat konkrétní sady pravidel nebo vytvořit vlastní sadu pravidel. Nebo použijte výchozí sadu pravidel, která obsahuje další kontroly PREfast.

Nástroj C++ Core Checker můžete spustit pouze u zadaných souborů. Použijte stejný přístup, jak je popsáno výše, ale použijte soubory MSBuild. Proměnné prostředí lze nastavit pomocí BuildMacro položky:

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

Pokud nechcete upravovat soubor projektu, můžete předat vlastnosti na příkazovém řádku:

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

Projekty jiné než MSBuild

Pokud používáte systém sestavení, který nespoléhá na NÁSTROJ MSBuild, můžete kontrolu spustit. Abyste ho mohli použít, musíte se seznámit s některými interními informacemi o konfiguraci modulu analýzy kódu. Vbudoucíchch

Analýza kódu vyžaduje několik proměnných prostředí a možností příkazového řádku kompilátoru. Doporučujeme použít prostředí příkazového řádku nativních nástrojů, abyste nemuseli hledat konkrétní cesty pro kompilátor, zahrnout adresáře atd.

  • Proměnné prostředí

    • set esp.extensions=cppcorecheck.dll To modulu říká, aby načetl modul C++ Core Guidelines.
    • Vzhledem k tomu, že Visual Studio 2019 už nedoporučujeme nastavit esp.annotationbuildlevel proměnnou prostředí, protože jeho nastavení může vést k falešně pozitivním výsledkům. Pokud se zobrazí neočekávané výsledky, odeberte tuto proměnnou z vašeho prostředí.
    • set caexcludepath=%include% Důrazně doporučujeme zakázat upozornění, která se aktivují na standardních hlavičkách. Tady můžete přidat další cesty, například cestu k běžným záhlavím v projektu.
  • Možnosti příkazového řádku

    • /analyze Umožňuje analýzu kódu (zvažte také použití /analyze:only a /analyze:quiet).
    • /analyze:plugin EspXEngine.dll Tato možnost načte modul Rozšíření analýzy kódu do prEfast. Tento modul zase načte nástroj C++ Core Guidelines Checker.

Použití knihovny podpory pokynů

Knihovna GSL (Guidelines Support Library) je navržená tak, aby vám pomohla postupovat podle základních pokynů. GSL obsahuje definice, které umožňují nahradit konstruktory náchylné k chybám bezpečnějšími alternativami. Můžete například nahradit T*, length dvojici parametrů typem span<T> . Projekt GSL je k dispozici na GitHubu na adrese https://github.com/Microsoft/GSL. Knihovna je opensourcová, takže můžete zobrazit zdroje, vytvářet komentáře nebo přispívat. Ke stažení a místní instalaci knihovny můžete použít také správce balíčků vcpkg .

Použití pokynů pro kontrolu jádra C++ v projektech sady Visual Studio 2015

Pokud používáte Visual Studio 2015, sady pravidel analýzy kódu C++ Core Check nejsou ve výchozím nastavení nainstalované. Před povolením nástrojů pro analýzu kódu C++ Core Check v sadě Visual Studio 2015 jsou potřeba další kroky. Microsoft poskytuje podporu pro projekty sady Visual Studio 2015 pomocí balíčku NuGet. Balíček má název Microsoft.CppCoreCheck a je k dispozici na adrese http://www.nuget.org/packages/Microsoft.CppCoreCheck. Tento balíček vyžaduje, abyste měli nainstalovanou alespoň sadu Visual Studio 2015 s nainstalovanou aktualizací Update 1.

Balíček také nainstaluje další balíček jako závislost, knihovnu GSL (Header-only Guideline Support Library). GSL je také k dispozici na GitHubu na adrese https://github.com/Microsoft/GSL.

Vzhledem ke způsobu načítání pravidel analýzy kódu v sadě Visual Studio 2015 musíte balíček NuGet nainstalovat Microsoft.CppCoreCheck do každého projektu C++, který chcete zkontrolovat.

Přidání balíčku Microsoft.CppCoreCheck do projektu v sadě Visual Studio 2015

  1. V Průzkumník řešení kliknutím pravým tlačítkem otevřete místní nabídku projektu v řešení, do kterého chcete balíček přidat. Zvolte Spravovat balíčky NuGet a otevřete Správce balíčků NuGet.

  2. V okně Správce balíčků NuGet vyhledejte Microsoft.CppCoreCheck.

    Nuget Package Manager window showing the CppCoreCheck package.

  3. Vyberte balíček Microsoft.CppCoreCheck a pak zvolte tlačítko Instalovat a přidejte do projektu pravidla.

    Balíček NuGet přidá do projektu soubor MSBuild .targets , který se vyvolá při povolení analýzy kódu v projektu. Soubor .targets přidá pravidla kontroly jádra C++ jako další rozšíření do analytického nástroje editoru Visual Studio Code. Po instalaci balíčku můžete pomocí dialogového okna Stránky vlastností povolit nebo zakázat vydaná a experimentální pravidla.

Viz také