メインコンテンツ

AUTOSAR C++14 Rule A5-10-1

A pointer to member virtual function shall only be tested for equality with null-pointer-constant

説明

ルール定義

A pointer to member virtual function shall only be tested for equality with null-pointer-constant.

根拠

メンバー バーチャル関数に対する呼び出しは、実行時にコンパイラによってその関数の最上位の派生バージョンに解決されます。等号演算子 (==) または (!=) を使用して null ポインター定数 nullptr 以外のものをメンバー バーチャル関数へのポインターと比較した場合は、結果が未指定になります。

Polyspace 実装

Polyspace® は、一方のオペランドがメンバー バーチャル関数へのポインターで、もう一方のオペランドが nullptr でない場合の (==) または (!=) 比較にフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

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

}

この例では、boolean b 内の比較の結果がルールに違反しています。これは、オペランドがメンバー バーチャル関数を指しているためです。同様に、ポインターの pr は、メンバー バーチャル関数を指しているメンバー宣言子へのポインターであり、Polyspace は、等号比較演算でのこれらのポインターの使用にフラグを設定します。ただし、pnullptr の比較は除きます。

チェック情報

グループ:
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入