Wrong type used in 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).

Примеры

развернуть все

#include <stdlib.h>

void test_case_1(void) {
    char* str;

    str = (char*)malloc(sizeof(char*) * 5);
    free(str);

}

В этом примере память выделяется для символьного указателя str использование malloc из пяти символьных указателей. Однако str указатель на символ, не указатель на символьный указатель. Поэтому sizeof аргумент, char*, является неправильным.

Коррекция — совпадает с типом указателя к sizeof Аргумент

Одна возможная коррекция должна совпадать с аргументом к типу указателя. В этом примере, str символьный указатель, поэтому аргумент должен также быть символом.

#include <stdlib.h>

void test_case_1(void) {
    char* str;

    str = (char*)malloc(sizeof(char) * 5);
    free(str);

}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: PTR_SIZEOF_MISMATCH
Удар: высоко
ID CWE: 467
Введенный в R2013b