AUTOSAR C++14 Rule A5-3-1

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

Описание

Управляйте определением

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

Объяснение

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

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

Реализация Polyspace

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

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#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