exponenta event banner

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

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

Описание

Определение правила

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

Это правило основано на MISRA C ®: 2012 Поправка 1.

Объяснение

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

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

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

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

Дополнительное сообщение в отчете

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#include <stdint.h> 
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.

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

Группа: Выражения
Категория: Обязательно
Категория СМЖЛ: обязательная
Представлен в R2017a