Message ID | 20211221110235.14345.62450.stgit@dceara.remote.csb |
---|---|
State | Changes Requested |
Headers | show |
Series | Fix UndefinedBehaviorSanitizer reported issues and enable it in CI. | expand |
Context | Check | Description |
---|---|---|
ovsrobot/apply-robot | success | apply and check: success |
ovsrobot/github-robot-_Build_and_Test | success | github build: passed |
Dumitru Ceara <dceara@redhat.com> writes: > UB Sanitizer reports: > tests/test-hash.c:59:40: runtime error: shift exponent 64 is too large for 64-bit type 'long unsigned int' > #0 0x44c3c9 in get_range128 tests/test-hash.c:59 > #1 0x44cb2e in check_hash_bytes128 tests/test-hash.c:178 > #2 0x44d14d in test_hash_main tests/test-hash.c:282 > [...] > ofproto/ofproto-dpif-xlate.c:5607:45: runtime error: left shift of 65535 by 16 places cannot be represented in type 'int' > #0 0x53fe9f in xlate_sample_action ofproto/ofproto-dpif-xlate.c:5607 > #1 0x54d625 in do_xlate_actions ofproto/ofproto-dpif-xlate.c:7160 > #2 0x553b76 in xlate_actions ofproto/ofproto-dpif-xlate.c:7806 > #3 0x4fcb49 in upcall_xlate ofproto/ofproto-dpif-upcall.c:1237 > #4 0x4fe02f in process_upcall ofproto/ofproto-dpif-upcall.c:1456 > #5 0x4fda99 in upcall_cb ofproto/ofproto-dpif-upcall.c:1358 > [...] > tests/test-util.c:89:23: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' > #0 0x476415 in test_ctz tests/test-util.c:89 > [...] > lib/dpif-netlink.c:396:33: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' > #0 0x571b9f in dpif_netlink_open lib/dpif-netlink.c:396 > > Signed-off-by: Dumitru Ceara <dceara@redhat.com> > --- Acked-by: Aaron Conole <aconole@redhat.com>
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 424a28401901..8bd975225aa2 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -84,7 +84,7 @@ enum { MAX_PORTS = USHRT_MAX }; #define EPOLLEXCLUSIVE (1u << 28) #endif -#define OVS_DP_F_UNSUPPORTED (1 << 31); +#define OVS_DP_F_UNSUPPORTED (1u << 31); /* This PID is not used by the kernel datapath when using dispatch per CPU, * but it is required to be set (not zero). */ diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index cafcd014ade7..41461e802fb5 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -5618,7 +5618,8 @@ xlate_sample_action(struct xlate_ctx *ctx, /* Scale the probability from 16-bit to 32-bit while representing * the same percentage. */ - uint32_t probability = (os->probability << 16) | os->probability; + uint32_t probability = + ((uint32_t) os->probability << 16) | os->probability; /* If ofp_port in flow sample action is equel to ofp_port, * this sample action is a input port action. */ diff --git a/tests/test-hash.c b/tests/test-hash.c index 5d3f8ea43f65..7c33922e3f02 100644 --- a/tests/test-hash.c +++ b/tests/test-hash.c @@ -174,7 +174,7 @@ check_hash_bytes128(void (*hash)(const void *, size_t, uint32_t, ovs_u128 *), set_bit128(&in2, j, n_bits); hash(&in2, sizeof(ovs_u128), 0, &out2); - for (ofs = 0; ofs < 128 - min_unique; ofs++) { + for (ofs = 1; ofs < 128 - min_unique; ofs++) { uint64_t bits1 = get_range128(&out1, ofs, unique_mask); uint64_t bits2 = get_range128(&out2, ofs, unique_mask); diff --git a/tests/test-util.c b/tests/test-util.c index f0fd0421086b..7d899fbbfd92 100644 --- a/tests/test-util.c +++ b/tests/test-util.c @@ -43,17 +43,16 @@ check_log_2_floor(uint32_t x, int n) static void test_log_2_floor(struct ovs_cmdl_context *ctx OVS_UNUSED) { - int n; - - for (n = 0; n < 32; n++) { + for (uint32_t n = 0; n < 32; n++) { /* Check minimum x such that f(x) == n. */ - check_log_2_floor(1 << n, n); + check_log_2_floor(UINT32_C(1) << n, n); /* Check maximum x such that f(x) == n. */ - check_log_2_floor((1 << n) | ((1 << n) - 1), n); + check_log_2_floor((UINT32_C(1) << n) | ((UINT32_C(1) << n) - 1), n); /* Check a random value in the middle. */ - check_log_2_floor((random_uint32() & ((1 << n) - 1)) | (1 << n), n); + check_log_2_floor((random_uint32() & ((UINT32_C(1) << n) - 1)) + | (UINT32_C(1) << n), n); } /* log_2_floor(0) is undefined, so don't check it. */ @@ -86,7 +85,7 @@ test_ctz(struct ovs_cmdl_context *ctx OVS_UNUSED) for (n = 0; n < 32; n++) { /* Check minimum x such that f(x) == n. */ - check_ctz32(1 << n, n); + check_ctz32(UINT32_C(1) << n, n); /* Check maximum x such that f(x) == n. */ check_ctz32(UINT32_MAX << n, n);
UB Sanitizer reports: tests/test-hash.c:59:40: runtime error: shift exponent 64 is too large for 64-bit type 'long unsigned int' #0 0x44c3c9 in get_range128 tests/test-hash.c:59 #1 0x44cb2e in check_hash_bytes128 tests/test-hash.c:178 #2 0x44d14d in test_hash_main tests/test-hash.c:282 [...] ofproto/ofproto-dpif-xlate.c:5607:45: runtime error: left shift of 65535 by 16 places cannot be represented in type 'int' #0 0x53fe9f in xlate_sample_action ofproto/ofproto-dpif-xlate.c:5607 #1 0x54d625 in do_xlate_actions ofproto/ofproto-dpif-xlate.c:7160 #2 0x553b76 in xlate_actions ofproto/ofproto-dpif-xlate.c:7806 #3 0x4fcb49 in upcall_xlate ofproto/ofproto-dpif-upcall.c:1237 #4 0x4fe02f in process_upcall ofproto/ofproto-dpif-upcall.c:1456 #5 0x4fda99 in upcall_cb ofproto/ofproto-dpif-upcall.c:1358 [...] tests/test-util.c:89:23: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' #0 0x476415 in test_ctz tests/test-util.c:89 [...] lib/dpif-netlink.c:396:33: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' #0 0x571b9f in dpif_netlink_open lib/dpif-netlink.c:396 Signed-off-by: Dumitru Ceara <dceara@redhat.com> --- lib/dpif-netlink.c | 2 +- ofproto/ofproto-dpif-xlate.c | 3 ++- tests/test-hash.c | 2 +- tests/test-util.c | 13 ++++++------- 4 files changed, 10 insertions(+), 10 deletions(-)