@@ -78,7 +78,7 @@ Pointer::Pointer(const Memory &m, const expr &bid, const expr &offset,
7878}
7979
8080Pointer::Pointer (const Memory &m, const char *var_name,
81- const ParamAttrs &attr, const std:: set<smt:: expr> &fn_vars)
81+ const ParamAttrs &attr, const set<expr> &fn_vars)
8282 : m(const_cast <Memory&>(m)) {
8383 auto ty = expr::mkUInt (0 , bitsShortBid () + bits_for_offset);
8484 vector<expr> vars (fn_vars.begin (), fn_vars.end ());
@@ -332,7 +332,7 @@ expr Pointer::blockSize() const {
332332expr Pointer::blockMaxSize () const {
333333 return
334334 mkIf_fold (getAllocType () == GROWABLE,
335- getValue (" blk_max_size" , m.local_blk_size , m. non_local_blk_size ,
335+ getValue (" blk_max_size" , m.local_blk_size , {} ,
336336 expr::mkUInt (0 , bits_size_t )),
337337 blockSize ());
338338}
@@ -351,6 +351,16 @@ expr Pointer::blockSizeAlignedOffsetT() const {
351351 return bits_for_offset > bits_size_t ? sz.zextOrTrunc (bits_for_offset) : sz;
352352}
353353
354+ expr Pointer::blockMaxSizeAligned () const {
355+ return
356+ blockMaxSize ().round_up_bits (blockAlignment ().zextOrTrunc (bits_size_t ));
357+ }
358+
359+ expr Pointer::blockMaxSizeAlignedOffsetT () const {
360+ expr sz = blockMaxSizeAligned ();
361+ return bits_for_offset > bits_size_t ? sz.zextOrTrunc (bits_for_offset) : sz;
362+ }
363+
354364expr Pointer::leftoverSize () const {
355365 auto off = getOffsetSizet ();
356366 auto sz = blockSizeOffsetT ();
@@ -447,22 +457,23 @@ expr Pointer::isInboundsOf(const Pointer &block, const expr &bytes0,
447457 (addr + bytes).ule (block_addr + block_size);
448458}
449459
450- expr Pointer::isInbounds (bool strict) const {
460+ expr Pointer::isInbounds (bool strict, bool max_size ) const {
451461 auto offset = getOffsetSizet ();
452- auto size = blockSizeAlignedOffsetT ();
462+ auto size = max_size ? blockMaxSizeAlignedOffsetT ()
463+ : blockSizeAlignedOffsetT ();
453464 expr ret = strict ? offset.ult (size) : offset.ule (size);
454465 if (bits_for_offset <= bits_size_t ) // implied
455466 ret &= !offset.isNegative ();
456467 return ret;
457468}
458469
459- expr Pointer::inbounds (bool simplify_ptr) {
470+ expr Pointer::inbounds (bool simplify_ptr, bool max_size ) {
460471 if (!simplify_ptr)
461- return isInbounds (false );
472+ return isInbounds (false , max_size );
462473
463474 DisjointExpr<expr> ret (expr (false )), all_ptrs;
464475 for (auto &[ptr_expr, domain] : DisjointExpr<expr>(p, 3 )) {
465- expr inb = Pointer (m, ptr_expr).isInbounds (false );
476+ expr inb = Pointer (m, ptr_expr).isInbounds (false , max_size );
466477 if (!inb.isFalse ())
467478 all_ptrs.add (ptr_expr, domain);
468479 ret.add (std::move (inb), domain);
0 commit comments