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