exponenta event banner

CERT C: 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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