Variable shadowing

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

Описание

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

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

Риск

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

Фиксация

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

Если затенение предназначается, и вы не хотите устранять проблему, добавлять комментарии в ваш результат или код, чтобы избежать другого анализа. Смотрите Результаты 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