mrubyの話というかただのC言語の話

つい先日mrubyのissue trackingを使ってとある議論をしていました。
該当のページはこれですね。

Inappropriate assumption about the pointer address.

ここで何人かのお話にあったのは、ざっくりと以下の3つのことかなと思っています。
ちなみに内容はmrubyというよりはmruby中のコードがC言語の規格にてらして問題があるかどうかって話です。

  1. NULLが0でないケースがあって、その場合にpointerとvalueの変換および比較が問題になるケースがあるよってこと。
  2. intptr_tをvoid*に変換してさらにそれを元に戻せることが保証されてるか?
  3. intptr_tが完全にportableでないから使いたくないよ。


で、このうち1.については、いくつかの前提を置くことでクリアしていることがわかりました。
次の2.については、C言語の規格上、intptr_tをvoid*に変換することは許可されているので問題無いわけです。
(詳しくはC言語規格書のドラフト版(リンク先PDF注意)の「7.20.1.4 Integer types capable of holding object pointers」とか読むと良いですね。)
最後の3.については、intptr_tが関数ポインタを保持できないというお話かなと思います。
これは言語規格上許されていない(pointer to functionとpointer to objectまたはpointer to voidの相互変換ができると書いていない)ので、そもそもやっちゃダメよということですね。


話の中でunion使おうぜってことになってるんですが、なぜunionの話になってるのか私にはいまいち理解できないんだけど、とりあえずフォローアップの記事ということで。