From 6e137ea259113b5452a2dc268d43a7e4a39bccab Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 17 Feb 2023 22:13:16 -0500 Subject: [PATCH] ctf-writer: avoid undefined behavior left shift MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-on: https://review.lttng.org/c/babeltrace/+/9586 Reviewed-by: Jérémie Galarneau Tested-by: jenkins --- src/ctf-writer/stream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ctf-writer/stream.c b/src/ctf-writer/stream.c index ccd7cc60..41da4c88 100644 --- a/src/ctf-writer/stream.c +++ b/src/ctf-writer/stream.c @@ -480,7 +480,7 @@ static 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; -- 2.34.1