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

From Bo Persson<bop@gmb.dk>
Newsgroups comp.std.c++
Subject Re: An "intermediate value" in two-phase initialization
Date 2012-05-22 14:57 -0700
Organization unknown
Message-ID <a22blsFjqfU1@mid.individual.net> (permalink)
References <82a16114-04ce-427e-bbb9-1cd70bb8f3c2@googlegroups.com>

Show all headers | 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