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

Данное диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

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

Массив может быть членом структуры или объединения и, следовательно, быть частью любого выражения \(value expression\)\. Поскольку при использовании массива в выражении он всегда конвертируется в указатель, в C есть возможность сформировать такой указатель на массив, который является подобъектом временного объекта\. Модификация элементов временного массива, а также доступ к ним после окончания времени жизни ведёт к [неопределённому поведению](https://pvs-studio.ru/ru/blog/terms/0066/)\.

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

```cpp
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 элементов\. Анализатор выдаст предупреждение при попытке получить доступ к этому массиву через временный объект\.

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

```cpp
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);
}
```