# V774. Pointer was used after the memory was released.

Анализатор обнаружил использование указателя, который ссылается на освобождённый участок памяти. Это является неопределённым поведением и может привести к разнообразнейшим последствиям.

Некоторые возможные варианты:

- при записи по такому указателю можно испортить какой-то другой объект в памяти;
- при чтении можно получить случайные значения;
- работа с указателем приведёт к аварийному завершению программы.

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

    for (node *p = head; p != nullptr; p = p->next)
    {
      delete p;
    }

В данном примере при выполнении выражения 'p = p->next' произойдёт разыменование указателя p, удалённого в теле цикла. Необходимо было сначала вычислить это выражение и только потом освободить память. Исправленный вариант кода:

    node *p = head;
    while (p != nullptr)
    {
      node *prev = p;
      p = p->next;
      delete prev;
    }

Неприятное в таких ошибках, что долгое время может казаться, что программа работает корректно. При этом, всё может сломаться после простого рефакторинга кода, добавлении новой переменной, смены компилятора и так далее.

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

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

CWE-416 CERT-MEM30-C CERT-MEM50-CPP

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