# V772. Calling a 'delete' operator for a void pointer will cause undefined behavior.

Анализатор обнаружил потенциально возможную ошибку в коде, связанную с тем, что оператор 'delete' или 'delete[]' применяется для нетипизированного указателя (void*). Согласно стандарту C++20 (п. п. $7.6.2.8/3) такое применение ведет к неопределенному поведению.

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

    class Example
    {
      int *buf;

    public:
      Example(size_t n = 1024) { buf = new int[n]; }
      ~Example() { delete[] buf; }
    };

    ....
    void *ptr = new Example();
    ....
    delete ptr;
    ....

Подобный пример опасен тем, что компилятор в реальности не знает, к каком типу относится указатель 'ptr'. Поэтому, при удалении такого нетипизированного указателя могут произойти различные неприятности, например, может возникнуть утечка памяти: оператор 'delete' не вызовет деструктор объекта типа 'Example', на который ссылается указатель 'ptr'.

Если подразумевалась именно работа с нетипизированным указателем, то перед применением оператора 'delete' ('delete[]') его необходимо привести к изначальному типу, например так:

    ....
    void *ptr = new Example();
    ....
    delete (Example*)ptr;
    ....

Иначе, во избежание ошибок, рекомендуется использовать только типизированные указатели совместно с оператором 'delete' ('delete[]'):

    ....
    Example *ptr = new Example();
    ....
    delete ptr;
    ....

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

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

CWE-758 CERT-MSC15-C

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