exponenta event banner

Правило AUTOSAR C++ 14 A5-3-1

Оценка операнда оператору типа не должна содержать побочных эффектов

Описание

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

Оценка операнда оператору типа не должна содержать побочных эффектов.

Объяснение

typeid оператор оценивает операнд только в том случае, если это вызов функции, возвращающей ссылку на полиморфный тип (полиморфный тип - это тип класса, содержащий виртуальные функции). Во всех остальных случаях выражения предоставлены typeid оператор не оценивается.

Для кода, который проще поддерживать, избегайте выражений с побочными эффектами вообще при использовании typeid оператор. Вы или другой разработчик будут спасены от отслеживания ингредиентов выражения к их определениям и определения, действительно ли побочные эффекты происходят.

Внедрение Polyspace

Флаги средства проверки typeid операторы с выражениями, тип которых можно определить только во время выполнения. Предполагается, что все такие выражения имеют побочные эффекты.

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

Поиск неисправностей

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

Примеры

развернуть все

#include <iostream>
#include <typeinfo>

class Base
{
public:
    virtual ~Base();
};

class Derived: public Base
{
public:
    ~Derived();
};

Base& getObj();

void main()
{

    Base& b = getObj();

    std::cout << "Dynamic type:" << typeid(getObj()).name(); //Noncompliant
    std::cout << "Dynamic type:" << typeid(b).name(); //Compliant
}

Правило нарушается, когда typeid операнд включает вызов функции.

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

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