From c77deb9313ee3c4ca9885191f5cb8e07d8d68ad3 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 17 May 2026 14:28:21 +0200 Subject: Fix undefined behaviour MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libj2_j2i_lsh.c | 59 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 22 deletions(-) (limited to 'libj2_j2i_lsh.c') diff --git a/libj2_j2i_lsh.c b/libj2_j2i_lsh.c index aff86bb..0184e2d 100644 --- a/libj2_j2i_lsh.c +++ b/libj2_j2i_lsh.c @@ -90,7 +90,7 @@ int main(void) { struct libj2_j2i a, b; - struct libj2_j2u t; + struct libj2_j2u u, v, t; unsigned i, j, k, s; int overflow; @@ -101,29 +101,40 @@ main(void) libj2_j2i_zero(&b); check(&a, j, &b, 0); - libj2_not_j2u((void *)&a); - libj2_not_j2u((void *)&b); - libj2_j2u_lsh((void *)&b, j); + libj2_j2i_to_j2u(&a, &t); + libj2_not_j2u(&t); + libj2_j2u_to_j2i(&t, &a); + libj2_j2i_to_j2u(&b, &t); + libj2_not_j2u(&t); + libj2_j2u_lsh(&t, j); + libj2_j2u_to_j2i(&t, &b); check(&a, j, &b, j >= LIBJ2_J2I_BIT ? -1 : 0); for (i = 0; i < LIBJ2_J2I_BIT; i++) { libj2_j2i_zero(&a); - libj2_j2u_or_bit((void *)&a, i); + libj2_j2i_to_j2u(&a, &t); + libj2_j2u_or_bit(&t, i); + libj2_j2u_to_j2i(&t, &a); libj2_j2i_zero(&b); - if (i + j < LIBJ2_J2I_BIT) - libj2_j2u_or_bit((void *)&b, i + j); + if (i + j < LIBJ2_J2I_BIT) { + libj2_j2i_to_j2u(&b, &t); + libj2_j2u_or_bit(&t, i + j); + libj2_j2u_to_j2i(&t, &b); + } overflow = i == LIBJ2_J2I_VBIT ? j ? -1 : 0 : i + j < LIBJ2_J2I_VBIT ? 0 : +1; check(&a, j, &b, overflow); - libj2_j2i_zero(&a); - libj2_j2u_or_bit((void *)&a, i); - libj2_not_j2u((void *)&a); - libj2_j2i_zero(&b); + libj2_j2u_zero(&t); + libj2_j2u_or_bit(&t, i); + libj2_not_j2u(&t); + libj2_j2u_to_j2i(&t, &a); + libj2_j2u_zero(&t); if (i + j < LIBJ2_J2I_BIT) - libj2_j2u_or_bit((void *)&b, i + j); + libj2_j2u_or_bit(&t, i + j); for (k = 0; k < j; k++) - libj2_j2u_or_bit((void *)&b, k); - libj2_not_j2u((void *)&b); + libj2_j2u_or_bit(&t, k); + libj2_not_j2u(&t); + libj2_j2u_to_j2i(&t, &b); overflow = i == LIBJ2_J2I_VBIT ? j ? +1 : 0 : i + j < LIBJ2_J2I_VBIT ? 0 : -1; check(&a, j, &b, overflow); } @@ -132,24 +143,28 @@ main(void) for (i = 0; i < 32; i++) { for (j = 0; j < LIBJ2_J2I_BIT - 1U; j++) { for (k = 0; k <= LIBJ2_J2I_BIT + 1U; k++) { - libj2_j2i_zero(&a); - libj2_j2i_zero(&b); + libj2_j2u_zero(&u); + libj2_j2u_zero(&v); for (s = 0; s <= j; s++) { if (rand() < rand()) continue; - libj2_j2u_or_bit((void *)&a, s); - libj2_j2u_or_bit((void *)&b, s + k); + libj2_j2u_or_bit(&u, s); + libj2_j2u_or_bit(&v, s + k); } - overflow = libj2_co_j2u((const void *)&a) > libj2_co_j2u((const void *)&b); + libj2_j2u_to_j2i(&u, &a); + libj2_j2u_to_j2i(&v, &b); + overflow = libj2_co_j2u(&u) > libj2_co_j2u(&v); overflow |= libj2_j2i_is_negative(&b); check(&a, k, &b, overflow); - libj2_not_j2u((void *)&a); - libj2_not_j2u((void *)&b); + libj2_not_j2u(&u); + libj2_not_j2u(&v); libj2_ju_lsh_to_j2u(1, k, &t); libj2_j2u_sub_ju(&t, 1); libj2_not_j2u(&t); - libj2_j2u_and_j2u((void *)&b, &t); + libj2_j2u_and_j2u(&v, &t); + libj2_j2u_to_j2i(&u, &a); + libj2_j2u_to_j2i(&v, &b); overflow = -overflow; if (a.high == UINTMAX_MAX && a.low == UINTMAX_MAX && k >= LIBJ2_J2I_BIT) overflow = -1; -- cgit v1.2.3-70-g09d2