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 не необходимо, поскольку восходящее может быть выполнено через неявное преобразование (Derived1 * ptr = ptrd2;).

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

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