İzlenecek yol: Hatalara yönelik C/C++ kodunu analiz etme
Bu kılavuzda, olası kod hataları için C/C++ kodunun nasıl çözümlenecekleri gösterilmektedir. C/C++ kodu için kod çözümleme araçlarını kullanır.
Bu kılavuzda şunları yapacaksınız:
- Yerel kodda kod analizini çalıştırın.
- Kod hatası uyarılarını analiz edin.
- Uyarıyı hata olarak değerlendirin.
- Kod hatası analizini geliştirmek için kaynak koduna açıklama ekleyin.
Önkoşullar
Yerel kodda kod analizi çalıştırma
Yerel kodda kod hatası analizini çalıştırmak için
Visual Studio'da CppDemo çözümünü açın.
CppDemo çözümü artık Çözüm Gezgini doldurur.
Oluştur menüsünde Çözümü Yeniden Derle'yi seçin.
Çözüm herhangi bir hata veya uyarı olmadan derlenir.
Çözüm Gezgini'da CodeDefects projesini seçin.
Proje menüsünde Özellikler'i seçin.
CodeDefects Özellik Sayfaları iletişim kutusu görüntülenir.
Kod Analizi özellik sayfasını seçin.
Derlemede Kod Analizini Etkinleştir özelliğini Evet olarak değiştirin. Değişikliklerinizi kaydetmek için Tamam'ı seçin.
CodeDefects projesini yeniden oluşturun.
Kod analizi uyarıları Hata Listesi penceresinde görüntülenir.
Visual Studio'da CppDemo çözümünü açın.
CppDemo çözümü artık Çözüm Gezgini doldurur.
Oluştur menüsünde Çözümü Yeniden Derle'yi seçin.
Çözüm herhangi bir hata veya uyarı olmadan derlenir.
Not
Visual Studio 2017'de IntelliSense altyapısında sahte bir uyarı
E1097 unknown attribute "no_init_all"
görebilirsiniz. Bu uyarıyı güvenle yoksayabilirsiniz.Çözüm Gezgini'da CodeDefects projesini seçin.
Proje menüsünde Özellikler'i seçin.
CodeDefects Özellik Sayfaları iletişim kutusu görüntülenir.
Kod Analizi özellik sayfasını seçin.
Derlemede Kod Analizini Etkinleştir onay kutusunu seçin. Değişikliklerinizi kaydetmek için Tamam'ı seçin.
CodeDefects projesini yeniden oluşturun.
Kod analizi uyarıları Hata Listesi penceresinde görüntülenir.
Kod hatası uyarılarını analiz etmek için
Görünüm menüsünde Hata Listesi'ni seçin.
Bu menü öğesi görünmüyor olabilir. Visual Studio'da seçtiğiniz geliştirici profiline bağlıdır. Görünüm menüsünde Diğer Windows'un üzerine gelip Hata Listesi'ni seçmeniz gerekebilir.
Hata Listesi penceresinde aşağıdaki uyarıya çift tıklayın:
C6230: Sanal olarak farklı türler arasında örtük tür atama: Boole bağlamında HRESULT kullanma.
Kod düzenleyicisi işlevinde
bool ProcessDomain()
uyarıya neden olan satırı görüntüler. Bu uyarı, booleHRESULT
sonucunun beklendiği bir 'if' deyiminde bir kullanıldığını gösterir. Bu genellikle bir hatadır, çünkü BIR işlevden HRESULT döndürüldüğündeS_OK
başarılı olduğunu gösterir, ancak boole değerine dönüştürüldüğünde olarak değerlendirilirfalse
.Bu uyarıyı düzeltmek için bir dönüş değerinin
SUCCEEDED
başarılı olduğunu belirten makroyuHRESULT
true
kullanın. Kodunuz aşağıdaki koda benzemelidir:if (SUCCEEDED(ReadUserAccount()))
Hata Listesi'nde aşağıdaki uyarıya çift tıklayın:
C6282: Yanlış işleç: Boole bağlamında sabit ataması. Bunun yerine '==' kullanmayı düşünün.
Eşitlik testi yaparak bu uyarıyı düzeltin. Kodunuz aşağıdaki koda benzer görünmelidir:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
Hata
j
Listesi'ndeki kalan C6001 uyarılarını 0'a başlataraki
düzeltin.CodeDefects projesini yeniden oluşturun.
Proje herhangi bir uyarı veya hata olmadan derlenir.
Kaynak kodu ek açıklaması uyarılarını düzeltme
annotation.c dosyasında kaynak kodu ek açıklama uyarılarını etkinleştirmek için
Çözüm Gezgini'da Ek Açıklamalar projesini seçin.
Proje menüsünde Özellikler'i seçin.
Ek Açıklamalar Özellik Sayfaları iletişim kutusu görüntülenir.
Kod Analizi özellik sayfasını seçin.
Derlemede Kod Analizini Etkinleştir özelliğini Evet olarak değiştirin. Değişikliklerinizi kaydetmek için Tamam'ı seçin.
Çözüm Gezgini'da Ek Açıklamalar projesini seçin.
Proje menüsünde Özellikler'i seçin.
Ek Açıklamalar Özellik Sayfaları iletişim kutusu görüntülenir.
Kod Analizi özellik sayfasını seçin.
Derlemede Kod Analizini Etkinleştir onay kutusunu seçin. Değişikliklerinizi kaydetmek için Tamam'ı seçin.
annotation.c dosyasındaki kaynak kodu ek açıklama uyarılarını düzeltmek için
Ek Açıklamalar projesini yeniden oluşturun.
Oluştur menüsünde Ek Açıklamalarda Kod Çözümlemesi Çalıştır'ı seçin.
Hata Listesi'nde aşağıdaki uyarıya çift tıklayın:
C6011: 'newNode' NULL işaretçisi başvurusu kaldırıyor.
Bu uyarı, çağıranın dönüş değerini denetleme hatasını gösterir. Bu durumda çağrısı
AllocateNode
NULL değer döndürebilir. içinAllocateNode
işlev bildirimi için annotations.h üst bilgi dosyasına bakın.İmleç, uyarının oluştuğu annotations.cpp dosyasındaki konumdadır.
Bu uyarıyı düzeltmek için dönüş değerini test etmek için bir 'if' deyimi kullanın. Kodunuz aşağıdaki koda benzemelidir:
LinkedList* newNode = AllocateNode(); if (nullptr != newNode) { newNode->data = value; newNode->next = 0; node->next = newNode; }
Ek Açıklamalar projesini yeniden oluşturun.
Proje herhangi bir uyarı veya hata olmadan derlenir.
Daha fazla sorun keşfetmek için kaynak kodu ek açıklamasını kullanma
Kaynak kodu ek açıklamasını kullanmak için
İşaretçi değerlerinin null olabileceğini belirtmek için resmi parametrelere ve işlevin
AddTail
dönüş değerine açıklama ekleme:_Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
Oluştur menüsünde Çözümde Kod Çözümlemesi Çalıştır'ı seçin.
Hata Listesi'nde aşağıdaki uyarıya çift tıklayın:
C6011: NULL işaretçisi 'node' başvurusu kaldırıyor.
Bu uyarı, işleve geçirilen düğümün null olabileceğini gösterir.
Bu uyarıyı düzeltmek için, geçirilen değeri test etmek için işlevin başındaki 'if' deyimini kullanın. Kodunuz aşağıdaki koda benzemelidir:
if (nullptr == node) { return nullptr; }
Oluştur menüsünde Çözümde Kod Çözümlemesi Çalıştır'ı seçin.
Proje artık herhangi bir uyarı veya hata olmadan derlenir.
Ayrıca bkz.
İzlenecek yol: Kod Kusurları için Yönetilen Kodu Analiz Etme
C/C++ için kod analizi