Feature #3018

UNINITIALIZED_VAR() マクロの導入

Added by Motohiro KOSAKI over 5 years ago. Updated about 4 years ago.

Status:Closed
Priority:Normal
Assignee:-

Description

=begin
最近の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においたのですが、
これについてご意見をお聞かせください。
=end

uninitialized_var.diff Magnifier (1.39 KB) Motohiro KOSAKI, 03/26/2010 10:40 PM

Associated revisions

Revision 27238
Added by Motohiro KOSAKI about 5 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 Motohiro KOSAKI about 5 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

#1 Updated by Koichi Sasada over 5 years ago

=begin
 ささだです.

(2010/03/26 22:40), Motohiro KOSAKI wrote::

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

#define uninitialized_var(x) x = x

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

# 他は異論ありません.

--
// SASADA Koichi at atdot dot net

=end

#2 Updated by Motohiro KOSAKI over 5 years ago

=begin
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が大文字に変換されているのに合わせました。

=end

#3 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

In message "Re: [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ではこの問題にたいして以下のようなマクロで解決しており、同様の手法を導入したいと
|思うのですが、いかがでしょうか?

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

=end

#4 Updated by Motohiro KOSAKI over 5 years ago

=begin

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

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

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

=end

#5 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

In message "Re: 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-ってところが時代を感じさせますね。

=end

#6 Updated by Hiroshi Nakamura over 5 years ago

=begin
本題じゃないですが、

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のページがそうなってるんでしたっけ?

=end

#7 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

In message "Re: 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)の相互運用性とかいう話になるのだ
と思いますが、私たちはセキュリティの専門家ではないので。

=end

#8 Updated by Hiroshi Nakamura over 5 years ago

=begin
2010/3/30 Yukihiro Matsumoto matz@ruby-lang.org:

|gpgサイン→(PGP|OpenPGP)(サイン|署名)、とするのがよいと思います。

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

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

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

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

=end

#9 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

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

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

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

=end

#10 Updated by Shugo Maeda over 5 years ago

=begin
前田です。

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

=end

#11 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

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

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

あれ、記憶違いかなあ。

=end

#12 Updated by Motohiro KOSAKI about 5 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
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.

=end

Also available in: Atom PDF