ПроблемаНеправильно введите используемый в 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);
}