Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V2632. MISRA. Object with temporary lifetime should not undergo array-to-pointer conversion.

07 Фев 2025

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Это правило актуально только для C.

Массивы в качестве временных объектов не должны конвертироваться в указатель. Это связано с тем, что временные объекты существуют только на время выполнения полного выражения и уничтожаются сразу после его завершения.

Массив может быть членом структуры или объединения и, следовательно, быть частью любого выражения (value expression). Поскольку при использовании массива в выражении он всегда конвертируется в указатель, в C есть возможность сформировать такой указатель на массив, который является подобъектом временного объекта. Модификация элементов временного массива, а также доступ к ним после окончания времени жизни ведёт к неопределённому поведению.

Рассмотрим пример кода:

struct S
{
  int arr[10];
};

struct S getS(void);

void foo(int const *p);

void bar()
{
  p = getS().arr;         // <=
  foo(getS().arr);        // <=

  int j = getS().arr[3];
  getS().arr[3] = j;      // <=
}

Структура S в качестве поля содержит массив arr из 10 элементов. Анализатор выдаст предупреждение при попытке получить доступ к этому массиву через временный объект.

Для исправления нужно объявить объект с нормальным временем жизни:

struct S
{
  int arr[10];
};

struct S s;
struct S getS(void);

void foo(int const* p);

void global_object()
{
  int* p = s.arr;
  s.arr[0] = 1;
  p[1] = 1;

  foo(s.arr);
}

void local_object()
{
  struct S obj = getS();
  int* p = obj.arr;
  obj.arr[0] = 1;
  p[1] = 1;

  foo(obj.arr);
}

Данная диагностика классифицируется как:

  • MISRA-C-2023-18.9