c++/8543: bus error with 2 word alignments

Wolfgang Bangerth bangerth@ticam.utexas.edu
Mon Nov 25 14:55:00 GMT 2002


The following reply was made to PR c++/8543; it has been noted by GNATS.

From: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
To: gcc-gnats@gcc.gnu.org
Cc:  
Subject: RE: c++/8543: bus error with 2 word alignments
Date: Tue, 19 Nov 2002 08:38:31 -0600 (CST)

 ---------- Forwarded message ----------
 Date: Tue, 19 Nov 2002 09:35:42 +0100
 From: Massimo Ravasi <massimo.ravasi@epfl.ch>
 To: bangerth@dealii.org
 Subject: RE: c++/8543: bus error with 2 word alignments
 
 
 
 
 > -----Original Message-----
 > From: bangerth@dealii.org [mailto:bangerth@dealii.org] 
 > Sent: Monday, 18 November 2002 19:12 
 > To: gcc-bugs@gcc.gnu.org; gcc-prs@gcc.gnu.org; ravasi; 
 > nobody@gcc.gnu.org
 > Subject: Re: c++/8543: bus error with 2 word alignments
 > 
 > 
 > Synopsis: bus error with 2 word alignments
 > 
 > State-Changed-From-To: open->analyzed
 > State-Changed-By: bangerth
 > State-Changed-When: Mon Nov 18 10:11:12 2002
 > State-Changed-Why:
 >     I can confirm this. However, from my limited understanding,
 >     what you do is not legal. You try something like
 >       long long i;
 >       long long *p = (long long *)((char*)&i + 4);
 >       *p = 0;
 >     As far as I can tell, trying to play games with pointers
 >     and not obeying to the alignment rules of the types they
 >     point to is invoking undefined behavior, and a bus error
 >     is undefined behavior.
 >     
 >     That you get varying results with various flags and other
 >     parts of code is to be expected then (after all, a working
 >     program is a valid interpretation of "undefined behavior").
 
 Thank you for you answer,
 
 my problem is that I have to deal with long long data which are not
 guaranteed to be aligned at a 8-byte aligned (but that are guaranteed to
 be aligned at a 4-byte address... At least. It's an array of bytes where
 data are stored in a proprietary format)
 My doubt was if this had to be considered a compiler bug or not, given
 the non deterministic behavior of the compiled code in the different
 cases.
 
 In any case, comparing long long type to double type, both of them being
 8 byte long, I think that an option for long longs like the following
 one for doubles could be useful in some cases... At least in mine ;-)
 
      -munaligned-doubles
          Assume that doubles have 8 byte alignment.  This is the
          default.
 
          With -munaligned-doubles, GCC assumes that doubles have
          8 byte alignment only if they are contained in another
          type, or if they have an absolute address.  Otherwise,
          it assumes they have 4 byte alignment.  Specifying this
          option avoids some rare compatibility problems with code
          generated by other compilers.  It is not the default
          because it results in a performance loss, especially for
          floating point code.
 
 
 By the way, is there a reason why such an option is available for SPARC
 architectures only? That is, what kind of behavior should I expect, or
 shouldn't I expect, when facing the same problem on another
 architecture?
 
 
 
 
 Bye,
 	Massimo
 



More information about the Gcc-prs mailing list