Aracılığıyla paylaş


PaddingByteInformationDisclosure (Windows Sürücü KoduQL Sorgusu)

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.