メインコンテンツ

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

MISRA C:2012 Rule 5.3

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

説明

ルール定義

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

根拠

2 つの識別子が同じ名前でスコープが異なる場合、内側のスコープの識別子は外側のスコープの識別子を隠蔽します。識別子の名前の使用はすべて内側のスコープの識別子を参照します。この動作により、開発者がスコープを追跡しておかなければならなくなり、コードの可読性は低下します。

Polyspace 実装

Polyspace® は最初の 63 文字の間に相違点があれば 2 つの名前を別個であると見なします。C90 では、相違点は最初の 31 文字の間に存在しなければなりません。C90 ルール チェックを使用するには、オプション [C 標準バージョン] (-c-version) で値 c90 を使用します。比較する文字数は、オプション -code-behavior-specifications を使用して変更できます。-code-behavior-specifications を参照してください。

非表示の識別子が標準ライブラリ ヘッダーで宣言されており、そのヘッダーを解析で指定していない場合は、この問題が表示されません。標準ライブラリ ヘッダーで宣言された識別子との競合の可能性を確認するには、Polyspace 解析でヘッダーのコンパイラ実装を指定します。Polyspace 解析への標準ライブラリ ヘッダーの指定を参照してください。

レポート内の追加のメッセージ

Variable XX hides variable XX (FILE line LINE column COLUMN).

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

typedef signed short int16_t;

void func( void )
{
    int16_t i;
    {
        int16_t i;				/* Non-compliant */
        i = 3;
    }
}

この例では、func の内側のブロックで定義されている識別子 i が、関数スコープによって識別子 i を隠します。

ステートメント i=3 の参照先がどの i であるか、すぐには理解できません。

typedef signed short int16_t;

struct astruct
{
    int16_t m;
};

extern void g ( struct astruct *p );
int16_t xyz = 0;

void func ( struct astruct xyz )  /* Non-compliant */
{
    g ( &xyz );
}

この例では、関数 func のパラメーター xyz によって、グローバル変数 xyz が隠されます。

ステートメント g (&xyz ) の参照先がどの xyz であるか、すぐには理解できません。

チェック情報

グループ: 識別子
カテゴリ: 必要
AGC カテゴリ: 推奨

バージョン履歴

R2014b で導入


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.