fix undefined shift operations on signed integers

This commit is contained in:
Miroslav Lichvar 2015-12-02 12:06:01 +01:00
parent 934df19c52
commit 8e71a46173
2 changed files with 13 additions and 5 deletions

View file

@ -414,7 +414,7 @@ SRC_UpdateReachability(SRC_Instance inst, int reachable)
{
inst->reachability <<= 1;
inst->reachability |= !!reachable;
inst->reachability &= ~(-1 << SOURCE_REACH_BITS);
inst->reachability %= 1U << SOURCE_REACH_BITS;
if (inst->reachability_size < SOURCE_REACH_BITS)
inst->reachability_size++;

16
util.c
View file

@ -352,7 +352,7 @@ UTI_IPToRefid(IPAddr *ip)
assert(0);
return 0;
};
return buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3];
return (uint32_t)buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3];
}
return 0;
}
@ -796,11 +796,19 @@ UTI_TimevalHostToNetwork(struct timeval *src, Timeval *dest)
double
UTI_FloatNetworkToHost(Float f)
{
int32_t exp, coef, x;
int32_t exp, coef;
uint32_t x;
x = ntohl(f.f);
exp = (x >> FLOAT_COEF_BITS) - FLOAT_COEF_BITS;
coef = x << FLOAT_EXP_BITS >> FLOAT_EXP_BITS;
if (exp >= 1 << (FLOAT_EXP_BITS - 1))
exp -= 1 << FLOAT_EXP_BITS;
coef = x % (1U << FLOAT_COEF_BITS);
if (coef >= 1 << (FLOAT_COEF_BITS - 1))
coef -= 1 << FLOAT_COEF_BITS;
return coef * pow(2.0, exp);
}
@ -857,7 +865,7 @@ UTI_FloatHostToNetwork(double x)
if (neg)
coef = (uint32_t)-coef << FLOAT_EXP_BITS >> FLOAT_EXP_BITS;
f.f = htonl(exp << FLOAT_COEF_BITS | coef);
f.f = htonl((uint32_t)exp << FLOAT_COEF_BITS | coef);
return f;
}