bug-gnulib
[Top][All Lists]
Advanced

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

Re: parse-datetime.y reports integer overflow when compiled with gcc 5.5


From: Bruno Haible
Subject: Re: parse-datetime.y reports integer overflow when compiled with gcc 5.5.0
Date: Fri, 08 Jan 2021 22:49:14 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-197-generic; KDE/5.18.0; x86_64; ; )

Sergey Poznyakoff wrote:
> With recent gnulib (v0.1-4336-gbdae9a5), attempting to compile
> parse-datetime.c fails with:
> 
> $ make -k parse-datetime.o V=1
> gcc -DHAVE_CONFIG_H -I. -I..     -Wall -ggdb -MT parse-datetime.o -MD -MP -MF 
> .deps/parse-datetime.Tpo -c -o parse-datetime.o parse-datetime.c
> In file included from parse-datetime.y:39:0:
> parse-datetime.y: In function 'to_tm_year':
> intprops.h:578:17: warning: integer overflow in expression [-Woverflow]
>        || (tmax) + (b) < (a)))
>                  ^
> intprops.h:524:4: note: in expansion of macro 
> '_GL_INT_SUBTRACT_RANGE_OVERFLOW'
>    (overflow (a, b, tmin, tmax) \
>     ^
> intprops.h:491:10: note: in expansion of macro '_GL_INT_OP_CALC'
>         ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
>           ^
> intprops.h:389:4: note: in expansion of macro '_GL_INT_OP_WRAPV'
>     _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
>     ^
> parse-datetime.y:1274:9: note: in expansion of macro 'INT_SUBTRACT_WRAPV'
>        : INT_SUBTRACT_WRAPV (year, TM_YEAR_BASE, tm_year))
>          ^
> parse-datetime.y: In function 'yylex':
> intprops.h:578:17: warning: integer overflow in expression [-Woverflow]
>        || (tmax) + (b) < (a)))
>                  ^
> intprops.h:524:4: note: in expansion of macro 
> '_GL_INT_SUBTRACT_RANGE_OVERFLOW'
>    (overflow (a, b, tmin, tmax) \
>     ^
> intprops.h:500:11: note: in expansion of macro '_GL_INT_OP_CALC'
>          ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
>            ^
> intprops.h:495:7: note: in expansion of macro '_GL_INT_OP_WRAPV_LONGISH'
>      : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
>        ^
> intprops.h:389:4: note: in expansion of macro '_GL_INT_OP_WRAPV'
>     _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
>     ^
> parse-datetime.y:1469:23: note: in expansion of macro 'INT_SUBTRACT_WRAPV'
>                    if (INT_SUBTRACT_WRAPV (s, 1, &s))
>                        ^

The compilation doesn't fail; it merely shows warning.

When I modify intprops.h to behave the same for all GCC versions as for GCC 5.x,
I see:
  * The warning is there for all GCC versions < 10, but is fixed in GCC 10.2.0.
  * GCC 9.3.0 has more details:

In file included from parse-datetime.y:39:
parse-datetime.y: In function 'to_tm_year':
intprops.h:576:17: warning: integer overflow in expression of type 'int' 
results in '-2147481749' [-Woverflow]
  576 |       || (tmax) + (b) < (a)))
      |                 ^
intprops.h:522:4: note: in expansion of macro '_GL_INT_SUBTRACT_RANGE_OVERFLOW'
  522 |   (overflow (a, b, tmin, tmax) \
      |    ^~~~~~~~
intprops.h:489:10: note: in expansion of macro '_GL_INT_OP_CALC'
  489 |        ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
      |          ^~~~~~~~~~~~~~~
intprops.h:389:4: note: in expansion of macro '_GL_INT_OP_WRAPV'
  389 |    _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
      |    ^~~~~~~~~~~~~~~~
parse-datetime.y:1274:9: note: in expansion of macro 'INT_SUBTRACT_WRAPV'
 1274 |       : INT_SUBTRACT_WRAPV (year, TM_YEAR_BASE, tm_year))
      |         ^~~~~~~~~~~~~~~~~~
parse-datetime.y: In function 'yylex':
intprops.h:576:17: warning: integer overflow in expression of type 'long int' 
results in '-9223372036854775808' [-Woverflow]
  576 |       || (tmax) + (b) < (a)))
      |                 ^
intprops.h:522:4: note: in expansion of macro '_GL_INT_SUBTRACT_RANGE_OVERFLOW'
  522 |   (overflow (a, b, tmin, tmax) \
      |    ^~~~~~~~
intprops.h:498:11: note: in expansion of macro '_GL_INT_OP_CALC'
  498 |         ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
      |           ^~~~~~~~~~~~~~~
intprops.h:493:7: note: in expansion of macro '_GL_INT_OP_WRAPV_LONGISH'
  493 |     : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
      |       ^~~~~~~~~~~~~~~~~~~~~~~~
intprops.h:389:4: note: in expansion of macro '_GL_INT_OP_WRAPV'
  389 |    _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
      |    ^~~~~~~~~~~~~~~~
parse-datetime.y:1469:23: note: in expansion of macro 'INT_SUBTRACT_WRAPV'
 1469 |                   if (INT_SUBTRACT_WRAPV (s, 1, &s))
      |                       ^~~~~~~~~~~~~~~~~~

So, the problem is a signed-integer overflow of constants in a dead
(unreachable) code branch.

Bruno




reply via email to

[Prev in Thread] Current Thread [Next in Thread]