Re: libc/printf bug
- From: "Nils O. Selåsdal" <NOS@xxxxxxx>
- Date: Tue, 28 Feb 2006 14:08:48 +0100
Jan Panteltje wrote:
On a sunny day (Mon, 27 Feb 2006 23:55:20 GMT) it happened Micah Cowan
<micah@xxxxxxxxxx> wrote in <8764n09wph.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>:
Jan Panteltje <pNaonStpealmtje@xxxxxxxxx> writes:I think when the subroutine is called, the variables are on teh stack.
On a sunny day (27 Feb 2006 12:09:54 -0800) it happened "bill pursell"Actually, floating point types now have a hexadecimal
<bill.pursell@xxxxxxxxx> wrote in
<1141070994.179527.261050@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>:
The following code exhibits unexpected behavior. Either it'sHow would you print a float in hex?
a bug in libc, or the author (me) is blind as a bat. Am I missing
something here, or is something horribly wrong? It appears
that printf is mangling the address unless the second argument
gets cast. I don't see that the cast should have any effect at all
on the output. Any thoughts?
[tmp]$ cat printf_bug.c
int
main()
{
float a=0;
printf("%p\n", &a);
printf("%x %p\n", a, &a);
printf("%x %p\n", (int)a, &a);
}
[tmp]$ ./a.out
0xfefb6764
0 (nil)
0 0xfefb6764
[tmp]$
representation. See if your system/C-implementation has the "a" and
"A" conversion specifiers.
I think print will convert it to integer, and that is 0.It will not: variadic functions are "dumb" about what you're passing
it. You have to explicitly cast.
How much the stackpointerneeds to be incremented for each variable
is set by its type (the function will use that).
So if you wite %x the thing will increment stackpointer by some bytes to
get the next variable.
If that increment was wrong (because you handed it a float), then it
will have the next variable as some part of the current one.
I still think Asm here, push this push that, then index stackpointer
to get those vars back.
'variadic' my foot.
Both, though. The original post hadn't included stdio.h, so all
arguments would be pushed on the stack(typically) as ints. With a
prototype for printf, which accepts varadic arguments, the promotion
rules are different, floats become doubles, char/short become ints and similar.
But yeah, %x might result in reading overlapping arguments vs what
was actually pushed, or result in a trap, or the like.
Main thing is though, if you do something producing undefined behavior
according to C, strange things might happen :-)
.
- Follow-Ups:
- Re: libc/printf bug
- From: Micah Cowan
- Re: libc/printf bug
- References:
- libc/printf bug
- From: bill pursell
- Re: libc/printf bug
- From: Jan Panteltje
- Re: libc/printf bug
- From: Micah Cowan
- Re: libc/printf bug
- From: Jan Panteltje
- libc/printf bug
- Prev by Date: Re: libc/printf bug
- Next by Date: But now for something completely different, how to shorten these long delays in kernel 2.6?
- Previous by thread: Re: libc/printf bug
- Next by thread: Re: libc/printf bug
- Index(es):
Relevant Pages
|