回答編集履歴

3

rubato6809さんのコメントを参考に書き換え

2019/11/17 06:03

投稿

raccy
raccy

スコア21737

test CHANGED
@@ -13,6 +13,46 @@
13
13
  #include <string.h>
14
14
 
15
15
  #include <stdint.h>
16
+
17
+
18
+
19
+ // assert用
20
+
21
+ // テスト時はこのままにし、本番ではコメントアウトを外す
22
+
23
+ // #defien NDEBUG
24
+
25
+ #include <assert.h>
26
+
27
+
28
+
29
+ // 本来はヘッダ部分を分離して、それ読み込むが、
30
+
31
+ // 今回はmainの方に直接書いてあるため、個々に書く。
32
+
33
+ // mainと同じファイルに書く場合はこの部分は不要
34
+
35
+ #define SLEN 126
36
+
37
+
38
+
39
+ /**
40
+
41
+ * 受け取った文字列を二回表示にして返す。
42
+
43
+ * 引数は`SLEN`文字以下のnull終端文字列で無ければならない。
44
+
45
+ * そうで無い場合の動作は未定義とする。(何が起こるかは不明)
46
+
47
+ * この関数呼び出し時は、プログラム実行時は十分なメモリが存在し、
48
+
49
+ * malloc等の処理が失敗しない状態で無ければならない。
50
+
51
+ * メモリが不十分で、malloc等が失敗する場合の動作は未定義とする。
52
+
53
+ * これらの条件をつけた経緯はrubato6809さんのコメントを参考にすること。
54
+
55
+ */
16
56
 
17
57
 
18
58
 
@@ -38,11 +78,17 @@
38
78
 
39
79
  // その計算がオーバーフロー起こす可能性がある。
40
80
 
41
- // ためあらかじめSIZE_MAXを越えないかを確認しておく。
81
+ // 受け取る引数文字列の長さに制限が無い場合は
42
82
 
43
- // 越えたら、今回はNULL返す。
83
+ // あらかじめSIZE_MAXを越え確認しておく
44
84
 
85
+ // しかし今回は、SLENによってサイズの最大サイズが固定であるため、
86
+
87
+ // SLENによって条件を満たさない場合があるかの確認をテスト時のみ行う。
88
+
89
+ // NDEBUGが有効の場合は下記はコンパイル時に除外される。
90
+
45
- if (len > (SIZE_MAX - 1) / 2) return NULL;
91
+ assert(SERN <= (SIZE_MAX - 1) / 2)
46
92
 
47
93
 
48
94
 
@@ -60,11 +106,17 @@
60
106
 
61
107
 
62
108
 
63
- // mallocしたら必ず戻り値NULLでないかを確認する。
109
+ // メモリ十分に確保されていることが保証ければ、
64
110
 
65
- // NULLの場合は適切エラー処理をする。今回は処理を中断してNULLを返すとしている。
111
+ // mallocしたら必ず戻り値がNULLいか確認する必要がある。
66
112
 
113
+ // しかし、rubato6809さん曰く「まずエラーになりません。」となっている。
114
+
115
+ // SLENのサイズが小さくても、空きメモリが極めて少ない状態でプログラムを
116
+
67
- if (double_str == NULL) return NULL;
117
+ // 実行した等の特殊な状況においては、失敗する恐れがあるが、
118
+
119
+ // 今回は、そのような場合は動作未定義として、チェックはしないこととする。
68
120
 
69
121
 
70
122
 

2

誤字の修正

2019/11/17 06:02

投稿

raccy
raccy

スコア21737

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  // lenだけズレた位置にもう一度コピーする。
84
84
 
85
- // 終端null文字も含めるために、lenに1だけ確か数分コピーする。
85
+ // 終端null文字も含めるために、lenに+1したコピーする。
86
86
 
87
87
  memcpy(double_str + len, str, len + 1);
88
88
 

1

思い処理・・・何かの思い出が詰まっているのだろうか…

2019/11/16 10:23

投稿

raccy
raccy

スコア21737

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- // strlen()はい処理のため、呼び出しは一回のみにするように変数に入れる。
29
+ // strlen()はい処理のため、呼び出しは一回のみにするように変数に入れる。
30
30
 
31
31
  // strlen()の戻り値はsize_t型。
32
32