mrubyの話というかただのC言語の話
つい先日mrubyのissue trackingを使ってとある議論をしていました。
該当のページはこれですね。
Inappropriate assumption about the pointer address.
ここで何人かのお話にあったのは、ざっくりと以下の3つのことかなと思っています。
ちなみに内容はmrubyというよりはmruby中のコードがC言語の規格にてらして問題があるかどうかって話です。
- NULLが0でないケースがあって、その場合にpointerとvalueの変換および比較が問題になるケースがあるよってこと。
- intptr_tをvoid*に変換してさらにそれを元に戻せることが保証されてるか?
- 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の話になってるのか私にはいまいち理解できないんだけど、とりあえずフォローアップの記事ということで。