exponenta event banner

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