Неправильно введите используемый в sizeof

Аргумент 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