exponenta event banner

Правило AUTOSAR C++ 14 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