Правило 12.5 MISRA C:2012

Оператор sizeof не должен иметь операнда, который является параметром функции, объявленным как “массив типа”

Описание

Управляйте определением

Оператор sizeof не должен иметь операнда, который является параметром функции, объявленным как “массив типа”.

Объяснение

Оператор sizeof, действующий на массив обычно, возвращает размер массивов в байтах. Например, в следующем коде, sizeof(arr) возвращает размер arr в байтах.

int32_t arr[4];
size_t numberOfElements = sizeof (arr) / sizeof(arr[0]);

Однако, когда массив является параметром функции, он ухудшается к указателю. Оператор sizeof, действующий на массив, возвращает соответствующий размер указателя а не размер массивов.

Использование оператора sizeof на массиве, который является параметром функции обычно, указывает на непреднамеренную программную ошибку.

Обменивайтесь сообщениями в отчете

Оператор sizeof не должен иметь операнда, который является параметром функции, объявленным как “массив типа”.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

int32_t glbA[] = { 1, 2, 3, 4, 5 };
void f (int32_t A[4])
{
 		uint32_t numElements = sizeof(A) / sizeof(int32_t);  /* Non-compliant */
		uint32_t numElements_glbA = sizeof(glbA) / sizeof(glbA[0]);  /* Compliant */
}

В этом примере переменная numElements всегда имеет то же значение 1, независимо от числа членов, которые, кажется, находятся в массиве (4 в этом случае), потому что A имеет, вводят int32_t * и не int32_t[4].

Переменная numElements_glbA имеет ожидаемую долину 5, потому что оператор sizeof действует на глобальный массив glbA.

Проверяйте информацию

Группа: Выражения
Категория: обязательный
Категория AGC: обязательный
Язык: C90, C99

Введенный в R2017a