>
>
>
V2632. MISRA. Object with temporary lif…


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

Данное диагностическое правило основано на руководстве 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);
}