diff --git a/lang/cpp26/erroneous_behavior_for_uninitialized_reads.md b/lang/cpp26/erroneous_behavior_for_uninitialized_reads.md index 70c3141bb..c90685a23 100644 --- a/lang/cpp26/erroneous_behavior_for_uninitialized_reads.md +++ b/lang/cpp26/erroneous_behavior_for_uninitialized_reads.md @@ -22,7 +22,7 @@ int main() { } ``` -未初期化の値は、コンパイラやターゲット環境によって定義された固定値である。コンパイラにはこの誤りを診断することが許可され、推奨されているが、誤りを無視して有効な読み取りとして扱うことも許可されている。このコードは誤りではあるが、未定義動作に関連する結果に遭遇するリスクはない。 +未初期化の値は、コンパイラやターゲット環境によって定義された固定値である。コンパイラにはこの誤りを診断することが許可され、推奨されているが、誤りを無視して有効な読み取りとして扱うことも許可されている。このコードは誤りではあるが、実行ごとに異なる動作をしたり攻撃者に値を制御されたりといったリスクはなくなる。 「erroneous behavior」は未定義動作とはちがって、明確に定義された動作をするがコードとして正しくない、ということを規定するものであり、処理系に対して有用な診断を提供するものである。 @@ -124,6 +124,17 @@ int main() { | 契約違反 | 契約に関する現在の策定作業では、契約違反時になにが起こるべきかという問題に直面している。「erroneous behavior」という概念は有用な回答を与えてくれる可能性がある | +## 備考 +- 以下のようなケースでは、erroneous behaviorではなく未定義動作を引き起こす可能性がある: + ```cpp + T* p; // 未初期化のポインタ。erroneous value (例としてヌルポインタ) をもつ + bool b; // 未初期化の真理値。erroneous valueとして、 + // 妥当ではないbool値 (trueでもfalseでもない値) をもつ可能性がある + + f(*p); // 間接参照は未定義動作を引き起こす + g(b); // bが妥当な値である場合にerroneous behavior、そうでなければ未定義動作 + ``` + ## 参照 - [P2795R5 Erroneous behaviour for uninitialized reads](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2795r5.html)