Korzystanie z kontrolerów podstawowych wytycznych dotyczących języka C++

Podstawowe wytyczne języka C++ to przenośny zestaw wytycznych, reguł i najlepszych rozwiązań dotyczących kodowania w języku C++ utworzonych przez ekspertów i projektantów języka C++. Program Visual Studio obecnie obsługuje podzbiór tych reguł w ramach narzędzi do analizy kodu dla języka C++. Podstawowe narzędzia sprawdzania wytycznych są instalowane domyślnie w programach Visual Studio 2017 i Visual Studio 2019. Są one dostępne jako pakiet NuGet dla programu Visual Studio 2015.

Projekt podstawowych wytycznych dotyczących języka C++

Utworzone przez Bjarne Stroustrup i inne, podstawowe wytyczne języka C++ to przewodnik dotyczący bezpiecznego i efektywnego korzystania z nowoczesnego języka C++. Wytyczne podkreślają bezpieczeństwo typów statycznych i bezpieczeństwo zasobów. Identyfikują sposoby wyeliminowania lub zminimalizowania najbardziej podatnych na błędy części języka. Sugerują one również, jak uprościć, bardziej niezawodny kod i uzyskać lepszą wydajność. Te wytyczne są obsługiwane przez Standard C++ Foundation. Aby dowiedzieć się więcej, zapoznaj się z dokumentacją, podstawowymi wytycznymi języka C++ i uzyskaj dostęp do plików projektów dokumentacji podstawowych wytycznych języka C++ w witrynie GitHub.

Włączanie wytycznych dotyczących sprawdzania podstawowego języka C++ w analizie kodu

Podzestaw reguł sprawdzania podstawowego języka C++ znajduje się w zestawie reguł Zalecanych przez firmę Microsoft. Jest to zestaw reguł uruchamiany domyślnie po włączeniu analizy kodu.

Aby włączyć analizę kodu w projekcie

  1. Otwórz okno dialogowe Strony właściwości dla projektu.

  2. Wybierz stronę właściwości Analiza kodu właściwości>konfiguracji.

  3. Zaznacz pole wyboru Włącz analizę kodu w kompilacji.

Property page for Code Analysis General settings.

Aby włączyć więcej podstawowych reguł sprawdzania, otwórz listę rozwijaną i wybierz zestawy reguł, które chcesz uwzględnić:

Dropdown for additional C++ Core Check rule sets.

Podzestaw reguł sprawdzania podstawowego języka C++ znajduje się w zestawie reguł Zalecanych przez firmę Microsoft. Jest to zestaw reguł uruchamiany domyślnie po włączeniu analizy kodu firmy Microsoft.

Aby włączyć analizę kodu w projekcie:

  1. Otwórz okno dialogowe Strony właściwości dla projektu.

  2. Wybierz stronę właściwości Analiza kodu właściwości>konfiguracji.

  3. Ustaw właściwości Enable Code Analysis on Build and Enable Microsoft Code Analysis (Włącz analizę kodu w kompilacji i włącz analizę kodu firmy Microsoft).

Możesz również uruchomić wszystkie obsługiwane reguły sprawdzania podstawowego języka C++ lub wybrać własny podzestaw do uruchomienia:

Aby włączyć więcej podstawowych reguł sprawdzania

  1. Otwórz okno dialogowe Strony właściwości dla projektu.

  2. Wybierz stronę właściwości Właściwości>konfiguracji Analiza>kodu firmy Microsoft.

  3. Otwórz listę rozwijaną Aktywne reguły i wybierz pozycję Wybierz wiele zestawów reguł.

  4. W oknie dialogowym Dodawanie lub usuwanie zestawów reguł wybierz zestawy reguł, które chcesz uwzględnić.

Przykłady

Oto przykład niektórych problemów, które można znaleźć w regułach sprawdzania podstawowego języka 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;
}

W tym przykładzie pokazano kilka ostrzeżeń, które można znaleźć w regułach sprawdzania podstawowego języka C++:

  • C26494 to reguła Type.5: Zawsze inicjuj obiekt.

  • C26485 to reguła Bounds.3: Brak rozkładu tablicy na wskaźnik.

  • C26481 jest regułą Bounds.1: Nie używaj arytmetyki wskaźnika. Użycie w zamian parametru span.

Zainstaluj i włącz zestawy reguł analizy kodu c++ Core Check, a następnie skompiluj ten kod. Analiza kodu generuje pierwsze dwa ostrzeżenia i pomija trzeci. Oto dane wyjściowe kompilacji z przykładowego kodu w programie 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 ==========

Podstawowe wytyczne dotyczące języka C++ ułatwiają pisanie lepszego i bezpieczniejszego kodu. Można jednak znaleźć wystąpienie, w którym nie należy stosować reguły lub profilu. Łatwo jest pominąć go bezpośrednio w kodzie. Za pomocą atrybutu [[gsl::suppress]] można zachować kontrolę rdzeni języka C++ przed wykrywaniem i raportowaniem wszelkich naruszeń reguły w poniższym bloku kodu. Możesz oznaczyć poszczególne instrukcje, aby pominąć określone reguły. Możesz nawet pominąć cały profil granic, pisząc [[gsl::suppress(bounds)]] bez uwzględniania określonego numeru reguły.

Obsługiwane zestawy reguł

W miarę dodawania nowych reguł do podstawowego modułu sprawdzania wytycznych języka C++ liczba ostrzeżeń generowanych dla istniejącego kodu może wzrosnąć. Możesz użyć wstępnie zdefiniowanych zestawów reguł, aby filtrować, które rodzaje reguł mają być włączone. Artykuły referencyjne dla większości reguł można znaleźć w artykule Visual Studio C++ Core Check Reference (Dokumentacja sprawdzania podstawowego języka C++ programu Visual Studio).

15.3 Te reguły pojawiły się po raz pierwszy w programie Visual Studio 2017 w wersji 15.3
15.5 Te reguły pojawiły się po raz pierwszy w programie Visual Studio 2017 w wersji 15.5
15.6 Te reguły pojawiły się po raz pierwszy w programie Visual Studio 2017 w wersji 15.6
15.7 Te reguły pojawiły się po raz pierwszy w programie Visual Studio 2017 w wersji 15.7
16.0 Te reguły pojawiły się po raz pierwszy w programie Visual Studio 2019 w wersji 16.0
16.3 Te reguły pojawiły się po raz pierwszy w programie Visual Studio 2019 w wersji 16.3

Możesz ograniczyć ostrzeżenia tylko do jednej lub kilku grup. Zestawy reguł Native Minimum i Native Recommended obejmują podstawowe reguły sprawdzania języka C++ i inne testy PREfast.

Aby wyświetlić dostępne zestawy reguł, otwórz okno dialogowe Właściwości projektu. W oknie dialogowym Strony właściwości wybierz stronę właściwości Właściwości>konfiguracji Analiza>kodu Ogólne. Następnie otwórz listę rozwijaną w polu kombi Zestawy reguł, aby wyświetlić dostępne zestawy reguł. Aby utworzyć niestandardową kombinację zestawów reguł, wybierz pozycję Wybierz wiele zestawów reguł. Okno dialogowe Dodawanie lub usuwanie zestawów reguł zawiera listę reguł, z których można wybrać. Aby uzyskać więcej informacji na temat używania zestawów reguł w programie Visual Studio, zobacz Używanie zestawów reguł w celu określenia reguł języka C++, które mają być uruchamiane.

Aby wyświetlić dostępne zestawy reguł, otwórz okno dialogowe Właściwości projektu. W oknie dialogowym Strony właściwości wybierz stronę właściwości Właściwości>konfiguracji Analiza>kodu firmy Microsoft. Następnie otwórz listę rozwijaną w polu kombi Aktywne reguły , aby wyświetlić dostępne zestawy reguł. Aby utworzyć niestandardową kombinację zestawów reguł, wybierz pozycję Wybierz wiele zestawów reguł. Okno dialogowe Dodawanie lub usuwanie zestawów reguł zawiera listę reguł, z których można wybrać. Aby uzyskać więcej informacji na temat używania zestawów reguł w programie Visual Studio, zobacz Używanie zestawów reguł w celu określenia reguł języka C++, które mają być uruchamiane.

Makra

Podstawowe wytyczne języka C++ są dostarczane z plikiem nagłówka, który definiuje makra, które ułatwiają pomijanie całych kategorii ostrzeżeń w kodzie:

ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS

Te makra odpowiadają zestawom reguł i rozszerzają się na rozdzielaną spacjami listę numerów ostrzeżeń. Korzystając z odpowiednich konstrukcji pragma, można skonfigurować skuteczny zestaw reguł, który jest interesujący dla projektu lub sekcji kodu. W poniższym przykładzie analiza kodu ostrzega tylko o braku stałych modyfikatorów:

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

Atrybuty

Kompilator języka Microsoft C++ ma ograniczoną obsługę atrybutu [[gsl::suppress]] . Może służyć do pomijania ostrzeżeń w wyrażeniach i instrukcjach bloku wewnątrz funkcji.

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

Pomijanie analizy przy użyciu opcji wiersza polecenia

Zamiast #pragmas można użyć opcji wiersza polecenia na stronie właściwości pliku, aby pominąć ostrzeżenia dotyczące projektu lub pojedynczego pliku. Aby na przykład wyłączyć ostrzeżenie C26400 dla pliku:

  1. Kliknij prawym przyciskiem myszy plik w Eksplorator rozwiązań i wybierz polecenie Właściwości.

  2. W oknie dialogowym Strony właściwości wybierz stronę właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. W polu Edycja opcji dodatkowych dodaj polecenie /wd26400.

Możesz użyć opcji wiersza polecenia, aby tymczasowo wyłączyć całą analizę kodu dla pliku, określając ./analyze- Zobaczysz ostrzeżenie D9025 przesłaniające "/analyze" za pomocą polecenia "/analyze-", które przypomina o ponownym włączeniu analizy kodu później.

Włączanie podstawowego narzędzia do sprawdzania wytycznych języka C++ dla określonych plików projektu

Czasami warto przeprowadzić skoncentrowaną analizę kodu i nadal używać środowiska IDE programu Visual Studio. Wypróbuj następujący przykładowy scenariusz dla dużych projektów. Może zaoszczędzić czas kompilacji i ułatwić filtrowanie wyników:

  1. W powłoce poleceń ustaw zmienną środowiskową esp.extension .

  2. Aby dziedziczyć tę zmienną, otwórz program Visual Studio z powłoki poleceń.

  3. Załaduj projekt i otwórz jego właściwości.

  4. Włącz analizę kodu, wybierz odpowiednie zestawy reguł, ale nie włączaj rozszerzeń analizy kodu.

  5. Przejdź do pliku, który chcesz przeanalizować za pomocą podstawowego modułu sprawdzania wytycznych języka C++ i otwórz jego właściwości.

  6. Wybierz pozycję Właściwości>konfiguracji C/C++>, dodaj dodatkowe opcje wiersza polecenia>/analyze:plugin EspXEngine.dll

  7. Wyłącz użycie prekompilowanego nagłówka (Właściwości>konfiguracji C/C++>Prekompilowane nagłówki). Jest to konieczne, ponieważ aparat rozszerzeń może próbować odczytać informacje wewnętrzne ze wstępnie skompilowanego nagłówka (PCH). Jeśli PCH został skompilowany z domyślnymi opcjami projektu, nie będzie zgodny.

  8. Ponownie skompiluj projekt. Typowe kontrole PREFast powinny być uruchamiane we wszystkich plikach. Ponieważ narzędzie sprawdzania podstawowych wytycznych języka C++ nie jest domyślnie włączone, powinno być uruchamiane tylko w pliku skonfigurowanym do jego używania.

Jak używać narzędzia sprawdzania podstawowych wytycznych języka C++ poza programem Visual Studio

Możesz użyć kontroli podstawowych wytycznych języka C++ w automatycznych kompilacjach.

MSBuild

Moduł sprawdzania analizy kodu natywnego (PREfast) jest zintegrowany ze środowiskiem MSBuild przez niestandardowe pliki obiektów docelowych. Możesz użyć właściwości projektu, aby ją włączyć, i dodać narzędzie sprawdzania podstawowych wytycznych języka C++ (które jest oparte na prEfast):

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

Przed zaimportowanie Microsoft.Cpp.targets pliku upewnij się, że te właściwości zostały dodane. Możesz wybrać określone zestawy reguł lub utworzyć niestandardowy zestaw reguł. Możesz też użyć domyślnego zestawu reguł, który zawiera inne kontrole PREfast.

Narzędzie do sprawdzania rdzeni języka C++ można uruchomić tylko w określonych plikach. Użyj tego samego podejścia, jak opisano wcześniej, ale użyj plików MSBuild. Zmienne środowiskowe można ustawić przy użyciu BuildMacro elementu :

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

Jeśli nie chcesz modyfikować pliku projektu, możesz przekazać właściwości w wierszu polecenia:

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

Projekty inne niż MSBuild

Jeśli używasz systemu kompilacji, który nie korzysta z programu MSBuild, nadal możesz uruchomić narzędzie sprawdzania. Aby go użyć, musisz zapoznać się z niektórymi elementami wewnętrznymi konfiguracji aparatu analizy kodu. Nie gwarantujemy obsługi tych wewnętrznych w przyszłych wersjach programu Visual Studio.

Analiza kodu wymaga kilku zmiennych środowiskowych i opcji wiersza polecenia kompilatora. Zalecamy użycie środowiska wiersza polecenia narzędzi natywnych, aby nie trzeba było wyszukiwać określonych ścieżek dla kompilatora, dołączania katalogów itd.

  • Zmienne środowiskowe

    • set esp.extensions=cppcorecheck.dll Informuje to aparat o załadowaniu modułu Core Guidelines języka C++.
    • Ponieważ program Visual Studio 2019 nie zaleca już ustawiania zmiennej środowiskowej esp.annotationbuildlevel , ponieważ ustawienie może spowodować wynik fałszywie dodatni. Jeśli widzisz nieoczekiwane wyniki, usuń tę zmienną ze środowiska.
    • set caexcludepath=%include% Zdecydowanie zalecamy wyłączenie ostrzeżeń uruchamianych w nagłówkach standardowych. W tym miejscu możesz dodać więcej ścieżek, na przykład ścieżkę do typowych nagłówków w projekcie.
  • Opcje wiersza polecenia

    • /analyze Umożliwia analizę kodu (rozważ również użycie elementów /analyze:only i /analyze:quiet).
    • /analyze:plugin EspXEngine.dll Ta opcja ładuje aparat rozszerzeń analizy kodu do prEfast. Z kolei ten aparat ładuje narzędzie sprawdzania podstawowych wytycznych języka C++.

Korzystanie z biblioteki pomocy technicznej wytycznych

Biblioteka pomocy technicznej wytycznych (GSL) została zaprojektowana tak, aby ułatwić przestrzeganie podstawowych wytycznych. Biblioteka GSL zawiera definicje, które pozwalają zastąpić konstrukcje podatne na błędy bezpieczniejszymi alternatywami. Można na przykład zastąpić T*, length parę parametrów typem span<T> . Projekt GSL jest dostępny w witrynie GitHub pod adresem https://github.com/Microsoft/GSL. Biblioteka jest typu open source, dzięki czemu można wyświetlać źródła, tworzyć komentarze lub współtworzyć. Możesz również użyć menedżera pakietów vcpkg , aby pobrać i zainstalować bibliotekę lokalnie.

Korzystanie z wytycznych dotyczących sprawdzania podstawowego języka C++ w projektach programu Visual Studio 2015

Jeśli używasz programu Visual Studio 2015, zestawy reguł analizy kodu podstawowego sprawdzania języka C++ nie są instalowane domyślnie. Przed włączeniem narzędzi do analizy kodu podstawowego języka C++ w programie Visual Studio 2015 należy wykonać inne kroki. Firma Microsoft zapewnia obsługę projektów programu Visual Studio 2015 przy użyciu pakietu NuGet. Pakiet ma nazwę Microsoft.CppCoreCheck i jest dostępny pod adresem http://www.nuget.org/packages/Microsoft.CppCoreCheck. Ten pakiet wymaga zainstalowania co najmniej programu Visual Studio 2015 z aktualizacją Update 1.

Pakiet instaluje również inny pakiet jako zależność — bibliotekę obsługi wytycznych tylko do nagłówka (GSL). Biblioteka GSL jest również dostępna w witrynie GitHub pod adresem https://github.com/Microsoft/GSL.

Ze względu na sposób ładowania reguł analizy kodu w programie Visual Studio 2015 należy zainstalować Microsoft.CppCoreCheck pakiet NuGet w każdym projekcie języka C++, który chcesz sprawdzić.

Aby dodać pakiet Microsoft.CppCoreCheck do projektu w programie Visual Studio 2015

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy, aby otworzyć menu kontekstowe projektu w rozwiązaniu, do którego chcesz dodać pakiet. Wybierz pozycję Zarządzaj pakietami NuGet, aby otworzyć Menedżer pakietów NuGet.

  2. W oknie Menedżer pakietów NuGet wyszukaj pozycję Microsoft.CppCoreCheck.

    Nuget Package Manager window showing the CppCoreCheck package.

  3. Wybierz pakiet Microsoft.CppCoreCheck, a następnie wybierz przycisk Zainstaluj , aby dodać reguły do projektu.

    Pakiet NuGet dodaje plik MSBuild .targets do projektu wywoływanego podczas włączania analizy kodu w projekcie. Plik dodaje reguły sprawdzania .targets rdzeni języka C++ jako inne rozszerzenie do narzędzia do analizy programu Visual Studio Code. Po zainstalowaniu pakietu można użyć okna dialogowego Strony właściwości, aby włączyć lub wyłączyć wydane i eksperymentalne reguły.

Zobacz też