# V507. Pointer to local array 'X' is stored outside the scope of this array. Such a pointer will become invalid.

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

Первый пример:

    class MyClass1
    {
      int *m_p;
      void Foo()
      {
        int localArray[33];
        ...
        m_p = localArray;
      }
    };

Массив localArray создается в стеке и массив localArray перестанет существовать по завершению функции Foo(). Однако указатель на этот массив будет сохранен в переменной m_p и может по неаккуратности использоваться, что приведет к ошибке.

Второй пример:

    struct CVariable {
      ...
      char  name[64];
    };

    void CRendererContext::RiGeometryV(int n, char *tokens[])
    {
      for (i=0;i<n;i++)
      {
        CVariable  var;
        if (parseVariable(&var, NULL, tokens[i])) {
          tokens[i]  =  var.name;
      }
    }

В этом примере указатель на массив, находящийся в переменной типа CVariable, сохраняется во внешнем массиве. В результате массив "tokens" после завершения функции RiGeometryV будет содержать указатели на уже несуществующие объекты.

Предупреждение V507 не всегда свидетельствует о наличии ошибки. Приведем сокращенный фрагмент кода, который анализатор считает опасным, но на самом деле этот код корректен:

    png_infop info_ptr = png_create_info_struct(png_ptr);
    ...
    BYTE trans[256];
    info_ptr->trans = trans;
    ...
    png_destroy_write_struct(&png_ptr, &info_ptr);

В данном коде время жизни объекта info_ptr совпадает с временем жизни trans. Объект создается внутри png_create_info_struct (), а уничтожается внутри png_destroy_write_struct(). Анализатор не может разобрать данный случай и предполагает, что объект png_ptr поступает извне. Пример кода, где анализатор был бы прав:

    void Foo()
    {
      png_infop info_ptr;
      info_ptr = GetExternInfoPng();
      BYTE trans[256];
      info_ptr->trans = trans;
    }

Это сообщение подобно сообщению V506.

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

CWE-562 CERT-DCL30-C

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