# V757. It is possible that an incorrect variable is compared with null after type conversion using 'dynamic_cast'.

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

Анализатор заметил в коде следующую ситуацию. Сначала указатель на базовый класс приводится к указателю на производный класс с помощью 'dynamic_cast'. А затем этот же указатель проверяется на значение 'nullptr', хотя в этом случае, скорее всего, предполагалось проверить на 'nullptr' указатель, полученный в результате приведения.

Рассмотрим следующий пример. Здесь возможна ситуация, когда указатель 'baseObj' не будет ссылаться на экземпляр класса 'Derived'. В этом случае при вызове функции произойдёт разыменование нулевого указателя. Анализатор выдаст предупреждение на этот код, указав две строки. Первая строка - это то место, где указатель проверяется на 'nullptr'. Вторая строка - это то место, где указатель на базовый класс приводится к указателю на производный класс.

    Base *baseObj;
    ....
    Derived *derivedObj = dynamic_cast<Derived *>(baseObj);
    if (baseObj != nullptr)
    {
        derivedObj->Func();
    }

Скорее всего в этом примере перед использованием предполагалось проверить на 'nullptr' указатель, полученный в результате приведения. Исправленный вариант кода:

    Base *baseObj;
    ....
    Derived *derivedObj = dynamic_cast<Derived *>(baseObj)
    if (derivedObj != null)
    {
        derivedObj->Func();
    }

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

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

CWE-690 CERT-EXP12-C

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