[#25035] 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...>

こんにちは。

16 messages 2004/12/03
[#25070] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/06

なかだです。

[#25071] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/06

In message <200412060607.iB667giF007533@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25089] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — nobu@... 2004/12/07

なかだです。

[#25090] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — Takahiro Kambe <taca@...> 2004/12/07

In message <200412070015.iB70FAiF012770@sharui.nakada.niregi.kanuma.tochigi.jp>

[#25093] Re: 拡張ライブラリへの共有ライブラリのPATHの埋め込み — akira yamada / やまだあきら <akira@...> 2004/12/07

2004-12-07 (火) の 12:27 +0900 に Takahiro Kambe さんは書きました:

[#25041] temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org>

同じ文字列をほぼ同時に IO に書き込むと、temporal locking already

13 messages 2004/12/04
[#25042] Re: temporal locking already locked string on simultaneous write — Yukihiro Matsumoto <matz@...> 2004/12/04

まつもと ゆきひろです

[#25043] Re: temporal locking already locked string on simultaneous write — Tanaka Akira <akr@...17n.org> 2004/12/04

In article <1102133507.339625.10453.nullmailer@x31.priv.netlab.jp>,

[#25096] double free problem — "Akinori MUSHA" <knu@...>

 ご無沙汰しております。

15 messages 2004/12/07
[#25099] Re: double free problem — Yukihiro Matsumoto <matz@...> 2004/12/07

Hi,

[#25101] non-stdio buffering — Tanaka Akira <akr@...17n.org>

えぇと、今回 1.9 でなにが起きたのかを私が把握している範囲でまとめてお

18 messages 2004/12/07

[#25152] 1.8 reopen problem with duplex popen — Tanaka Akira <akr@...17n.org>

次のように、1.8 で双方向 popen な IO を reopen するとエラーになること

11 messages 2004/12/10

[#25158] core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org>

NetBSD 2.0 で次のようにすると core を吐きます。

18 messages 2004/12/11
[#25159] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/11

In article <87hdmsivva.fsf@serein.a02.aist.go.jp>,

[#25163] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/12

In article <87ekhwiv7g.fsf@serein.a02.aist.go.jp>,

[#25165] Re: core dump on NetBSD 2.0 — nobu@... 2004/12/13

なかだです。

[#25167] Re: core dump on NetBSD 2.0 — Tanaka Akira <akr@...17n.org> 2004/12/13

In article <200412130040.iBD0e8Qh003275@sharui.nakada.niregi.kanuma.tochigi.jp>,

[#25193] 1.8.2 release schedule — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2004/12/14

[#25299] Re: リリース準備 — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

20 messages 2004/12/24
[#25301] Re: リリース準備 — TAKAHASHI Masayoshi <maki@...> 2004/12/24

高橋征義です。

[#25302] test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...>

In message <20041223175402.3116FC6718@lithium.ruby-lang.org>,

15 messages 2004/12/24
[#25314] Re: test_readline.rb blocks on BSD again — GOTOU Yuuzou <gotoyuzo@...> 2004/12/24

In message <20041224.131211.846943951.gotoyuzo@sawara.does.notwork.org>,

[#25315] Re: test_readline.rb blocks on BSD again — Yukihiro Matsumoto <matz@...> 2004/12/24

まつもと ゆきひろです

[#25317] Re: test_readline.rb blocks on BSD again — WATANABE Hirofumi <eban@...> 2004/12/25

わたなべです。

[ruby-dev:25195] Re: double free problem

From: Takaaki Tateishi <ttate@...>
Date: 2004-12-14 14:23:41 UTC
List: ruby-dev #25195
Yukihiro Matsumoto wrote:
>   externが設定したrealpath(3)の戻り値のtypeは"s"なので、返さ
>   れた値をfreeする。
> 
>   しかし、realpath(3)は2番目の引数を返す。つまり、戻されたポ
>   インタは「"\0" * LIBC::PATH_MAX」で作られたStringのptrであ
>   る。

これについて、意見を伺いたいと思っています。現状の実装では、戻り
値の型をconst char * にするか、あるいは、void * として受けること
で解決できます。
そして今回の問題は、Cで文字列を扱う場合にはfreeするかどうかはユー
ザが決定すべきものですが、import.rb では、そのfreeの権限を型(プロ
トタイプ)から推測させてしまっていることが根本的な原因です。
このため、このような推測をやめるという方法もとれますが、この場合、
プロトタイプ宣言をexternメソッドに与える際に、別の方法でユーザか
らfreeするかどうかを明示的に与えてもらう必要があります。どちらの
方が良いでしょうか? (私は現状のままがいいかなと思っています)
あるいは、他の方法など提案してもらえると助かります。


少し詳細に書くと以下の通りです。
# 今回の問題に限らず、不明な点などあれば聞いてください。

引数側と、戻り値側で2度同じものがfreeされるという問題なのですが、
  (1)引数側をfreeしない、
  (2)戻り値側をfreeしない
という2つの解決方法があります。
このどちらか、あるいは両方を実現するためには、
  (a)プロトタイプ宣言として const char *を指定するなど、ユーザに
     任せるという方法と、
  (b)dl側で常にfreeしない
という2つの実現方法があります。現状では、(a)を採用してchar* や
const char* などのプロトタイプ宣言から、どうするべきかを判断し
ています。

この判断として、次のことを考えています。文字列の場合、Rubyのオ
ブジェクトが保持している文字列をそのまま渡すか、あるいは、渡さ
ないかという2つの選択肢があります。プロトタイプ宣言として const
がついているということは、その文字列の中身は変更されないという
ことを意味するので、この場合にはRubyが保持している文字列
RSTRING(value)->ptr をそのまま渡します。そうでない場合にはコピ
ーを作って渡すようにしています。
コピーを作る場合、そのコピーはrb_tainted_str_new2()によってRuby
上のオブジェクトとなるのですが、rb_tainted_str_new2()内では引数
で与えた文字列をさらにコピーするので、結局そのコピーをfreeする
必要があります。このためにknuさんの示したコードでは引数側がfree
されています。

一方で、戻り値についても同様のことが言えます。Ruby側へ文字列と
して返すためには rb_tainted_str_new2() を使っています。このため
戻ってきた文字列はrb_tainted_str_new2()によってコピーされてRuby
の文字列となります。元のポインタは不要になるので free するので
すが、knuさんのコードでは、(たぶん)ここで2度目の free が起きて
います。

ここからが迷っているところなのですが、引数をfreeしないようにす
るためには、const char * を使うのですが、Rubyが保持している文
字列への変更を許してしまうので、なるべくなら避けたいと思ってい
ます。そこでもう一方の返り値をfreeしないようにするためには、引
数の型と同じ感覚で const char * を返り値の型として欲しいと思っ
ています。
これでよければ解決するのですが、プロトタイプ宣言と若干異なる型
になる点で反対される方がいらっしゃると思います。この場合、別途
freeするしないを判断するためのキーワードを導入することになりま
す。
-- 
Takaaki Tateishi <ttate@ttsky.net>

In This Thread