@tnozaki とりあえず手持ちドキュメント見ると、「C99もC11もそんな規定はない」「SUSv3では『freeと等価』と明記されてる。が、POSIX拡張のマークもないし、『ISO Cと食い違ってる場合は単なるミス』」って書いてあるので、C89とC99で違うのかも
2016-12-07 14:30:31@tnozaki POSIX2004までは残っていて、POSIX2008では削除されてるので、単なるミスか、参照してたISO Cの違いかもしれませんな。
2016-12-07 14:35:05@AoiMoe ですね、最新の異臭7みたらサイズゼロ要求の場合は実装依存になってますね pubs.opengroup.org/onlinepubs/969…
2016-12-07 14:36:49@tnozaki しかし、POSIX2004のNomative ReferencesにはC99って書いてあるので、これ単なるミスかもしれませんな pubs.opengroup.org/onlinepubs/009…
2016-12-07 14:38:11@tnozaki @AoiMoe あれまあ。C89(のJIS版のJIS X3010-1993)には、7.10.3.4に「sizeが0でかつptrが空ポインタでないとき,ptrが指すオブジェクトを解放する 」とありました。これ、非互換な変換な気がするけど、う~ん。
2016-12-07 14:38:32まとめると -C95まではrealloc(ptr, 0)はfree(ptr)と等価だった -C99ではfreeと等価とは読めない -POSIXは2004まではfreeと等価だったが2008でそうじゃなくなった
2016-12-07 14:42:51@n_soda @AoiMoe 変更履歴にある[400]って番号がおそらくDR#400かなぁと open-std.org/jtc1/sc22/wg14…
2016-12-07 14:44:292010年くらいにこのDR#400にまだ結論が出てない頃、*BSDのrealloc(p, 0)がfreeしないのをバグだと思って修正しようとしたんだけど、すでにISO-C側では実装依存になってたとかだったかな記憶が怪しい twitter.com/tnozaki/status…
2016-12-07 14:49:52この時に誰かにPOSIXではrealloc(p, 0)はfree(p)と同義だけどISO-Cではその限りではない的なことを教えてもらった記憶がある
2016-12-07 14:51:32続報: -C11が出た後DR#400が出てる → 現行ドラフトではsizeが0なら実装依存 open-std.org/jtc1/sc22/wg14…
2016-12-07 14:51:42そださんの指摘通りfree(3)されるつもりでrealloc(p, 0)してれば使い手にしてみれば非互換ともいえるけど、実装でfree(3)しないのが存在したなら現状にあわせて緩めただけともいえるし微妙だなぁ
2016-12-07 15:06:11realloc(p,0)とかmalloc(0)とか結果不定でいい
2016-12-07 15:12:12昔のP.J.プラウガー先生のエッセイで、Cの規格委員会(C89)で(政治的要因により)reallocのサイズ0指定がmalloc(0)相当にならず、free()相当になった点は返す返すも残念、という文章があったな…。 twitter.com/AoiMoe/status/…
2016-12-07 15:22:40Defect 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なんでRationaleにはドヤ顔で「sizeが0ならptrはデアロケートされてNULLが返る」とか書いてあんの?規格書本体はそうなってないじゃん
2016-12-09 21:51:13C99 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規格書である ISO/IEC 9899:1999 の 7.20.3.4 はAoiMoeさんの書かれている通りそんなことは書かれていない
2016-12-10 00:40:46