MISRA C:2012 Rule 12.5

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

Описание

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

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

Это правило получено от MISRA C®: 2012 1 о внесении изменений.

Объяснение

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

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

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

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

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

The 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