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).