bitfield.h uses the left shift operator with a left operand which may be negative. The C99 standard states that shifting a negative value is undefined.
We also need to cast the result explicitly into the left hand side type to deal with: warning: large integer implicitly truncated to unsigned type [-Woverflow] Signed-off-by: Mathieu Desnoyers <mathieu.desnoy...@efficios.com> --- include/babeltrace/bitfield-internal.h | 61 ++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/include/babeltrace/bitfield-internal.h b/include/babeltrace/bitfield-internal.h index c5d5eccd..da56f089 100644 --- a/include/babeltrace/bitfield-internal.h +++ b/include/babeltrace/bitfield-internal.h @@ -55,19 +55,24 @@ #define _bt_is_signed_type(type) ((type) -1 < (type) 0) /* - * NOTE: The cast to (uint64_t) below ensures that we're not casting a - * negative value, which is undefined in C. However, this limits the - * maximum type size of `type` and `v` to 64-bit. The - * _bt_check_max_64bit() is used to check that the users of this header - * do not use types with a size greater than 64-bit. + * NOTE: The unsigned cast ensures that we're not shifting a negative + * value, which is undefined in C. However, this limits the maximum + * type size of `type` and `v` to 64-bit. The _bt_check_max_64bit() is + * used to check that the users of this header do not use types with a + * size greater than 64-bit. */ #define _bt_unsigned_cast(type, v) \ ({ \ - (sizeof(v) < sizeof(type)) ? \ - ((type) (v)) & ((type) (~(~(uint64_t) 0 << (sizeof(v) * CHAR_BIT)))) : \ - (type) (v); \ + __builtin_types_compatible_p(type, int8_t) ? (uint8_t) (v) : \ + __builtin_types_compatible_p(type, int16_t) ? (uint16_t) (v) : \ + __builtin_types_compatible_p(type, int32_t) ? (uint32_t) (v) : \ + __builtin_types_compatible_p(type, int64_t) ? (uint64_t) (v) : \ + (type) (v); \ }) +/* Unsigned bitwise complement. */ +#define _bt_bitwise_not(type, v) _bt_unsigned_cast(type, ~(type) v) + #define _bt_check_max_64bit(type) \ char _max_64bit_assertion[sizeof(type) <= sizeof(uint64_t) ? 1 : -1] __attribute__((unused)) @@ -108,15 +113,15 @@ do { \ \ /* Trim v high bits */ \ if (__length < sizeof(__v) * CHAR_BIT) \ - __v &= ~((~(typeof(__v)) 0) << __length); \ + __v &= (__typeof__(__v)) ~(_bt_bitwise_not(typeof(__v), 0) << __length); \ \ /* We can now append v with a simple "or", shift it piece-wise */ \ this_unit = start_unit; \ if (start_unit == end_unit - 1) { \ - mask = ~((~(type) 0) << (__start % ts)); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (__start % ts)); \ if (end % ts) \ - mask |= (~(type) 0) << (end % ts); \ - cmask = (type) __v << (__start % ts); \ + mask |= (__typeof__(mask)) (_bt_bitwise_not(type, 0) << (end % ts)); \ + cmask = (__typeof__(cmask)) (_bt_unsigned_cast(type, __v) << (__start % ts)); \ cmask &= ~mask; \ __ptr[this_unit] &= mask; \ __ptr[this_unit] |= cmask; \ @@ -124,8 +129,8 @@ do { \ } \ if (__start % ts) { \ cshift = __start % ts; \ - mask = ~((~(type) 0) << cshift); \ - cmask = (type) __v << cshift; \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << cshift); \ + cmask = (__typeof__(cmask)) (_bt_unsigned_cast(type, __v) << cshift); \ cmask &= ~mask; \ __ptr[this_unit] &= mask; \ __ptr[this_unit] |= cmask; \ @@ -139,7 +144,7 @@ do { \ __start += ts; \ } \ if (end % ts) { \ - mask = (~(type) 0) << (end % ts); \ + mask = (__typeof__(mask)) (_bt_bitwise_not(type, 0) << (end % ts)); \ cmask = (type) __v; \ cmask &= ~mask; \ __ptr[this_unit] &= mask; \ @@ -167,15 +172,15 @@ do { \ \ /* Trim v high bits */ \ if (__length < sizeof(__v) * CHAR_BIT) \ - __v &= ~((~(typeof(__v)) 0) << __length); \ + __v &= (__typeof__(__v)) ~(_bt_bitwise_not(typeof(__v), 0) << __length); \ \ /* We can now append v with a simple "or", shift it piece-wise */ \ this_unit = end_unit - 1; \ if (start_unit == end_unit - 1) { \ - mask = ~((~(type) 0) << ((ts - (end % ts)) % ts)); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << ((ts - (end % ts)) % ts)); \ if (__start % ts) \ - mask |= (~((type) 0)) << (ts - (__start % ts)); \ - cmask = (type) __v << ((ts - (end % ts)) % ts); \ + mask |= (__typeof__(mask)) (_bt_bitwise_not(type, 0) << (ts - (__start % ts))); \ + cmask = (__typeof__(cmask)) (_bt_unsigned_cast(type, __v) << ((ts - (end % ts)) % ts)); \ cmask &= ~mask; \ __ptr[this_unit] &= mask; \ __ptr[this_unit] |= cmask; \ @@ -183,8 +188,8 @@ do { \ } \ if (end % ts) { \ cshift = end % ts; \ - mask = ~((~(type) 0) << (ts - cshift)); \ - cmask = (type) __v << (ts - cshift); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (ts - cshift)); \ + cmask = (__typeof__(cmask)) (_bt_unsigned_cast(type, __v) << (ts - cshift)); \ cmask &= ~mask; \ __ptr[this_unit] &= mask; \ __ptr[this_unit] |= cmask; \ @@ -198,7 +203,7 @@ do { \ end -= ts; \ } \ if (__start % ts) { \ - mask = (~(type) 0) << (ts - (__start % ts)); \ + mask = (__typeof__(mask)) (_bt_bitwise_not(type, 0) << (ts - (__start % ts))); \ cmask = (type) __v; \ cmask &= ~mask; \ __ptr[this_unit] &= mask; \ @@ -275,7 +280,7 @@ do { \ cmask = __ptr[this_unit]; \ cmask >>= (__start % ts); \ if ((end - __start) % ts) { \ - mask = ~((~(type) 0) << (end - __start)); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (end - __start)); \ cmask &= mask; \ } \ __v = _bt_piecewise_lshift(__v, end - __start); \ @@ -285,7 +290,7 @@ do { \ } \ if (end % ts) { \ cshift = end % ts; \ - mask = ~((~(type) 0) << cshift); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << cshift); \ cmask = __ptr[this_unit]; \ cmask &= mask; \ __v = _bt_piecewise_lshift(__v, cshift); \ @@ -299,7 +304,7 @@ do { \ end -= ts; \ } \ if (__start % ts) { \ - mask = ~((~(type) 0) << (ts - (__start % ts))); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (ts - (__start % ts))); \ cmask = __ptr[this_unit]; \ cmask >>= (__start % ts); \ cmask &= mask; \ @@ -346,7 +351,7 @@ do { \ cmask = __ptr[this_unit]; \ cmask >>= (ts - (end % ts)) % ts; \ if ((end - __start) % ts) { \ - mask = ~((~(type) 0) << (end - __start)); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (end - __start)); \ cmask &= mask; \ } \ __v = _bt_piecewise_lshift(__v, end - __start); \ @@ -356,7 +361,7 @@ do { \ } \ if (__start % ts) { \ cshift = __start % ts; \ - mask = ~((~(type) 0) << (ts - cshift)); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (ts - cshift)); \ cmask = __ptr[this_unit]; \ cmask &= mask; \ __v = _bt_piecewise_lshift(__v, ts - cshift); \ @@ -370,7 +375,7 @@ do { \ __start += ts; \ } \ if (end % ts) { \ - mask = ~((~(type) 0) << (end % ts)); \ + mask = (__typeof__(mask)) ~(_bt_bitwise_not(type, 0) << (end % ts)); \ cmask = __ptr[this_unit]; \ cmask >>= ts - (end % ts); \ cmask &= mask; \ -- 2.11.0 _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev