Project

General

Profile

Feature #3018

UNINITIALIZED_VAR() マクロの導入

Added by kosaki (Motohiro KOSAKI) over 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
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

Also available in: Atom PDF