aboutsummaryrefslogtreecommitdiffstats
path: root/libj2_j2i_sub_ji.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-05-17 14:28:21 +0200
committerMattias Andrée <m@maandree.se>2026-05-17 15:06:44 +0200
commitc77deb9313ee3c4ca9885191f5cb8e07d8d68ad3 (patch)
tree1de53628d7bffdac84992d8ae1e36d4bf0265c90 /libj2_j2i_sub_ji.c
parentFix usage of va_arg (diff)
downloadlibj2-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.c27
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));
}