This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Storage for uninitialized objects (PR 24626)
- From: Ian Lance Taylor <ian at airs dot com>
- To: Paul Schlie <schlie at comcast dot net>
- Cc: John David Anglin <dave at hiauly1 dot hia dot nrc dot ca>, <gcc at gcc dot gnu dot org>
- Date: 15 Jan 2006 02:37:16 -0800
- Subject: Re: Storage for uninitialized objects (PR 24626)
- References: <BFEF7F1F.CABE%schlie@comcast.net>
Paul Schlie <schlie@comcast.net> writes:
> As a simple example, although x may be indeterminate -1 < sin(x) < +1
> is unconditionally true, as must be tan(x) = sin(x)/cos(x), and x^x = 0;
No, the ISO C standard is clear that an uninitialized variable may be
set to a trap representation (6.7.8, 3.17.2). So in this case x might
be a signalling NaN, and executing sin (x) might well terminate the
program with a floating point exception. That would be a valid
translation of the program by the compiler, and would even be
reasonable and appropriate in a non-optimized compilation.
> (as a general rule, optimization should never alter observable semantics
> of a program within it's control; so if GCC chooses not to assign a
> default value to an otherwise un-initialized variable; it must assume
> it may be any single value, not any multiple value; although should
> feel free to complain loudly about it in either case.)
No, the ISO C standard is clear that the value of an uninitialized
variable is indeterminate. It may be a trap representation, or it may
be an unspecified value. In the latter case it must have the correct
type. But there is no other restriction on it, and the standard
specifically says (3.17.3) it "imposes no requirements on which value
is chosen in any instance."
Ian