AUTOSAR C++14 Rule A5-2-1

dynamic_cast не следует использовать

Описание

Определение правила

dynamic_cast не следует использовать.

Объяснение

Вы используете dynamic_cast для преобразования типа указателя или ссылки в класс по иерархии наследования, например, для преобразования указателя в базовый класс в указатель на производный класс. Преобразование сопряжено с накладными расходами из-за проверки типа, которая выполняется во время выполнения. Эти накладные расходы не отвечают низким требованиям к памяти, скорости и предсказуемой эффективности систем реального времени.

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

Реализация Polyspace

Polyspace® флаги всех применений dynamic_cast в вашем коде.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include<iostream>


using namespace std;

class Base
{
public:
    virtual void f()
    {
        cout << "Using Base class\n";
    }
};

class Derived1 : public Base
{
public:
    virtual void f()
    {
        cout << "Using Derived class\n";
    }
};

class Derived2 : public Derived1
{
public:
    virtual void f()
    {
        cout << "Using Derived2 class\n";
    }
};


int main()
{
    Derived2* ptrd2 = new Derived2;

    Derived1* ptrd1 = dynamic_cast<Derived1*>(ptrd2); // Noncompliant
    ptrd1 -> f();

    Base* ptrb = dynamic_cast<Base*>(ptrd2); // Noncompliant
    ptrb -> f();
}

В этом примере Base и Derived1 являются косвенными и прямыми базовыми классами Derived2 соответственно. Использование dynamic_cast к повышающей ptrd2 из типа Derived2 на Derived1 затем к Base не соответствует требованиям. Обратите внимание, что в этом случае использование dynamic_cast не является необходимым, поскольку upcast может быть выполнен путем неявного преобразования (Derived1 * ptr = ptrd2;).

Проверяйте информацию

Группа: Выражения
Категория: Консультационные, Автоматизированные
Введенный в R2020b