PaddingByteInformationDisclosure (драйвер Windows CodeQL Query)
Общие сведения
Только что выделенная структуру или класс, инициализированный по члену, может утекать информацию, если она включает байты заполнения.
Рекомендация
Убедитесь, что все байты заполнения в структуре или классе инициализированы.
По возможности используйте memset для инициализации всей структуры или класса.
Пример
В следующем примере показан сценарий, в котором заполнение между первым и вторым элементами не инициализируется:
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;
}
Чтобы исправить это, мы инициализируем все байты с помощью 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;
}
Дополнительные сведения
Этот запрос можно найти в репозитории Microsoft GitHub CodeQL. Дополнительные сведения о том, как разработчики драйверов Windows могут скачать и запустить CodeQL, см. на странице CodeQL и static Tools Logo Test .