Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Přehled
Nově přidělená struktura nebo třída, která je inicializována po jednotlivých členech, může vést k úniku informací, pokud obsahuje vyplněné bajty.
Doporučení
Ujistěte se, že jsou inicializovány všechny vyplňovací bajty ve struktuře nebo třídě.
Pokud je to možné, použijte memset k inicializaci celé struktury/třídy.
Příklad
Následující příklad ukazuje scénář, kdy není inicializována výplň mezi prvním a druhým prvkem:
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;
}
Abychom to mohli opravit, inicializujeme všechny bajty pomocí memsetu:
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;
}
Další podrobnosti
Tento dotaz najdete v úložišti Microsoft GitHub CodeQL. Podrobnosti o tom, jak mohou vývojáři ovladačů systému Windows stáhnout a spustit CodeQL, najdete na stránce CodeQL and the Static Tools Logo Test.