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



             Bug #: 56917

           Summary: -ftrapv detects a overflow wrongly.

    Classification: Unclassified

           Product: gcc

           Version: unknown

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: a...@fsij.org





Created attachment 29855

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29855

steps to reproduce the -ftrapv problem



I found that following program aborts with -ftrapv with gcc-4.8.0 on

Debian GNU/Linux (x86_64).



  % cat tst.c

  unsigned long ul = 0x8000000000000000UL;



  int main(int argc, char *argv[])

  {

    long l;

    l = (-(long)(ul-1))-1;

    return 0;

  }

  % /home/src/gcc/bin/gcc -g -ftrapv -Wall tst.c

  tst.c: In function 'main':

  tst.c:5:8: warning: variable 'l' set but not used [-Wunused-but-set-variable]

     long l;

      ^

  % ./a.out 

  zsh: abort (core dumped)  ./a.out



I think it should not abort on x86_64.



Since ul is LONG_MAX+1 (in indefinite precision), ul-1 is LONG_MAX which is

representable in long.

So the cast, (long)(ul-1), doesn't change the value.

Its negation, -(long)(ul-1), is -LONG_MAX which is also representable in long.

Its predecessor, (-(long)(ul-1))-1, is -LONG_MAX-1 = LONG_MIN which is also

representable in long.



gcc-ftrapv-problem-log.txt contains the log with gcc -v.

Reply via email to