Feature #3018

UNINITIALIZED_VAR() マクロの導入

Added by kosaki (Motohiro KOSAKI) about 2 years ago. Updated about 1 year ago.

Status:Closed Start date:03/26/2010
Priority:Low Due date:
Assignee:- % Done:

100%

Category:core
Target version:2.0.0

Description

最近のgccは未初期化変数をreadしようとすると警告を出すのですが、推論がおおざっぱなのでたまに的外れな警告を出します。
その副作用でthread.c のdo_select()が現在汚いことになっています。

----------------------------------------------------------------------
static int
do_select(int n, fd_set *read, fd_set *write, fd_set *except,
          struct timeval *timeout)
{
    int result, lerrno;
    fd_set orig_read, orig_write, orig_except;
#if defined __GNUC__ && defined __x86_64__
#define FAKE_FD_ZERO(f) (*(int *)&(f)=0) /* suppress lots of warnings */
#else
#define FAKE_FD_ZERO(f) ((void)0)
#endif

(snip)

    if (read) orig_read = *read; else FAKE_FD_ZERO(orig_read);
    if (write) orig_write = *write; else FAKE_FD_ZERO(orig_write);
    if (except) orig_except = *except; else FAKE_FD_ZERO(orig_except);

#undef FAKE_FD_ZERO

.....

----------------------------------------------------------------------

FAKE_FD_ZERO()が増えたことによってブランチが増えてしまっているのが美しくないのと、
__x86_64__ に依存しないの問題なので#ifdefの切り方が間違っているという問題があります。

Linuxではこの問題にたいして以下のようなマクロで解決しており、同様の手法を導入したいと
思うのですが、いかがでしょうか?

#define uninitialized_var(x) x = x

FAKE_FD_ZEROと違い自己代入は最適化で消えるので実行時コストは0です。
パッチを添付します。

あと、UNLIKELY()にあわせて、マクロをvm_core.hにおいたのですが、
これについてご意見をお聞かせください。

uninitialized_var.diff (1.4 kB) kosaki (Motohiro KOSAKI), 03/26/2010 10:40 pm

Associated revisions

Revision 27238
Added by kosaki (Motohiro KOSAKI) about 2 years ago

* vm_core.h: Introduce UNINITIALIZED_VAR() macro. * thread.c (do_select): Use UNINITIALIZED_VAR() instead FAKE_FD_ZERO(). Also, remove FAKE_FD_ZERO completely. [Feature #3018]

Revision 27238
Added by kosaki (Motohiro KOSAKI) about 2 years ago

* vm_core.h: Introduce UNINITIALIZED_VAR() macro. * thread.c (do_select): Use UNINITIALIZED_VAR() instead FAKE_FD_ZERO(). Also, remove FAKE_FD_ZERO completely. [Feature #3018]

History

Updated by ko1 (Koichi Sasada) about 2 years ago

 ささだです.

(2010/03/26 22:40), Motohiro KOSAKI wrote::
> Linuxではこの問題にたいして以下のようなマクロで解決しており、同様の手法を導入したいと
> 思うのですが、いかがでしょうか?
> 
> #define uninitialized_var(x) x = x

 なんとなく,マクロの名前が小文字ってのに違和感があるんですが,そうでも
ないでしょうか.それとも,別のプログラム(Linux)と一緒のほうが,通りが
良くていいでしょうか.

# 他は異論ありません.

-- 
// SASADA Koichi at atdot dot net

Updated by kosaki (Motohiro KOSAKI) about 2 years ago

2010年3月27日9:17 SASADA Koichi <ko1@atdot.net>:
>  ささだです.
>
> (2010/03/26 22:40), Motohiro KOSAKI wrote::
>> Linuxではこの問題にたいして以下のようなマクロで解決しており、同様の手法を導入したいと
>> 思うのですが、いかがでしょうか?
>>
>> #define uninitialized_var(x) x = x
>
>  なんとなく,マクロの名前が小文字ってのに違和感があるんですが,そうでも
> ないでしょうか.それとも,別のプログラム(Linux)と一緒のほうが,通りが
> 良くていいでしょうか.
>
> # 他は異論ありません.

書き方が悪かったです。説明はLinuxの定義の引用なので小文字ですが、
パッチではすでに大文字に変換されています。
これは、LIKELY/UNLIKELYが大文字に変換されているのに合わせました。

Updated by matz (Yukihiro Matsumoto) about 2 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:40779] [Feature #3018] UNINITIALIZED_VAR() 	マクロの導入"
    on Fri, 26 Mar 2010 22:40:53 +0900, Motohiro KOSAKI <redmine@ruby-lang.org> writes:

|最近のgccは未初期化変数をreadしようとすると警告を出すのですが、推論がおおざっぱなのでたまに的外れな警告を出します。
|その副作用でthread.c のdo_select()が現在汚いことになっています。

|Linuxではこの問題にたいして以下のようなマクロで解決しており、同様の手法を導入したいと
|思うのですが、いかがでしょうか?

いいんじゃないでしょうか。コミットしてください。って、こさき
さんにコミット権さしあげてましたっけ?

Updated by kosaki (Motohiro KOSAKI) about 2 years ago

> |Linuxではこの問題にたいして以下のようなマクロで解決しており、同様の手法を導入したいと
> |思うのですが、いかがでしょうか?
>
> いいんじゃないでしょうか。コミットしてください。って、こさき
> さんにコミット権さしあげてましたっけ?

いえ、私はコミッターではないです。
昨日IRCで代理コミットを立て続けに断れて悲しい思いをしていた所なので
コミット権をいただけるならありがたいです。自分でマージしようと思います。

Updated by matz (Yukihiro Matsumoto) about 2 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:40831] Re: [Feature #3018] UNINITIALIZED_VAR() 	マクロの導入"
    on Mon, 29 Mar 2010 19:45:01 +0900, KOSAKI Motohiro <kosaki.motohiro@gmail.com> writes:

|昨日IRCで代理コミットを立て続けに断れて悲しい思いをしていた所なので
|コミット権をいただけるならありがたいです。自分でマージしようと思います。

cvs-admin@ruby-lang.org に gpg サインした ssh2 公開鍵を送っ
てください。cvs-ってところが時代を感じさせますね。

Updated by nahi (Hiroshi Nakamura) about 2 years ago

本題じゃないですが、

2010/3/30 Yukihiro Matsumoto <matz@ruby-lang.org>:
> cvs-admin@ruby-lang.org に gpg サインした ssh2 公開鍵を送っ
> てください。cvs-ってところが時代を感じさせますね。

gpgサイン→(PGP|OpenPGP)(サイン|署名)、とするのがよいと思います。
gpgはOpenPGP仕様(+PGP仕様)を実装したツールの名前なので。
これを受ける前田さん(?)はgpgで検証してるのかもしれませんが、
gpg固有機能は使ってないはずです。

# 私は自作Rubyツールで署名して送ったはず。

大元のWikiのページがそうなってるんでしたっけ?

Updated by matz (Yukihiro Matsumoto) about 2 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:40839] Re: [Feature #3018] UNINITIALIZED_VAR() 	マクロの導入"
    on Tue, 30 Mar 2010 10:23:59 +0900, "NAKAMURA, Hiroshi" <nakahiro@gmail.com> writes:

|2010/3/30 Yukihiro Matsumoto <matz@ruby-lang.org>:
|> cvs-admin@ruby-lang.org に gpg サインした ssh2 公開鍵を送っ
|> てください。cvs-ってところが時代を感じさせますね。
|
|gpgサイン→(PGP|OpenPGP)(サイン|署名)、とするのがよいと思います。
|gpgはOpenPGP仕様(+PGP仕様)を実装したツールの名前なので。
|これを受ける前田さん(?)はgpgで検証してるのかもしれませんが、
|gpg固有機能は使ってないはずです。

記憶違いかもしれませんが、送られてきた署名が gpg で検証できず
再送をお願いしたケースがあったはずです。ですから、理屈として
は、中村さんのおっしゃる通りなのだと思いますが、「こちらは
gpg を使うから、それで検証できる署名にしてね」という意図の表
明は意味があると思いました。確か、それ以降 pgp と呼ばず gpg
と呼ぶようにしたはず。

そこから先は、(PGP | OpenPGP)の相互運用性とかいう話になるのだ
と思いますが、私たちはセキュリティの専門家ではないので。

Updated by nahi (Hiroshi Nakamura) about 2 years ago

2010/3/30 Yukihiro Matsumoto <matz@ruby-lang.org>:
> |gpgサイン→(PGP|OpenPGP)(サイン|署名)、とするのがよいと思います。

> 記憶違いかもしれませんが、送られてきた署名が gpg で検証できず
> 再送をお願いしたケースがあったはずです。ですから、理屈として
> は、中村さんのおっしゃる通りなのだと思いますが、「こちらは
> gpg を使うから、それで検証できる署名にしてね」という意図の表
> 明は意味があると思いました。確か、それ以降 pgp と呼ばず gpg
> と呼ぶようにしたはず。

それは失礼しました。残念な話ですがありがちですね。見てみたいなあその署名。

# --rfc2440オプションとか、互換性についていろいろ面倒な話はあります。

では、「gpgサイン」→「gpgを使って署名」くらいでぜひ。

Updated by matz (Yukihiro Matsumoto) about 2 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:40841] Re: [Feature #3018] UNINITIALIZED_VAR() 	マクロの導入"
    on Tue, 30 Mar 2010 11:12:50 +0900, "NAKAMURA, Hiroshi" <nakahiro@gmail.com> writes:

|では、「gpgサイン」→「gpgを使って署名」くらいでぜひ。

そうですね。今後は「gpgで検証できる署名」くらいで。

Updated by shugo (Shugo Maeda) about 2 years ago

前田です。

2010年3月30日10:51 Yukihiro Matsumoto <matz@ruby-lang.org>:
> |2010/3/30 Yukihiro Matsumoto <matz@ruby-lang.org>:
> |> cvs-admin@ruby-lang.org に gpg サインした ssh2 公開鍵を送っ
> |> てください。cvs-ってところが時代を感じさせますね。
> |
> |gpgサイン→(PGP|OpenPGP)(サイン|署名)、とするのがよいと思います。
> |gpgはOpenPGP仕様(+PGP仕様)を実装したツールの名前なので。
> |これを受ける前田さん(?)はgpgで検証してるのかもしれませんが、
> |gpg固有機能は使ってないはずです。
>
> 記憶違いかもしれませんが、送られてきた署名が gpg で検証できず
> 再送をお願いしたケースがあったはずです。ですから、理屈として
> は、中村さんのおっしゃる通りなのだと思いますが、「こちらは
> gpg を使うから、それで検証できる署名にしてね」という意図の表
> 明は意味があると思いました。確か、それ以降 pgp と呼ばず gpg
> と呼ぶようにしたはず。

そうでしたっけ。
私はなひさんに怒られてからPGPと言うようにしていました。

最初私がgpgと言っていたのはDebianプロジェクトの影響だったように
思います。

-- 
Shugo Maeda

Updated by matz (Yukihiro Matsumoto) about 2 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:40843] Re: [Feature #3018] UNINITIALIZED_VAR() 	マクロの導入"
    on Tue, 30 Mar 2010 11:22:22 +0900, Shugo Maeda <shugo@ruby-lang.org> writes:

|私はなひさんに怒られてからPGPと言うようにしていました。

あれ、記憶違いかなあ。

Updated by kosaki (Motohiro KOSAKI) about 2 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100
This issue was solved with changeset r27238.
Motohiro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

Also available in: Atom PDF