[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Full-disclosure] [Fwd: Re: {Java,PHP} Server Exploits]



On Thu, 10 Feb 2011 11:39:57 EST, Leon Kaiser said:

> "Yay open source"?
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323

>From comment #2 on that bug:

State-Changed-Why: See any faq on numerical analysis that mentions the x86.
    You are seeing the results of excess precision in the FPU.
    Either change the rounding precision in the FPCR, or work
    around the problem with -ffloat-store.

Let's look at the problematic line in the sample code:

    if (y != y2) printf("error\n");

This will cause the printf to trigger if the two numbers are bitwise identical
down to the last bit.  If y and y2 were computed via different code paths, and
thus hit different patterns of rounding and truncation, they could easily be
different in the last bit or two (for example, 3.993428883437 and
3.993428883436).  It's been well understood since literally the 1950s that if
you're trying to do any serious floating-point computation, such comparisons
should usually be written as 'if (abs(y - y2) < epsilon)' for whatever value of
epsilon you're willing to accept as a fuzz factor.

Although it's probably possible to "fix" gcc to do the right thing for the test
case in the bug report, it's in general *not* possible to "fix" this in the
general case.  It just becomes a total mess of little special corner cases and
makes performance of both the optimizer and the generated code totally tank.

There's only a limited amount of things the compiler and optimizer can do to 
save
a programmer from improper numeric analysis.

For further details, read comment 109 and/or the paper referenced in
comment 96.  Many of the other comments are also relevant.

Attachment: pgp7Qc6bd7u3T.pgp
Description: PGP signature

_______________________________________________
Full-Disclosure - We believe in it.
Charter: http://lists.grok.org.uk/full-disclosure-charter.html
Hosted and sponsored by Secunia - http://secunia.com/