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_sub_j2i.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'libj2_j2i_sub_j2i.c') diff --git a/libj2_j2i_sub_j2i.c b/libj2_j2i_sub_j2i.c index 24610cd..fbb569c 100644 --- a/libj2_j2i_sub_j2i.c +++ b/libj2_j2i_sub_j2i.c @@ -23,7 +23,7 @@ static void validate(uintmax_t a_high, uintmax_t a_low, uintmax_t b_high, uintmax_t b_low, uintmax_t r_high, uintmax_t r_low, int r_overflow) { int a_neg, b_neg, overflow; - struct libj2_j2u a, b; + struct libj2_j2u a, b, u; struct libj2_j2i t, r; t = (struct libj2_j2i){.high = a_high, .low = a_low}; @@ -41,31 +41,38 @@ validate(uintmax_t a_high, uintmax_t a_low, uintmax_t b_high, uintmax_t b_low, u if (a_neg && b_neg) { overflow = 0; libj2_minus_j2u(&a); - libj2_j2u_add_j2u_to_j2u_overflow(&a, &b, (void *)&r); - EXPECT(libj2_j2i_gt_j2i(&r, (const void *)&a)); + libj2_j2u_add_j2u_to_j2u_overflow(&a, &b, &u); + libj2_j2u_to_j2i(&u, &r); + libj2_j2u_to_j2i(&a, &t); + EXPECT(libj2_j2i_gt_j2i(&r, &t)); } else if (a_neg) { - overflow = -libj2_j2u_add_j2u_to_j2u_overflow(&a, &b, (void *)&r); + overflow = -libj2_j2u_add_j2u_to_j2u_overflow(&a, &b, &u); + libj2_j2u_to_j2i(&u, &r); EXPECT(overflow == 0 || overflow == -1); libj2_minus_j2i(&r); + libj2_j2u_to_j2i(&a, &t); if (!libj2_j2i_is_negative(&r)) overflow = -1; else if (overflow) - EXPECT(libj2_j2i_gt_j2i(&r, (const void *)&a)); + EXPECT(libj2_j2i_gt_j2i(&r, &t)); if (!overflow) - EXPECT(libj2_j2i_le_j2i(&r, (const void *)&a)); + EXPECT(libj2_j2i_le_j2i(&r, &t)); } else if (b_neg) { - overflow = +libj2_j2u_add_j2u_to_j2u_overflow(&a, &b, (void *)&r); + overflow = +libj2_j2u_add_j2u_to_j2u_overflow(&a, &b, &u); + libj2_j2u_to_j2i(&u, &r); EXPECT(overflow == 0 || overflow == +1); + libj2_j2u_to_j2i(&a, &t); if (!libj2_j2i_is_positive(&r)) overflow = +1; else if (overflow) - EXPECT(libj2_j2i_lt_j2i(&r, (const void *)&a)); + EXPECT(libj2_j2i_lt_j2i(&r, &t)); if (!overflow) - EXPECT(libj2_j2i_gt_j2i(&r, (const void *)&a)); + EXPECT(libj2_j2i_gt_j2i(&r, &t)); } else { overflow = 0; libj2_minus_j2u(&b); - libj2_j2u_add_j2u_to_j2u(&a, &b, (void *)&r); + libj2_j2u_add_j2u_to_j2u(&a, &b, &u); + libj2_j2u_to_j2i(&u, &r); EXPECT(libj2_j2i_le_j2u(&r, &a)); } -- cgit v1.2.3-70-g09d2