6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"cpp": ["cpp26"]}, "sources": [{"id": "8ecc4d0f14af1d43fe031fb8813b2b45acc4a217", "source": "// C++23\nvoid f(int) {}\n\nint main() {\n int x; // \u30c7\u30d5\u30a9\u30eb\u30c8\u521d\u671f\u5316\u3002x\u306f\u4e0d\u5b9a\u5024 (indeterminate value) \u3092\u3082\u3064\n f(x); // \u5de6\u8fba\u5024\u304b\u3089\u53f3\u8fba\u5024\u3078\u306e\u5909\u63db\u304c\u672a\u5b9a\u7fa9\u52d5\u4f5c\u3092\u5f15\u304d\u8d77\u3053\u3059\n}\n"}, {"id": "4a0c4737e6a08d3c9e45aa4958b4810624dce709", "source": "// C++26\nvoid f(int) {}\n\nint main() {\n int x; // x\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n int y [[indeterminate]]; // \u610f\u56f3\u3057\u3066\u4e0d\u5b9a\u5024\u306b\u521d\u671f\u5316\u3055\u308c\u308b\u3053\u3068\u3092\u6307\u793a\n\n f(x); // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c (\u30a8\u30e9\u30fc\u6027\u306e\u5024\u306e\u8aad\u307f\u53d6\u308a)\n f(y); // \u672a\u5b9a\u7fa9\u52d5\u4f5c (\u4e0d\u5b9a\u5024\u306e\u8aad\u307f\u53d6\u308a)\n}\n"}, {"id": "fe6d4c0bce9ea21b6d3925c0017226cdc04db58c", "source": "#include <cassert>\n#include <cstring>\n\nint g(bool b) {\n unsigned char c;\n unsigned char d = c; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3067\u306f\u306a\u3044\u3002d\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n\n assert(c == d); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c (\u6574\u6570\u6607\u683c)\n\n int e = d; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c (\u578b\u5909\u63db)\n return b ? d : 0; // b\u304ctrue\u306e\u5834\u5408\u306b\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n}\n\nint main() {\n int d1, d2;\n\n int e1 = d1; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n int e2 = d1; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n\n // \u51e6\u7406\u304c\u7d9a\u884c\u3057\u305f\u5834\u5408\u2026\n assert(e1 == e2); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3067\u306f\u306a\u3044\u3002\n // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u306e\u7d50\u679c\u3067\u751f\u6210\u3055\u308c\u305f\u5024 (e1\u3068e2) \u306f\u3001\n // \u30a8\u30e9\u30fc\u6027\u306e\u5024\u3068\u306f\u307f\u306a\u3055\u308c\u306a\u3044\n assert(e1 == d1); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n assert(e2 == d1); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n\n // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3067\u306f\u306a\u3044\u304c\n // d2\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n std::memcpy(&d2, &d1, sizeof(int));\n\n assert(e1 == d2); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n assert(e2 == d2); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n}\n"}, {"id": "7f024e2ac7c9eafd4b7e6b43f81576d40dbc8802", "source": "struct T {\n T() {}\n int x;\n};\n\nint h(T t [[indeterminate]]) {\n f(t.x); // \u5f8c\u8ff0\u306e\u95a2\u6570\u547c\u3073\u51fa\u3057\u306f\u3053\u3053\u3067\u672a\u5b9a\u7fa9\u52d5\u4f5c\u3092\u5f15\u304d\u8d77\u3053\u3059\n return 0;\n}\n\nint main() {\n int _ = h(T());\n}\n"}], "page_id": ["lang", "cpp26", "erroneous_behavior_for_uninitialized_reads"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"cpp": ["cpp26"]}, "sources": [{"id": "8ecc4d0f14af1d43fe031fb8813b2b45acc4a217", "source": "// C++23\nvoid f(int) {}\n\nint main() {\n int x; // \u30c7\u30d5\u30a9\u30eb\u30c8\u521d\u671f\u5316\u3002x\u306f\u4e0d\u5b9a\u5024 (indeterminate value) \u3092\u3082\u3064\n f(x); // \u5de6\u8fba\u5024\u304b\u3089\u53f3\u8fba\u5024\u3078\u306e\u5909\u63db\u304c\u672a\u5b9a\u7fa9\u52d5\u4f5c\u3092\u5f15\u304d\u8d77\u3053\u3059\n}\n"}, {"id": "4a0c4737e6a08d3c9e45aa4958b4810624dce709", "source": "// C++26\nvoid f(int) {}\n\nint main() {\n int x; // x\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n int y [[indeterminate]]; // \u610f\u56f3\u3057\u3066\u4e0d\u5b9a\u5024\u306b\u521d\u671f\u5316\u3055\u308c\u308b\u3053\u3068\u3092\u6307\u793a\n\n f(x); // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c (\u30a8\u30e9\u30fc\u6027\u306e\u5024\u306e\u8aad\u307f\u53d6\u308a)\n f(y); // \u672a\u5b9a\u7fa9\u52d5\u4f5c (\u4e0d\u5b9a\u5024\u306e\u8aad\u307f\u53d6\u308a)\n}\n"}, {"id": "4628fa335bf25255d2e6a5738e178ece84e118c2", "source": "#include <cassert>\n#include <cstring>\n\nint g(bool b) {\n unsigned char c;\n unsigned char d = c; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3067\u306f\u306a\u3044\u3002d\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n\n assert(c == d); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c (\u6574\u6570\u6607\u683c)\n\n int e = d; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c (\u578b\u5909\u63db)\u3002e\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n return b ? d : 0; // b\u304ctrue\u306e\u5834\u5408\u306b\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n}\n\nint main() {\n int d1, d2;\n\n int e1 = d1; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3002e1\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n int e2 = d1; // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3002e2\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n\n // \u51e6\u7406\u304c\u7d9a\u884c\u3057\u305f\u5834\u5408\u2026\n assert(e1 == e2); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n // (e1\u3068e2\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064)\n assert(e1 == d1); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n assert(e2 == d1); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n\n // \u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\u3067\u306f\u306a\u3044\u304c\n // d2\u306f\u30a8\u30e9\u30fc\u6027\u306e\u5024\u3092\u3082\u3064\n std::memcpy(&d2, &d1, sizeof(int));\n\n assert(e1 == d2); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n assert(e2 == d2); // \u5e38\u306b\u771f\u3001\u30a8\u30e9\u30fc\u6027\u52d5\u4f5c\n}\n"}, {"id": "7f024e2ac7c9eafd4b7e6b43f81576d40dbc8802", "source": "struct T {\n T() {}\n int x;\n};\n\nint h(T t [[indeterminate]]) {\n f(t.x); // \u5f8c\u8ff0\u306e\u95a2\u6570\u547c\u3073\u51fa\u3057\u306f\u3053\u3053\u3067\u672a\u5b9a\u7fa9\u52d5\u4f5c\u3092\u5f15\u304d\u8d77\u3053\u3059\n return 0;\n}\n\nint main() {\n int _ = h(T());\n}\n"}], "page_id": ["lang", "cpp26", "erroneous_behavior_for_uninitialized_reads"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
188188
189189 < p class ="text-right "> < small >
190190 最終更新日時(UTC):
191- < span itemprop ="datePublished " content ="2025-09-06T13:24:12 ">
192- 2025年09月06日 13時24分12秒
191+ < span itemprop ="datePublished " content ="2026-02-27T03:59:29 ">
192+ 2026年02月27日 03時59分29秒
193193 </ span >
194194 < br />
195195 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
196- < span itemprop ="name "> Raclamusi </ span >
196+ < span itemprop ="name "> Akira Takahashi </ span >
197197 </ span >
198198 が更新
199199 </ small > </ p >
@@ -229,7 +229,7 @@ <h2>概要</h2>
229229</ code > </ pre > </ div >
230230</ div > </ p >
231231< p > 未初期化の値は、コンパイラやターゲット環境によって定義された固定値である。コンパイラにはこの誤りを診断することが許可され、推奨されているが、誤りを無視して有効な読み取りとして扱うことも許可されている。このコードは誤りではあるが、実行ごとに異なる動作をしたり攻撃者に値を制御されたりといったリスクはなくなる。</ p >
232- < p > < a class ="cpprefjp-defined-word " data-desc ="エラー性の動作。未定義動作ではないが、誤ったプログラムの結果とされる動作。erroneous behavior (EB)。処理系によって診断や異常終了を実行することが許可されるが、処理が続行する場合もある " href ="../../implementation-compliance.html#dfn-erroneous-behavior "> エラー性動作</ a > は< a class ="cpprefjp-defined-word " data-desc ="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="../../implementation-compliance.html#dfn-undefined-behavior "> 未定義動作</ a > (一切の保証が失われる)とはちがって、動作を定めたうえで診断も可能とするものである。</ p >
232+ < p > < a class ="cpprefjp-defined-word " data-desc ="エラー性の動作。未定義動作ではないが、誤ったプログラムの結果とされる動作。erroneous behavior (EB)。処理系によって診断や異常終了を実行することが許可されるが、処理が続行する場合もある " href ="../../implementation-compliance.html#dfn-erroneous-behavior "> エラー性動作</ a > は< a class ="cpprefjp-defined-word " data-desc ="未定義の動作。処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="../../implementation-compliance.html#dfn-undefined-behavior "> 未定義動作</ a > (一切の保証が失われる)とはちがって、動作を定めたうえで診断も可能とするものである。< a class =" cpprefjp-defined-word " data-desc =" エラー性の動作。未定義動作ではないが、誤ったプログラムの結果とされる動作。erroneous behavior (EB)。処理系によって診断や異常終了を実行することが許可されるが、処理が続行する場合もある " href =" ../../implementation-compliance.html#dfn-erroneous-behavior " > エラー性動作 </ a > が起きた場合、処理系はその操作の実行時点で診断を発行すること、およびプログラムの実行を終了させることが許可されるが、必須ではない。 < /p >
233233< p > C++26では、不定値で初期化されることを明確に指示する< code > [[indeterminate]]</ code > 属性も導入され、以下のような動作となる:</ p >
234234< p > < div class ="yata " id ="4a0c4737e6a08d3c9e45aa4958b4810624dce709 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="c1 "> // C++26</ span >
235235< span class ="kt "> void</ span > < span class ="nf "> f</ span > < span class ="p "> (</ span > < span class ="kt "> int</ span > < span class ="p "> )</ span > < span class ="p "> {}</ span >
@@ -255,9 +255,10 @@ <h2>仕様</h2>
255255< li > これらのルールは、式が評価された結果として不定値が生成された場合に< a class ="cpprefjp-defined-word " data-desc ="処理系は予期せぬ動作をする可能性がある。要するに動作保証対象外。undefined behavior (UB)。 " href ="../../implementation-compliance.html#dfn-undefined-behavior "> 未定義の動作</ a > を引き起こすとする従来のルールと同様である</ li >
256256</ ul >
257257</ li >
258- < li > < a class ="cpprefjp-defined-word " data-desc ="エラー性の動作。未定義動作ではないが、誤ったプログラムの結果とされる動作。erroneous behavior (EB)。処理系によって診断や異常終了を実行することが許可されるが、処理が続行する場合もある " href ="../../implementation-compliance.html#dfn-erroneous-behavior "> エラー性動作</ a > を引き起こしたうえで生成された値は、後続の処理ではエラー性の値とはみなされない</ li >
258+ < li > prvalueを生成する組み込み演算子のオペランドが評価された結果としてエラー性の値を生成し、かつ破棄される値の式でない場合、その演算子が生成する値もエラー性の値となる</ li >
259+ < li > < a class ="cpprefjp-defined-word " data-desc ="エラー性の動作。未定義動作ではないが、誤ったプログラムの結果とされる動作。erroneous behavior (EB)。処理系によって診断や異常終了を実行することが許可されるが、処理が続行する場合もある " href ="../../implementation-compliance.html#dfn-erroneous-behavior "> エラー性動作</ a > を引き起こしたうえで生成された値もエラー性の値となる (エラー性の値は演算を通じて伝播する)</ li >
259260</ ul >
260- < p > < div class ="yata " id ="fe6d4c0bce9ea21b6d3925c0017226cdc04db58c "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../reference/cassert.html "> <cassert></ a > </ span > < span class ="cp "> </ span >
261+ < p > < div class ="yata " id ="4628fa335bf25255d2e6a5738e178ece84e118c2 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../reference/cassert.html "> <cassert></ a > </ span > < span class ="cp "> </ span >
261262< span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../reference/cstring.html "> <cstring></ a > </ span > < span class ="cp "> </ span >
262263
263264< span class ="kt "> int</ span > < span class ="nf "> g</ span > < span class ="p "> (</ span > < span class ="kt "> bool</ span > < span class ="n "> b</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
@@ -266,20 +267,19 @@ <h2>仕様</h2>
266267
267268 < span class ="n "> < a href ="../../reference/cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> c</ span > < span class ="o "> ==</ span > < span class ="n "> d</ span > < span class ="p "> );</ span > < span class ="c1 "> // 常に真、エラー性動作 (整数昇格)</ span >
268269
269- < span class ="kt "> int</ span > < span class ="n "> e</ span > < span class ="o "> =</ span > < span class ="n "> d</ span > < span class ="p "> ;</ span > < span class ="c1 "> // エラー性動作 (型変換)</ span >
270+ < span class ="kt "> int</ span > < span class ="n "> e</ span > < span class ="o "> =</ span > < span class ="n "> d</ span > < span class ="p "> ;</ span > < span class ="c1 "> // エラー性動作 (型変換)。eはエラー性の値をもつ </ span >
270271 < span class ="k "> return</ span > < span class ="n "> b</ span > < span class ="o "> ?</ span > < span class ="nl "> d</ span > < span class ="p "> :</ span > < span class ="mi "> 0</ span > < span class ="p "> ;</ span > < span class ="c1 "> // bがtrueの場合にエラー性動作</ span >
271272< span class ="p "> }</ span >
272273
273274< span class ="kt "> int</ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span > < span class ="p "> {</ span >
274275 < span class ="kt "> int</ span > < span class ="n "> d1</ span > < span class ="p "> ,</ span > < span class ="n "> d2</ span > < span class ="p "> ;</ span >
275276
276- < span class ="kt "> int</ span > < span class ="n "> e1</ span > < span class ="o "> =</ span > < span class ="n "> d1</ span > < span class ="p "> ;</ span > < span class ="c1 "> // エラー性動作</ span >
277- < span class ="kt "> int</ span > < span class ="n "> e2</ span > < span class ="o "> =</ span > < span class ="n "> d1</ span > < span class ="p "> ;</ span > < span class ="c1 "> // エラー性動作</ span >
277+ < span class ="kt "> int</ span > < span class ="n "> e1</ span > < span class ="o "> =</ span > < span class ="n "> d1</ span > < span class ="p "> ;</ span > < span class ="c1 "> // エラー性動作。e1はエラー性の値をもつ </ span >
278+ < span class ="kt "> int</ span > < span class ="n "> e2</ span > < span class ="o "> =</ span > < span class ="n "> d1</ span > < span class ="p "> ;</ span > < span class ="c1 "> // エラー性動作。e2はエラー性の値をもつ </ span >
278279
279280 < span class ="c1 "> // 処理が続行した場合…</ span >
280- < span class ="n "> < a href ="../../reference/cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> e1</ span > < span class ="o "> ==</ span > < span class ="n "> e2</ span > < span class ="p "> );</ span > < span class ="c1 "> // 常に真、エラー性動作ではない。</ span >
281- < span class ="c1 "> // エラー性動作の結果で生成された値 (e1とe2) は、</ span >
282- < span class ="c1 "> // エラー性の値とはみなされない</ span >
281+ < span class ="n "> < a href ="../../reference/cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> e1</ span > < span class ="o "> ==</ span > < span class ="n "> e2</ span > < span class ="p "> );</ span > < span class ="c1 "> // 常に真、エラー性動作</ span >
282+ < span class ="c1 "> // (e1とe2はエラー性の値をもつ)</ span >
283283 < span class ="n "> < a href ="../../reference/cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> e1</ span > < span class ="o "> ==</ span > < span class ="n "> d1</ span > < span class ="p "> );</ span > < span class ="c1 "> // 常に真、エラー性動作</ span >
284284 < span class ="n "> < a href ="../../reference/cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> e2</ span > < span class ="o "> ==</ span > < span class ="n "> d1</ span > < span class ="p "> );</ span > < span class ="c1 "> // 常に真、エラー性動作</ span >
285285
@@ -373,6 +373,7 @@ <h2>関連項目</h2>
373373< h2 > 参照</ h2 >
374374< ul >
375375< li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2795r5.html " target ="_blank "> P2795R5 Erroneous behaviour for uninitialized reads</ a > </ li >
376+ < li > < a href ="https://isocpp.org/files/papers/P3684R1.pdf " target ="_blank "> P3684R1 Fix erroneous behaviour termination semantics for C++26</ a > </ li >
376377</ ul > </ div >
377378
378379 </ div >
0 commit comments