Project

General

Profile

Bug #5317

rubyのヘッダファイルを使った拡張を行う際にoff_tの宣言回避をする事が出来ない。

Added by Yasuhiro Matsumoto about 5 years ago. Updated almost 3 years ago.

Status:
Assigned
Priority:
Normal
ruby -v:
-
Backport:
[ruby-dev:<unknown>]

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 offt;

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の宣言回避が出来ない物かと思っています。

History

#1 Updated by Yasuhiro Matsumoto about 5 years ago

ぜんぜんuid_tじゃないですねw off_tでした!
以下、s/uid_t/off_t/g で置き換えて下さい。

#2 [ruby-dev:44510] Updated by Nobuyoshi Nakada about 5 years ago

  • Subject changed from rubyのヘッダファイルを使った拡張を行う際にuid_tの宣言回避をする事が出来ない。 to rubyのヘッダファイルを使った拡張を行う際にoff_tの宣言回避をする事が出来ない。

#3 [ruby-dev:44512] Updated by Nobuyoshi Nakada about 5 years ago

Yasuhiro Matsumoto wrote:

sys/types.h:
typedef long offt;

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つのオブジェクトファイル通しでメンバ参照すると落ちるという物でした。

ruby.hのあとで #undef off_t では回避できませんか。

#4 [ruby-dev:44514] Updated by Yasuhiro Matsumoto about 5 years ago

vimのpatchとしてはそうしました。

https://groups.google.com/d/topic/vim_dev/VM_AgsF1_K4/discussion

ただ、あまりお作法が良いとは思えませんでした。
出来ればどのプロジェクトでも

#undef off_t

しなくても良い形がのぞましいと思ってます的な意味でfeature requestです。:)

#5 [ruby-dev:44515] Updated by Yui NARUSE about 5 years ago

システムに off_t があったら、int64 ではなく _off_t を使うようにすればいいんですかね。
いや、
off64_t か?

#6 [ruby-dev:44516] Updated by Yasuhiro Matsumoto about 5 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に限った話でもなさそうですが。

#7 [ruby-dev:45442] Updated by Yusuke Endoh over 4 years ago

  • Status changed from Open to Assigned
  • Assignee set to Nobuyoshi Nakada

まあこれは何かしら対処すべきじゃないですかね。

#define off_t を入れたのはなかださんっぽい (r10720) ので、
なかださんお願いします。

--
Yusuke Endoh mame@tsg.ne.jp

#8 Updated by Yusuke Endoh about 4 years ago

  • Tracker changed from Feature to Bug

これはバグ扱いでいいですかね。早くなんとかしてくれると嬉しいです。
もしもう直ってたら閉じてください。

--
Yusuke Endoh mame@tsg.ne.jp

#9 [ruby-dev:47030] Updated by Yusuke Endoh almost 4 years ago

  • Target version changed from 2.0.0 to 2.1.0
  • ruby -v set to -

残念ながら何ともしてもらえなかったですかね。まあ回避策あるので先送りにします。

--
Yusuke Endoh mame@tsg.ne.jp

#10 [ruby-dev:47928] Updated by Hiroshi SHIBATA almost 3 years ago

  • Target version changed from 2.1.0 to current: 2.2.0

Also available in: Atom PDF