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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|---                         |INVALID

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
static int
increment_overflow(int *number, int delta)
{
        int     number0;

        number0 = *number;
        *number += delta;
        return (*number < number0) != (delta < 0);
}

static int
long_increment_overflow(long *number, int delta)
{
        long    number0;

        number0 = *number;
        *number += delta;
        return (*number < number0) != (delta < 0);
}

These all have undefined behavior with respect to signed overflow.
You either need to use unsigned types to do the addition and then see if there
was an overflow or you need to check for the overflow before it happens.


The latest code (from
https://github.com/epam/libdt/blob/master/src/unix/libtz/libtz.c at least) has:
static int
long_increment_overflow(lp, m)
long *const    lp;
int const   m;
{
    register long const l = *lp;

    if ((l >= 0) ? (m > LONG_MAX - l) : (m < LONG_MIN - l)) {
        return TRUE;
    }
    *lp += m;
    return FALSE;
}

Reply via email to