From: Motohiro KOSAKI Date: 2010-03-26T22:40:53+09:00 Subject: [ruby-dev:40779] [Feature #3018] UNINITIALIZED_VAR() マクロの導入 Feature #3018: UNINITIALIZED_VAR() マクロの導入 http://redmine.ruby-lang.org/issues/show/3018 起票者: Motohiro KOSAKI ステータス: Open, 優先度: Low カテゴリ: core, Target version: 1.9.x 最近の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においたのですが、 これについてご意見をお聞かせください。 ---------------------------------------- http://redmine.ruby-lang.org