libstdc++/1576: crash before entering main
Florian Kainz
kainz@ilm.com
Sun Apr 1 00:00:00 GMT 2001
The following reply was made to PR libstdc++/1576; it has been noted by GNATS.
From: Florian Kainz <kainz@ilm.com>
To: Benjamin Kosnik <bkoz@redhat.com>
Cc: gcc-bugs@gcc.gnu.org, kainz@ilm.com, gcc-gnats@gcc.gnu.org, jimh@ilm.com
Subject: Re: libstdc++/1576: crash before entering main
Date: Fri, 12 Jan 2001 19:49:40 -0800
Benjamin Kosnik wrote:
>
> Here's a slightly different way of solving this, I believe, without
> the ctor hacks and just putting all the std objects into one file
> instead. Can you check it out please?
>
> thanks,
> benjamin
>
Benjamin,
thank you very much for your reply.
I tried your version of the bug fix, without the
constructor hacks. For my test case, it works.
However, I believe that this is just a coincidence.
I think that for correctness, the constructor hacks
(or something similar) are necessary. See below
for an explanation why.
Florian
------------------------------------------------------------------------------
Florian Kainz
Industrial Light + Magic
San Rafael, California
------------------------------------------------------------------------------
If I understand your changes correctly, you are assuming that
combining the definitions for ios_base::Init::_S_ios_base_init,
for the standard streams (cin, cout, cerr, clog), and for
ios_base::Init::Init(), all into one source file, forces
initialization to take place in this order:
1) _S_ios_base_init is set to zero.
2) The standard streams are initialized with NULL
filebufs; the streams are not yet usable, but
otherwise, this initialization is harmless.
3) Initialization of some __ioinit object triggers
the first call to ios_base::Init::Init().
_S_ios_base_init is incremented to one, and
ios_base::Init::Init() supplies real filebufs
for the standard streams. The streams are now
usable.
According to my understanding of section 3.6.2 of the C++ standard
(in particular the example in paragraph 3), there is no guarantee
that initialization of the variables cin, cout, etc. in ios.cc
happens before any of the __ioinit objects elsewhere in the program
are initialized. The following order of events is possible:
1) _S_ios_base_init is set to zero.
2) Initialization of some __ioinit object triggers
the first call to ios_base::Init::Init().
_S_ios_base_init is incremented to one, and
ios_base::Init::Init() supplies filebufs for
the standard streams. The streams are now
usable.
3) cin, cout, etc. are initialized with NULL
filebufs; the standard streams are no longer
usable.
More information about the Gcc-prs
mailing list