メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C: Rule PRE30-C

連結からユニバーサル文字名を作成しない

説明

ルール定義

連結からユニバーサル文字名を作成しないようにします。1

Polyspace 実装

ルール チェッカーは、"トークン連結からのユニバーサル文字名" をチェックします。

すべて展開する

問題

[トークン連結からのユニバーサル文字名] は、## 演算子で結合された 2 つの前処理トークンによってユニバーサル文字名が作成される場合に発生します。ユニバーサル文字列名は \u または \U で始まり 16 進数の桁が続きます。これは基本文字セットで見つからない文字を表します。

たとえば、2 つのトークンを結合して文字 \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 マクロは展開時に 2 つのトークン \u04 および 01 を結合し、ユニバーサル文字名 \u0401 を形成しています。

修正 — ユニバーサル文字名を直接使用

1 つの修正方法として、ユニバーサル文字名 \u0401 を直接使用します。この修正では、トークンが結合されないように assign マクロを再定義しています。

#define assign(ucn, val) ucn = val

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

チェック情報

グループ: Rule 01.プリプロセッサ (PRE)

バージョン履歴

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.