exponenta event banner

Переменное затенение

Переменная скрывает другую переменную с тем же именем с вложенной областью

Описание

Этот дефект возникает, когда переменная скрывает другую переменную с тем же именем во внешней области.

Например, если локальная переменная имеет то же имя, что и глобальная переменная, то локальная переменная скрывает глобальную переменную в течение срока ее действия.

Риск

Если во внутренней и внешней областях существуют две переменные с одинаковым именем, любая ссылка на имя переменной использует переменную во внутренней области. Однако разработчик или рецензент может неправильно ожидать, что переменная во внешней области была использована.

Зафиксировать

Исправление зависит от первопричины дефекта. Например, предположим, что выполняется рефакторинг функции таким образом, что вместо глобальной переменной используется локальная статическая переменная. В этом случае глобальная переменная является избыточной, и ее объявление можно удалить. Кроме того, если вы не уверены, используется ли глобальная переменная в другом месте, можно изменить имя локальной статической переменной и все ссылки в функции.

Если затенение предназначено и вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.

Примеры

развернуть все

#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.

Исправление - Изменение имени переменной

Одной из возможных корректировок является изменение имени одной из переменных, предпочтительно той, которая имеет более локальный объем.

#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
Воздействие: Низкий
Представлен в R2013b