Compartir a través de


PaddingByteInformationDisclosure (consulta codeQL del controlador de Windows)

Información general

Una estructura o clase recién asignada que se inicializa miembro por miembro puede perder información si incluye bytes de relleno.

Recomendación

Asegúrese de que se inicializan todos los bytes de relleno de la estructura o clase.

Si es posible, use memset para inicializar toda la estructura o clase.

Ejemplo

En el ejemplo siguiente se muestra un escenario en el que el relleno entre los elementos primero y segundo no se inicializa:

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;
}

Para corregirlo, inicializaremos todos los bytes mediante 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;
}

Detalles adicionales

Esta consulta se puede encontrar en el repositorio de Microsoft GitHub CodeQL. Consulte la página CodeQL y static Tools Logo Test (Prueba de logotipo de herramientas estáticas ) para obtener más información sobre cómo los desarrolladores de Controladores de Windows pueden descargar y ejecutar CodeQL.