164
164
165
165
< p class ="text-right "> < small >
166
166
最終更新日時(UTC):
167
- < span itemprop ="datePublished " content ="2022-06-08T01:33:19 ">
168
- 2022年06月08日 01時33分19秒
167
+ < span itemprop ="datePublished " content ="2024-11-07T07:21:03 ">
168
+ 2024年11月07日 07時21分03秒
169
169
</ span >
170
170
< br />
171
171
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -209,8 +209,9 @@ <h3><a href="#behavior" id="behavior">動作</a></h3>
209
209
< li > < dfn id ="dfn-unspecified-behavior "> 未規定の動作</ dfn > (unspecified behavior) とされた動作に対しては、処理系は考えられる動作の内の1つを行って良い。処理系は説明書にその動作を定義しなくて良い。</ li >
210
210
< li > < dfn id ="dfn-undefined-behavior "> 未定義の動作</ dfn > (undefined behavior; 通称 UB) は、処理系が実際に行う動作について標準規格が如何なる要件もおかないことを表す。</ li >
211
211
< li > < strong > 文化圏固有動作</ strong > (locale-specific behavior) に対しては、処理系は現地の国家・文化・言語の風習に依存した動作を行う。処理系はその動作を説明書に記述する必要がある。</ li >
212
+ < li > < dfn id ="dfn-erroneous-behavior "> エラー性の動作</ dfn > (erroneous behavior; 通称 EB) は、定義された動作であるが、処理系は< a class ="cpprefjp-defined-word " data-desc ="コンパイルエラーや警告。処理系がプログラム翻訳時に提供する情報の総称 " href ="#dfn-diagnostic-message "> 診断情報</ a > を出力することが推奨される。その後に< a class ="cpprefjp-defined-word " data-desc ="未規定の動作。事前の断りなく処理系によって異なる動作をする " href ="#dfn-unspecified-behavior "> 未規定</ a > の時点で、処理系は実行を終了しても良い。</ li >
212
213
</ ul >
213
- < p > これらの用語は処理系が取りうる動作の範囲を示すものであって、例えば "< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > " という名前の具体的な動作がある訳ではないことに注意する。</ p >
214
+ < p > これらの用語は処理系が取りうる動作の範囲を示すものであって、例えば "< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > " という名前の具体的な動作がある訳ではないことに注意する。</ p >
214
215
< h3 > < a href ="#rule " id ="rule "> 規則</ a > </ h3 >
215
216
< p > 標準規格の定める要件は、処理系 (抽象機械) に対する直接の要件と、処理系が受け入れるべきプログラムが満たす< strong > 規則</ strong > (rule) で構成される。
216
217
規則には幾つかの分類があるが、C++ の標準規格内では具体的な分類基準は示されていない。C言語に倣えば以下の解釈になる。</ p >
@@ -219,8 +220,8 @@ <h3><a href="#rule" id="rule">規則</a></h3>
219
220
< li > < strong > 制約</ strong > (constraints): C言語において構文記法によって表現しきれない構文的な制限を文章で述べたもの。C++ には現れない</ li >
220
221
< li > < strong > 意味規則</ strong > (semantic rule): 構文規則と制約のどちらでもないプログラムに対する規則</ li >
221
222
</ ul >
222
- < p > 各規則には< dfn id ="dfn-no-diagnostic-required "> 診断不要</ dfn > < sup > < a href ="#note-1 " id ="note_ref-1 "> [注1]</ a > </ sup > (no diagnostic required; 通称 NDR) や「違反すると< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > になる」などの属性が明記されることがあり、
223
- < a class ="cpprefjp-defined-word " data-desc ="処理系は規則違反に対してエラーメッセージや警告を出さないかもしれない " href ="#dfn-no-diagnostic-required "> 診断不要</ a > とも< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > になるとも明記されない規則を< strong > 診断対象規則</ strong > (diagnosable rule) と呼ぶ。
223
+ < p > 各規則には< dfn id ="dfn-no-diagnostic-required "> 診断不要</ dfn > < sup > < a href ="#note-1 " id ="note_ref-1 "> [注1]</ a > </ sup > (no diagnostic required; 通称 NDR) や「違反すると< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > になる」などの属性が明記されることがあり、
224
+ < a class ="cpprefjp-defined-word " data-desc ="処理系は規則違反に対してエラーメッセージや警告を出さないかもしれない " href ="#dfn-no-diagnostic-required "> 診断不要</ a > とも< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > になるとも明記されない規則を< strong > 診断対象規則</ strong > (diagnosable rule) と呼ぶ。
224
225
< strong > 単一定義規則</ strong > (ODR; one definition rule) は "使用される変数・関数・クラスについてただ1つの定義を与えなければならない" という一連の規則である。</ p >
225
226
< ul >
226
227
< li > < dfn id ="dfn-well-formed "> 適格</ dfn > (well-formed) とはプログラムが全ての構文規則・診断対象の意味規則・単一定義規則を満たすことである</ li >
@@ -260,25 +261,25 @@ <h3><a href="#informal-terms" id="informal-terms">慣用語</a></h3>
260
261
< p > プログラムの性質についての慣用語</ p >
261
262
< ul >
262
263
< li > < strong > 処理系依存</ strong > (implementation-dependent): プログラムの動作が処理系によって異なりうること。
263
- 条件付き対応の機能を使用している場合や、< a class ="cpprefjp-defined-word " data-desc ="処理系によって事前に定めた動作をする " href ="#dfn-implementation-defined-behavior "> 処理系定義の動作</ a > ・< a class ="cpprefjp-defined-word " data-desc ="事前の断りなく処理系によって異なる動作をする " href ="#dfn-unspecified-behavior "> 未規定の動作</ a > ・< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > ・文化圏固有動作を起こす場合、処理系限界を超える場合、規則に違反している場合を含む。</ li >
264
+ 条件付き対応の機能を使用している場合や、< a class ="cpprefjp-defined-word " data-desc ="処理系によって事前に定めた動作をする " href ="#dfn-implementation-defined-behavior "> 処理系定義の動作</ a > ・< a class ="cpprefjp-defined-word " data-desc ="事前の断りなく処理系によって異なる動作をする " href ="#dfn-unspecified-behavior "> 未規定の動作</ a > ・< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > ・文化圏固有動作を起こす場合、処理系限界を超える場合、規則に違反している場合を含む。</ li >
264
265
< li > < strong > 合法</ strong > (legal)・< strong > 違法</ strong > (illegal): これらの語はプログラムに対しても慣用されるが、具体的な意味は明確でない。
265
266
プログラムの正しさには複数の水準があるためである。
266
- < a class ="cpprefjp-defined-word " data-desc ="プログラムが文法規則・診断対象の意味規則・単一定義規則を満たすこと " href ="#dfn-well-formed "> 適格</ a > 、またはすべての規則を満たす、または< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > を含まないなどが考えられる。
267
+ < a class ="cpprefjp-defined-word " data-desc ="プログラムが文法規則・診断対象の意味規則・単一定義規則を満たすこと " href ="#dfn-well-formed "> 適格</ a > 、またはすべての規則を満たす、または< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > を含まないなどが考えられる。
267
268
曖昧さを避けるため、このサイトではプログラムに対して合法・違法という語は用いない。</ li >
268
269
</ ul >
269
270
< h2 > < a href ="#nasal-demon " id ="nasal-demon "> 「鼻から悪魔」とプログラムの可搬性</ a > </ h2 >
270
271
< p > プログラムが</ p >
271
272
< ul >
272
- < li > < a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > (UB) を引き起こすとき、</ li >
273
+ < li > < a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > (UB) を引き起こすとき、</ li >
273
274
< li > または< a class ="cpprefjp-defined-word " data-desc ="処理系は規則違反に対してエラーメッセージや警告を出さないかもしれない " href ="#dfn-no-diagnostic-required "> 診断不要</ a > (NDR) の規則に違反している</ li >
274
275
</ ul >
275
276
< p > とき、標準規格は適合する処理系に対して何らの要件も課さない。
276
277
つまり、UB または NDR 違反を含むプログラムに対して処理系がいかなる動作をしても規格には抵触しないということを表す。
277
278
例えば、このことで処理系が鼻から悪魔を出しても、それはプログラムの作者の責任であり、その処理系を責めることはできない。
278
279
この冗談を< strong > 鼻から悪魔</ strong > (nasal demons)< sup > < a href ="#cite-1 " id ="cite_ref-1 "> [1]</ a > </ sup > < sup > < a href ="#cite-2 " id ="cite_ref-2 "> [2]</ a > </ sup > と呼ぶ。鼻から悪魔を出す処理系は今のところ実在しないが、
279
- 実際の< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > として最適化の過程で或る種の「タイムトラベル」を起こす処理系は実在する< sup > < a href ="#cite-3 " id ="cite_ref-3 "> [3]</ a > </ sup > 。</ p >
280
+ 実際の< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > として最適化の過程で或る種の「タイムトラベル」を起こす処理系は実在する< sup > < a href ="#cite-3 " id ="cite_ref-3 "> [3]</ a > </ sup > 。</ p >
280
281
< p > 処理系依存のプログラムは、たとえ或る処理系の上で期待する動作をしたとしても、他の処理系でも正しく動作することは保証されない。
281
- 可搬なプログラムを書くためには、< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > を引き起こさずかつ< a class ="cpprefjp-defined-word " data-desc ="処理系は規則違反に対してエラーメッセージや警告を出さないかもしれない " href ="#dfn-no-diagnostic-required "> 診断不要</ a > の規則に違反しないプログラムを書くように心懸ける必要がある。
282
+ 可搬なプログラムを書くためには、< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > を引き起こさずかつ< a class ="cpprefjp-defined-word " data-desc ="処理系は規則違反に対してエラーメッセージや警告を出さないかもしれない " href ="#dfn-no-diagnostic-required "> 診断不要</ a > の規則に違反しないプログラムを書くように心懸ける必要がある。
282
283
更に、< a class ="cpprefjp-defined-word " data-desc ="処理系によって事前に定めた動作をする " href ="#dfn-implementation-defined-behavior "> 処理系定義の動作</ a > や< a class ="cpprefjp-defined-word " data-desc ="事前の断りなく処理系によって異なる動作をする " href ="#dfn-unspecified-behavior "> 未規定の動作</ a > は、(内部的に起こしても良いが) 外から見える動作として現れて問題を起こさないようにする必要がある。
283
284
余裕があれば、文化圏固有動作や条件付き対応の構成についても気を配ると良い。</ p >
284
285
< h2 > < a href ="#list-of-locale-specific " id ="list-of-locale-specific "> 文化圏固有動作の一覧</ a > </ h2 >
@@ -291,7 +292,7 @@ <h2>参照</h2>
291
292
< ul >
292
293
< li > < a href ="https://qiita.com/akinomyoga/items/592e5a3b8438a0c8556b " target ="_blank "> C++er は“合法”だとか“違法”だとか言いたくて仕方がないけれど、結局どういう意味? それより適合・適格・○○動作・○○規則・診断不要いろいろの関係が謎 - Qiita</ a > </ li >
293
294
< li > < a href ="http://www.c-lang.org/detail/implementation_defined_behavior.html " target ="_blank "> 処理系定義の動作</ a > - C言語の< a class ="cpprefjp-defined-word " data-desc ="処理系によって事前に定めた動作をする " href ="#dfn-implementation-defined-behavior "> 処理系定義の動作</ a > の一覧</ li >
294
- < li > < a href ="http://www.c-lang.org/detail/undefined_behavior.html " target ="_blank "> 未定義の動作</ a > - C言語の< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > の一覧</ li >
295
+ < li > < a href ="http://www.c-lang.org/detail/undefined_behavior.html " target ="_blank "> 未定義の動作</ a > - C言語の< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="#dfn-undefined-behavior "> 未定義の動作</ a > の一覧</ li >
295
296
< li > < a href ="http://www.c-lang.org/detail/unspecified_behavior.html " target ="_blank "> 未規定の動作</ a > - C言語の< a class ="cpprefjp-defined-word " data-desc ="事前の断りなく処理系によって異なる動作をする " href ="#dfn-unspecified-behavior "> 未規定の動作</ a > の一覧</ li >
296
297
< li > < a href ="http://www.c-lang.org/detail/locale_specific_behavior.html " target ="_blank "> 文化圏固有動作</ a > - C言語の文化圏固有動作の一覧</ li >
297
298
< li > < a href ="https://cpplover.blogspot.jp/2014/06/old-new-thing.html " target ="_blank "> 本の虫: Old New Thing: 未定義動作はタイムトラベルを引き起こす(他にもいろいろあるけど、タイムトラベルが一番ぶっ飛んでる)</ a > </ li >
0 commit comments