# V558. Function returns pointer/reference to temporary local object.

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

В самом простом виде данное диагностическое сообщение будет выдано на следующий код:

    float *F()
    {
      float f = 1.0;
      return &f;
    }

Конечно, в таком виде ошибка вряд ли будет существовать. Рассмотрим более реальный пример кода.

    int *Foo()
    {
      int A[10];
      // ...
      if (err)
        return 0;

      int *B = new int[10];
      memcpy(B, A, sizeof(A));

      return A;
    }

Мы работали с временным массивом A. При некотором условии мы должны вернуть указатель на новый массив B. Однако из-за опечатки мы возвращаем массив A, что повлечет за собой непредсказуемое поведение программы или её аварийное завершение. Исправленный вариант кода:

    int *Foo()
    {
      ...
      int *B = new int[10];
      memcpy(B, A, sizeof(A));
      return B;
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки управления динамической памятью (выделения, освобождения, использования освобожденной памяти) [* см. примечание касательно языков C#, Java].

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

CWE-562 CERT-DCL30-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V558.