public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0)
@ 2010-10-16 13:26 mbuilov at gmail dot com
2010-10-16 13:32 ` [Bug c/46045] " zsojka at seznam dot cz
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: mbuilov at gmail dot com @ 2010-10-16 13:26 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045
Summary: incorrect code generated if redecalring local variable
in do-while(0)
Product: gcc
Version: 4.5.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: mbuilov@gmail.com
following program gives incorrect results if compiled with -O0 and crashes if
compiled with -O2
$cat test.c
struct A
{
int k;
};
static int *foo(struct A *a)
{
do {
struct A *a = a;
return &a->k;
} while (0);
}
int main(int argc, char *argv[])
{
struct A a = {1};
return *foo(&a);
}
$gcc -O0 test.c && ./a.out ; echo $?
72
$gcc -O2 test.c && ./a.out ; echo $?
Segmentation fault
139
Renaming local variable in do-while fixes the problem:
< struct A *a = a;
< return &a->k;
---
> struct A *b = a;
> return &b->k;
$gcc -O0 test.c && ./a.out ; echo $?
1
$gcc -O2 test.c && ./a.out ; echo $?
1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/46045] incorrect code generated if redecalring local variable in do-while(0)
2010-10-16 13:26 [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0) mbuilov at gmail dot com
@ 2010-10-16 13:32 ` zsojka at seznam dot cz
2010-10-16 18:44 ` rguenth at gcc dot gnu.org
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: zsojka at seznam dot cz @ 2010-10-16 13:32 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045
Zdenek Sojka <zsojka at seznam dot cz> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |zsojka at seznam dot cz
--- Comment #1 from Zdenek Sojka <zsojka at seznam dot cz> 2010-10-16 13:31:58 UTC ---
> struct A *a = a;
Refers to the just declared variable, thus the variable is initialised by
itself.
$ gcc-4.6.0-pre9999 test.c -Wall -W -Wshadow -Winit-self
test.c: In function 'foo':
test.c:9:27: warning: declaration of 'a' shadows a parameter [-Wshadow]
test.c:6:27: warning: shadowed declaration is here [-Wshadow]
test.c:6:27: warning: unused parameter 'a' [-Wunused-parameter]
test.c: In function 'main':
test.c:14:14: warning: unused parameter 'argc' [-Wunused-parameter]
test.c:14:26: warning: unused parameter 'argv' [-Wunused-parameter]
test.c: In function 'foo':
test.c:9:27: warning: 'a' is used uninitialized in this function
[-Wuninitialized]
You get the warning with -Winit-self -Wuninitialized
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/46045] incorrect code generated if redecalring local variable in do-while(0)
2010-10-16 13:26 [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0) mbuilov at gmail dot com
2010-10-16 13:32 ` [Bug c/46045] " zsojka at seznam dot cz
@ 2010-10-16 18:44 ` rguenth at gcc dot gnu.org
2010-10-17 15:51 ` mbuilov at gmail dot com
2010-10-17 16:19 ` mbuilov at gmail dot com
3 siblings, 0 replies; 5+ messages in thread
From: rguenth at gcc dot gnu.org @ 2010-10-16 18:44 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045
Richard Guenther <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |INVALID
--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-10-16 18:43:42 UTC ---
.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/46045] incorrect code generated if redecalring local variable in do-while(0)
2010-10-16 13:26 [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0) mbuilov at gmail dot com
2010-10-16 13:32 ` [Bug c/46045] " zsojka at seznam dot cz
2010-10-16 18:44 ` rguenth at gcc dot gnu.org
@ 2010-10-17 15:51 ` mbuilov at gmail dot com
2010-10-17 16:19 ` mbuilov at gmail dot com
3 siblings, 0 replies; 5+ messages in thread
From: mbuilov at gmail dot com @ 2010-10-17 15:51 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045
--- Comment #3 from Michael Builov <mbuilov at gmail dot com> 2010-10-17 15:51:16 UTC ---
Just a warning with -Wextra, but no warnings with -Wall -pedantic.
I found a bug with this code:
struct A {
#definer dump(_a_) \
do { \
Struct A *a = _a_; \
printf("%d, %d\n", a->k, a->m); \
} while (0)
Struct *b, a;
dump(b); /* fine */
dump(a); /* crash */
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/46045] incorrect code generated if redecalring local variable in do-while(0)
2010-10-16 13:26 [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0) mbuilov at gmail dot com
` (2 preceding siblings ...)
2010-10-17 15:51 ` mbuilov at gmail dot com
@ 2010-10-17 16:19 ` mbuilov at gmail dot com
3 siblings, 0 replies; 5+ messages in thread
From: mbuilov at gmail dot com @ 2010-10-17 16:19 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045
--- Comment #4 from Michael Builov <mbuilov at gmail dot com> 2010-10-17 16:19:37 UTC ---
Just a warning with -Wextra, but no warnings with -Wall -pedantic.
I found a bug with this code:
struct A {
int k;
int m;
};
#define dump(_a_) \
do { \
struct A *a = _a_; \
printk("%d, %d\n", a->k, a->m); \
} while (0)
void foo(struct A *b, struct A *a)
{
dump(b); /* fine */
dump(a); /* crash */
}
This code compiles and runs fine with Sun cc, but crashes with gcc.
I think it is definitely a bug in gcc, this code compiled only with extra
warnings (not enabled by default in linux kernel) should not crash.
The best way to fix this issue - generate an error message, like when
redeclaring variable in function:
void bar(struct A *a)
{
struct A *a = a; /* error: 'a' redeclared as different kind of symbol
*/
}
strange, but no errors/non-extra warnings with:
void bar(struct A *a)
{
{
struct A *a = a;
}
}
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-10-17 16:19 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-16 13:26 [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0) mbuilov at gmail dot com
2010-10-16 13:32 ` [Bug c/46045] " zsojka at seznam dot cz
2010-10-16 18:44 ` rguenth at gcc dot gnu.org
2010-10-17 15:51 ` mbuilov at gmail dot com
2010-10-17 16:19 ` mbuilov at gmail 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).