CERT C: Rec. DCL01-C

Не повторно используйте имена переменных в подвозможностях

Описание

Определение правила

Не повторно используйте имена переменных в подвозможностях.[1]

Реализация Polyspace

Эта проверка проверяет на затенение переменной.

Примеры

расширить все

Проблема

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

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

Риск

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

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

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

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

Проверяйте информацию

Группа: Рек. 02. Объявления и инициализация (DCL)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.