主要内容

CERT C:Rule PRE30-C

R2026b

Do not create a universal character name through concatenation

描述

Do not create a universal character name through concatenation. 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);  //Noncompliant
    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;
}

检查信息

组:Rule 01.预处理器 (PRE)
PQL 名称:std.cert.PRE30_C

版本历史记录

在 R2019a 中推出


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.