Project

General

Profile

Actions

Feature #3018

closed

UNINITIALIZED_VAR() マクロの導入

Added by kosaki (Motohiro KOSAKI) about 14 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:

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


Files

uninitialized_var.diff (1.39 KB) uninitialized_var.diff kosaki (Motohiro KOSAKI), 03/26/2010 10:40 PM
Actions #1

Updated by ko1 (Koichi Sasada) about 14 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

Actions #2

Updated by kosaki (Motohiro KOSAKI) about 14 years ago

=begin
2010年3月27日9:17 SASADA Koichi :

 ささだです.

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

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

#define uninitialized_var(x) x = x

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

他は異論ありません.

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

=end

Actions #3

Updated by matz (Yukihiro Matsumoto) about 14 years ago

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

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

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

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

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

=end

Actions #4

Updated by kosaki (Motohiro KOSAKI) about 14 years ago

=begin

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

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

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

=end

Actions #5

Updated by matz (Yukihiro Matsumoto) about 14 years ago

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

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

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

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

=end

Actions #6

Updated by nahi (Hiroshi Nakamura) about 14 years ago

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

2010/3/30 Yukihiro Matsumoto :

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

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

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

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

=end

Actions #7

Updated by matz (Yukihiro Matsumoto) about 14 years ago

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

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

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

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

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

=end

Actions #8

Updated by nahi (Hiroshi Nakamura) about 14 years ago

=begin
2010/3/30 Yukihiro Matsumoto :

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

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

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

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

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

=end

Actions #9

Updated by matz (Yukihiro Matsumoto) about 14 years ago

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

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

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

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

=end

Actions #10

Updated by shugo (Shugo Maeda) about 14 years ago

=begin
前田です。

2010年3月30日10:51 Yukihiro Matsumoto :

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

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

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

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

--
Shugo Maeda

=end

Actions #11

Updated by matz (Yukihiro Matsumoto) about 14 years ago

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

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

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

あれ、記憶違いかなあ。

=end

Actions #12

Updated by kosaki (Motohiro KOSAKI) about 14 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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0