メインコンテンツ

MISRA C++:2023 Rule 6.4.1

A variable declared in an inner scope shall not hide a variable declared in an outer scope

R2024b 以降

説明

ルール定義

A variable declared in an inner scope shall not hide a variable declared in an outer scope. 1

根拠

内側のスコープと外側のスコープに同じ名前の 2 つの変数が存在する場合、その変数名を参照すると、内側のスコープの変数が使用されます。しかし、開発者またはコード レビュー担当者は、外側のスコープの変数が使用されるという誤った想定をする可能性があります。

Polyspace 実装

ルール チェッカーは、変数が同じ名前の別の変数を外側のスコープ内に隠している場合に違反を報告します。たとえば、ローカル変数の名前がグローバル変数と同じ名前である場合、ローカル変数はその有効期間の間、グローバル変数を隠します。

一方の変数の宣言に対して違反が報告され、違反の結果の詳細に含まれるイベント リストにもう一方の変数の宣言が示されます。

トラブルシューティング

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

すべて展開する

#include <stdio.h>

int fact[5]={1,2,6,24,120};

int factorial (int n)  {
    int fact=1;     // Noncompliant
    for(int i=1;i<=n;i++)
         fact*=i;
    return(fact);
 }


int factorial_fixed (int n)  {
    int f=1;       // Compliant
    for(int i=1;i<=n;i++)
        f*=i;
    return(f);
 }

関数 factorial() 内での整数変数 fact の宣言は、グローバル整数配列 fact を隠すため、準拠していません。

関数 factorial_fixed() は、ローカル変数の名前を変更することによって、この問題を修正します。

チェック情報

グループ: 基本概念
カテゴリ: 必要

バージョン履歴

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.