public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/30148] New: parameter passing bug
@ 2006-12-11 16:55 gcc-bugzilla at gcc dot gnu dot org
2006-12-13 12:09 ` [Bug target/30148] " lindig at cs dot uni-sb dot de
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: gcc-bugzilla at gcc dot gnu dot org @ 2006-12-11 16:55 UTC (permalink / raw)
To: gcc-bugs
The following code tests that values are passed correctly from a
call to a function. This fails, when the followign code is
compiled with -O2 and executed:
foo: foo.c:65: callee_b0f: Assertion `b14.b3 == b20.b3' failed.
The code below is automatically generated explicitly to test for
parameter-passing bugs. Since the pre-processed code below might be
hard to understand, here is the orginal code as well.
/* These macros are defined in Lua string Quest.header, which may be
* re-defined from the quest command line or in file quest.lua.
*/
#ifndef QUEST_FAILED
#include <assert.h>
#define QUEST_ASSERT(x) assert(x)
#else
#define QUEST_ASSERT(x) if (!(x)) failed(__LINE__)
#endif
#include <stdarg.h>
extern int printf(char *, ...);
static int errors = 0;
static void failed(int line)
{ printf("failed in %s: %d\n", __FILE__, line); errors++; }
static union bt7 { unsigned long int b10; double *b11; } b12 = {1989374529UL};
static
struct bt5 { unsigned int *b7; unsigned int b8; signed b9:10; } b17
= {(unsigned int *) 229073790U, 777271108U, 408};
static union bt6 { } b18 = {};
static union bt0 { } b13 = {};
static
struct bt3
{
float b3;
struct bt1 { short int b0; signed b1:2; } b4;
struct bt2 { float b2; } b5;
}
b14
= {10569.23, {17187, 1}, {45076.89}};
static union bt4 { double b6; } b15 = {92314.64};
static double b16 = 89201.46;
union bt7 callee_b0f(struct bt5 bp2, union bt6 bp3, ...)
{
va_list ap;
typedef union bt0 bd0;
typedef struct bt3 bd1;
typedef union bt4 bd2;
typedef double bd3;
bd0 b19;
bd1 b20;
bd2 b21;
bd3 b22;
/* seed: 4346181125667919790 */
va_start(ap, bp3);
QUEST_ASSERT(b17.b7 == bp2.b7);
QUEST_ASSERT(b17.b8 == bp2.b8);
QUEST_ASSERT(b17.b9 == bp2.b9);
b19 = va_arg(ap, bd0);
b20 = va_arg(ap, bd1);
b21 = va_arg(ap, bd2);
b22 = va_arg(ap, bd3);
QUEST_ASSERT(b14.b3 == b20.b3);
QUEST_ASSERT(b14.b4.b0 == b20.b4.b0);
QUEST_ASSERT(b14.b4.b1 == b20.b4.b1);
QUEST_ASSERT(b14.b5.b2 == b20.b5.b2);
QUEST_ASSERT(b15.b6 == b21.b6);
QUEST_ASSERT(b16 == b22);
va_end(ap);
return b12;
}
static void caller_b1f()
{
union bt7 b23;
/* seed: 4346181125667919790 */
b23 = callee_b0f(b17, b18, b13, b14, b15, b16);
QUEST_ASSERT(b12.b10 == b23.b10);
}
int main(int argc, char **argv) { caller_b1f(); return errors; }
Below is the pre-processed code:
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "foo.c"
# 15 "foo.c"
# 1 "/usr/include/assert.h" 1 3 4
# 36 "/usr/include/assert.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 308 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 309 "/usr/include/features.h" 2 3 4
# 331 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4
# 332 "/usr/include/features.h" 2 3 4
# 37 "/usr/include/assert.h" 2 3 4
# 67 "/usr/include/assert.h" 3 4
extern void __assert_fail (__const char *__assertion, __const char *__file,
unsigned int __line, __const char *__function)
__attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
extern void __assert_perror_fail (int __errnum, __const char *__file,
unsigned int __line,
__const char *__function)
__attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
extern void __assert (const char *__assertion, const char *__file, int __line)
__attribute__ ((__nothrow__)) __attribute__ ((__noreturn__));
# 16 "foo.c" 2
# 1 "/usr/lib/gcc/x86_64-linux-gnu/4.1.2/include/stdarg.h" 1 3 4
# 43 "/usr/lib/gcc/x86_64-linux-gnu/4.1.2/include/stdarg.h" 3 4
typedef __builtin_va_list __gnuc_va_list;
# 105 "/usr/lib/gcc/x86_64-linux-gnu/4.1.2/include/stdarg.h" 3 4
typedef __gnuc_va_list va_list;
# 22 "foo.c" 2
extern int printf(char *, ...);
static int errors = 0;
static void failed(int line)
{ printf("failed in %s: %d\n", "foo.c", line); errors++; }
static union bt7 { unsigned long int b10; double *b11; } b12 = {1989374529UL};
static
struct bt5 { unsigned int *b7; unsigned int b8; signed b9:10; } b17
= {(unsigned int *) 229073790U, 777271108U, 408};
static union bt6 { } b18 = {};
static union bt0 { } b13 = {};
static
struct bt3
{
float b3;
struct bt1 { short int b0; signed b1:2; } b4;
struct bt2 { float b2; } b5;
}
b14
= {10569.23, {17187, 1}, {45076.89}};
static union bt4 { double b6; } b15 = {92314.64};
static double b16 = 89201.46;
union bt7 callee_b0f(struct bt5 bp2, union bt6 bp3, ...)
{
va_list ap;
typedef union bt0 bd0;
typedef struct bt3 bd1;
typedef union bt4 bd2;
typedef double bd3;
bd0 b19;
bd1 b20;
bd2 b21;
bd3 b22;
__builtin_va_start(ap,bp3);
((void) ((b17.b7 == bp2.b7) ? 0 : (__assert_fail ("b17.b7 == bp2.b7",
"foo.c", 58, __PRETTY_FUNCTION__), 0)));
((void) ((b17.b8 == bp2.b8) ? 0 : (__assert_fail ("b17.b8 == bp2.b8",
"foo.c", 59, __PRETTY_FUNCTION__), 0)));
((void) ((b17.b9 == bp2.b9) ? 0 : (__assert_fail ("b17.b9 == bp2.b9",
"foo.c", 60, __PRETTY_FUNCTION__), 0)));
b19 = __builtin_va_arg(ap,bd0);
b20 = __builtin_va_arg(ap,bd1);
b21 = __builtin_va_arg(ap,bd2);
b22 = __builtin_va_arg(ap,bd3);
((void) ((b14.b3 == b20.b3) ? 0 : (__assert_fail ("b14.b3 == b20.b3",
"foo.c", 65, __PRETTY_FUNCTION__), 0)));
((void) ((b14.b4.b0 == b20.b4.b0) ? 0 : (__assert_fail ("b14.b4.b0 ==
b20.b4.b0", "foo.c", 66, __PRETTY_FUNCTION__), 0)));
((void) ((b14.b4.b1 == b20.b4.b1) ? 0 : (__assert_fail ("b14.b4.b1 ==
b20.b4.b1", "foo.c", 67, __PRETTY_FUNCTION__), 0)));
((void) ((b14.b5.b2 == b20.b5.b2) ? 0 : (__assert_fail ("b14.b5.b2 ==
b20.b5.b2", "foo.c", 68, __PRETTY_FUNCTION__), 0)));
((void) ((b15.b6 == b21.b6) ? 0 : (__assert_fail ("b15.b6 == b21.b6",
"foo.c", 69, __PRETTY_FUNCTION__), 0)));
((void) ((b16 == b22) ? 0 : (__assert_fail ("b16 == b22", "foo.c", 70,
__PRETTY_FUNCTION__), 0)));
__builtin_va_end(ap);
return b12;
}
static void caller_b1f()
{
union bt7 b23;
b23 = callee_b0f(b17, b18, b13, b14, b15, b16);
((void) ((b12.b10 == b23.b10) ? 0 : (__assert_fail ("b12.b10 == b23.b10",
"foo.c", 79, __PRETTY_FUNCTION__), 0)));
}
int main(int argc, char **argv) { caller_b1f(); return errors; }
Environment:
System: Linux kubrick 2.6.16-2-amd64-k8-smp #1 SMP Fri Aug 18 21:10:33 CEST
2006 x86_64 GNU/Linux
Architecture: x86_64
host: x86_64-pc-linux-gnu
build: x86_64-pc-linux-gnu
target: x86_64-pc-linux-gnu
configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu
--enable-libstdcxx-debug --enable-mpfr --enable-checking=release
x86_64-linux-gnu
How-To-Repeat:
Compile the code above with -O2 and run it; this should result
in an assertion failure.
------- Comment #1 from lindig at cs dot uni-sb dot de 2006-12-11 16:55 -------
Fix:
No fix known.
--
Summary: parameter passing bug
Product: gcc
Version: 4.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: lindig at cs dot uni-sb dot de
GCC build triplet: x86_64-pc-linux-gnu
GCC host triplet: x86_64-pc-linux-gnu
GCC target triplet: x86_64-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30148
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug target/30148] parameter passing bug
2006-12-11 16:55 [Bug c/30148] New: parameter passing bug gcc-bugzilla at gcc dot gnu dot org
@ 2006-12-13 12:09 ` lindig at cs dot uni-sb dot de
2008-02-04 16:17 ` rguenth at gcc dot gnu dot org
2010-07-13 10:49 ` steven at gcc dot gnu dot org
2 siblings, 0 replies; 4+ messages in thread
From: lindig at cs dot uni-sb dot de @ 2006-12-13 12:09 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from lindig at cs dot uni-sb dot de 2006-12-13 12:09 -------
Created an attachment (id=12794)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12794&action=view)
preprocessed file to reproduce the bug.
I have now attached the file that reproduces the bug to make everyone's life
easier. The bug can be summarized as follows: when a struct (b14) is passed by
value as a vararg, it may be garbled. In this case, the struct is passed as the
second vararg (b14) where the first one (b13) is an empty struct {}. This could
confuse the code that implements the calling convention.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30148
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug target/30148] parameter passing bug
2006-12-11 16:55 [Bug c/30148] New: parameter passing bug gcc-bugzilla at gcc dot gnu dot org
2006-12-13 12:09 ` [Bug target/30148] " lindig at cs dot uni-sb dot de
@ 2008-02-04 16:17 ` rguenth at gcc dot gnu dot org
2010-07-13 10:49 ` steven at gcc dot gnu dot org
2 siblings, 0 replies; 4+ messages in thread
From: rguenth at gcc dot gnu dot org @ 2008-02-04 16:17 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from rguenth at gcc dot gnu dot org 2008-02-04 16:16 -------
Works on the trunk, fails for 4.1 and 4.2 branches with -O2,
-fno-strict-aliasing
makes the failure go away there. Inlining is not required to trigger the bug.
Probably a dup of one of the various alias-related miscompiles on the branches.
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
Keywords| |alias
Known to fail| |4.1.2 4.2.3
Known to work| |4.3.0
Last reconfirmed|0000-00-00 00:00:00 |2008-02-04 16:16:20
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30148
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug target/30148] parameter passing bug
2006-12-11 16:55 [Bug c/30148] New: parameter passing bug gcc-bugzilla at gcc dot gnu dot org
2006-12-13 12:09 ` [Bug target/30148] " lindig at cs dot uni-sb dot de
2008-02-04 16:17 ` rguenth at gcc dot gnu dot org
@ 2010-07-13 10:49 ` steven at gcc dot gnu dot org
2 siblings, 0 replies; 4+ messages in thread
From: steven at gcc dot gnu dot org @ 2010-07-13 10:49 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from steven at gcc dot gnu dot org 2010-07-13 10:49 -------
GCC 4.1 and GCC 4.2 are no longer maintained => WONTFIX.
--
steven at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |WONTFIX
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30148
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-07-13 10:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-12-11 16:55 [Bug c/30148] New: parameter passing bug gcc-bugzilla at gcc dot gnu dot org
2006-12-13 12:09 ` [Bug target/30148] " lindig at cs dot uni-sb dot de
2008-02-04 16:17 ` rguenth at gcc dot gnu dot org
2010-07-13 10:49 ` steven at gcc dot gnu dot org
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).