Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.mixmin.net!news.albasani.net!.POSTED!not-for-mail From: Bo Persson Newsgroups: comp.std.c++ Subject: Re: An "intermediate value" in two-phase initialization Date: Tue, 22 May 2012 14:57:35 -0700 (PDT) Organization: unknown Lines: 58 Sender: std-cpp-request@vandevoorde.com Approved: stephen.clamage@oracle.com Message-ID: References: <82a16114-04ce-427e-bbb9-1cd70bb8f3c2@googlegroups.com> NNTP-Posting-Host: aoRITzPLEAKbwAhodRkEztkalMW2FHXIS/Yo/aTJMi0= Content-Type: text/plain; charset=UTF-8; format=flowed X-Trace: news.albasani.net XubnpU3Suof2H+lXaKXCimWRwQdw+1c2wt8THBEtNnXncGldWlvXx2AQZgkdJhU72/8Q/uJFMwL2+/KwuzEKOQ== X-Complaints-To: abuse@albasani.net NNTP-Posting-Date: Tue, 22 May 2012 21:57:37 +0000 (UTC) X-Mailer: Perl5 Mail::Internet v2.05 X-Submission-Address: std-cpp-submit@vandevoorde.com Cancel-Lock: sha1:tozLPADe2ssZWDFf+DV3FlvGFhA= X-Original-Date: Tue, 22 May 2012 22:36:13 +0200 Xref: csiph.com comp.std.c++:517 Andrzej KrzemieĊ„ski skrev 2012-05-22 21:14: > Hi, > It looks like a global object (non-local variable with static storage > duration) can be initialized in two phases (not to mention the > "constant initialization"). So, there is a moment when the first phase > -- zero-initialization -- has set the variable to value 0, but the > dynamic initialization has not yet started; and at this point it may > so happen that someone attempts to read the value from such variable. > 3.6.2 p3 even mentions such situation explicitly in the note and in > the example, which implies that reading such "intermediate value" > works fine (does not cause UB). The example uses word "unspecified" > which implies even stronger that if UB were involved it would have > been mentioned also. > > On the other hand, my reading of a couple of paragraphs from clause 3 > makes me believe that an attempt to read the "intermediate value" is a > UB. Here are the three quotes: > > 3.6.2 p2: "Variables with static storage duration [...] shall be > zero-initialized before any other initialization takes place." > > 3.8 p1: "The lifetime of an object of type T begins when: storage with > the proper alignment and size for type T is obtained, and if the > object has non-trivial initialization, its initialization is > complete." > > 3.8 P6: "before the lifetime of an object has started but after the > storage which the object will occupy > has been allocated [...] The program has undefined behavior if: (i) an > lvalue-to-rvalue conversion is applied to such a glvalue, (ii) the > glvalue is used to access a non-static data member". > > And this is my reasoning: Until the dynamic initialization is > finished, the lifetime of the global object has not yet started. So, > an attempt to access the "intermediate value" requires either an > lvalue-to-rvalue conversion or accessing a non-static data member for > an object before its lifetime has started; which is described as UB. > > So, my question is: is the reading of "intermediate (zero) value", as > described above, a well defined behavior or a UB? > I think you have already answered you question. For some types, those without any "non-trivial initialization", the zero-initialization is all there is. Those are complete and "alive" immediately. This int. Accessing objects with non-trivial constructors before the constructor has completed, is definitely UB. Bo Persson -- [ comp.std.c++ is moderated. To submit articles, try posting with your ] [ newsreader. If that fails, use mailto:std-cpp-submit@vandevoorde.com ] [ --- Please see the FAQ before posting. --- ] [ FAQ: http://www.comeaucomputing.com/csc/faq.html ]