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