AUTOSAR C++14 Rule A5-10-1

Указатель на виртуальную функцию члена должен только быть протестирован на равенство с постоянным нулевым указателем

Описание

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

Указатель на виртуальную функцию члена должен только быть протестирован на равенство с постоянным нулевым указателем.

Объяснение

Вызов виртуальной функции члена разрешен компилятором во времени выполнения к наиболее выведенной версии функции. Если вы используете операторы равенства (==) или (!=) сравнить что-либо кроме нулевого указателя постоянный nullptr с указателем на виртуальную функцию члена результат не задан.

Реализация Polyspace

Polyspace® отмечает любого (==) или (!=) сравнением, где один операнд является указателем на виртуальную функцию члена и другой операнд, не является nullptr.

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

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

Примеры

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

class Base
{
public:
    virtual void f();
    void g();
};

template<typename T>
class Derived : public Base
{
public:
    void f();
};

void f()
{

    bool b = (&Derived<int>::f == &Derived<int>::f); // Noncompliant

    void (Derived<float>::* p)() = &Derived<float>::f;
    bool b1 = (&Derived<float>::f == p); // Noncompliant
    bool b2 = (p == p); // Noncompliant
    bool b3 = (p == nullptr); // Compliant

    void (Base::* q)() = &Base::g;
    bool b4 = (q == q); // Compliant

    void (Base::* r)() = &Base::f;
    bool b5 = (q == r); // Noncompliant

}

В этом примере, результате сравнения в булевом b несовместимо, потому что операнды указывают на виртуальную функцию члена. Точно так же указатели p и r указатели на операторы объявления члена, которые указывают на виртуальную функцию члена, и Polyspace отмечает их использование в операциях сравнения равенства, за исключением сравнения p к nullptr.

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

Группа: Выражения
Категория: необходимый, автоматизированный
Введенный в R2020b