Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.std.c++ > #517

Re: An "intermediate value" in two-phase initialization

Path csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.mixmin.net!news.albasani.net!.POSTED!not-for-mail
From Bo Persson<bop@gmb.dk>
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 <a22blsFjqfU1@mid.individual.net> (permalink)
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

Show key headers only | View raw


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                      ]

Back to comp.std.c++ | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

An "intermediate value" in two-phase initialization Andrzej Krzemieński <akrzemi1@gmail.com> - 2012-05-22 12:14 -0700
  Re: An "intermediate value" in two-phase initialization Bo Persson<bop@gmb.dk> - 2012-05-22 14:57 -0700
    Re: An "intermediate value" in two-phase initialization Andrzej Krzemieński <akrzemi1@gmail.com> - 2012-05-24 00:04 -0700

csiph-web