Megosztás a következőn keresztül:


A C++ alapvető irányelvek ellenőrzőinek használata

A C++ alapvető irányelvei a C++ szakértői és tervezői által létrehozott, a C++-ban történő kódolással kapcsolatos útmutatók, szabályok és ajánlott eljárások hordozható készletei. A Visual Studio jelenleg a Microsoft C++ kódelemzési eszközeinek részeként támogatja a szabályok egy részét. Az alapvető útmutató-ellenőrzők alapértelmezés szerint telepítve vannak a Visual Studio 2017-ben és a Visual Studio 2019-ben. NuGet-csomagként érhetők el a Visual Studio 2015-höz.

A C++ alapvető irányelvek projektje

A Bjarne Stroustrup és mások által létrehozott C++ alapvető irányelvek útmutatók a modern C++ biztonságos és hatékony használatához. Az irányelvek a statikus típus biztonságát és az erőforrás-biztonságot hangsúlyozzák. Azonosítják a nyelv leghivatosabb részeinek kiküszöbölésére vagy minimalizálására szolgáló módszereket. Azt is javasolják, hogyan teheti egyszerűbbé, megbízhatóbbá és jobb teljesítménnyel a kódot. Ezeket az irányelveket a Standard C++ Alapítvány tartja fenn. További információkért tekintse meg a dokumentációt, a C++ alapvető irányelveket, és férjen hozzá a C++ Core Guidelines dokumentációs projektfájljaihoz a GitHubon.

A C++ core ellenőrzési irányelveinek engedélyezése a Kódelemzésben

A C++ core check szabályok egy részhalmaza szerepel a Microsoft natív ajánlott szabálykészletében. A kódelemzés engedélyezésekor alapértelmezés szerint ez a szabálykészlet fut.

Kódelemzés engedélyezése a projekten

  1. Nyissa meg a projekt Tulajdonságlapok párbeszédpanelét.

  2. Válassza a Configuration Properties>Code Analysis tulajdonságlapját.

  3. Jelölje be a Kódelemzés engedélyezése buildeléskor jelölőnégyzetet.

A Kódelemzés általános beállításainak tulajdonságlapja.

További alapvető ellenőrzési szabályok engedélyezéséhez nyissa meg a legördülő listát, és válassza ki a felvenni kívánt szabálykészleteket:

További C++ alapvető ellenőrzési szabálykészletek legördülő listája.

A C++ core check szabályok egy részhalmaza szerepel a Microsoft natív ajánlott szabálykészletében. Ez az a szabálykészlet, amely alapértelmezés szerint akkor fut, ha engedélyezve van a Microsoft-kódelemzés.

Kódelemzés engedélyezése a projekten

  1. Nyissa meg a projekt Tulajdonságlapok párbeszédpanelét.

  2. Válassza a Configuration Properties>Code Analysis tulajdonságlapját.

  3. Állítsa be az Engedélyezze a kódelemzést a build során és a Microsoft kódelemzés engedélyezése tulajdonságokat.

Azt is választhatja, hogy az összes támogatott C++ alapvető ellenőrzési szabályt futtatja, vagy kiválaszthatja a saját alkészletét a futtatáshoz:

További alapvető ellenőrzési szabályok engedélyezése

  1. Nyissa meg a projekt Tulajdonságlapok párbeszédpanelét.

  2. Válassza a Configuration Properties>Code Analysis>Microsoft tulajdonságlapját.

  3. Nyissa meg az Aktív szabályok legördülő listát, és válassza a Több szabálykészlet kiválasztása lehetőséget.

  4. A Szabálykészletek hozzáadása vagy eltávolítása párbeszédpanelen válassza ki a felvenni kívánt szabálykészleteket.

Példák

Íme egy példa a C++ alapvető ellenőrzési szabályok által talált problémákra:

// 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", justification : "This attribute suppresses Bounds rules #1")]]
    {
        int* q = p + 1;    // warning C26481 (suppressed)
        p = q++;           // warning C26481 (suppressed)
    }

    return 0;
}

Ez a példa néhány figyelmeztetést mutat be, amelyeket a C++ alapvető ellenőrzési szabályok megtalálhatnak:

  • A C26494 szabálytípus.5: Mindig inicializáljon egy objektumot.

  • A C26485 a Bounds.3 szabály: Nincs tömb–mutató bomlás.

  • A C26481 a Bounds.1 szabály: Ne használjon mutató aritmetikát. A span használható helyette.

Telepítse és engedélyezze a C++ Core Check kódelemzési szabálykészleteket, majd fordítsa le ezt a kódot. A kódelemzés az első két figyelmeztetést adja ki, és letiltja a harmadikat. A Visual Studio 2015 példakódjának buildkimenete a következő:

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 ==========

A C++ alapvető irányelvei segítenek a jobb és biztonságosabb kódírásban. Előfordulhat azonban, hogy olyan példányt talál, ahol egy szabályt vagy profilt nem szabad alkalmazni. Egyszerűen el lehet tiltani közvetlenül a kódban. Az attribútummal megakadályozhatja, hogy a [[gsl::suppress]] C++ Core Check észlelje és jelentse a szabály megsértését az alábbi kódblokkban. Az egyes kijelentéseket megjelölve elnyomhatja a specifikus szabályokat. Akár a teljes határprofilt is letilthatja írással [[gsl::suppress("bounds")]] egy adott szabályszám nélkül.

Támogatott szabálykészletek

Mivel a C++ alapvető irányelvek ellenőrzője új szabályokat ad hozzá, a már meglévő kódhoz létrehozott figyelmeztetések száma növekedhet. Az előre definiált szabálykészletekkel szűrheti, hogy milyen típusú szabályokat engedélyezzen. A Visual Studio C++ Core Check Reference alatt a legtöbb szabályra vonatkozó referenciacikkeket talál.

15.3 Ezek a szabályok először a Visual Studio 2017 15.3-os verziójában jelentek meg
15.5 Ezek a szabályok először a Visual Studio 2017 15.5-ös verziójában jelentek meg
15.6 Ezek a szabályok először a Visual Studio 2017 15.6-os verziójában jelentek meg
15.7 Ezek a szabályok először a Visual Studio 2017 15.7-es verziójában jelentek meg
16.0 Ezek a szabályok először a Visual Studio 2019 16.0-s verziójában jelentek meg
16.3 Ezek a szabályok először a Visual Studio 2019 16.3-os verziójában jelentek meg

Dönthet úgy, hogy csak egy vagy néhány csoportra korlátozza a figyelmeztetéseket. A Natív minimum és a natív ajánlott szabálykészletek közé tartoznak a C++ Alapvető ellenőrzési szabályok és az egyéb PREfast-ellenőrzések.

Az elérhető szabálykészletek megtekintéséhez nyissa meg a Projekt tulajdonságai párbeszédpanelt. A Tulajdonságlapok párbeszédpanelen válassza a Configuration Properties>Code Analysis>General tulajdonságlapot. Ezután nyissa meg a Szabálykészletek kombinált lista legördülő menüjét az elérhető szabálykészletek megtekintéséhez. A szabálykészletek egyéni kombinációjának létrehozásához válassza a Több szabálykészlet kiválasztása lehetőséget. A Szabálykészletek hozzáadása vagy eltávolítása párbeszédpanel felsorolja azokat a szabályokat, amelyek közül választhat. A Szabálykészletek Visual Studióban való használatával kapcsolatos további információkért lásd: Szabálykészletek használata a futtatandó C++ szabályok megadásához.

Az elérhető szabálykészletek megtekintéséhez nyissa meg a Projekt tulajdonságai párbeszédpanelt. A Tulajdonságlapok párbeszédpanelen válassza a Configuration Properties>Code Analysis>Microsoft tulajdonságlapját. Ezután nyissa meg az Aktív szabályok kombinált lista legördülő menüjét az elérhető szabálykészletek megtekintéséhez. A szabálykészletek egyéni kombinációjának létrehozásához válassza a Több szabálykészlet kiválasztása lehetőséget. A Szabálykészletek hozzáadása vagy eltávolítása párbeszédpanel felsorolja azokat a szabályokat, amelyek közül választhat. A Szabálykészletek Visual Studióban való használatával kapcsolatos további információkért lásd: Szabálykészletek használata a futtatandó C++ szabályok megadásához.

Makrók

A C++ alapvető irányelvek ellenőrzője egy fejlécfájllal rendelkezik, amely olyan makrókat határoz meg, amelyek megkönnyítik a figyelmeztetések teljes kategóriáinak letiltását a kódban:

ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS

Ezek a makrók megfelelnek a szabálykészleteknek, és a figyelmeztetési számok szóközzel elválasztott listájára bonthatók. A megfelelő pragma-szerkezetek használatával konfigurálhatja a projekt vagy a kódszakasz számára érdekes szabályok hatékony készletét. A következő példában a kódelemzés csak a hiányzó állandó módosítókra figyelmeztet:

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

Tulajdonságok

A Microsoft C++ fordító korlátozott mértékben támogatja az [[gsl::suppress]] attribútumot. A függvényeken belüli kifejezésekre és blokkokra vonatkozó figyelmeztetések letiltására használható.

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

Az elemzés mellőzése parancssori beállításokkal

A #pragmas helyett a fájl tulajdonságlapjának parancssori beállításaival letilthatja a projektre vagy egyetlen fájlra vonatkozó figyelmeztetéseket. Például letilthatja a C26400 figyelmeztetést egy fájl esetében:

  1. Kattintson a jobb gombbal a fájlra a Megoldáskezelőben , és válassza a Tulajdonságok parancsot.

  2. A Tulajdonságlapok párbeszédpanelen válassza a Configuration Properties>C/C++>Parancssor tulajdonságlapot.

  3. A További beállítások szerkesztési mezőben adja hozzá a következőt /wd26400:

A parancssori beállítással ideiglenesen letilthatja egy fájl összes kódelemzését /analyze-a beállítás megadásával. Megjelenik a D9025 figyelmeztetés, amely felülírja az '/analyze' parancsot az '/analyze-'-vel, ami arra emlékezteti, hogy később újra engedélyezze a kódelemzést.

A C++ alapvető irányelvek ellenőrzőjének engedélyezése adott projektfájlokon

Néha hasznos, ha koncentrált kódelemzést végez, és továbbra is a Visual Studio IDE-t használja. Próbálja ki a következő mintaforgatókönyvet nagy projektekhez. Időt takaríthat meg a buildelésben, és egyszerűbbé teheti az eredmények szűrését:

  1. A parancshéjban állítsa be a környezeti változót esp.extension .

  2. A változó örökléséhez nyissa meg a Visual Studiót a parancshéjból.

  3. Töltsd be a projektet, és nyisd meg a tulajdonságait.

  4. Engedélyezze a kódelemzést, válassza ki a megfelelő szabálykészleteket, de ne engedélyezze a kódelemzési bővítményeket.

  5. Nyissa meg az elemezni kívánt fájlt a C++ alapvető irányelvek ellenőrzőjével, és nyissa meg annak tulajdonságait.

  6. Válassza a Konfigurációs tulajdonságok>C/C++>Parancssor>További opciók lehetőséget, és adja hozzá a/analyze:plugin EspXEngine.dll

  7. Tiltsa le az előre összeállított fejléc használatát (konfigurációs tulajdonságok>C/C++>Előre összeállított fejlécek). Ez azért szükséges, mert a bővítménymotor megpróbálhatja beolvasni a belső információkat az előre összeállított fejlécből (PCH). Ha a PCH alapértelmezett projektbeállításokkal lett lefordítva, az nem lesz kompatibilis.

  8. A projekt újraépítése. A gyakori PREFast-ellenőrzéseknek minden fájlon futniuk kell. Mivel a C++ alapvető irányelvek ellenőrzője alapértelmezés szerint nincs engedélyezve, csak a használatára konfigurált fájlon kell futnia.

A C++ alapvető irányelvek ellenőrzőjének használata a Visual Studión kívül

A C++ alapvető irányelvek ellenőrzései automatizált buildekben is használhatók.

MSBuild

A natív kódelemzés-ellenőrzőt (PREfast) egyéni célfájlok integrálják az MSBuild környezetbe. A projekttulajdonságok használatával engedélyezheti azt, és hozzáadhatja a C++ Alapvető irányelvek ellenőrzőt (amely a PREfaston alapul):

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

A fájl importálása előtt mindenképpen adja hozzá ezeket a Microsoft.Cpp.targets tulajdonságokat. Kiválaszthatja az adott szabálykészleteket, vagy létrehozhat egyéni szabálykészletet. Vagy használja az alapértelmezett szabálykészletet, amely más PREfast-ellenőrzéseket is tartalmaz.

A C++ Core Checker csak a megadott fájlokon futtatható. Használja ugyanazt a megközelítést, mint korábban, de használja az MSBuild fájlokat. A környezeti változók az BuildMacro elem használatával állíthatók be:

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

Ha nem szeretné módosítani a projektfájlt, tulajdonságokat adhat át a parancssorban:

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

Nem MSBuild projektek

Ha olyan buildrendszert használ, amely nem támaszkodik az MSBuildre, akkor is futtathatja az ellenőrzőt. A használatához ismernie kell a Kódelemzési motor konfigurációjának néhány belső részét. A Visual Studio jövőbeli verzióiban nem garantáljuk ezeknek a belső verzióknak a támogatását.

A kódelemzéshez szükség van néhány környezeti változóra és a fordító parancssori beállításaira. Javasoljuk, hogy a natív eszközök parancssori környezetét használja, hogy ne kelljen megkeresnie a fordító adott elérési útját, a könyvtárakat és így tovább.

  • Környezeti változók

    • set esp.extensions=cppcorecheck.dll Ez azt jelzi a motornak, hogy betöltse a C++ Alapvető irányelvek modult.
    • A Visual Studio 2019 óta nem javasoljuk a esp.annotationbuildlevel környezeti változó beállítását, mert a beállítás hamis pozitív eredményt eredményezhet. Ha váratlan eredményeket lát, távolítsa el ezt a változót a környezetből.
    • set caexcludepath=%include% Javasoljuk, hogy tiltsa le a szabványos fejlécekre figyelmeztető figyelmeztetéseket. Itt további útvonalakat adhat hozzá, például a projekt közös fejléceinek elérési útját.
  • Parancssori beállítások

    • /analyze Engedélyezi a kódelemzést (fontolja meg a /analyze:only és a /analyze:quiet használatát is).
    • /analyze:plugin EspXEngine.dll Ez a beállítás betölti a Code Analysis Extensions motort a PREfastba. Ez a motor viszont betölti a(z) C++ Alapvető irányelvek ellenőrzőt.

Az útmutató támogatási kódtára használata

Az útmutató támogatási kódtára (GSL) úgy lett kialakítva, hogy segítsen követni az alapvető irányelveket. A GSL olyan definíciókat tartalmaz, amelyek lehetővé teszik a hibalehetőségekre hajlamos szerkezetek biztonságosabb alternatívákkal való helyettesítését. Például lecserélhet egy T*, length paraméterpárt a span<T> típusra. A GSL-projekt a GitHubon érhető el a következő címen https://github.com/Microsoft/GSL: . A tár nyílt forráskódú, így megtekintheti a forrásokat, megjegyzéseket fűzhet vagy közreműködhet. A vcpkg-csomagkezelővel helyileg is letöltheti és telepítheti a kódtárat.

A C++ Core Ellenőrzési útmutató használata Visual Studio 2015-projektekben

A Visual Studio 2015 használata esetén a C++ Core Check kódelemzési szabálykészletek alapértelmezés szerint nincsenek telepítve. A C++ Core Check kódelemző eszközeinek a Visual Studio 2015-ben való engedélyezéséhez további lépésekre van szükség. A Microsoft NuGet-csomaggal támogatja a Visual Studio 2015-projekteket. A csomag neve Microsoft.CppCoreCheck, és a következő címen https://www.nuget.org/packages/Microsoft.CppCoreCheckérhető el: . Ehhez a csomaghoz legalább az 1. frissítéssel rendelkező Visual Studio 2015 szükséges.

A csomag egy másik csomagot is telepít függőségként, a csak fejléces útmutató támogatási kódtárat (GSL). A GSL a GitHubon is elérhető a következő címen https://github.com/Microsoft/GSL: .

Mivel a kódelemzési szabályok betölthetők a Visual Studio 2015-ben, telepítenie kell a Microsoft.CppCoreCheck NuGet-csomagot minden ellenőrizni kívánt C++ projektbe.

A Microsoft.CppCoreCheck csomag hozzáadása a projekthez a Visual Studio 2015-ben

  1. A Megoldáskezelőben kattintson a jobb gombbal a projekt helyi menüjének megnyitásához abban a megoldásban, amelyhez hozzá szeretné adni a csomagot. Válassza a NuGet-csomagok kezelése lehetőséget a NuGet-csomagkezelő megnyitásához.

  2. A NuGet Package Manager ablakban keresse meg a Microsoft.CppCoreCheck elemet.

    A Nuget Package Manager ablaka a CppCoreCheck csomagot jeleníti meg.

  3. Válassza a Microsoft.CppCoreCheck csomagot, majd a Telepítés gombra kattintva adja hozzá a szabályokat a projekthez.

    A NuGet-csomag hozzáad egy MSBuild .targets fájlt a projekthez, amelyet a program meghív, amikor engedélyezi a kódelemzést a projekten. A .targets fájl további bővítményként hozzáadja a C++ Core Check szabályokat a Visual Studio kódelemző eszközéhez. A csomag telepítésekor a Tulajdonságlapok párbeszédpanelen engedélyezheti vagy letilthatja a kiadott és a kísérleti szabályokat.

Lásd még