MISRA C:2012 Rule 5.3

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

Описание

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

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

Объяснение

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

Реализация Polyspace

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

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

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

Переменная XX скрывает переменную XX (ФАЙЛ линии ЛИНИИ столбец 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