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

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

Описание

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

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

Риск

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

Фиксация

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

Если затенение предназначается, и вы не хотите устранять проблему, добавлять комментарии в ваш результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.

Примеры

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

#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