diff options
| author | Mattias Andrée <m@maandree.se> | 2026-05-17 14:28:21 +0200 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-05-17 15:06:44 +0200 |
| commit | c77deb9313ee3c4ca9885191f5cb8e07d8d68ad3 (patch) | |
| tree | 1de53628d7bffdac84992d8ae1e36d4bf0265c90 /libj2_j2i_sub_ji.c | |
| parent | Fix usage of va_arg (diff) | |
| download | libj2-c77deb9313ee3c4ca9885191f5cb8e07d8d68ad3.tar.gz libj2-c77deb9313ee3c4ca9885191f5cb8e07d8d68ad3.tar.bz2 libj2-c77deb9313ee3c4ca9885191f5cb8e07d8d68ad3.tar.xz | |
Fix undefined behaviour
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libj2_j2i_sub_ji.c')
| -rw-r--r-- | libj2_j2i_sub_ji.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/libj2_j2i_sub_ji.c b/libj2_j2i_sub_ji.c index 34222f6..1749c9d 100644 --- a/libj2_j2i_sub_ji.c +++ b/libj2_j2i_sub_ji.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); EXPECT(overflow == 0 || overflow == +1); + libj2_j2u_to_j2i(&a, &t); + libj2_j2u_to_j2i(&u, &r); 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)); } |
