realloc(3)の非互換性

こっちにまとまってますhttp://qiita.com/AoiMoe/items/0e654a81d2ee70792070
13
AoiMoe a.k.aしお兄P @AoiMoe

@tnozaki とりあえず手持ちドキュメント見ると、「C99もC11もそんな規定はない」「SUSv3では『freeと等価』と明記されてる。が、POSIX拡張のマークもないし、『ISO Cと食い違ってる場合は単なるミス』」って書いてあるので、C89とC99で違うのかも

2016-12-07 14:30:31
AoiMoe a.k.aしお兄P @AoiMoe

@tnozaki POSIX2004までは残っていて、POSIX2008では削除されてるので、単なるミスか、参照してたISO Cの違いかもしれませんな。

2016-12-07 14:35:05
tnozaki @tnozaki

@AoiMoe ですね、最新の異臭7みたらサイズゼロ要求の場合は実装依存になってますね pubs.opengroup.org/onlinepubs/969…

2016-12-07 14:36:49
AoiMoe a.k.aしお兄P @AoiMoe

@tnozaki しかし、POSIX2004のNomative ReferencesにはC99って書いてあるので、これ単なるミスかもしれませんな pubs.opengroup.org/onlinepubs/009…

2016-12-07 14:38:11
tnozaki @tnozaki

Issue7の改変履歴、defect report番号だけで変更の内容が書いてないじゃねーかksg

2016-12-07 14:38:23
SODA Noriyuki @n_soda

@tnozaki @AoiMoe あれまあ。C89(のJIS版のJIS X3010-1993)には、7.10.3.4に「sizeが0でかつptrが空ポインタでないとき,ptrが指すオブジェクトを解放する 」とありました。これ、非互換な変換な気がするけど、う~ん。

2016-12-07 14:38:32
AoiMoe a.k.aしお兄P @AoiMoe

まとめると -C95まではrealloc(ptr, 0)はfree(ptr)と等価だった -C99ではfreeと等価とは読めない -POSIXは2004まではfreeと等価だったが2008でそうじゃなくなった

2016-12-07 14:42:51
tnozaki @tnozaki

@n_soda @AoiMoe 変更履歴にある[400]って番号がおそらくDR#400かなぁと open-std.org/jtc1/sc22/wg14…

2016-12-07 14:44:29
AoiMoe a.k.aしお兄P @AoiMoe

@tnozaki @n_soda ああ、次のCでさらに「実装依存」へと修正されるパターンか

2016-12-07 14:48:07
tnozaki @tnozaki

2010年くらいにこのDR#400にまだ結論が出てない頃、*BSDのrealloc(p, 0)がfreeしないのをバグだと思って修正しようとしたんだけど、すでにISO-C側では実装依存になってたとかだったかな記憶が怪しい twitter.com/tnozaki/status…

2016-12-07 14:49:52
tnozaki @tnozaki

この時に誰かにPOSIXではrealloc(p, 0)はfree(p)と同義だけどISO-Cではその限りではない的なことを教えてもらった記憶がある

2016-12-07 14:51:32
AoiMoe a.k.aしお兄P @AoiMoe

続報: -C11が出た後DR#400が出てる → 現行ドラフトではsizeが0なら実装依存 open-std.org/jtc1/sc22/wg14…

2016-12-07 14:51:42
tnozaki @tnozaki

@AoiMoe @n_soda AMD1とか出るんですかねぇ

2016-12-07 14:56:20
tnozaki @tnozaki

もう長いこと追っかけてないので知識が古くなっている

2016-12-07 14:57:02
tnozaki @tnozaki

そださんの指摘通りfree(3)されるつもりでrealloc(p, 0)してれば使い手にしてみれば非互換ともいえるけど、実装でfree(3)しないのが存在したなら現状にあわせて緩めただけともいえるし微妙だなぁ

2016-12-07 15:06:11
tnozaki @tnozaki

だいたい*BSDがfreeしないんだからワイらが悪い

2016-12-07 15:09:59
-------------------------------------------------- @obache

realloc(p,0)とかmalloc(0)とか結果不定でいい

2016-12-07 15:12:12
MAEKAWA Masahide @cvsync

free(3) ちゃんとしような

2016-12-07 15:13:15
Shirouzu Hiroaki(白水啓章) @shirouzu

昔のP.J.プラウガー先生のエッセイで、Cの規格委員会(C89)で(政治的要因により)reallocのサイズ0指定がmalloc(0)相当にならず、free()相当になった点は返す返すも残念、という文章があったな…。 twitter.com/AoiMoe/status/…

2016-12-07 15:22:40
yoh @yohhoy

Defect Report Summary for C11 open-std.org/jtc1/sc22/wg14… Invoking realloc with a size argument equal to zero is an obsolescent feature. なるほど

2016-12-07 15:33:36
AoiMoe a.k.aしお兄P @AoiMoe

reallocの件、もう少し調べてるが、なんか身体中の穴という穴から血を吹いて死にそうな闇

2016-12-09 21:47:23
AoiMoe a.k.aしお兄P @AoiMoe

なんでRationaleにはドヤ顔で「sizeが0ならptrはデアロケートされてNULLが返る」とか書いてあんの?規格書本体はそうなってないじゃん

2016-12-09 21:51:13
tnozaki @tnozaki

C99 Rationale読むと 7.20.3.4 に確かにドヤっとrealloc(ptr, 0) frees ptr and returns null とか書いてあって大草原 -- open-std.org/jtc1/sc22/wg14…

2016-12-10 00:29:49
tnozaki @tnozaki

規格書である ISO/IEC 9899:1999 の 7.20.3.4 はAoiMoeさんの書かれている通りそんなことは書かれていない

2016-12-10 00:40:46