CERT C: Rule PRE30-C

Не создавайте универсальное имя символа посредством конкатенации

Описание

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

Не создавайте универсальное имя символа посредством конкатенации.[1]

Реализация Polyspace

Эта проверка проверяет имя универсального символа из конкатенации токенов.

Примеры

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

Проблема

Универсальное имя символа из конкатенации токенов происходит, когда две лексемы предварительной обработки соединяются с ## оператор создает универсальное имя символа. Универсальное имя символа начинается с \u или \U за которым следуют шестнадцатеричные цифры. Он представляет символ, не найденный в основном наборе символов.

Например, вы формируете символ \u0401 путем присоединения к двум лексемам:

#define assign(uc1, uc2, val) uc1##uc2 = val
...
assign(\u04, 01, 4);

Риск

Стандарт C11 (раздел 5.1.1.2) утверждает, что, если универсальное имя символа образовано конкатенацией токенов, поведение не определено.

Зафиксировать

Используйте универсальное имя символа непосредственно вместо создания его посредством конкатенации токенов.

Пример - Универсальное имя символа из конкатенации токена
#define assign(uc1, uc2, val) uc1##uc2 = val

int func(void) {
    int \u0401 = 0;
    assign(\u04, 01, 4); 
    return \u0401;
}

В этом примере assign макрос, когда он развернут, присоединяется к двум лексемам \u04 и 01 для формирования универсального имени символа \u0401.

Коррекция - Используйте универсальное имя символа непосредственно

Одной из возможных коррекций является использование универсального имени символа \u0401 непосредственно. Коррекция переопределяет assign макрос, чтобы он не присоединился к лексемам.

#define assign(ucn, val) ucn = val

int func(void) {
    int \u0401 = 0;
    assign(\u0401, 4); 
    return \u0401;
}

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

Группа: Правило 01. Препроцессор (PRE)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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