Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
Nyissa meg a projekt Tulajdonságlapok párbeszédpanelét.
Válassza a Configuration Properties>Code Analysis tulajdonságlapját.
Jelölje be a Kódelemzés engedélyezése buildeléskor jelölőnégyzetet.
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:
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
Nyissa meg a projekt Tulajdonságlapok párbeszédpanelét.
Válassza a Configuration Properties>Code Analysis tulajdonságlapját.
Á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
Nyissa meg a projekt Tulajdonságlapok párbeszédpanelét.
Válassza a Configuration Properties>Code Analysis>Microsoft tulajdonságlapját.
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.
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
spanhaszná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.
Aritmetikai szabályok: Az aritmetikai túlcsordulás, az aláírt-aláíratlan műveletek és a bitmanipuláció észlelésére vonatkozó szabályok. 15.6
Határszabályok: A C++ alapvető irányelvek kötött profiljának kényszerítése. 15.3
Osztályszabályok: Néhány szabály, amelyek a speciális tagfüggvények és virtuális specifikációk megfelelő használatára összpontosítanak. Ezek az osztályokhoz és osztályhierarchiákhoz ajánlott ellenőrzések részhalmazai. 15.5
Egyidejűségi szabályok: Egyetlen szabály, amely elfogja a hibás védőobjektum-deklarációkat. További információkért tekintse meg az egyidejűséggel kapcsolatos irányelveket. 15.5
Const-szabályok: Konstansokkal kapcsolatos ellenőrzések kényszerítése a C++ alapvető irányelvekből. 15.3
Deklarációs szabályok: Néhány szabály az interfészek irányelveiből , amelyek a globális változók deklarálására összpontosítanak. 15.5
Enum szabályok: Ezek a szabályok a C++ Core Guidelines alapján az enumerációval kapcsolatos ellenőrzéseket kényszerítik ki. 16.3
Kísérleti szabályok Ezek kísérleti C++ Core Check szabályok, amelyek hasznosak, de nem állnak készen a mindennapi használatra. Próbálja ki őket, és küldjön visszajelzést. 16.0
Függvényszabályok: Két ellenőrzés, amelyek segítenek a
noexceptkijelölő bevezetésében. Ezek a függvények egyértelmű tervezésére és megvalósítására vonatkozó irányelvek részét képezik. 15.5GSL-szabályok: Ezek a szabályok az irányelvek támogatási kódtárával kapcsolatos ellenőrzéseket kényszerítik ki a C++ alapvető irányelvekből. 15.7
Élettartam-szabályok: Ezek a szabályok a C++ alapvető irányelvek élettartamprofilját kényszerítik ki. 15.7
Tulajdonosmutató-szabályok: A C++ alapvető irányelveiből kényszerítheti ki a T< tulajdonossal>kapcsolatos erőforrás-felügyeleti ellenőrzéseket.15.3
Nyers mutatószabályok: A C++ alapvető irányelveiből származó nyers mutatókkal kapcsolatos erőforrás-felügyeleti ellenőrzések kényszerítése. 15.3
Megosztott mutatószabályok: Ez az erőforrás-kezelési irányelvek kikényszerítésének része. 15.5 Hozzáadtunk néhány szabályt, amelyek a megosztott mutatók függvényekbe való átadására vagy helyi használatra vonatkoznak.
STL-szabályok: Ezek a szabályok a C++ standard kódtárhoz (STL) kapcsolódó ellenőrzéseket kényszerítik ki a C++ alapvető irányelvekből. 15.7
Stílusszabályok: Egy egyszerű, de fontos ellenőrzés, amely tiltja a használatát goto. 15.5 Ez az első lépés a C++-ban használt kifejezések és kifejezések kódolási stílusának és használatának javításához.
Típusszabályok: A C++ alapvető irányelvek típusprofiljának kényszerítése. 15.3
Egyedi mutatószabályok: A C++ alapvető irányelvekből származó egyedi mutató szemantikával rendelkező típusokkal kapcsolatos erőforrás-kezelési ellenőrzések kényszerítése. 15.3
C++ alapvető ellenőrzési szabályok: Ez a szabálykészlet tartalmazza a C++ alapvető irányelvekből jelenleg végrehajtott összes ellenőrzést, kivéve a kísérleti szabályokat.
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:
Kattintson a jobb gombbal a fájlra a Megoldáskezelőben , és válassza a Tulajdonságok parancsot.
A Tulajdonságlapok párbeszédpanelen válassza a Configuration Properties>C/C++>Parancssor tulajdonságlapot.
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:
A parancshéjban állítsa be a környezeti változót
esp.extension.A változó örökléséhez nyissa meg a Visual Studiót a parancshéjból.
Töltsd be a projektet, és nyisd meg a tulajdonságait.
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.
Nyissa meg az elemezni kívánt fájlt a C++ alapvető irányelvek ellenőrzőjével, és nyissa meg annak tulajdonságait.
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.dllTiltsa 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.
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.dllEz azt jelzi a motornak, hogy betöltse a C++ Alapvető irányelvek modult. - A Visual Studio 2019 óta nem javasoljuk a
esp.annotationbuildlevelkö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
-
/analyzeEngedélyezi a kódelemzést (fontolja meg a/analyze:onlyés a/analyze:quiethasználatát is). -
/analyze:plugin EspXEngine.dllEz 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
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.
A NuGet Package Manager ablakban keresse meg a Microsoft.CppCoreCheck elemet.
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
.targetsfájlt a projekthez, amelyet a program meghív, amikor engedélyezi a kódelemzést a projekten. A.targetsfá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.