diff options
author | Gavin D. Howard <gavin@gavinhoward.com> | 2023-02-27 22:30:14 -0700 |
---|---|---|
committer | Gavin D. Howard <gavin@gavinhoward.com> | 2023-02-27 22:30:14 -0700 |
commit | 6fd3203a77031793432388027cafe628eeb716af (patch) | |
tree | dd9a1ec947a3b8755dab0ca951754b836f94e573 | |
parent | 83ac71a77f383b7cfe35e015a94d2a4b0de06afb (diff) | |
download | bc-6fd3203a77031793432388027cafe628eeb716af.tar.gz |
Fix bcl bugs when in memcheck mode
Signed-off-by: Gavin D. Howard <gavin@gavinhoward.com>
-rw-r--r-- | include/bcl.h | 3 | ||||
-rw-r--r-- | include/library.h | 6 | ||||
-rw-r--r-- | src/library.c | 39 |
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); |