Bug #5317
closedrubyのヘッダファイルを使った拡張を行う際にoff_tの宣言回避をする事が出来ない。
Description
以前、vimのif_ruby(ruby拡張)の修正を担当した時、mingw32でのuid_tの宣言とrubyに同梱されているwin32.hでの宣言に差異があり、リンクされた物がクラッシュするというバグに遭遇しました。
vimでrubyに関連するのはif_ruby.cであり、そのファイルのみがruby.hをincludeしているのですが(他のファイルもruby.hをincludeしろというのは無しです)、別のファイルはmingw32の宣言である
sys/types.h:
typedef long _off_t;
と
ruby-1.9.1/ruby/win32.h:
#define off_t __int64
https://github.com/ruby/ruby/blob/trunk/include/ruby/win32.h
が競合してしまい、構造体内にoff_t型のメンバを持つ2つのオブジェクトファイル通しでメンバ参照すると落ちるという物でした。
win32.hの方は、SIZEOF_OFF_Tが宣言されていれば#defineを回避出来ますが、このSIZEOF_OFF_Tはconfigureで吐かれるconfig.hに出力されてしまっている事から、ruby.h → ruby/ruby.h → ruby/config.h と読み込まれて(win32の場合)、結果としてSIZEOF_OFF_Tは変更出来ない事になります。
vimの場合は、LoadLibraryとGetProcAddressを使ったダイナミックローディングを使っていますが、出来れば宣言くらいは横着してヘッダファイルが使いたいので、出来ればoff_tの宣言回避が出来ない物かと思っています。
Updated by mattn (Yasuhiro Matsumoto) about 13 years ago
ぜんぜんuid_tじゃないですねw off_tでした!
以下、s/uid_t/off_t/g で置き換えて下さい。
Updated by nobu (Nobuyoshi Nakada) about 13 years ago
- Subject changed from rubyのヘッダファイルを使った拡張を行う際にuid_tの宣言回避をする事が出来ない。 to rubyのヘッダファイルを使った拡張を行う際にoff_tの宣言回避をする事が出来ない。
Updated by nobu (Nobuyoshi Nakada) about 13 years ago
Yasuhiro Matsumoto wrote:
sys/types.h:
typedef long _off_t;と
ruby-1.9.1/ruby/win32.h:
#define off_t __int64https://github.com/ruby/ruby/blob/trunk/include/ruby/win32.h
が競合してしまい、構造体内にoff_t型のメンバを持つ2つのオブジェクトファイル通しでメンバ参照すると落ちるという物でした。
ruby.hのあとで #undef off_t では回避できませんか。
Updated by mattn (Yasuhiro Matsumoto) about 13 years ago
vimのpatchとしてはそうしました。
https://groups.google.com/d/topic/vim_dev/VM_AgsF1_K4/discussion
ただ、あまりお作法が良いとは思えませんでした。
出来ればどのプロジェクトでも
#undef off_t
しなくても良い形がのぞましいと思ってます的な意味でfeature requestです。:)
Updated by naruse (Yui NARUSE) about 13 years ago
システムに _off_t があったら、__int64 ではなく _off_t を使うようにすればいいんですかね。
いや、_off64_t か?
Updated by mattn (Yasuhiro Matsumoto) about 13 years ago
システムに _off_t があったら、__int64 ではなく _off_t を使うようにすればいいんですかね。
いや、_off64_t か?
そうですね。
もしくはconfig.hのSIZEOF_OFF_T宣言を無効化出来るとか。
#ifndef SIZEOF_OFF_T
#define SIZEOF_OFF_T 8
#endif
まぁoff_tに限った話でもなさそうですが。
Updated by mame (Yusuke Endoh) over 12 years ago
- Status changed from Open to Assigned
- Assignee set to nobu (Nobuyoshi Nakada)
まあこれは何かしら対処すべきじゃないですかね。
#define off_t を入れたのはなかださんっぽい (r10720) ので、
なかださんお願いします。
--
Yusuke Endoh mame@tsg.ne.jp
Updated by mame (Yusuke Endoh) almost 12 years ago
- Tracker changed from Feature to Bug
これはバグ扱いでいいですかね。早くなんとかしてくれると嬉しいです。
もしもう直ってたら閉じてください。
--
Yusuke Endoh mame@tsg.ne.jp
Updated by mame (Yusuke Endoh) over 11 years ago
- Target version changed from 2.0.0 to 2.1.0
- ruby -v set to -
残念ながら何ともしてもらえなかったですかね。まあ回避策あるので先送りにします。
--
Yusuke Endoh mame@tsg.ne.jp
Updated by hsbt (Hiroshi SHIBATA) almost 11 years ago
- Target version changed from 2.1.0 to 2.2.0
Updated by naruse (Yui NARUSE) almost 7 years ago
- Target version deleted (
2.2.0)
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
- Status changed from Assigned to Closed
Applied in changeset git|e2ccb316b437104cd1734c378970d34f5305966d.
[Bug #5317] Use rb_off_t
instead of off_t
Get rid of the conflict with system-provided small off_t
.