はじめに(Introduction)
N3054 Working Draft, Standard for Programming Language C
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3054.pdf
http://www.open-std.org/jtc1/sc22/wg14/docs/papers/2022/n3054.pdf
C++ nは、ISO/IEC JTC1 SC22 WG14の作業原案(Working Draft)です。
公式のISO/IEC 9899原本ではありません。
ISO/IEC JTC1 SC22 のWG14を含むいくつかのWGでは、可能な限り作業文書を公開し、幅広い意見を求めています。
ISO/IEC JTC1 SC7からISO/IEC JTC1 SC22リエゾンとして、2000年頃、C/C++の品質向上に貢献しようとした活動をしていたことがあります。その頃は、まだISO/IEC TS 17961の原案が出る前です。Cの精神が優勢で、セキュリティ対策は補助的な位置付けでした。ISO/IEC TS 17961の制定と、C/C++のライブラリ類の見直しと、C++の進化はどんどん進んでいきます。
進化の具合が、どちらに行こうとしているかは、コンパイルて実行させてみないとわかりません。C/C++の規格案の電子ファイルは、そのままコンパイルできる形式であるとよいと主張してきました。MISRA-C/C++, CERTC/C++でも同様です。MISRA-C/C++は、Example Suiteという形で、コード断片をコンパイルできる形で提供するようになりました。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(gcc, clang)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C/C++, MISRA C/C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, 箱庭プロジェクト、g++(GCC), clang++(LLVM)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。
背景(back ground)
C/C++でコンパイルエラーが出ると、途方にくれることがしばしばあります。
何回かに1回は、該当するエラーが検索できます。
ただ、条件が違っていて、そこでの修正方法では目的を達成しないこともしばしばです。いろいろな条件のコンパイルエラーとその対応方法について、広く記録することによって、いつか同じエラーに遭遇した時にやくに立つことを目指しています。
過去に何度か、自分のネットでの記録に助けられたことがあります。
また
https://researchmap.jp/joub9b3my-1797580/#_1797580
に記載したサイトのお世話になっています。
作業方針(sequence)
clangでは--std=c11, -std=C17 -std=c2xの3種類
gccでは-std=c11, -std=C17 -std=c2xの3種類
でコンパイルし、
1)コンパイルエラーを収集する。
2)コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
3)リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
4)意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。
1)だけのものから4)まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。
$ docker run -v /Users/ogawakiyoshi/n4910/n3540:/Users/ogawakiyoshi/n4910/n3540 -it kaizenjapan/n3540 /bin/bash
読書感想文
CコンパイラによるC言語規格の読書感想文として掲載しています。
コンパイル実験が、CN3242に対する、gccとclangによる感想文だということご理解いただけると幸いです。
読書感想文は人間かAIだけが作るものとは限りません。
本(電子書籍を含む)を入力として、その内容に対する文字列を読書感想文として受け止めましょう。
元の文章をあり方、コンパイルできるように電子化しておくこと、コンパイラが解釈可能な断片の作り方など。
個人開発
Cコンパイラの試験を一人でもくもくとやっているのは個人開発の一つの姿です。
<この項は書きかけです。順次追記します。>
編纂器(Compiler)
clang --version
Debian clang version 14.0.6-++20220622053050+f28c006a5895-1~exp1~20220622173135.152
Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin
gcc --version
gcc (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6.6 Constant expressions, CN3054:2022 (8) p94.c
算譜(source code)
// CN3054 Committee Draft, Standard for Programming Language C
// http://www.open-std.org/jtc1/sc22/wg14/docs/papers/2022/n3054.pdf
const char * n3054 = "6.6 Constant expressions, CN3054:2022 (8) p94.c";
// Debian clang version 14.0.5-++20220610033153+c12386ae247c-
// g++ (GCC) 12.1.0 Copyright (C) 2022 Free Software Foundation, Inc.
// Edited by Dr. OGAWA Kiyoshi. Compile procedure and results record.
// C++N3054:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
#include "N3054.h"
// 6.6 Constant expressions
// Syntax
// constant-expression: conditional-expression
// Description
// A constant expression can be evaluated during translation rather than runtime, and accordingly may be used in any place that a constant may be.
// Constraints
// Constant expressions shall not contain assignment, increment, decrement, function-call, or comma operators, except when they are contained within a subexpression that is not evaluated.130)
// Each constant expression shall evaluate to a constant that is in the range of representable values for its type.
// Semantics
// An expression that evaluates to a constant is required in several contexts. If a floating expression is evaluated in the translation environment, the arithmetic range and precision shall be at least as great as if the expression were being evaluated in the execution environment. 131)
// A compound literal with storage-class specifier constexpr is a compound literal constant. A com- pound literal constant is a constant expression with the type and value of the unnamed object.
// An identifier that is:
// — an enumeration constant,
// — a predefined constant, or
// — declared with storage-class specifier constexpr and has an object type,
// is a named constant, as is a postfix expression that applies the . member access operator to a named constant of structure or union type, even recursively. For enumeration and predefined constants, their value and type are defined in the respective clauses; for constexpr objects, such a named constant is a constant expression with the type and value of the declared object.
// An integer constant expression132) shall have integer type and shall only have operands that are integer constants, named and compound literal constants of integer type, character constants, sizeof expressions whose results are integer constants, alignof expressions, and floating, named, or compound literal constants of arithmetic type that are the immediate operands of casts. Cast operators in an integer constant expression shall only convert arithmetic types to integer types, except as part of an operand to the typeof operators, sizeof operator, or alignof operator.
// More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:
// — a named constant,
// — a compound literal constant,
// — an arithmetic constant expression,
// 130)The operand of a typeof (6.7.2.5), sizeof, or alignof operator is usually not evaluated (6.5.3.4).
// 131)The use of evaluation formats as characterized by FLT_EVAL_METHOD and DEC_EVAL_METHOD also applies to evaluation in the translation environment.
// 132)An integer constant expression is required in contexts such as the size of a bit-field member of a structure, the value of an enumeration constant, and the size of a non-variable length array. Further constraints that apply to the integer constant expressions used in conditional-inclusion preprocessing directives are discussed in 6.10.1.//
// — a null pointer constant,
// — an address constant, or
// — an address constant for a complete object type plus or minus an integer constant expression.
// An arithmetic constant expression shall have arithmetic type and shall only have operands that are integer constants, floating constants, named or compound literal constants of arithmetic type, char- acter constants, sizeof expressions whose results are integer constants, and alignof expressions. Cast operators in an arithmetic constant expression shall only convert arithmetic types to arithmetic types, except as part of an operand to the typeof operators, sizeof operator, or alignof operator.
// An address constant is a null pointer133), a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; it shall be created explicitly using the unary & operator or an integer constant cast to pointer type, or implicitly using an expression of array or function type.
// The array-subscript [] and member-access -> operator, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators.134)
// A structure or union constant is a named constant or compound literal constant with structure or union type, respectively.
// An implementation may accept other forms of constant expressions; however, they are not an integer constant expression.135)
// Starting from a structure or union constant, the member-access . operator may be used to form a named constant or compound literal constant as described above.
// If the member-access operator . accesses a member of a union constant, the accessed member shall be the same as the member that is initialized by the union constant’s initializer.
// The semantic rules for the evaluation of a constant expression are the same as for nonconstant expressions136) .
// Forward references: array declarators (6.7.6.2), initialization (6.7.10).
// 133)A named constant or compound literal constant of integer type and value zero is a null pointer constant. A named constant or compound literal constant with a pointer type and a value null is a null pointer but not a null pointer constant; it may only be used to initialize a pointer object if its type implicitly converts to the target type.
// 134)Named constants or compound literal constants with arithmetic type, including names of constexpr objects, are valid in offset computations such as array subscripts or in pointer casts, as long as the expressions in which they occur form integer constant expressions. In contrast, names of other objects, even if const-qualified and with static storage duration, are not valid.
// 135)Forexample, in the statementint arr_or_vla[(int)+1.0];
// , while possible to be computed by some implementations as an array with a size of one, still results in a variable length array declaration of automatic storage duration.
// 136)Thus, in the following initialization,
static int i = 2 || 1 / 0;
// the expression is a valid integer constant expression with value one.
int main() {
// PR3(st.a,st.b,st.c,d);
printf("%s\n", n3054);
return EXIT_SUCCESS;
}
編纂・実行結果(compile and go)
$ clang p94.c -std=11 -o p94l -I. -Wall
p94.c:52:23: warning: division by zero is undefined [-Wdivision-by-zero]
static int i = 2 || 1 / 0;
^ ~
p94.c:52:12: warning: unused variable 'i' [-Wunused-variable]
static int i = 2 || 1 / 0;
^
2 warnings generated.
6.6 Constant expressions, CN3054:2022 (8) p94.c
$ clang p94.c -std=17 -o p94l -I. -Wall
p94.c:52:23: warning: division by zero is undefined [-Wdivision-by-zero]
static int i = 2 || 1 / 0;
^ ~
p94.c:52:12: warning: unused variable 'i' [-Wunused-variable]
static int i = 2 || 1 / 0;
^
2 warnings generated.
6.6 Constant expressions, CN3054:2022 (8) p94.c
$ clang p94.c -std=2x -o p94l -I. -Wall
p94.c:52:23: warning: division by zero is undefined [-Wdivision-by-zero]
static int i = 2 || 1 / 0;
^ ~
p94.c:52:12: warning: unused variable 'i' [-Wunused-variable]
static int i = 2 || 1 / 0;
^
2 warnings generated.
6.6 Constant expressions, CN3054:2022 (8) p94.c
$ gcc p94.c -std=11 -o p94g -I. -Wall
p94.c:52:12: warning: 'i' defined but not used [-Wunused-variable]
52 | static int i = 2 || 1 / 0;
| ^
6.6 Constant expressions, CN3054:2022 (8) p94.c
$ gcc p94.c -std=c17 -o p94g -I. -Wall
p94.c:52:12: warning: 'i' defined but not used [-Wunused-variable]
52 | static int i = 2 || 1 / 0;
| ^
6.6 Constant expressions, CN3054:2022 (8) p94.c
$ gcc p94.c -std=c2x -o p94g -I. -Wall
p94.c:52:12: warning: 'i' defined but not used [-Wunused-variable]
52 | static int i = 2 || 1 / 0;
| ^
6.6 Constant expressions, CN3054:2022 (8) p94.c
検討事項(agenda)
意味のある出力。
応用例1 MISRA C/C++
MISRA C まとめ #include
MISRA C++ 5-0-16
応用例2 CERT C/C++
SEI CERT C++ Coding Standard AA. Bibliography 確認中。
MISRA C/C++, AUTOSAR C++, CERT C/C++とC/C++工業標準をコンパイルする
自己参考資料(self reference)
関連する自己参照以外は、こちらの先頭に移転。
C言語(C++)に対する誤解、曲解、無理解、爽快。
C言語教育はCコンパイラの写経で
C2011コンパイル一覧@researchmap
https://researchmap.jp/jownvh0ye-1797580/#_1797580
[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。
C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
dockerにclang
docker gnu(gcc/g++) and llvm(clang/clang++)
コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
astyle 使ってみた
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
文書履歴(document history)
ver. 0.01 初稿 20221021
ver. 0.02 N3054 URLリンク切れ 変更, C言語教育はCコンパイラの写経で URL追記 20221029
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.