# 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);
    }

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

MISRA-C-2023-18.9