メインコンテンツ

MISRA C++:2008 Rule 2-10-2

An identifier declared in an inner scope shall not hide an identifier declared in an outer scope.

説明

ルール定義

Identifiers declared in an inner scope shall not hide an identifier declared in an outer scope. 1

根拠

このルールは、2 つの変数宣言で同じ識別子名が使用されていて、そのうちの一方が外側のスコープにあり、もう一方が内側のスコープにある状況にフラグを設定します。

int var; 
...
{
...
  int var;
...
}

内側のスコープ内での名前の使用はすべて、内側のスコープで宣言された変数を参照します。しかし、開発者またはコード レビュー担当者が、その使用法で参照されるのは外側のスコープで宣言された変数だという誤った想定をする可能性があります。

Polyspace 実装

ルール チェッカーは、以下の場合を含む、変数のシャドウイングのすべてのケースにフラグを設定します。

  • 外側と内側の両方の名前付き名前空間に同じ識別子名が使用されている。

  • クラスのデータ メンバーとクラスの外にある変数に同じ名前が使用されている。

  • 基底クラスと派生クラスのメソッドに同じ名前が使用されている。

このようなケースを除外するには、より新しい標準 AUTOSAR C++14 に切り替えて、ルール [AUTOSAR C++14 Rule A2-10-1] をチェックします。

トラブルシューティング

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

すべて展開する

int varInit = 1;

void doSomething(void);

void step(void) {
    int varInit = 0; //Noncompliant
    if(varInit)
       doSomething(); 
}

この例では、func に定義された varInit によってグローバル変数 varInit が隠されています。if 条件はローカルの varInit を参照しており、そのブロックは到達不能になっていますが、別の形になることを想定していた可能性があります。

void runSomeCheck(int);

void checkMatrix(int dim1, int dim2) {
  for(int index = 0; index < dim1; index++) {
      for(int index = 0; index < dim2; index++) { // Noncompliant
          runSomeCheck(index);
      }
  }
}

この例では、内側の for ループで定義された変数 index が外側のループの同じ名前の変数を隠します。

チェック情報

グループ: Lexical Conventions
カテゴリ: 必要

バージョン履歴

R2013b で導入


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.