ctf-writer: avoid undefined behavior left shift
authorSimon Marchi <simon.marchi@efficios.com>
Sat, 18 Feb 2023 03:13:16 +0000 (22:13 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 7 Mar 2023 16:23:40 +0000 (11:23 -0500)
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>
src/ctf-writer/stream.c

index ccd7cc605bc797d01c3ab3df2fa8e644ed6aad27..41da4c88332e0a2538e88f09ecdd5ceb35e5bf00 100644 (file)
@@ -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;
 
This page took 0.025968 seconds and 4 git commands to generate.