aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin D. Howard <gavin@gavinhoward.com>2023-02-27 22:30:14 -0700
committerGavin D. Howard <gavin@gavinhoward.com>2023-02-27 22:30:14 -0700
commit6fd3203a77031793432388027cafe628eeb716af (patch)
treedd9a1ec947a3b8755dab0ca951754b836f94e573
parent83ac71a77f383b7cfe35e015a94d2a4b0de06afb (diff)
downloadbc-6fd3203a77031793432388027cafe628eeb716af.tar.gz
Fix bcl bugs when in memcheck mode
Signed-off-by: Gavin D. Howard <gavin@gavinhoward.com>
-rw-r--r--include/bcl.h3
-rw-r--r--include/library.h6
-rw-r--r--src/library.c39
3 files changed, 27 insertions, 21 deletions
diff --git a/include/bcl.h b/include/bcl.h
index 25313823..0c7a41d2 100644
--- a/include/bcl.h
+++ b/include/bcl.h
@@ -36,6 +36,9 @@
#ifndef BC_BCL_H
#define BC_BCL_H
+// TODO: Add a generation index when building with Valgrind to check for
+// use-after-free's or double frees.
+
#include <stdbool.h>
#include <stdlib.h>
#include <limits.h>
diff --git a/include/library.h b/include/library.h
index fa1d7b7a..7a6e8581 100644
--- a/include/library.h
+++ b/include/library.h
@@ -298,7 +298,8 @@ typedef BcNum BclNum;
#define BC_CHECK_NUM(c, n) \
do \
{ \
- if (BC_ERR((n).i >= (c)->nums.len)) \
+ size_t no_gen_ = BCL_NO_GEN(n); \
+ if (BC_ERR(no_gen_ >= (c)->nums.len)) \
{ \
if ((n).i > 0 - (size_t) BCL_ERROR_NELEMS) return (n); \
else \
@@ -323,7 +324,8 @@ typedef BcNum BclNum;
#define BC_CHECK_NUM_ERR(c, n) \
do \
{ \
- if (BC_ERR((n).i >= (c)->nums.len)) \
+ size_t no_gen_ = BCL_NO_GEN(n); \
+ if (BC_ERR(no_gen_ >= (c)->nums.len)) \
{ \
if ((n).i > 0 - (size_t) BCL_ERROR_NELEMS) \
{ \
diff --git a/src/library.c b/src/library.c
index 71f35541..d4cfb489 100644
--- a/src/library.c
+++ b/src/library.c
@@ -526,7 +526,8 @@ bcl_num_insert(BclContext ctxt, BclNum* restrict n)
n->gen_idx = 0;
#endif // BC_ENABLE_MEMCHECK
- // Just push the number onto the vector.
+ // Just push the number onto the vector because the generation index is
+ // 0.
idx.i = ctxt->nums.len;
bc_vec_push(&ctxt->nums, n);
}
@@ -691,7 +692,7 @@ bcl_num_neg(BclNumber n)
BCL_CHECK_NUM_VALID(ctxt, n);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
num = BCL_NUM(ctxt, n);
@@ -711,7 +712,7 @@ bcl_num_setNeg(BclNumber n, bool neg)
BCL_CHECK_NUM_VALID(ctxt, n);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
num = BCL_NUM(ctxt, n);
@@ -731,7 +732,7 @@ bcl_num_scale(BclNumber n)
BCL_CHECK_NUM_VALID(ctxt, n);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
num = BCL_NUM(ctxt, n);
@@ -756,7 +757,7 @@ bcl_num_setScale(BclNumber n, size_t scale)
BC_FUNC_HEADER(vm, err);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
nptr = BCL_NUM(ctxt, n);
@@ -789,7 +790,7 @@ bcl_num_len(BclNumber n)
BCL_CHECK_NUM_VALID(ctxt, n);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
num = BCL_NUM(ctxt, n);
@@ -812,7 +813,7 @@ bcl_bigdig(BclNumber n, BclBigDig* result)
BC_FUNC_HEADER(vm, err);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
assert(result != NULL);
num = BCL_NUM(ctxt, n);
@@ -883,7 +884,7 @@ bcl_binary(BclNumber a, BclNumber b, const BcNumBinaryOp op,
BCL_GROW_NUMS(ctxt);
- assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(a) < ctxt->nums.len && BCL_NO_GEN(b) < ctxt->nums.len);
aptr = BCL_NUM(ctxt, a);
bptr = BCL_NUM(ctxt, b);
@@ -976,7 +977,7 @@ bcl_sqrt(BclNumber a)
BCL_GROW_NUMS(ctxt);
- assert(a.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(a) < ctxt->nums.len);
aptr = BCL_NUM(ctxt, a);
@@ -1087,8 +1088,8 @@ bcl_modexp(BclNumber a, BclNumber b, BclNumber c)
BCL_GROW_NUMS(ctxt);
- assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len);
- assert(c.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(a) < ctxt->nums.len && BCL_NO_GEN(b) < ctxt->nums.len);
+ assert(BCL_NO_GEN(c) < ctxt->nums.len);
aptr = BCL_NUM(ctxt, a);
bptr = BCL_NUM(ctxt, b);
@@ -1135,7 +1136,7 @@ bcl_cmp(BclNumber a, BclNumber b)
BCL_CHECK_NUM_VALID(ctxt, a);
BCL_CHECK_NUM_VALID(ctxt, b);
- assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(a) < ctxt->nums.len && BCL_NO_GEN(b) < ctxt->nums.len);
aptr = BCL_NUM(ctxt, a);
bptr = BCL_NUM(ctxt, b);
@@ -1157,7 +1158,7 @@ bcl_zero(BclNumber n)
BCL_CHECK_NUM_VALID(ctxt, n);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
nptr = BCL_NUM(ctxt, n);
@@ -1177,7 +1178,7 @@ bcl_one(BclNumber n)
BCL_CHECK_NUM_VALID(ctxt, n);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
nptr = BCL_NUM(ctxt, n);
@@ -1249,11 +1250,11 @@ bcl_string(BclNumber n)
BCL_CHECK_NUM_VALID(ctxt, n);
- if (BC_ERR(n.i >= ctxt->nums.len)) return str;
+ if (BC_ERR(BCL_NO_GEN(n) >= ctxt->nums.len)) return str;
BC_FUNC_HEADER(vm, err);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
nptr = BCL_NUM(ctxt, n);
@@ -1297,7 +1298,7 @@ bcl_irand(BclNumber a)
BCL_GROW_NUMS(ctxt);
- assert(a.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(a) < ctxt->nums.len);
aptr = BCL_NUM(ctxt, a);
@@ -1445,7 +1446,7 @@ bcl_ifrand(BclNumber a, size_t places)
BCL_GROW_NUMS(ctxt);
- assert(a.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(a) < ctxt->nums.len);
aptr = BCL_NUM(ctxt, a);
@@ -1481,7 +1482,7 @@ bcl_rand_seedWithNum(BclNumber n)
BC_FUNC_HEADER(vm, err);
- assert(n.i < ctxt->nums.len);
+ assert(BCL_NO_GEN(n) < ctxt->nums.len);
nptr = BCL_NUM(ctxt, n);