CERT C: Rec. DCL23-C

Гарантируйте, что взаимно видимые идентификаторы являются уникальными

Описание

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

Гарантируйте, что взаимно видимые идентификаторы являются уникальными.[1]

Реализация Polyspace

Эта проверка проверяет на наличие следующих проблем:

  • Внешние идентификаторы не различаются.

  • Идентификатор в тех же возможностях видимости и пространстве имен не различен.

  • Идентификатор макроса не отличается.

  • Имя для макросов и идентификаторов не различается.

Примеры

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

Проблема

Проблема возникает, когда внешние идентификаторы имеют те же первые шесть символов для C90 или те же первые 31 символ для C99.

Чекер не помечает эту проблему в Polyspace по умолчанию® по мере анализа You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

Риск

Внешние идентификаторы являются таковыми, объявленными с глобальными возможностями или классом памяти extern.

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

Пример - C90: Первые шесть символов идентификаторов не уникальны
int engine_temperature_raw;
int engine_temperature_scaled;   /* Non-compliant */					
int engin2_temperature;          /* Compliant */	

В этом примере идентификатор engine_temperature_scaled имеет те же первые шесть символов, что и предыдущий идентификатор, engine_temperature_raw.

Пример - C99: Первые 31 символов идентификаторов не уникальны
int engine_exhaust_gas_temperature_raw;
int engine_exhaust_gas_temperature_scaled; /* Non-compliant */					

int eng_exhaust_gas_temp_raw;
int eng_exhaust_gas_temp_scaled;           /* Compliant */						

В этом примере идентификатор engine_exhaust_gas_temperature_scaled имеет те же первые 31 символ, что и предыдущий идентификатор, engine_exhaust_gas_temperature_raw.

Пример - C90: Первые шесть символов идентификаторы в разных модулях перевода различаются в одном случае
/* file1.c */
int abc = 0;
/* file2.c */
int ABC = 0; /* Non-compliant */

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

Проблема

Проблема возникает, когда вы объявляете идентификаторы в одной возможности видимости и пространстве имен, и идентификаторы имеют те же первые 31 символ в C90 или те же первые 63 символа в C99.

Риск

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

Пример - C90: Первые 31 символов идентификаторов не уникальны
extern int engine_exhaust_gas_temperature_raw;
static int engine_exhaust_gas_temperature_scaled;      /* Non-compliant */

extern double engine_exhaust_gas_temperature_raw;
static double engine_exhaust_gas_temperature2_scaled;  /* Compliant */

void func ( void )
{
  /* Not in the same scope */
  int engine_exhaust_gas_temperature_local;            /* Compliant */
}

В этом примере идентификатор engine_exhaust_gas_temperature_scaled имеет тот же 31 символ, что и предыдущий идентификатор, engine_exhaust_gas_temperature_raw.

Правило не применяется, если два идентификатора имеют одинаковые 31 символ, но имеют различные возможности. Для образца, engine_exhaust_gas_temperature_local имеет тот же 31 символ, что и engine_exhaust_gas_temperature_raw но разные возможности.

Пример - C99: Первые 63 символа идентификаторов не уникальны
extern int engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_x_raw;
static int engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_x_scale;
    /* Non-compliant */

extern int engine_gas_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx__raw;
static int engine_gas_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx__scale;
    /* Compliant */

void func ( void )
{
/* Not in the same scope */
    int engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_x_local;
          /* Compliant */
}

В этом примере идентификатор engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_x_scale имеет те же 63 символа, что и предыдущий идентификатор, engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_x_raw.

Проблема

Проблема возникает, когда вы используете идентификаторы макросов, которые имеют те же первые 31 символ в C90 или те же первые 63 символа в C99.

Риск

Имена идентификаторов макросов должны отличаться как от других идентификаторов макросов, так и от их параметров.

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

Пример - C90: Первые 31 символов имен макросов не уникальны
#define engine_exhaust_gas_temperature_raw egt_r
#define engine_exhaust_gas_temperature_scaled egt_s   /* Non-compliant */

#define engine_exhaust_gas_temp_raw egt_r
#define engine_exhaust_gas_temp_scaled egt_s          /* Compliant */

В этом примере макрос engine_exhaust_gas_temperature_scaled egt_s имеет те же первые 31 символ, что и предыдущий макрос engine_exhaust_gas_temperature_scaled.

Пример - C99: Первые 63 символа макроса Имен не уникальные

#define engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_raw egt_r
#define engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_raw_scaled egt_s
    /* Non-compliant */

/* 63 significant case-sensitive characters in macro identifiers */
#define new_engine_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_raw egt_r
#define new_engine_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_scaled egt_s
    /* Compliant */

В этом примере макрос engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx___gaz_scaled имеет те же первые 63 символа, что и предыдущий макрос engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx___raw.

Проблема

Проблема возникает, когда идентификаторы не отличаются от имен макросов.

Риск

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

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

Пример - Имена макросов совпадают с именами идентификаторов
#define Sum_1(x, y) ( ( x ) + ( y ) )
short Sum_1;                    /* Non-compliant */

#define Sum_2(x, y) ( ( x ) + ( y ) )
short x = Sum_2 ( 1, 2 );       /* Compliant */

В этом примере Sum_1 - имя идентификатора и макроса. Sum_2 используется только в качестве макроса.

Пример - C90: Первые 31 символов имени макроса совпадают с именем идентификатора
#define	   low_pressure_turbine_temperature_1 lp_tb_temp_1
static int low_pressure_turbine_temperature_2;	  /* Non-compliant  */	

В этом примере идентификатор low_pressure_turbine_temperature_2 имеет те же первые 31 символ, что и предыдущий макрос low_pressure_turbine_temperature_1.

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

Группа: Рек. 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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