public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps
@ 2012-08-24 11:57 glaw@undo-software.com
  2012-08-24 18:24 ` [Bug rtl-optimization/54365] " pinskia at gcc dot gnu.org
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: glaw@undo-software.com @ 2012-08-24 11:57 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

             Bug #: 54365
           Summary: ARM optimization bug when pointer arithmetic wraps
    Classification: Unclassified
           Product: gcc
           Version: 4.6.3
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: glaw@undo-software.com


Created attachment 28077
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28077
Simple program showing the bug.

Apologies if I've got the wrong component - it was a bit of a guess!

The attached program shows a fairly simple, but I think nasty, bug in GCC on
ARM. It seems to be present on at least versions 4.4.5, 4.5.1 and 4.6.3. If
compiled without optimisation, it behaves as I expect: adding 4 to a pointer
such that it wraps gives a pointer that is less than the original.  With -O2,
that is not the case. I note that the problem does not occur if I use integer
types.

Transcript follows (.c file attached separately and in transcript below for
convenience):

 $ cat compilerbug.c 
#include <stdio.h>

int
main( void)
{
    unsigned char* addr = (unsigned char*)0xfffffffe;
    unsigned len = 4;

    if ( addr+len < addr)
    {
        printf( "it wraps\n");
    }
    else
    {
        printf( "no wrap\n");
    }

    return 0;
}
 $ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 $ gcc compilerbug.c 
 $ ./a.out 
it wraps
 $ # As expected. Now let's try with optimisations.
 $ gcc -O2 compilerbug.c 
 $ ./a.out 
no wrap
 $ # Oh dear!


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
@ 2012-08-24 18:24 ` pinskia at gcc dot gnu.org
  2012-08-24 18:38 ` glaw@undo-software.com
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: pinskia at gcc dot gnu.org @ 2012-08-24 18:24 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> 2012-08-24 18:23:50 UTC ---
This code as far as I Know is undefined.  Pointer arithmetic overflow is
undefined and not wrapping.  Mainly because there is no way to add a positive
number to an object and get back a NULL pointer.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
  2012-08-24 18:24 ` [Bug rtl-optimization/54365] " pinskia at gcc dot gnu.org
@ 2012-08-24 18:38 ` glaw@undo-software.com
  2012-08-24 18:43 ` jakub at gcc dot gnu.org
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: glaw@undo-software.com @ 2012-08-24 18:38 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

--- Comment #2 from Greg Law <glaw@undo-software.com> 2012-08-24 18:38:24 UTC ---
Yes, I think you're right: I hadn't appreciated that.

Still, even though it's undefined, it's slightly strange behaviour for the
compiler to adopt. I guess it's reasonable to close this bug as invalid though
if you consider that the most appropriate action.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
  2012-08-24 18:24 ` [Bug rtl-optimization/54365] " pinskia at gcc dot gnu.org
  2012-08-24 18:38 ` glaw@undo-software.com
@ 2012-08-24 18:43 ` jakub at gcc dot gnu.org
  2012-08-27  7:39 ` fweimer at redhat dot com
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: jakub at gcc dot gnu.org @ 2012-08-24 18:43 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
                 CC|                            |jakub at gcc dot gnu.org
         Resolution|                            |INVALID

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-08-24 18:42:46 UTC ---
Invalid.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
                   ` (2 preceding siblings ...)
  2012-08-24 18:43 ` jakub at gcc dot gnu.org
@ 2012-08-27  7:39 ` fweimer at redhat dot com
  2012-08-30 13:24 ` glaw@undo-software.com
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: fweimer at redhat dot com @ 2012-08-27  7:39 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

Florian Weimer <fweimer at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |fweimer at redhat dot com

--- Comment #4 from Florian Weimer <fweimer at redhat dot com> 2012-08-27 07:39:15 UTC ---
(In reply to comment #0)
>  $ gcc -O2 compilerbug.c 
>  $ ./a.out 
> no wrap
>  $ # Oh dear!

Could you try with "-O2 -fwrapv" for completeness?  Thanks.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
                   ` (3 preceding siblings ...)
  2012-08-27  7:39 ` fweimer at redhat dot com
@ 2012-08-30 13:24 ` glaw@undo-software.com
  2012-08-30 13:33 ` fweimer at redhat dot com
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: glaw@undo-software.com @ 2012-08-30 13:24 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

--- Comment #5 from Greg Law <glaw@undo-software.com> 2012-08-30 13:23:54 UTC ---
-fwrapv doesn't appear to make a difference:

 $ gcc compilerbug.c 
 $ ./a.out 
it wraps
 $ gcc -O2 compilerbug.c 
 $ ./a.out 
no wrap
 $ gcc -O2 -fwrapv compilerbug.c
 $ ./a.out
no wrap
 $


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
                   ` (4 preceding siblings ...)
  2012-08-30 13:24 ` glaw@undo-software.com
@ 2012-08-30 13:33 ` fweimer at redhat dot com
  2012-08-30 13:45 ` jakub at gcc dot gnu.org
  2012-08-30 13:56 ` fweimer at redhat dot com
  7 siblings, 0 replies; 9+ messages in thread
From: fweimer at redhat dot com @ 2012-08-30 13:33 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

--- Comment #6 from Florian Weimer <fweimer at redhat dot com> 2012-08-30 13:33:05 UTC ---
(In reply to comment #5)
> -fwrapv doesn't appear to make a difference:
> 
>  $ gcc compilerbug.c 
>  $ ./a.out 
> it wraps
>  $ gcc -O2 compilerbug.c 
>  $ ./a.out 
> no wrap
>  $ gcc -O2 -fwrapv compilerbug.c
>  $ ./a.out
> no wrap
>  $

This is surprising.  Is there a way to extend the effect of -fwrapv to pointer
arithmetic?


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
                   ` (5 preceding siblings ...)
  2012-08-30 13:33 ` fweimer at redhat dot com
@ 2012-08-30 13:45 ` jakub at gcc dot gnu.org
  2012-08-30 13:56 ` fweimer at redhat dot com
  7 siblings, 0 replies; 9+ messages in thread
From: jakub at gcc dot gnu.org @ 2012-08-30 13:45 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-08-30 13:45:13 UTC ---
This is not surprising, just use integer arithmetic instead of pointer
arithmetic.  Pointer arithmetic not only has undefined wrapping, it is defined
only within the bounds of the object it points into (or one past the last byte
in it, but you can't dereference it in that case).


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug rtl-optimization/54365] ARM optimization bug when pointer arithmetic wraps
  2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
                   ` (6 preceding siblings ...)
  2012-08-30 13:45 ` jakub at gcc dot gnu.org
@ 2012-08-30 13:56 ` fweimer at redhat dot com
  7 siblings, 0 replies; 9+ messages in thread
From: fweimer at redhat dot com @ 2012-08-30 13:56 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54365

--- Comment #8 from Florian Weimer <fweimer at redhat dot com> 2012-08-30 13:56:04 UTC ---
(In reply to comment #7)
> This is not surprising, just use integer arithmetic instead of pointer
> arithmetic.  Pointer arithmetic not only has undefined wrapping, it is defined
> only within the bounds of the object it points into (or one past the last byte
> in it, but you can't dereference it in that case).

I was hoping that -fwrapv would turn pointer arithmetic into pure address
arithmetic as well.  The -fwrapv documentation only mentions integer arithmetic
so this is not a bug, it's just ... surprising.


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-08-30 13:56 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-24 11:57 [Bug rtl-optimization/54365] New: ARM optimization bug when pointer arithmetic wraps glaw@undo-software.com
2012-08-24 18:24 ` [Bug rtl-optimization/54365] " pinskia at gcc dot gnu.org
2012-08-24 18:38 ` glaw@undo-software.com
2012-08-24 18:43 ` jakub at gcc dot gnu.org
2012-08-27  7:39 ` fweimer at redhat dot com
2012-08-30 13:24 ` glaw@undo-software.com
2012-08-30 13:33 ` fweimer at redhat dot com
2012-08-30 13:45 ` jakub at gcc dot gnu.org
2012-08-30 13:56 ` fweimer at redhat dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).