exponenta event banner

MISRA C:2012 Правило 5.3

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

Описание

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

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

Объяснение

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

Внедрение Polyspace

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

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

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

Переменная XX скрывает переменную XX (FILE LINE LINE COLUMN).

Поиск неисправностей

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

Примеры

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

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 ).

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

Группа: идентификаторы
Категория: Обязательно
СМЖЛ Категория: Консультативные услуги
Представлен в R2014b