realloc(3)の非互換性

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

だいたい、reallocとfreeだけあれば十分なのにmallocとcalloc用意してるんだから、bzeroも用意しろよ!<またそれか

2016-12-07 11:44:57
AoiMoe a.k.aしお兄P @AoiMoe

@AoiMoe あっ、freeも要らなかった。reallocだけあれば十分だった

2016-12-07 11:46:46
ELD-R-ESH-2 @eldesh

@AoiMoe reallocがあればfree要らないですよね?

2016-12-07 12:56:42
ELD-R-ESH-2 @eldesh

んー? reallocに0サイズ指定するとfreeになるって何処に書いてあるんだ?どっかの細則かな

2016-12-07 13:13:51
yoh @yohhoy

reallocはfreeの代用にはならんのでは?

2016-12-07 13:19:57
ELD-R-ESH-2 @eldesh

@AoiMoe やっぱり間違いかも知れません。sizeに0を指定するとfreeされるけど返り値として有効なアドレスが返ってくることがあるので0サイズの領域を指すポインタが永久にdeallocate出来ないのでは…?

2016-12-07 13:24:11
ELD-R-ESH-2 @eldesh

@yohhoy これ読んで出来ると思い込んでたんですが、ダメですか? | size が 0 で ptr が NULL でない場合には、 free(ptr) と等価である。 linuxjm.osdn.jp/html/LDP_man-p…

2016-12-07 13:25:08
yoh @yohhoy

@eldesh en.cppreference.com/w/c/memory/rea… ちゃんと当たってないですが こんな記述もあって微妙かも?

2016-12-07 13:27:29
ELD-R-ESH-2 @eldesh

@yohhoy なるほど。やはりdeallocateだけを行う手段は無さそうに見えますね。 私の見解> twitter.com/eldesh/status/…

2016-12-07 13:34:41
ELD-R-ESH-2 @eldesh

もうrealloc廃止にしよう(提案)

2016-12-07 13:36:03
かりやみつらない 3042798775655 @kariya_mitsuru

realloc の 0 は、今の Linux は free と等価、今の UNIN の規定では処理系定義、C 言語では規定無し、かな?

2016-12-07 13:37:47
ELD-R-ESH-2 @eldesh

@AoiMoe ハイ。ただC言語の現在のドラフトで確認したところ §7.22.3.5 realloc function deallocates the old object とは書いてあるのでそこは確実だとは思います。(返って来るモノがあやしい

2016-12-07 13:44:02
AoiMoe a.k.aしお兄P @AoiMoe

@eldesh ああなるほど、解放はされるけど何が返ってくるかは実装依存だから無視せよってことですね。既に無効な第一引数がそのまま来るかもしれないし、あるいは内部で使われたeaxレジスタのゴミが返ってくるかもしれないとか。

2016-12-07 13:55:09
ELD-R-ESH-2 @eldesh

@AoiMoe いえ。戻ってくるのはNULL、またはfree出来る有効なポインタ(ただしサイズ0なのでデリファレンス出来ない)です。どっちが来るかは実装依存だと思います。後者が来る場合はそれもfreeしたいんですけど、そこでreallocを使うとまた別のポインタが…。

2016-12-07 14:01:18
AoiMoe a.k.aしお兄P @AoiMoe

@eldesh なるほど。まあ普通に考えて、「常にfreeされる」か「常にfreeされない」かの二択でしょうね。

2016-12-07 14:05:15
AoiMoe a.k.aしお兄P @AoiMoe

あれ、C11のreallocはsizeが0の時の話は一切書いてない。

2016-12-07 14:11:59
AoiMoe a.k.aしお兄P @AoiMoe

NULLが返ってくるのは「新しいオブジェクトがアロケートできなかった場合」であり、その場合には「古いオブジェクトは開放されず、ptrは有効なまま残る」と書いてある。どう考えても実装依存ではなく「解放されない」が正しい

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

reallocも難しすぎる関数として有名だが、「sizeが0じゃないことを確認する」という注意はするけど、あえてfree関数の代わりとして明示的にsizeに0を渡すという使い方はしないから、この辺のコーナーケースは理解してなかった

2016-12-07 14:17:33
AoiMoe a.k.aしお兄P @AoiMoe

reallocがNULLを返して来たときの対処として、「上流へエラーを返す」だけではなくて、「ptrは有効のままだから別途だれかがfreeしないといけない」というのは忘れがち。まーメモリアロケーションが失敗するときはリカバリ不能なことが多いから、あんまり問題にはならんのだけど

2016-12-07 14:21:58
まかべひろし @sinpen

え、realloc()にsize=0渡すとfree()するんだ。そういう使い方したことなかったな

2016-12-07 14:22:44
tnozaki @tnozaki

POSIXではrealloc(p, 0)はfree(p)と同義だけどISO-Cではその限りではないだっけか

2016-12-07 14:23:42