Аргумент sizeof
не совпадает с указанным типом
Неправильно введите используемый в sizeof, происходит, когда оба из следующих условий содержат:
Вы присваиваете адрес блока памяти указателю или передаете данные между двумя блоками памяти. Присвоение или копия используют оператор sizeof
.
Например, вы инициализируете указатель с помощью
или копируете данные между двумя адресами с помощью malloc(sizeof(type))
.memcpy(destination_ptr, source_ptr, sizeof(type))
Вы используете неправильный тип в качестве аргумента оператора sizeof
. Вы используете тип указателя вместо типа, на который указывает указатель.
Например, чтобы инициализировать указатель
, вы используете type*
вместо malloc(sizeof(type*))
.malloc(sizeof(type))
Независимо от того, что type
выдерживает за, выражение
всегда возвращает фиксированный размер. Возвращенный размер является размером указателя на вашей платформе в байтах. Внешний вид , sizeof(type*)
часто указывает на непреднамеренное использование. Ошибка может вызвать выделение блока памяти, который намного меньше, чем, в чем вы нуждаетесь и приводите к слабым местам, таким как переполнение буфера.sizeof(type*)
Например, примите, что structType
является структурой с десятью переменными int
. Если вы инициализируете указатель structType*
с помощью malloc(sizeof(structType*))
на 32-битной платформе, указатель присвоен блок памяти четырех байтов. Однако, чтобы быть выделенным полностью для одной переменной structType
, указатель structType*
должен указать на блок памяти байтов sizeof(structType) = 10 * sizeof(int)
. Необходимый размер намного больше, чем фактический выделенный размер четырех байтов.
Чтобы инициализировать указатель
, замените type*
в выражении инициализации указателя с sizeof(type*)
.sizeof(type)
Группа: Программирование |
Язык: C | C++ |
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки: PTR_SIZEOF_MISMATCH |
Влияние: высоко |
ID CWE: 467 |