Re: libc/printf bug



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:

On a sunny day (27 Feb 2006 12:09:54 -0800) it happened "bill pursell"
<bill.pursell@xxxxxxxxx> wrote in
<1141070994.179527.261050@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>:

The following code exhibits unexpected behavior. Either it's
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]$

How would you print a float in hex?

Actually, floating point types now have a hexadecimal
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.
I think when the subroutine is called, the variables are on teh stack.
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.

.



Relevant Pages

  • Re: libc/printf bug
    ... How would you print a float in hex? ... So if you wite %x the thing will increment stackpointer by some bytes to ... rules are different, floats become doubles, char/short become ints and similar. ...
    (comp.os.linux.development.apps)
  • Re: internals of typecasting
    ... > object of type int is applied an cast of float the result ... > would be of type float. ... casting from floating-point numbers to integers. ...
    (comp.lang.c)
  • Re: Problems With strtof()
    ... >I then tried to convert it into a float and store it in another variable. ... The cast is unnecessary but also not harmful. ... really have a C99 compiler or is this a typo? ...
    (comp.lang.c)
  • Re: 12.34f vs (float) 12.34
    ... where cast followed by a literal parses the literal ... believe the compiler makes passes over the statement/expression trees it has ... generated, looking for certain patterns, and replacing them with ... float it's not guaranteed to be no more than a float. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Selecting record with specific datetime
    ... How about using a standard format and forgetting all that CAST stuff (why ... would float ever come into this?)... ... SELECT FROM TABLENAME ... the query returns zero results. ...
    (microsoft.public.sqlserver.programming)