aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libj2/addition.h2
-rw-r--r--libj2_j2u_add_j2u.c4
2 files changed, 6 insertions, 0 deletions
diff --git a/libj2/addition.h b/libj2/addition.h
index 48df7d4..c0fed6e 100644
--- a/libj2/addition.h
+++ b/libj2/addition.h
@@ -400,6 +400,8 @@ libj2_j2u_add_j2u_overflow_p(const struct libj2_j2u *a, const struct libj2_j2u *
return (int)(a->high >> (LIBJ2_JU_BIT - 1U));
else if (libj2_j2u_add_ju_overflow_p(a, b->low))
return 1;
+ else if (a->low > UINTMAX_MAX - b->low)
+ return a->high + 1U > UINTMAX_MAX - b->high;
else
return a->high > UINTMAX_MAX - b->high;
}
diff --git a/libj2_j2u_add_j2u.c b/libj2_j2u_add_j2u.c
index 5f26629..29d2a93 100644
--- a/libj2_j2u_add_j2u.c
+++ b/libj2_j2u_add_j2u.c
@@ -243,6 +243,10 @@ main(void)
check_double(UINTMAX_MAX, random_ju());
}
+ check_manual(UINTMAX_MAX - 1U, UINTMAX_MAX - 1U, 1, 1, UINTMAX_MAX, UINTMAX_MAX, 0);
+ check_manual(UINTMAX_MAX - 1U, UINTMAX_MAX - 1U, 1, 2, 0, 0, 1);
+ check_manual(UINTMAX_MAX - 1U, UINTMAX_MAX - 1U, 1, 3, 0, 1, 1);
+
return 0;
}