Bug#548274: Incomprehensible error message when strict aliasing rules are broken
Package: g++-4.4
Version: 4.4.1-4
Severity: normal
cwidget doesn't compile cleanly with g++-4.4 because it violates
"strict aliasing rules"; apparently they've been made stricter in 4.4?
Unfortunately, the error message that g++ generates is very vague and
doesn't help much in tracking it down.
The problem seems to be something to do with libsigc++:
/usr/include/sigc++-2.0/sigc++/limit_reference.h: In constructor ‘cwidget::widgets::menubar::menubar(bool)’:
/usr/include/sigc++-2.0/sigc++/limit_reference.h:81: error: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/sigc++-2.0/sigc++/limit_reference.h:81: note: initialized from here
Note that this is *all* of the error message; it doesn't make it clear
where the limit_reference template is instantiated from (which is a bug
IMO, hence why I'm filing one). The code in question looks like this:
template <class T_type>
class limit_reference<T_type, true>
{
public:
/** Constructor.
* @param _A_target The reference to limit.
*/
limit_reference(T_type& _A_target)
: visited(_A_target),
invoked(_A_target)
{}
and it's being invoked like this:
menubar::menubar(bool _always_visible)
:container(), startloc(0), active(false),
always_visible(_always_visible), curloc(0), subwidget(NULL)
{
do_layout.connect(sigc::mem_fun(*this, &menubar::layout_me));
focussed.connect(sigc::mem_fun(*this, &menubar::got_focus));
unfocussed.connect(sigc::mem_fun(*this, &menubar::lost_focus));
}
I know that menubar::menubar is the culprit, because when I comment
out these three lines, the error stops. It also stops if I invoke
another method on menubar; not sure why, but maybe it helps:
menubar::menubar(bool _always_visible)
:container(), startloc(0), active(false),
always_visible(_always_visible), curloc(0), subwidget(NULL)
{
get_active_widget();
do_layout.connect(sigc::mem_fun(*this, &menubar::layout_me));
focussed.connect(sigc::mem_fun(*this, &menubar::got_focus));
unfocussed.connect(sigc::mem_fun(*this, &menubar::lost_focus));
}
It looks like maybe an intermediate value is causing some trouble
and its name can't be displayed (hence <anonymous>), but I don't know
what's going on. connect() and mem_fun() are invoked with pretty much
the same code as above in lots of places where no error occurs, and I
don't understand what I'm doing wrong (although I admit I'm not familiar
with the strict aliasing rules, so I could be breaking them by
accident). Any advice or help would be appreciated; this has me
stumped.
I apologize for not having a better example than "compile cwidget" --
I spent some time trying to reproduce this with a simpler batch of code
and was entirely unsuccessful. :-(
Thanks,
Daniel
-- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Kernel: Linux 2.6.30-1-686 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages g++-4.4 depends on:
ii gcc-4.4 4.4.1-4 The GNU C compiler
ii gcc-4.4-base 4.4.1-4 The GNU Compiler Collection (base
ii libc6 2.9-26 GNU C Library: Shared libraries
ii libcloog-ppl0 0.15.7-1 the Chunky Loop Generator (runtime
ii libgmp3c2 2:4.3.1+dfsg-3 Multiprecision arithmetic library
ii libgmpxx4ldbl 2:4.3.1+dfsg-3 Multiprecision arithmetic library
ii libmpfr1ldbl 2.4.1-2 multiple precision floating-point
ii libppl-c2 0.10.2-2 Parma Polyhedra Library (C interfa
ii libppl7 0.10.2-2 Parma Polyhedra Library (runtime l
ii libstdc++6-4.4-dev 4.4.1-4 The GNU Standard C++ Library v3 (d
g++-4.4 recommends no packages.
Versions of packages g++-4.4 suggests:
pn g++-4.4-multilib <none> (no description available)
pn gcc-4.4-doc <none> (no description available)
pn libstdc++6-4.4-dbg <none> (no description available)
-- no debconf information
Reply to: