Skip to content

Commit 6421439

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent dc0873e commit 6421439

File tree

3 files changed

+85
-42
lines changed

3 files changed

+85
-42
lines changed

lang/cpp26/erroneous_behavior_for_uninitialized_reads.html

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
</head>
7070
<body>
71-
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;cpp&#34;: [&#34;cpp26&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;8ecc4d0f14af1d43fe031fb8813b2b45acc4a217&#34;, &#34;source&#34;: &#34;// 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&#34;}, {&#34;id&#34;: &#34;4a0c4737e6a08d3c9e45aa4958b4810624dce709&#34;, &#34;source&#34;: &#34;// 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&#34;}, {&#34;id&#34;: &#34;fe6d4c0bce9ea21b6d3925c0017226cdc04db58c&#34;, &#34;source&#34;: &#34;#include &lt;cassert&gt;\n#include &lt;cstring&gt;\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(&amp;d2, &amp;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&#34;}, {&#34;id&#34;: &#34;7f024e2ac7c9eafd4b7e6b43f81576d40dbc8802&#34;, &#34;source&#34;: &#34;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&#34;}], &#34;page_id&#34;: [&#34;lang&#34;, &#34;cpp26&#34;, &#34;erroneous_behavior_for_uninitialized_reads&#34;]}">
71+
<header data-kunai-mdinfo="{&#34;meta&#34;: {&#34;cpp&#34;: [&#34;cpp26&#34;]}, &#34;sources&#34;: [{&#34;id&#34;: &#34;8ecc4d0f14af1d43fe031fb8813b2b45acc4a217&#34;, &#34;source&#34;: &#34;// 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&#34;}, {&#34;id&#34;: &#34;4a0c4737e6a08d3c9e45aa4958b4810624dce709&#34;, &#34;source&#34;: &#34;// 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&#34;}, {&#34;id&#34;: &#34;4628fa335bf25255d2e6a5738e178ece84e118c2&#34;, &#34;source&#34;: &#34;#include &lt;cassert&gt;\n#include &lt;cstring&gt;\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(&amp;d2, &amp;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&#34;}, {&#34;id&#34;: &#34;7f024e2ac7c9eafd4b7e6b43f81576d40dbc8802&#34;, &#34;source&#34;: &#34;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&#34;}], &#34;page_id&#34;: [&#34;lang&#34;, &#34;cpp26&#34;, &#34;erroneous_behavior_for_uninitialized_reads&#34;]}">
7272
<nav class="navbar navbar-default" role="navigation">
7373
<div class="container-fluid">
7474
<div class="navbar-header">
@@ -188,12 +188,12 @@
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">&lt;cassert&gt;</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">&lt;cassert&gt;</a></span><span class="cp"></span>
261262
<span class="cp">#include</span> <span class="cpf"><a href="../../reference/cstring.html">&lt;cstring&gt;</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

Comments
 (0)