ПроблемаНеправильный тип, используемый в sizeof во время выделения памяти, возникает, когда вы используете указатель в качестве аргумента sizeof
оператор вместо использования объекта, на который указывает указатель при динамическом выделении памяти для указателя. Например, эта проблема возникает, если вы используете malloc (sizeof (type
*))
вместо malloc (sizeof (type
))
при инициализации type
*
указатель.
РискНезависимо от того, что type
означает, выражение sizeof (type
*)
всегда возвращает размер указателя на вашей платформе в байтах. Если вы непреднамеренно используете sizeof (type
*)
вместо sizeof (type
)
в вашем malloc
оператор, выделенный блок памяти может быть меньше, чем вам нужно. Эта ошибка может вызвать такие дефекты, как переполнение буфера.
Рассмотрим структуру structType
, который содержит 10 int
переменные. Если вы инициализируете structType*
указатель при помощи malloc(sizeof(structType*))
на 32-битной платформе указателю присваивается блок памяти в четыре байта. Этого блока памяти недостаточно для structType
структура, которая требует, по крайней мере 10 * sizeof(int)
байты. Поскольку необходимый размер намного больше, чем фактический назначенный размер, использование structType*
вместо structType
как аргумент sizeof
приводит к переполнению.
ЗафиксироватьПри выделении блоков памяти для указателей используйте sizeof (type
)
вместо sizeof (type
*)
. Кроме того, избегайте использования malloc
или аналогичные команды выделения памяти, которые требуют, чтобы вы задали размер блока памяти, который будет выделен. Используйте new
оператор для выделения памяти без указания размера и delete
оператор для удаления памяти.
Пример - Выделение массива при помощи sizeof
Оператор в malloc
Оператор#include <stdlib.h>
class USER{
long uid;
long euid;
int number;
int address;
int value;
};
void Noncompliant(void) {
USER* user_list;
user_list = (USER*)malloc(sizeof(USER*) * 5);
/*...*/
free(user_list);
}
В этом примере память динамически выделяется для массива user_list
который содержит пять объектов класса USER
. Этот массив требует не менее 50 байт памяти, поскольку для каждого элемента массива требуется не менее 10 байтов памяти. В malloc
оператор, USER*
используется в качестве аргумента для sizeof
оператор вместо USER
Возможно, непреднамеренно. В результате размер выделенного блока памяти может составить 20 байт, что намного меньше необходимой памяти. Эта ошибка может привести к переполнению буфера.
Коррекция - Используйте правильный типОдной из возможных коррекций является использование типа объекта, на который указывает указатель мыши, в качестве входов sizeof
. Для образца используйте USER
вместо USER*
при выделении памяти для массива USER
.
#include <stdlib.h>
class USER{
long uid;
long euid;
int number;
int address;
int value;
};
void Compliant(void) {
USER* user_list;
user_list = (USER*)malloc(sizeof(USER) * 5);
/*...*/
free(user_list);
}
Коррекция - Избегайте использования malloc
Другой возможной коррекцией является использование new
и delete
операторы для выделения памяти.
#include <stdlib.h>
class USER{
long uid;
long euid;
int number;
int address;
int value;
};
void Compliant(void) {
USER* user_list = new USER[5];
//...
delete(user_list);
}