[Bug c/66582] New: -Wstrict-overflow issues invalid warning.

matthias.meixner at verifone dot com gcc-bugzilla@gcc.gnu.org
Thu Jun 18 09:43:00 GMT 2015


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66582

            Bug ID: 66582
           Summary: -Wstrict-overflow issues invalid warning.
           Product: gcc
           Version: 4.8.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: matthias.meixner at verifone dot com
  Target Milestone: ---

Compiling the code below gives a warning when compiled as follows.

gcc -O3 -Wall -c opt.c -DSHOWWARN

opt.c: In function ‘test’:
opt.c:18:9: warning: assuming signed overflow does not occur when assuming that
(X + c) >= X is always true [-Wstrict-overflow]
       if(tst > last || tst < first) return 1234;
         ^
opt.c:13:23: warning: assuming signed overflow does not occur when assuming
that (X + c) >= X is always true [-Wstrict-overflow]
       if (first > tst && tst > last  ) return 1234;

The strange thing is that it does not give any warning at all, when compiled
using:

gcc -O3 -Wall -c opt.c

The difference between the two is just the order of the comparisons which
should not make any real difference. 


This is the code that was used:
==================================

int get(int *a, int *b);

int test()
{
   int last,tst,first;

   get(&last,&first);

   tst = last;
   if (tst <=0) tst += 9999;   

   if (first > last) {
      if (first > tst && tst > last  ) return 1234;
   }
   else
   {
#ifdef SHOWWARN
      if(tst > last || tst < first) return 1234;
#else
      if(tst < first || tst > last) return 1234;
#endif
   }
   return 4321;
}


More information about the Gcc-bugs mailing list