CERT C: Rec. DCL01-C

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

Описание

Управляйте определением

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

Примеры

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

Описание

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

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

Риск

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

Фиксация

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

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

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

Группа: Rec. 02. Объявления и инициализация (DCL)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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