Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przegląd
Nowo przypisana struktura lub klasa, która jest inicjowana człon po członie, może wyciekać informacje, jeśli zawiera ono bajty wypełnienia.
Rekomendacja
Upewnij się, że wszystkie bajty wypełnienia w strukturze lub klasie są zainicjowane.
Jeśli to możliwe, użyj memset, aby zainicjować całą strukturę/klasę.
Przykład
W poniższym przykładzie pokazano scenariusz, w którym padding między pierwszym a drugim elementem nie jest zainicjalizowany.
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;
}
Aby rozwiązać ten problem, zainicjujemy wszystkie bajty za pomocą memset:
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;
}
Dodatkowe szczegóły
To zapytanie można znaleźć w repozytorium Microsoft GitHub CodeQL. Zobacz stronę CodeQL i Static Tools Logo Test, aby uzyskać szczegółowe informacje na temat pobierania i uruchamiania CodeQL przez programistów sterowników systemu Windows.