メインコンテンツ

変数のシャドウイング

入れ子にされたスコープで変数が同じ名前の別の変数を隠す

説明

この欠陥は、変数が同じ名前の別の変数を外側のスコープ内に隠している場合に発生します。

たとえば、ローカル変数の名前がグローバル変数と同じ名前である場合、ローカル変数はその有効期間の間、グローバル変数を隠します。

Polyspace® は、構造体バインディングの _ という名前の変数について欠陥を報告しません。多くの場合、この名前の変数はプレースホルダーです。

リスク

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

修正方法

修正方法は欠陥の根本原因によって異なります。たとえば、関数をリファクタリングして、ローカルの静的変数をグローバル変数の代わりに使用するとします。この場合、グローバル変数は冗長であり、その宣言を削除できます。または、グローバル変数が他の場所で使用されているか不明な場合、ローカルの静的変数の名前とその関数内のすべての参照を変更できます。

シャドウイングが意図したもので、問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

#include <stdio.h>

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

int factorial(int n)
 {
  int fact=1; 
  /*Defect: Local variable hides global array with same name */

  for(int i=1;i<=n;i++)
    fact*=i;

  return(fact);
 }

関数 factorial 内で、整数変数 fact がグローバル整数配列 fact を隠しています。

修正 — 変数名を変更

1 つの修正方法として、いずれかの変数、できればよりローカルなスコープをもつ変数の名前を変更することができます。

#include <stdio.h>

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

int factorial(int n)
 {
  /* Fix: Change name of local variable */
  int f=1; 

  for(int i=1;i<=n;i++)
    f*=i;

  return(f);
 }

結果情報

グループ: データ フロー
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: VAR_SHADOWING
影響度: Low

バージョン履歴

R2013b で導入

すべて展開する