Skip to content

Commit f3e89a5

Browse files
committed
用語 : 「未定義動作となる」 → 「未定義動作を引き起こす」 #1348
1 parent 5eba34f commit f3e89a5

File tree

133 files changed

+166
-153
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

133 files changed

+166
-153
lines changed

.github/workflows/script/defined_word_check.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import re
77

88
DEFINED_WORD_LIST = [
9-
# ターゲット用語, その用語の許可された使用方法リスト
10-
("未定義", ["未定義動作", "未定義の動作", "動作は未定義", "未定義アドレス"]),
9+
# ターゲット用語, その用語の許可された使用方法リスト, 許可しない使用方法リスト
10+
("未定義", ["未定義動作", "未定義の動作", "動作は未定義", "未定義アドレス"], ["未定義動作となる"]),
1111
# 「未定義アドレス」は意味が明確に規定されていない。規定されたら「未定義動作」を使用した説明に差し替える
1212
# LWG issue 3906. "Undefined address" is undefined
1313
# https://cplusplus.github.io/LWG/issue3906
@@ -16,7 +16,7 @@
1616
def check_defined_word(text: str, filename: str) -> bool:
1717
found_error: bool = False
1818

19-
for word, allow_list in DEFINED_WORD_LIST:
19+
for word, allow_list, disallow_list in DEFINED_WORD_LIST:
2020
match_list = [m.start() for m in re.finditer(word, text)]
2121
if len(match_list) == 0:
2222
continue
@@ -35,7 +35,20 @@ def check_defined_word(text: str, filename: str) -> bool:
3535
if sliced == allow_word:
3636
ok_count += 1
3737

38-
if ok_count == 0:
38+
ng_count = 0
39+
for disallow_word in disallow_list:
40+
index = disallow_word.find(word)
41+
n = len(disallow_word)
42+
43+
if i - index < 0:
44+
continue
45+
46+
j = i - index
47+
sliced = text[j:j+n]
48+
if sliced == disallow_word:
49+
ng_count += 1
50+
51+
if ok_count == 0 or ng_count > 0:
3952
start = text.rfind('\n', 0, i)
4053
if start < 0:
4154
start = 0

implementation-status.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@
309309
| P2573R2: [関数宣言を削除する理由を指定できるようにする](/lang/cpp26/delete_reason.md.nolink) | `f() = delete("reason");` | 15 | 19 | | |
310310
| P2893R3: [可変引数テンプレートで`friend`宣言をできるようにする](/lang/cpp26/variadic_friends.md.nolink) | クラステンプレートの可変引数テンプレートでまとめて`friend`宣言できるようにする | 15 | | | |
311311
| P2747R2: [`constexpr`配置`new`](/lang/cpp26/constexpr_placement_new.md.nolink) | 定数式の文脈での配置`new`を許可 | | | | |
312-
| P3144R2: [不完全型へのポインタに対する`delete`を不適格とする](/lang/cpp26/deleting_a_pointer_to_an_incomplete_type_should_be_ill-formed.md.nolink) | 未定義動作となる操作をコンパイルエラーとする | 15 | 19 | | |
312+
| P3144R2: [不完全型へのポインタに対する`delete`を不適格とする](/lang/cpp26/deleting_a_pointer_to_an_incomplete_type_should_be_ill-formed.md.nolink) | 未定義動作を引き起こす操作をコンパイルエラーとする | 15 | 19 | | |
313313
| P2963R3: [制約式内での畳み込み式の順序付け](/lang/cpp26/ordering_of_constraints_involving_fold_expressions.md.nolink) | 畳み込み式では全体ではなく個別の制約を原子制約式として扱う | | 19 | | |
314314
| P0963R3: [条件式での構造化束縛の使用を許可](/lang/cpp26/structured_binding_declaration_as_a_condition.md.nolink) | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする | 15 | | | |
315315

lang/cpp11/lambda_expressions.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ member_value_ : 5
215215
result : 8
216216
```
217217
218-
ラムダ式がひとつ以上の変数を参照キャプチャしている場合、参照している変数の寿命が切れたあとの、ラムダ式のコピーと呼び出しは未定義動作となる
218+
ラムダ式がひとつ以上の変数を参照キャプチャしている場合、参照している変数の寿命が切れたあとの、ラムダ式のコピーと呼び出しは未定義動作を引き起こす
219219
220220
```cpp example
221221
#include <functional>

lang/cpp17/replacement_of_class_objects_containing_reference_members.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<!-- last lang caution -->
1111

1212
## 概要
13-
`placement new`を使用して、参照型や`const`メンバ変数を含む構造体/クラスを置き換える際、オブジェクト生存期間(lifetime)に基づいた最適化の抑止をコンパイラに伝える関数[`std::launder()`](/reference/new/launder.md)を用いることで、未定義動作となるような文脈で参照型や`const`メンバ変数へのアクセスができる。
13+
`placement new`を使用して、参照型や`const`メンバ変数を含む構造体/クラスを置き換える際、オブジェクト生存期間(lifetime)に基づいた最適化の抑止をコンパイラに伝える関数[`std::launder()`](/reference/new/launder.md)を用いることで、未定義動作を引き起こすような文脈で参照型や`const`メンバ変数へのアクセスができる。
1414

1515
## 仕様
1616
[n4659](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf) [ptr.launder]/5より
@@ -99,4 +99,4 @@ public:
9999
- [std::launder - cppreference.com](https://en.cppreference.com/w/cpp/utility/launder)
100100
- [Pointer safety and placement new](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4303.html)
101101
- [Implementability of std::optional (std :: optionalの実装可能性) ](https://groups.google.com/a/isocpp.org/forum/#!msg/std-proposals/93ebFsxCjvQ/Q5LUnO8339wJ)
102-
- [Lifetime - cppreference.com](https://en.cppreference.com/w/cpp/language/lifetime)
102+
- [Lifetime - cppreference.com](https://en.cppreference.com/w/cpp/language/lifetime)

lang/cpp20/consistent_comparison.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ bool is_equal = comp == 0.0;
107107
表にあるように3つの比較カテゴリ型はそれぞれ数学的な2項関係(順序関係)の一つと対応している。
108108

109109
三方比較演算子による比較の結果となる値は、これら比較カテゴリ型のいずれかの`prvalue`オブジェクトとなる。
110-
全てのカテゴリにおいてそのようなオブジェクトの`0`リテラル以外との比較は未定義動作となる
110+
全てのカテゴリにおいてそのようなオブジェクトの`0`リテラル以外との比較は未定義動作を引き起こす
111111

112112
これらの比較カテゴリ型は新しく追加される[`<compare>`](/reference/compare.md)ヘッダにて定義されるが、`<=>`をコード中で使用したとしても自動でインクルードされないため、`<=>`の使用も含めて比較カテゴリ型を利用する際は`<compare>`を明示的にインクルードする必要がある。
113113

lang/cpp20/efficient_sized_delete_for_variable_sized_classes.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct S {
2121

2222
// #1 Sのための operator delete オーバーロード
2323
void operator delete(void* p) {
24-
// Sのオブジェクトは破棄済みのため、未定義動作となる
24+
// Sのオブジェクトは破棄済みのため、未定義動作を引き起こす
2525
const S* self = reinterpret_cast<const S*>(p); // UB
2626
std::cout << self->str; // UB
2727

@@ -382,7 +382,7 @@ static void operator delete(void* ptr) {
382382
}
383383
```
384384

385-
しかし、前述のように、この`operator delete`実行の前に`ptr`にあるオブジェクトは破棄されているため、これは未定義動作となる
385+
しかし、前述のように、この`operator delete`実行の前に`ptr`にあるオブジェクトは破棄されているため、これは未定義動作を引き起こす
386386

387387
*destroying operator delete*は、この一番最後の`operator delete`相当のコードを安全にし、このような可変長クラスの`delete`を効率化するために導入された。
388388

@@ -437,4 +437,4 @@ struct S {
437437
438438
- [P0722R3 Efficient sized delete for variable sized classes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0722r3.html)
439439
- [P0722R1 Efficient sized delete for variable sized classes](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0722r1.html)
440-
- [CWG Issue 2248. Problems with sized delete](https://cplusplus.github.io/CWG/issues/2248)
440+
- [CWG Issue 2248. Problems with sized delete](https://cplusplus.github.io/CWG/issues/2248)

lang/cpp20/implicit_creation_of_objects_for_low-level_object_manipulation.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
## 概要
1313

14-
`new`式ではなく`malloc()`等他の方法で確保されたメモリ領域には、明示的にオブジェクトの構築を行うまで想定する型のオブジェクトは生存期間内になく、そのアクセス(読み書き)は未定義動作となる
14+
`new`式ではなく`malloc()`等他の方法で確保されたメモリ領域には、明示的にオブジェクトの構築を行うまで想定する型のオブジェクトは生存期間内になく、そのアクセス(読み書き)は未定義動作を引き起こす
1515

1616
```cpp
1717
struct X {
@@ -47,11 +47,11 @@ X *make_x() {
4747
}
4848
```
4949

50-
一番最初の`malloc()`を用いるコードは主にCのコードと共有する部分で現れることがあり、Cでは問題ないもののC++コードとしてコンパイルした場合にのみ未定義動作となる。C++20からは、この様なコードのC/C++相互運用性向上のために、明示的にオブジェクトを構築する必要がないとみなすことのできる一部の型(*implicit-lifetime types*)に限って、未初期化領域へのアクセス時に暗黙的に(自動的に)オブジェクトが構築される様になり、未定義動作を回避できる様になる。
50+
一番最初の`malloc()`を用いるコードは主にCのコードと共有する部分で現れることがあり、Cでは問題ないもののC++コードとしてコンパイルした場合にのみ未定義動作を引き起こす。C++20からは、この様なコードのC/C++相互運用性向上のために、明示的にオブジェクトを構築する必要がないとみなすことのできる一部の型(*implicit-lifetime types*)に限って、未初期化領域へのアクセス時に暗黙的に(自動的に)オブジェクトが構築される様になり、未定義動作を回避できる様になる。
5151

5252
## 問題となる他の例
5353

54-
以下の例はこの変更によって解決される例であり、C++17以前は未定義動作となるものである
54+
以下の例はこの変更によって解決される例であり、C++17以前は未定義動作を引き起こすものである
5555

5656
### `operator new`
5757

@@ -109,7 +109,7 @@ void process(Stream *stream) {
109109
}
110110
```
111111

112-
1つの領域に複数の型のオブジェクトが同時に生存期間内にあることはないため、`stream->read()`が内部で`Foo, Bar`どちらかのオブジェクトを構築していたとしても、`#1``#2`のどちらかのパスは未定義動作となる。そして、この様なコードでは多くの場合、明示的にオブジェクトが構築されることはない。
112+
1つの領域に複数の型のオブジェクトが同時に生存期間内にあることはないため、`stream->read()`が内部で`Foo, Bar`どちらかのオブジェクトを構築していたとしても、`#1``#2`のどちらかのパスは未定義動作を引き起こす。そして、この様なコードでは多くの場合、明示的にオブジェクトが構築されることはない。
113113

114114
### 動的配列の実装
115115

@@ -154,7 +154,7 @@ int main() {
154154
}
155155
```
156156
157-
C++においては、ポインタに対する演算(`+ -`など)はそのポインタが配列オブジェクトを指している場合にのみ有効となるが、例中の`#a #b #c #d #e #f`で使用されるポインタの指す領域にはいずれも配列オブジェクトが生存期間にない(正確には、非配列オブジェクトのポインタの場合は要素数1の配列として扱われるが、この例の場合はそれを満たすことはほぼなく、満たさないものとする)。そのため、そのポインタをイテレータの様に使用することは未定義動作となる
157+
C++においては、ポインタに対する演算(`+ -`など)はそのポインタが配列オブジェクトを指している場合にのみ有効となるが、例中の`#a #b #c #d #e #f`で使用されるポインタの指す領域にはいずれも配列オブジェクトが生存期間にない(正確には、非配列オブジェクトのポインタの場合は要素数1の配列として扱われるが、この例の場合はそれを満たすことはほぼなく、満たさないものとする)。そのため、そのポインタをイテレータの様に使用することは未定義動作を引き起こす
158158
159159
## 仕様
160160
@@ -224,13 +224,13 @@ C++においては、ポインタに対する演算(`+ -`など)はそのポ
224224
225225
### 暗黙的なオブジェクト構築
226226
227-
オブジェクトを暗黙的に構築する操作では、そうすることでプログラムが定義された振る舞いをするようになる(すなわち、未定義動作が回避できる)場合に、*implicit-lifetime types*の0個以上のオブジェクトを暗黙的に構築しその生存期間を開始させる。そのような、暗黙的なオブジェクト構築によってプログラムに定義された振る舞いをもたらすオブジェクトの集合が1つも存在しない場合は未定義動作となる(これは今まで通り)。逆に、そのようなオブジェクトの集合が複数存在している場合は、どのオブジェクトが暗黙的に構築されるかは未規定(これは、都度適切なオブジェクトが選択され構築されることを意図している)。
227+
オブジェクトを暗黙的に構築する操作では、そうすることでプログラムが定義された振る舞いをするようになる(すなわち、未定義動作が回避できる)場合に、*implicit-lifetime types*の0個以上のオブジェクトを暗黙的に構築しその生存期間を開始させる。そのような、暗黙的なオブジェクト構築によってプログラムに定義された振る舞いをもたらすオブジェクトの集合が1つも存在しない場合は未定義動作を引き起こす(これは今まで通り)。逆に、そのようなオブジェクトの集合が複数存在している場合は、どのオブジェクトが暗黙的に構築されるかは未規定(これは、都度適切なオブジェクトが選択され構築されることを意図している)。
228228
229229
暗黙的なオブジェクト構築が行われる場合、そのサブオブジェクトの*implicit-lifetime types*のオブジェクトも暗黙的に構築され生存期間が開始されるが、*implicit-lifetime types*ではないオブジェクトは暗黙的に構築されないため明示的な初期化が必要となる。
230230
231231
暗黙的なオブジェクト構築を行わなくてもプログラムが定義された振る舞いをする(未定義動作とならない)場合、対象の操作は暗黙的にオブジェクトを構築せず、通常の効果のみをもたらす。
232232
233-
さらに、オブジェクトを暗黙的に構築する操作の内メモリを確保する関数等一部の操作では、暗黙的なオブジェクト構築によって作成されたオブジェクトを指す適切なポインタを返すことが規定される。これらの操作においては、そのポインタ値を返すことでプログラムが定義された振る舞いをするようになる場合に、指定された領域の先頭アドレスをアドレスとする暗黙的に構築されたオブジェクトの1つを選択し、そのオブジェクトを指すポインタ値を生成しそれを返す。そのような、プログラムに定義された振る舞いをもたらすようなポインタ値が存在しない場合は未定義動作となる。逆に、そのようなポインタ値が複数存在している場合は、どのポインタ値が生成されるかは未規定。
233+
さらに、オブジェクトを暗黙的に構築する操作の内メモリを確保する関数等一部の操作では、暗黙的なオブジェクト構築によって作成されたオブジェクトを指す適切なポインタを返すことが規定される。これらの操作においては、そのポインタ値を返すことでプログラムが定義された振る舞いをするようになる場合に、指定された領域の先頭アドレスをアドレスとする暗黙的に構築されたオブジェクトの1つを選択し、そのオブジェクトを指すポインタ値を生成しそれを返す。そのような、プログラムに定義された振る舞いをもたらすようなポインタ値が存在しない場合は未定義動作を引き起こす。逆に、そのようなポインタ値が複数存在している場合は、どのポインタ値が生成されるかは未規定。
234234
235235
そのようなポインタ生成を行わなくてもプログラムが定義された振る舞いをする場合、そのようなポインタ値は生成されず、対象の操作は通常のポインタ値を返す。
236236
@@ -381,7 +381,7 @@ unique_ptr<char[]> Stream::read() {
381381

382382
## この機能が必要になった背景・経緯
383383

384-
例に上がっているようなコードはC言語では一般的な操作であり、Cでは問題がない。このようなコードはCとC++のコード共有部分でC++コードとして現れる可能性があり、その場合には未定義動作となる
384+
例に上がっているようなコードはC言語では一般的な操作であり、Cでは問題がない。このようなコードはCとC++のコード共有部分でC++コードとして現れる可能性があり、その場合には未定義動作を引き起こす
385385

386386
また、動的配列の例などは、`std::vector`の実装において問題となることで、そこは完全にC++のコードでありながらC++がサポートしてないことを行うことになってしまう。
387387

@@ -413,4 +413,4 @@ unique_ptr<char[]> Stream::read() {
413413
- [P0593R0 What to do with buffers that are not arrays, and undefined behavior thereof?](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0593r0.html)
414414
- [CWG Issue 2325. `std::launder` and reuse of character buffers](https://cplusplus.github.io/CWG/issues/2325.html)
415415
- [CWG Issue 2605. Implicit-lifetime aggregates](https://cplusplus.github.io/CWG/issues/2605.html)
416-
- [P1839R5 Accessing Object Representations](https://wg21.link/p1839r5)
416+
- [P1839R5 Accessing Object Representations](https://wg21.link/p1839r5)

0 commit comments

Comments
 (0)