メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2023 Rule 6.0.1

Block scope declarations shall not be visually ambiguous

R2024b 以降

説明

ルール定義

Block scope declarations shall not be visually ambiguous. 1

根拠

ブロック スコープで関数を宣言すると、そのステートメントが関数宣言なのか、コンストラクターの呼び出しを伴うオブジェクト宣言なのかが明確にならないことがよくあります。たとえば、以下の宣言はあいまいです。

  • ResourceType aResource();

    aResourceResourceType 型の変数を返す関数なのか、ResourceType 型のオブジェクトなのか、すぐには理解できません。

  • TimeKeeper aTimeKeeper(Timer());

    aTimeKeeperTimer 型の名前なしオブジェクトで構築されるオブジェクトなのか、パラメーターとして名前なし関数ポインター型をもつ関数なのか、すぐには理解できません。この関数ポインターは、引数がなく戻り値の型が Timer の関数を参照しています。

このルールは、グローバル スコープのあいまいな宣言はチェックしません。

Polyspace 実装

ルール チェッカーは、オブジェクト宣言と間違う可能性があるあいまいな関数宣言にフラグを設定します。

トラブルシューティング

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

すべて展開する

class A {
};

void b1() {
    void func(); //Noncompliant
    A a();   //Noncompliant
}

この例では、funca の宣言は b1 のブロック スコープ内にあります。

2 つ目の関数宣言は、aA 型のオブジェクトを返す関数なのか、a 自体が A 型のオブジェクトなのかが明確でないため、混乱を招く可能性があります。

この例では、aResource はオブジェクトとして使用される可能性がありますが、宣言の構文は関数宣言を示しています。


class ResourceType {
      int aMember;
    public:
      int getMember();
};

void getResource() {
    ResourceType aResource(); //Noncompliant
}
修正 — オブジェクト宣言の {} を使用

1 つの修正方法 (C++11 以降) として、オブジェクト宣言の中かっこを使用することができます。


class ResourceType {
      int aMember;
    public:
      int getMember();
};

void getResource() {
    ResourceType aResource{};
}

チェック情報

グループ: Basic Concepts
カテゴリ: Required

バージョン履歴

R2024b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.