diff options
author | Jo-Philipp Wich <jo@mein.io> | 2023-07-25 13:56:30 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2023-07-25 14:06:21 +0200 |
commit | 4f4f38f4f5d09cd5f5f1d036db841fb23d69e59d (patch) | |
tree | b88a0af8408036a7b3118165ebb2adf5c45cac8d | |
parent | 5efb7a0c109a3bd42b63ed55218be1d8958249fd (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.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -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... */ |