Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Genel Bakış
Yeni tahsis edilen ve üyelerine göre başlatılan bir yapı veya sınıf, doldurma baytları içeriyorsa bilgileri sızdırabilir.
Tavsiye
Yapı veya sınıftaki tüm "padding" baytlarının başlatıldığından emin olun.
Mümkünse, tüm yapıyı/sınıfı başlatmak için memset kullanın.
Örnek
Aşağıdaki örnekte, birinci ve ikinci öğeler arasındaki doldurmanın başlatılmadığı bir senaryo gösterilmektedir:
typedef enum { Unknown = 0, Known = 1, Other = 2 } MyStructType;
struct MyStruct { MyStructType type; UINT64 id; };
MyStruct testReturn()
{
// BAD: Padding between the first and second elements not initialized.
MyStruct myBadStackStruct = { Unknown };
return myBadStackStruct;
}
Düzeltmek için memset kullanarak tüm baytları başlatacağız:
typedef enum { Unknown = 0, Known = 1, Other = 2 } MyStructType;
struct MyStruct { MyStructType type; UINT64 id; };
MyStruct testReturn()
{
// GOOD: All padding bytes initialized
MyStruct* myGoodHeapStruct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
memset(myGoodHeapStruct, 0, sizeof(struct MyStruct));
return *myGoodHeapStruct;
}
Ek ayrıntılar
Bu sorgu Microsoft GitHub CodeQL deposunda bulunabilir. Windows Sürücüsü geliştiricilerinin CodeQL'i nasıl indirip çalıştırabileceği hakkında ayrıntılı bilgi için CodeQL ve Statik Araçlar Logo Testi sayfasına bakın.