forked from boostorg/utility
Made memset call in value_init conditional, see #3869. Updated the section "compiler issues" of its documentation.
[SVN r62307]
This commit is contained in:
@ -10,6 +10,7 @@
|
|||||||
// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
|
// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
|
||||||
// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola
|
// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola
|
||||||
// 03 Apr 2010 (Added initialized<T>, suggested by Jeffrey Hellrung, fixing #3472) Niels Dekker
|
// 03 Apr 2010 (Added initialized<T>, suggested by Jeffrey Hellrung, fixing #3472) Niels Dekker
|
||||||
|
// 30 May 2010 (Made memset call conditional, fixing #3869) Niels Dekker
|
||||||
//
|
//
|
||||||
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
||||||
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
||||||
@ -21,6 +22,7 @@
|
|||||||
// contains. More details on these issues are at libs/utility/value_init.htm
|
// contains. More details on these issues are at libs/utility/value_init.htm
|
||||||
|
|
||||||
#include <boost/aligned_storage.hpp>
|
#include <boost/aligned_storage.hpp>
|
||||||
|
#include <boost/config.hpp> // For BOOST_NO_COMPLETE_VALUE_INITIALIZATION.
|
||||||
#include <boost/detail/workaround.hpp>
|
#include <boost/detail/workaround.hpp>
|
||||||
#include <boost/static_assert.hpp>
|
#include <boost/static_assert.hpp>
|
||||||
#include <boost/type_traits/cv_traits.hpp>
|
#include <boost/type_traits/cv_traits.hpp>
|
||||||
@ -41,6 +43,23 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BOOST_NO_COMPLETE_VALUE_INITIALIZATION
|
||||||
|
// Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
|
||||||
|
// suggests that a workaround should be applied, because of compiler issues
|
||||||
|
// regarding value-initialization.
|
||||||
|
#define BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND
|
||||||
|
// switches the value-initialization workaround either on or off.
|
||||||
|
#ifndef BOOST_DETAIL_VALUE_INIT_WORKAROUND
|
||||||
|
#ifdef BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
|
||||||
|
#define BOOST_DETAIL_VALUE_INIT_WORKAROUND 1
|
||||||
|
#else
|
||||||
|
#define BOOST_DETAIL_VALUE_INIT_WORKAROUND 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@ -82,10 +101,9 @@ class initialized
|
|||||||
|
|
||||||
initialized()
|
initialized()
|
||||||
{
|
{
|
||||||
// Note: the following memset call will become conditional when ticket #3869 is fixed:
|
#if BOOST_DETAIL_VALUE_INIT_WORKAROUND
|
||||||
// https://svn.boost.org/trac/boost/ticket/3869 reported by Aleksey Gurtovoy.
|
|
||||||
std::memset(&x, 0, sizeof(x));
|
std::memset(&x, 0, sizeof(x));
|
||||||
|
#endif
|
||||||
new (wrapper_address()) wrapper();
|
new (wrapper_address()) wrapper();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,37 +223,65 @@ it <em>may</em> in practice still be left uninitialized, because of those
|
|||||||
compiler issues! It's hard to make a general statement on what those issues
|
compiler issues! It's hard to make a general statement on what those issues
|
||||||
are like, because they depend on the compiler you are using, its version number,
|
are like, because they depend on the compiler you are using, its version number,
|
||||||
and the type of object you would like to have value-initialized.
|
and the type of object you would like to have value-initialized.
|
||||||
Compilers usually support value-initialization for built-in types properly.
|
All compilers we have tested so far support value-initialization for arithmetic types properly.
|
||||||
But objects of user-defined types that involve <em>aggregates</em> may <em>in some cases</em>
|
However, various compilers may leave some types of <em>aggregates</em> uninitialized, when they
|
||||||
be partially, or even entirely left uninitialized, when they should be value-initialized.
|
should be value-initialized. Value-initialization of objects of a pointer-to-member type may also
|
||||||
|
go wrong on various compilers.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
We have encountered issues regarding value-initialization on compilers by
|
At the moment of writing, May 2010, the following reported issues regarding
|
||||||
Microsoft, Sun, Borland, and GNU. Here is a list of bug reports on those issues:
|
value-initialization are still there in current compiler releases:
|
||||||
<table summary="Compiler bug reports regarding value-initialization" border="0" cellpadding="7" cellspacing="1" >
|
<ul>
|
||||||
<tr><td>
|
<li>
|
||||||
<a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100744">
|
<a href="https://connect.microsoft.com/VisualStudio/feedback/details/100744">
|
||||||
Microsoft Feedback ID 100744 - Value-initialization in new-expression</a>
|
Microsoft Visual Studio Feedback ID 100744, Value-initialization in new-expression</a>
|
||||||
<br>Reported by Pavel Kuznetsov (MetaCommunications Engineering), 2005-07-28
|
<br>Reported by Pavel Kuznetsov (MetaCommunications Engineering), 2005
|
||||||
<br>
|
</li><li>
|
||||||
<a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111">
|
<a href="http://connect.microsoft.com/VisualStudio/feedback/details/484295">
|
||||||
GCC Bug 30111 - Value-initialization of POD base class doesn't initialize members</a>
|
Microsoft Visual Studio Feedback ID 484295, VC++ does not value-initialize members of derived classes without user-declared constructor</a>
|
||||||
<br>Reported by Jonathan Wakely, 2006-12-07
|
<br>Reported by Sylvester Hesp, 2009
|
||||||
<br>
|
</li><li>
|
||||||
<a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916">
|
<a href="https://connect.microsoft.com/VisualStudio/feedback/details/499606">
|
||||||
GCC Bug 33916 - Default constructor fails to initialize array members</a>
|
Microsoft Visual Studio Feedback ID 499606, Presence of copy constructor breaks member class initialization</a>
|
||||||
<br>Reported by Michael Elizabeth Chastain, 2007-10-26
|
<br>Reported by Alex Vakulenko, 2009
|
||||||
<br>
|
</li><li>
|
||||||
<a href="http://qc.codegear.com/wc/qcmain.aspx?d=51854">
|
<a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=83751">
|
||||||
Borland Report 51854 - Value-initialization: POD struct should be zero-initialized</a>
|
Embarcadero/C++Builder Report 83751, Value-initialization: arrays should have each element value-initialized</a>
|
||||||
<br>Reported by Niels Dekker (LKEB, Leiden University Medical Center), 2007-09-11
|
<br>Reported by Niels Dekker (LKEB), 2010
|
||||||
<br>
|
</li><li>
|
||||||
</td></tr></table>
|
<a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=83851">
|
||||||
|
Embarcadero/C++Builder Report 83851, Value-initialized temporary triggers internal backend error C1798</a>
|
||||||
|
<br>Reported by Niels Dekker, 2010
|
||||||
|
</li><li>
|
||||||
|
<a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=84279">
|
||||||
|
Embarcadero/C++Builder Report 84279, Internal compiler error (F1004), value-initializing member function pointer by "new T()"</a>
|
||||||
|
<br>Reported by Niels Dekker, 2010
|
||||||
|
</li><li>
|
||||||
|
Sun CR 6947016, Sun 5.10 may fail to value-initialize an object of a non-POD aggregate.
|
||||||
|
<br>Reported to Steve Clamage by Niels Dekker, 2010
|
||||||
|
</li><li>
|
||||||
|
IBM's XL V10.1 and V11.1 may fail to value-initialize a temporary of a non-POD aggregate.
|
||||||
|
<br>Reported to Michael Wong by Niels Dekker, 2010
|
||||||
|
</li><li>
|
||||||
|
Intel support issue 589832, Attempt to value-initialize pointer-to-member triggers internal error
|
||||||
|
on Intel 11.1.
|
||||||
|
<br>Reported by John Maddock, 2010
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
Note that all known GCC issues regarding value-initialization are
|
||||||
|
fixed with GCC version 4.4, including
|
||||||
|
<a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111">GCC Bug 30111</a>.
|
||||||
|
Clang also has completely implemented value-initialization, as far as we know,
|
||||||
|
now that <a href="http://llvm.org/bugs/show_bug.cgi?id=7139">Clang Bug 7139</a> is fixed.
|
||||||
</p><p>
|
</p><p>
|
||||||
|
|
||||||
New versions of <code>value_initialized</code>
|
New versions of <code>value_initialized</code>
|
||||||
(Boost release version 1.35 or higher)
|
(Boost release version 1.35 or higher)
|
||||||
offer a workaround to these issues: <code>value_initialized</code> will now clear
|
offer a workaround to these issues: <code>value_initialized</code> may now clear
|
||||||
its internal data, prior to constructing the object that it contains.
|
its internal data, prior to constructing the object that it contains. It will do
|
||||||
|
so for those compilers that need to have such a workaround, based on the
|
||||||
|
<a href="../config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_defects"
|
||||||
|
>compiler defect macro</a> BOOST_NO_COMPLETE_VALUE_INITIALIZATION.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a name="types"></a>Types and objects</h2>
|
<h2><a name="types"></a>Types and objects</h2>
|
||||||
@ -463,7 +491,7 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<p>Revised 1 May 2010</p>
|
<p>Revised 30 May 2010</p>
|
||||||
|
|
||||||
<p>© Copyright Fernando Cacciola, 2002 - 2010.</p>
|
<p>© Copyright Fernando Cacciola, 2002 - 2010.</p>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user