C++ Temel Yönergeleri denetleyicilerini kullanma
C++ Temel Yönergeleri, C++ uzmanları ve tasarımcıları tarafından oluşturulan C++ dilinde kodlama hakkında taşınabilir bir kılavuz, kural ve en iyi yöntemler kümesidir. Visual Studio şu anda C++ için kod çözümleme araçlarının bir parçası olarak bu kuralların bir alt kümesini destekler. Temel kılavuz denetleyicileri, Visual Studio 2017 ve Visual Studio 2019'da varsayılan olarak yüklenir. Visual Studio 2015 için NuGet paketi olarak kullanılabilirler.
C++ Çekirdek Yönergeleri Projesi
Bjarne Stroustrup ve diğerleri tarafından oluşturulan C++ Core Guidelines, modern C++'ı güvenli ve etkili bir şekilde kullanmaya yönelik bir kılavuzdur. Yönergeler statik tür güvenliğini ve kaynak güvenliğini vurgular. Dilin hataya en açık kısımlarını ortadan kaldırmanın veya en aza indirmenin yollarını belirler. Ayrıca kodunuzu daha basit, daha güvenilir ve daha iyi bir performansa nasıl sahip olabileceğinizi de önerirler. Bu yönergeler Standart C++ Temeli tarafından korunur. Daha fazla bilgi edinmek için C++ Temel Yönergeleri belgelerine bakın ve GitHub'da C++ Çekirdek Yönergeleri belge proje dosyalarına erişin.
Kod Analizi'nde C++ Çekirdek Denetimi yönergelerini etkinleştirme
C++ Çekirdek Denetimi kurallarının bir alt kümesi Microsoft Yerel Önerilen kural kümesine eklenir. Kod analizi etkinleştirildiğinde varsayılan olarak çalışan kural kümesidir.
Projenizde kod analizini etkinleştirmek için
Projeniz için Özellik Sayfaları iletişim kutusunu açın.
Yapılandırma Özellikleri>Kod Analizi özellik sayfasını seçin.
Derlemede Kod Analizini Etkinleştir onay kutusunu seçin.
Daha fazla Çekirdek Denetimi kuralı etkinleştirmek için açılan listeyi açın ve hangi kural kümelerini eklemek istediğinizi seçin:
C++ Çekirdek Denetimi kurallarının bir alt kümesi Microsoft Yerel Önerilen kural kümesine eklenir. Microsoft kod analizi etkinleştirildiğinde varsayılan olarak çalışan kural kümesidir.
Projenizde kod analizini etkinleştirmek için:
Projeniz için Özellik Sayfaları iletişim kutusunu açın.
Yapılandırma Özellikleri>Kod Analizi özellik sayfasını seçin.
Derlemede Kod Analizini Etkinleştir ve Microsoft Kod Analizini Etkinleştir özelliklerini ayarlayın.
Ayrıca desteklenen tüm C++ Çekirdek Denetimi kurallarını çalıştırmayı veya çalıştırmak için kendi alt kümenizi seçebilirsiniz:
Daha fazla Çekirdek Denetimi kuralı etkinleştirmek için
Projeniz için Özellik Sayfaları iletişim kutusunu açın.
Yapılandırma Özellikleri>Kod Analizi>Microsoft özellik sayfasını seçin.
Etkin Kurallar açılan listesini açın ve Birden çok kural kümesi seçin'i seçin.
Kural Kümesi Ekle veya Kaldır iletişim kutusunda, hangi kural kümelerini eklemek istediğinizi seçin.
Örnekler
C++ Çekirdek Denetimi kurallarının bulabileceği sorunlardan bazıları aşağıda verilmişti:
// 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;
}
Bu örnek, C++ Çekirdek Denetimi kurallarının bulabileceği uyarılardan birkaçını gösterir:
C26494 kural türüdür.5: Her zaman bir nesneyi başlatın.
C26485 kural Sınırlarıdır.3: Diziden işaretçiye bozulma yoktur.
C26481 kural Sınırlarıdır.1: İşaretçi aritmetiği kullanmayın. Bunun yerine
span
kullanın.
C++ Çekirdek Denetimi kod analizi kural kümelerini yükleyip etkinleştirin, ardından bu kodu derleyin. Kod analizi ilk iki uyarıyı oluşturur ve üçüncü uyarıyı bastırır. Visual Studio 2015'teki örnek koddan derleme çıktısı aşağıda verilmişti:
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 ==========
Daha iyi ve daha güvenli kod yazmanıza yardımcı olmak için C++ Temel Yönergeleri vardır. Ancak bir kuralın veya profilin uygulanmaması gereken bir örnek bulabilirsiniz. Doğrudan kodda gizlemesi kolaydır. Aşağıdaki kod bloğunda [[gsl::suppress]]
C++ Çekirdek Denetimi'nin kural ihlalini algılamasını ve raporlamasını engellemek için özniteliğini kullanabilirsiniz. Belirli kuralları engellemek için tek tek deyimleri işaretleyebilirsiniz. Hatta belirli bir kural numarası eklemeden yazarak [[gsl::suppress(bounds)]]
sınır profilinin tamamını gizleyebilirsiniz.
Desteklenen kural kümeleri
C++ Çekirdek Yönergeleri Denetleyicisi'ne yeni kurallar eklendikçe, önceden var olan kod için oluşturulan uyarı sayısı artabilir. Hangi tür kuralların etkinleştirileceğine filtre uygulamak için önceden tanımlanmış kural kümelerini kullanabilirsiniz. Çoğu kural için başvuru makalelerini Visual Studio C++ Çekirdek Denetimi Başvurusu altında bulabilirsiniz.
Aritmetik Kurallar: Aritmetik taşma, imzalı imzalanmamış işlemler ve bit işlemeyi algılama kuralları.15.6
Sınır Kuralları: C++ Çekirdek Yönergelerinin Sınır profilini zorunlu kılma.15.3
Sınıf Kuralları: Özel üye işlevlerinin ve sanal belirtimlerin düzgün kullanımına odaklanan birkaç kural. Sınıflar ve sınıf hiyerarşileri için önerilen denetimlerin bir alt kümesidir.15.5
Eşzamanlılık Kuralları: Bad guard nesne bildirimlerini yakalayan tek bir kural. Daha fazla bilgi için bkz . Eşzamanlılık ile ilgili yönergeler.15.5
Const Kuralları: C++ Çekirdek Yönergeleri'nden const ile ilgili denetimleri zorunlu kılma.15.3
Bildirim Kuralları: Arabirim yönergelerinde yer alan ve genel değişkenlerin nasıl bildirildiğini gösteren birkaç kural.15.5
Numaralandırma Kuralları: Bu kurallar, C++ Çekirdek Yönergeleri'nden sabit listesiyle ilgili denetimleri zorunlu kılar.16.3
Deneysel Kurallar Bunlar, yararlı olan ancak günlük kullanıma hazır olmayan deneysel C++ Çekirdek Denetimi kurallarıdır. Bunları deneyin ve geri bildirim sağlayın.16.0
İşlev Kuralları: Tanımlayıcının
noexcept
benimsenmesi konusunda yardımcı olan iki denetim. Bunlar, net işlev tasarımı ve uygulamasına yönelik yönergelerin bir parçasıdır.15.5GSL Kuralları: Bu kurallar, C++ Temel Yönergeleri'nden Yönergeler Destek Kitaplığı ile ilgili denetimleri zorunlu kılar.15.7
Yaşam Süresi Kuralları: Bu kurallar C++ Çekirdek Yönergelerinin Yaşam Süresi profilini zorunlu kılar.15.7
Sahip İşaretçi Kuralları: C++ Çekirdek Yönergeleri'nden sahip<T> ile ilgili kaynak yönetimi denetimlerini zorunlu kılma.15.3
Ham İşaretçi Kuralları: C++ Çekirdek Yönergeleri'nden ham işaretçilerle ilgili kaynak yönetimi denetimlerini zorunlu kılma.15.3
Paylaşılan işaretçi Kuralları: Kaynak yönetimi yönergelerini zorunlu kılmanın bir parçasıdır.15.5 Paylaşılan işaretçilerin işlevlere geçirilmesine veya yerel olarak kullanılmasına özgü birkaç kural ekledik.
STL Kuralları: Bu kurallar, C++ Temel Yönergeleri'nden C++ Standart Kitaplığı (STL) ile ilgili denetimleri zorunlu kılar.15.7
Stil Kuralları: Goto kullanımını yasaklayan basit ama önemli bir denetim.15.5 C++ dilinde kodlama stilinizi ve ifade ve deyim kullanımını geliştirmenin ilk adımıdır.
Tür Kuralları: C++ Çekirdek Yönergelerinin Tür profilini zorunlu kılma.15.3
Benzersiz İşaretçi Kuralları: C++ Temel Yönergeleri'nden benzersiz işaretçi semantiğine sahip türlerle ilgili kaynak yönetimi denetimlerini zorunlu kılma.15.3
C++ Çekirdek Denetimi Kuralları: Bu kural kümesi, Deneysel kurallar dışında C++ Çekirdek Yönergelerinden geçerli olan tüm denetimleri içerir.
15.3 Bu kurallar ilk olarak Visual Studio 2017 sürüm 15.3'te göründü
15.5 Bu kurallar ilk olarak Visual Studio 2017 sürüm 15.5'te göründü
15.6 Bu kurallar ilk olarak Visual Studio 2017 sürüm 15.6'da göründü
15.7 Bu kurallar ilk olarak Visual Studio 2017 sürüm 15.7'de göründü
16.0 Bu kurallar ilk olarak Visual Studio 2019 sürüm 16.0'da göründü
16.3 Bu kurallar ilk olarak Visual Studio 2019 sürüm 16.3'te göründü
Uyarıları yalnızca bir veya birkaç grupla sınırlamayı seçebilirsiniz. Yerel Minimum ve Yerel Önerilen kural kümeleri C++ Çekirdek Denetimi kurallarını ve diğer PREfast denetimlerini içerir.
Kullanılabilir kural kümelerini görmek için Proje Özellikleri iletişim kutusunu açın. Özellik Sayfaları iletişim kutusunda Yapılandırma Özellikleri>Kod Analizi>Genel özellik sayfasını seçin. Ardından, kullanılabilir kural kümelerini görmek için Kural Kümeleri birleşik giriş kutusunda açılan listeyi açın. Özel bir kural kümesi bileşimi oluşturmak için Birden çok kural kümesi seçin'i seçin. Kural Kümeleri Ekle veya Kaldır iletişim kutusunda, aralarından seçim yapabileceğiniz kurallar listelenir. Visual Studio'da Kural Kümelerini kullanma hakkında daha fazla bilgi için bkz . Çalıştırılacak C++ kurallarını belirtmek için kural kümelerini kullanma.
Kullanılabilir kural kümelerini görmek için Proje Özellikleri iletişim kutusunu açın. Özellik Sayfaları iletişim kutusunda Yapılandırma Özellikleri>Kod Analizi>Microsoft özellik sayfasını seçin. Ardından, kullanılabilir kural kümelerini görmek için Etkin Kurallar birleşik giriş kutusunda açılan listeyi açın. Özel bir kural kümesi bileşimi oluşturmak için Birden çok kural kümesi seçin'i seçin. Kural Kümeleri Ekle veya Kaldır iletişim kutusunda, aralarından seçim yapabileceğiniz kurallar listelenir. Visual Studio'da Kural Kümelerini kullanma hakkında daha fazla bilgi için bkz . Çalıştırılacak C++ kurallarını belirtmek için kural kümelerini kullanma.
Makrolar
C++ Temel Kılavuz Denetleyicisi, koddaki uyarı kategorilerinin tamamını gizlemeyi kolaylaştıran makroları tanımlayan bir üst bilgi dosyasıyla birlikte gelir:
ALL_CPPCORECHECK_WARNINGS
CPPCORECHECK_TYPE_WARNINGS
CPPCORECHECK_RAW_POINTER_WARNINGS
CPPCORECHECK_CONST_WARNINGS
CPPCORECHECK_OWNER_POINTER_WARNINGS
CPPCORECHECK_UNIQUE_POINTER_WARNINGS
CPPCORECHECK_BOUNDS_WARNINGS
Bu makrolar kural kümelerine karşılık gelir ve boşlukla ayrılmış uyarı numaraları listesine genişletilir. Uygun pragma yapılarını kullanarak, bir proje veya kod bölümü için ilginç olan etkili kural kümesini yapılandırabilirsiniz. Aşağıdaki örnekte, kod analizi yalnızca eksik sabit değiştiriciler hakkında uyarır:
#include <CppCoreCheck\Warnings.h>
#pragma warning(disable: ALL_CPPCORECHECK_WARNINGS)
#pragma warning(default: CPPCORECHECK_CONST_WARNINGS)
Özellikler
Microsoft C++ derleyicisi özniteliği için sınırlı desteğe [[gsl::suppress]]
sahiptir. İfadedeki uyarıları engellemek ve işlevlerin içindeki deyimleri engellemek için kullanılabilir.
// 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;
}
Komut satırı seçeneklerini kullanarak çözümlemeyi gizleme
#pragmas yerine, projenin veya tek bir dosyanın uyarılarını engellemek için dosyanın özellik sayfasındaki komut satırı seçeneklerini kullanabilirsiniz. Örneğin, bir dosya için C26400 uyarısını devre dışı bırakmak için:
Çözüm Gezgini'da dosyaya sağ tıklayın ve Özellikler'i seçin.
Özellik Sayfaları iletişim kutusunda Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.
Ek Seçenekler düzenleme kutusuna ekleyin
/wd26400
.
komut satırı seçeneğini kullanarak belirterek /analyze-
bir dosya için tüm kod analizini geçici olarak devre dışı bırakabilirsiniz. D9025'in '/analyze' öğesini '/analyze-' ile geçersiz kıldığı ve daha sonra kod analizini yeniden etkinleştirmenizi anımsatan bir uyarı görürsünüz.
Belirli proje dosyalarında C++ Temel Kılavuz Denetleyicisi'ni etkinleştirme
Bazen odaklanmış kod analizi yapmak ve Visual Studio IDE'yi kullanmaya devam etmek yararlı olabilir. Büyük projeler için aşağıdaki örnek senaryoyu deneyin. Derleme zamanından tasarruf edebilir ve sonuçları filtrelemeyi kolaylaştırabilir:
Komut kabuğunda ortam değişkenini
esp.extension
ayarlayın.Bu değişkeni devralmak için komut kabuğundan Visual Studio'yu açın.
Projenizi yükleyin ve özelliklerini açın.
Kod analizini etkinleştirin, uygun kural kümelerini seçin, ancak kod analizi uzantılarını etkinleştirmeyin.
C++ Çekirdek Yönergeleri Denetleyicisi ile analiz etmek istediğiniz dosyaya gidin ve özelliklerini açın.
Yapılandırma Özellikleri>C/C++>Komut Satırı>Ek Seçenekleri'ni seçin ve ekleyin
/analyze:plugin EspXEngine.dll
Önceden derlenmiş üst bilgi kullanımını devre dışı bırakın (Yapılandırma Özellikleri>C/C++>Önceden Derlenmiş Üst Bilgiler). Uzantı altyapısı iç bilgilerini önceden derlenmiş üst bilgiden (PCH) okumaya çalışabileceğinden bu gereklidir. PCH varsayılan proje seçenekleriyle derlendiyse uyumlu olmaz.
Projeyi yeniden oluşturun. Yaygın PREFast denetimleri tüm dosyalarda çalıştırılmalıdır. C++ Temel Kılavuz Denetleyicisi varsayılan olarak etkinleştirilmediğinden, yalnızca kullanmak üzere yapılandırılmış dosyada çalıştırılmalıdır.
Visual Studio dışında C++ Çekirdek Yönergeleri Denetleyicisi'ni kullanma
Otomatik derlemelerde C++ Çekirdek Yönergeleri denetimlerini kullanabilirsiniz.
MSBuild
Yerel Kod Analizi denetleyicisi (PREfast), özel hedefler dosyaları tarafından MSBuild ortamıyla tümleştirilir. Proje özelliklerini kullanarak bunu etkinleştirebilir ve C++ Çekirdek Kılavuz Denetleyicisi'ni (PREfast'ı temel alır) ekleyebilirsiniz:
<PropertyGroup>
<EnableCppCoreCheck>true</EnableCppCoreCheck>
<CodeAnalysisRuleSet>CppCoreCheckRules.ruleset</CodeAnalysisRuleSet>
<RunCodeAnalysis>true</RunCodeAnalysis>
</PropertyGroup>
Dosyanın içeri aktarılmasından önce bu özellikleri eklediğinizden Microsoft.Cpp.targets
emin olun. Belirli kural kümelerini seçebilir veya özel bir kural kümesi oluşturabilirsiniz. Alternatif olarak, diğer PREfast denetimlerini içeren varsayılan kural kümesini de kullanabilirsiniz.
C++ Çekirdek Denetleyicisi'ni yalnızca belirtilen dosyalarda çalıştırabilirsiniz. Daha önce açıklandığı gibi aynı yaklaşımı kullanın, ancak MSBuild dosyalarını kullanın. Ortam değişkenleri şu öğe kullanılarak BuildMacro
ayarlanabilir:
<ItemGroup>
<BuildMacro Include="Esp_Extensions">
<EnvironmentVariable>true</EnvironmentVariable>
<Value>CppCoreCheck.dll</Value>
</BuildMacro>
</ItemGroup>
Proje dosyasını değiştirmek istemiyorsanız, komut satırında özellikleri geçirebilirsiniz:
msbuild /p:EnableCppCoreCheck=true /p:RunCodeAnalysis=true /p:CodeAnalysisRuleSet=CppCoreCheckRules.ruleset ...
MSBuild dışı projeler
MSBuild'i kullanmayan bir derleme sistemi kullanıyorsanız, yine de denetleyicisini çalıştırabilirsiniz. Bunu kullanmak için Kod Analizi altyapısı yapılandırmasının bazı iç bileşenlerini tanımanız gerekir. Visual Studio'nun gelecek sürümlerinde bu iç cihazlar için destek garantisi vermiyoruz.
Kod Analizi birkaç ortam değişkeni ve derleyici komut satırı seçeneği gerektirir. Yerel Araçlar Komut İstemi ortamını kullanmanızı öneririz, böylece derleyici için belirli yolları aramak, dizinleri dahil etmek vb. gerekmez.
Ortam değişkenleri
set esp.extensions=cppcorecheck.dll
Bu, altyapıya C++ Çekirdek Yönergeleri modülünü yüklemesini söyler.- Visual Studio 2019'dan bu yana, ortam değişkeninin ayarlanması hatalı pozitif sonuçlara neden olabileceğinden artık ortam değişkeninin
esp.annotationbuildlevel
ayarlanmasını önermeyiz. Beklenmeyen sonuçlar görüyorsanız, bu değişkeni ortamınızdan kaldırın. set caexcludepath=%include%
Standart üst bilgilerde tetikleyen uyarıları devre dışı bırakmanızı kesinlikle öneririz. Buraya, örneğin projenizdeki ortak üst bilgilerin yolu gibi daha fazla yol ekleyebilirsiniz.
Komut satırı seçenekleri
/analyze
Kod analizini etkinleştirir (ve/analyze:quiet
kullanmayı/analyze:only
da göz önünde bulundurun)./analyze:plugin EspXEngine.dll
Bu seçenek Kod Analizi Uzantıları altyapısını PREfast'a yükler. Bu altyapı da C++ Çekirdek Yönergeleri Denetleyicisi'ni yükler.
Kılavuz Destek Kitaplığı'nı kullanma
Kılavuz Destek Kitaplığı (GSL), Temel Yönergeleri izlemenize yardımcı olmak için tasarlanmıştır. GSL, hataya açık yapıları daha güvenli alternatiflerle değiştirmenize olanak sağlayan tanımlar içerir. Örneğin, bir T*, length
parametre çiftini türüyle span<T>
değiştirebilirsiniz. GSL projesi gitHub'da https://github.com/Microsoft/GSLbulunabilir. Kitaplık açık kaynak olduğundan kaynakları görüntüleyebilir, yorum yapabilir veya katkıda bulunabilirsiniz. Kitaplığı yerel olarak indirip yüklemek için vcpkg paket yöneticisini de kullanabilirsiniz.
Visual Studio 2015 projelerinde C++ Çekirdek Denetimi yönergelerini kullanma
Visual Studio 2015 kullanıyorsanız, C++ Çekirdek Denetimi kod analizi kural kümeleri varsayılan olarak yüklenmez. Visual Studio 2015'te C++ Çekirdek Denetimi kod analizi araçlarını etkinleştirebilmeniz için önce başka adımlar gerekir. Microsoft, NuGet paketi kullanarak Visual Studio 2015 projeleri için destek sağlar. Paket Microsoft.CppCoreCheck olarak adlandırılır ve adresinde http://www.nuget.org/packages/Microsoft.CppCoreCheckkullanılabilir. Bu paket için en az Güncelleştirme 1'in yüklü olduğu Visual Studio 2015 gerekir.
Paket ayrıca bağımlılık olarak yalnızca üst bilgi yönergesi Destek Kitaplığı (GSL) olmak üzere başka bir paket yükler. GSL, gitHub'da https://github.com/Microsoft/GSLda kullanılabilir.
Kod çözümleme kurallarının Visual Studio 2015'e yüklenme biçimi nedeniyle nuget paketini denetlemek istediğiniz her C++ projesine yüklemeniz Microsoft.CppCoreCheck
gerekir.
Visual Studio 2015'te projenize Microsoft.CppCoreCheck paketini eklemek için
Çözüm Gezgini'da, paketi eklemek istediğiniz çözümde projenizin bağlam menüsünü açmak için sağ tıklayın. NuGet paketlerini yönet'i seçerek NuGet Paket Yöneticisi açın.
NuGet Paket Yöneticisi penceresinde Microsoft.CppCoreCheck araması yapın.
Microsoft.CppCoreCheck paketini seçin ve ardından yükle düğmesini seçerek kuralları projenize ekleyin.
NuGet paketi, projenizde kod analizini etkinleştirdiğinizde çağrılan bir MSBuild
.targets
dosyası ekler. Dosya,.targets
C++ Çekirdek Denetimi kurallarını Visual Studio Code çözümleme aracına başka bir uzantı olarak ekler. Paket yüklendiğinde, yayımlanan ve deneysel kuralları etkinleştirmek veya devre dışı bırakmak için Özellik Sayfaları iletişim kutusunu kullanabilirsiniz.