http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59961

            Bug ID: 59961
           Summary: Use of size_t in leading term of computation with
                    subtraction
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olaf at robots dot ox.ac.uk

The minimalistic example further down produces a very unexpected result and no
warnings at all. I understand that size_t s1 can not be negative. However, in
my example using "-s1*..." in the leading term of the computation therefore
seems to cause an overflow.

Quite curiously, a similar bug is caused when using "unsigned int" instead of
size_t, but no bugs are caused if using "unsigned short" or "unsigned char".
The bug also does not appear if the + and - terms are swapped. All of this is
on an x86_64 platform.

Even if may be correct in a very obscure way according to some C specification,
it would be very helpful to issue a warning with -Wall -Wextra



/* compile with gcc -Wall -Wextra testcase.c */

#include <stdio.h>

int main(int ac, char**dc)
{
        ac = ac; dc = dc;

        size_t s1 = 100;
        size_t s2 = 200;
        double d1 = 0.123;
        double d2 = 0.234;

        double result = -s1*d1 + s2*d2;

        printf("%lf %lf\n", result, -100*0.123+200*0.234);

        return 0;
}

Reply via email to