Opened 10 years ago

Last modified 9 years ago

#7219 new Bugs

boost::optional<int> gives strict alias warning on GCC 4.4.6, breaks at runtime — at Initial Version

Reported by: Tony.Astolfi@… Owned by: Fernando Cacciola
Milestone: To Be Determined Component: optional
Version: Boost 1.51.0 Severity: Showstopper
Keywords: Cc:

Description

Here is my test code:

#include <boost/optional.hpp>

struct my_type { #if 1 change to 0 to see the problem disappear

typedef boost::optional<int> value_type;

#else

typedef boost::optional<int attribute((may_alias))> value_type;

#endif

value_type value_;

void set (int value) {

value_ = value;

}

value_type get () {

return value_;

}

}; class event

void testCase () {

my_type a; a.set(4); bool const b = 4 == ( *a.get() ); if( !b ) abort(); will abort unless 'may_alias' attribute is added to 'int'

}

Here is my compile line:

g++ -c src/thread/unittest/test_gcc_bug.cpp -o ../../../derived/glnxa64/obj/deployment_server/foundation/util/src/thread/unittest/test_gcc_bug.o -MD -MF ../../../derived/glnxa64/obj/deployment_server/foundation/util/src/thread/unittest/test_gcc_bug.d -MP -MT ../../../derived/glnxa64/obj/deployment_server/foundation/util/src/thread/unittest/test_gcc_bug.o -I../../../src/include -I../../../derived/glnxa64/src/include -I../include -I../../include -Imathworks/hub/3rdparty/R2013a/356881/glnxa64/boost/include -Imathworks/hub/3rdparty/R2013a/356141/glnxa64/cpp11compat/include -Imathworks/hub/3rdparty/R2013a/356141/glnxa64/cpp11compat/include -Imathworks/hub/3rdparty/R2013a/350182/glnxa64/protobuf/include -Imathworks/hub/3rdparty/R2013a/350182/glnxa64/tbb/include -DBOOST_FILESYSTEM_VERSION=2 -DBOOST_ASIO_DISABLE_EVENTFD -DBOOST_ASIO_DISABLE_EPOLL -DTBB_AVAILABLE -O2 -pipe -pthread -fPIC -std=c++98 -fvisibility=hidden -g -D_POSIX_C_SOURCE=199506L -fno-omit-frame-pointer -DNDEBUG -W -Wcast-align -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wno-unused -Woverloaded-virtual -Wnon-virtual-dtor -Wno-ignored-qualifiers

I was also able to work around it by changing the return type of certain optional_base<T> methods (i.e. get_impl()) to 'T attribute((may_alias))&' (or whatever the analogous pointer or reference type is).

Change History (1)

by Tony.Astolfi@…, 10 years ago

Attachment: test_gcc_bug.cpp added

test case source file

Note: See TracTickets for help on using tickets.