MISRA C:2012 Rule 5.3

Идентификатор, объявленный во внутреннем осциллографе, не должен скрывать идентификатор, объявленный во внешнем осциллографе

Описание

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

Идентификатор, объявленный во внутреннем осциллографе, не должен скрывать идентификатор, объявленный во внешнем осциллографе.

Объяснение

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

Реализация Polyspace

Polyspace® рассматривает два имени как отличные, если существует различие между их первыми 63 символами. В C90 различие должно находиться между первым 31 символом. Чтобы использовать проверку правил C90, используйте значение c90 для опции C standard version (-c-version).

Если идентификатор, который скрыт, объявляется в Стандартном заголовке Библиотеки, и вы не обеспечиваете заголовок для анализа, проблему не показывают. Чтобы видеть потенциальные конфликты с идентификаторами, объявленными в Стандартном заголовке Библиотеки, обеспечьте свою реализацию компилятора заголовков для анализа Polyspace. Смотрите Обеспечивают Стандартные Заголовки Библиотеки для Анализа Polyspace.

Дополнительное сообщение в отчете

Переменная XX скрывает переменную XX (СТОЛБЕЦ столбца ЛИНИИ линии ФАЙЛА).

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

typedef signed short int16_t;

void func( void )
{
    int16_t i;
    {
        int16_t i;				/* Non-compliant */
        i = 3;
    }
}

В этом примере, идентификатор i заданный во внутреннем блоке в func скрывает идентификатор i с функциональным осциллографом.

Это не сразу понятно читателю который i упомянут в операторе i=3.

typedef signed short int16_t;

struct astruct
{
    int16_t m;
};

extern void g ( struct astruct *p );
int16_t xyz = 0;

void func ( struct astruct xyz )  /* Non-compliant */
{
    g ( &xyz );
}

В этом примере, параметр xyz из функционального func скрывает глобальную переменную xyz.

Это не сразу понятно читателю который xyz упомянут в операторе g (&xyz ).

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

Группа: Идентификаторы
Категория: необходимый
Категория AGC: консультация
Введенный в R2014b