MISRA C:2012 Rule 12.5

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

Описание

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

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

Объяснение

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.

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

Группа: Выражения
Категория: обязательный
Категория AGC: обязательный
Введенный в R2017a