summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2023-07-25 13:56:30 +0200
committerJo-Philipp Wich <jo@mein.io>2023-07-25 14:06:21 +0200
commit4f4f38f4f5d09cd5f5f1d036db841fb23d69e59d (patch)
treeb88a0af8408036a7b3118165ebb2adf5c45cac8d
parent5efb7a0c109a3bd42b63ed55218be1d8958249fd (diff)
types: don't rely on implicit type conversion in ucv_compare()
- Don't implicitly convert intptr_t difference to int8_t but perform explicit comparisons - Don't implicitly convert strcmp() int result to int8_t Fixes: #165 Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--types.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/types.c b/types.c
index 5758f74..d601479 100644
--- a/types.c
+++ b/types.c
@@ -1998,7 +1998,7 @@ ucv_compare(int how, uc_value_t *v1, uc_value_t *v2, int *deltap)
uint64_t u1, u2;
int64_t n1, n2;
double d1, d2;
- int8_t delta;
+ int delta;
/* at least one operand is null and we compare for equality or inequality ... */
if ((!v1 || !v2) && (how == I_EQ || how == I_NE)) {
@@ -2015,7 +2015,12 @@ ucv_compare(int how, uc_value_t *v1, uc_value_t *v2, int *deltap)
/* ... both operands are of the same, non-scalar type... */
if (t1 == t2 && !ucv_is_scalar(v1)) {
/* ... compare memory addrs */
- delta = (intptr_t)v1 - (intptr_t)v2;
+ if ((uintptr_t)v1 == (uintptr_t)v2)
+ delta = 0;
+ else if ((uintptr_t)v1 < (uintptr_t)v2)
+ delta = -1;
+ else
+ delta = 1;
}
/* ... operands are of different type or at least one is scalar... */