Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Feb 2003 21:21:51 +0100
From:      Erik Trulsson <ertr1013@student.uu.se>
To:        Huang wen hui <hwh@gddsn.org.cn>
Cc:        java@FreeBSD.ORG, stable@freebsd.org
Subject:   Re: Optimization problem (Re: Math.pow bug for jdk1.3.1-p8 ?)
Message-ID:  <20030215202151.GA23574@falcon.midgard.homeip.net>
In-Reply-To: <3E4E86B8.2040608@gddsn.org.cn>
References:  <3E4C9DDD.4040204@gddsn.org.cn> <20030215.175421.1015281127.shudo@localhost> <20030216014802.A10817@misty.eyesbeyond.com> <20030216.005020.894433699.shudo@localhost> <3E4E7728.8030803@gddsn.org.cn> <3E4E86B8.2040608@gddsn.org.cn>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Feb 16, 2003 at 02:28:08AM +0800, Huang wen hui wrote:
> This is a simple one:
> 
> #include <stdio.h>
> 
> #define __LO(x) *(int*)&x
> 
> double tst()
> {
>  double t1;
> 
>  t1=2;
>  __LO(t1) = 0;
>  return t1;
> }
> main() {
>  double d = tst();
>  printf("%f\n", d);
> 
> }

The program above seems to be buggy.
The line 
__LO(t1) = 0;
after macro expansion looks like

*(int*)&t1 = 0;

where t1 is declared as a double, i.e. the program is accessing an
object of type double through a pointer to type int.
As far as I can tell this is not allowed by the C standard and
therefore this program has undefined behaviour.  This means that a
compiler is allowed to do whatever it wants.

That the program above exhibits different behaviour when compiled with
-O0 (prints 2.000000) and when compiled with -O1 (prints 0.000000)
does not seem to be a bug in the compiler but rather a bug in the
program that happens to be triggered by the optimization process.




-- 
<Insert your favourite quote here.>
Erik Trulsson
ertr1013@student.uu.se

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-java" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030215202151.GA23574>