CERT C: Rec. DCL23-C

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

Описание

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

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

Реализация Polyspace

Это средство проверки проверяет на эти проблемы:

  • Внешние идентификаторы, не отличные.

  • Идентификатор в том же осциллографе и пространстве имен, не отличном.

  • Макро-идентификатор, не отличный.

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

Примеры

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

Проблема

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

Средство проверки не отмечает эту проблему в Polyspace® по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (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.

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

Группа: 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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