Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Aperçu
Une structure ou une classe nouvellement allouée qui est initialisée membre par membre peut divulguer des informations si elle inclut des octets de remplissage.
Recommandation
Assurez-vous que tous les octets de remplissage dans le struct ou la classe sont initialisés.
Si possible, utilisez memset pour initialiser l’ensemble de la structure/classe.
Exemple :
L’exemple suivant montre un scénario où le remplissage entre les premiers et les deuxième éléments n’est pas initialisé :
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;
}
Pour le corriger, nous allons initialiser tous les octets à l’aide de 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;
}
Informations supplémentaires
Cette requête se trouve dans le référentiel Microsoft GitHub CodeQL. Consultez la page CodeQL et Static Tools Logo Test pour plus d’informations sur la façon dont les développeurs windows Driver peuvent télécharger et exécuter CodeQL.