Running the plugins/src.ctf.fs/succeed/test_succeed test in a build with
-fsanitize=undefined, I get a failure:
# Generating trace 'simple'
ERROR: "/home/simark/build/babeltrace/tests/plugins/src.ctf.fs/succeed/gen-trace-simple" "/tmp/tmp.QvrLAHYWXw" failed
not ok 3 - Generated trace 'simple' gives the expected output
This is because of this undefined behavior error:
$ /home/simark/build/babeltrace/tests/plugins/src.ctf.fs/succeed/gen-trace-simple /tmp/yo
/home/simark/src/babeltrace/src/ctf-writer/stream.c:483:29: runtime error: shift exponent 64 is too large for 64-bit type 'long long unsigned int'
#0 0x7feddba0c21d in update_clock_value /home/simark/src/babeltrace/src/ctf-writer/stream.c:483
#1 0x7feddba0c918 in visit_field_update_clock_value /home/simark/src/babeltrace/src/ctf-writer/stream.c:555
#2 0x7feddba0cd74 in visit_field_update_clock_value /home/simark/src/babeltrace/src/ctf-writer/stream.c:626
#3 0x7feddba0ced2 in visit_event_update_clock_value /home/simark/src/babeltrace/src/ctf-writer/stream.c:663
#4 0x7feddba0e129 in set_packet_context_timestamps /home/simark/src/babeltrace/src/ctf-writer/stream.c:818
#5 0x7feddba0ebca in auto_populate_packet_context /home/simark/src/babeltrace/src/ctf-writer/stream.c:908
#6 0x7feddba146aa in bt_ctf_stream_flush /home/simark/src/babeltrace/src/ctf-writer/stream.c:1650
#7 0x55940807b535 in write_stream /home/simark/src/babeltrace/tests/plugins/src.ctf.fs/succeed/gen-trace-simple.c:109
#8 0x55940807b75b in main /home/simark/src/babeltrace/tests/plugins/src.ctf.fs/succeed/gen-trace-simple.c:119
#9 0x7feddae3c78f (/usr/lib/libc.so.6+0x2378f)
#10 0x7feddae3c849 in __libc_start_main (/usr/lib/libc.so.6+0x23849)
#11 0x559408079f74 in _start (/home/simark/build/babeltrace/tests/plugins/src.ctf.fs/succeed/.libs/gen-trace-simple+0x2af74)
Fix that by avoiding the left shift if new_val_size is 64. If
new_val_size is 64, leave pow2 at 0, which is what I suppose is the
behavior we are relying on.
Change-Id: I8814773e24c53094be5af613664e6ed4b9ef2d82
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/9586
Reviewed-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Tested-by: jenkins <jenkins@lttng.org>
void update_clock_value(uint64_t *val, uint64_t new_val,
unsigned int new_val_size)
{
- const uint64_t pow2 = 1ULL << new_val_size;
+ const uint64_t pow2 = new_val_size == 64 ? 0 : 1ULL << new_val_size;
const uint64_t mask = pow2 - 1;
uint64_t val_masked;