Fix: overflow of signed integer results in undefined behaviour
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 3 May 2016 02:46:28 +0000 (22:46 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 3 May 2016 02:46:28 +0000 (22:46 -0400)
commit9dc0d640e89f40e93b27cf0a82217a3dfa4186a3
tree8f17aa4c5ddc2e4ec35fac212794fc12d62318ee
parentd460dc7fa7af51a10b47243250b9bf92824b07c4
Fix: overflow of signed integer results in undefined behaviour

The expression "min_value = -((int64_t)1 << (size - 1))"

will result in a signed integer overflow when size is 64
((1ULL << 63) > LONG_MAX).

Note that larger sizes are unsupported and checked for in the setter.

Signed overflows result in undefined behaviour and llvm takes
advantage of this to optimize away the range check

"if (value < min_value || value > max_value) {"

Surprisingly, this was not catched by GCC, Coverity, scan-build or
cppcheck.

The fix consists in computing both bounds using an unsigned long long
type and, in the case of the lower bound, negating it (resulting in a
long long).

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/fields.c
This page took 0.041534 seconds and 4 git commands to generate.