MISRA C:2012 Rule 12.5

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

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

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

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

Это правило прибывает из MISRA C®: 2 012 Поправок 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.

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

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

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2017a