从python中检查z3 bitvector溢出?

时间:2014-03-21 20:26:31

标签: z3 z3py

z3的C API具有Z3_mk_bvadd_no_overflow等功能,但Python API似乎没有这些功能。在我开始进行黑客攻击以解决这个问题之前,我想确认是这种情况,并要求将这些内容添加到官方版本中。

我尝试将这样的内容添加到z3.py,但到目前为止还没有设法让细节正确。关于我出错的地方的建议将不胜感激。我正在使用contrib分支。

def Bvadd_no_overflow(a, b, si, ctx=None):
    """Create a Z3 bvadd_no_overflow expression.

    """
    ctx = _get_ctx(_ctx_from_ast_arg_list([a, b], ctx))
    # argh can't hard-code the 32
    s = BitVecSort(32,ctx)
    a = s.cast(a)
    b = s.cast(b)
    # this function requires a bool as the last argument but is it a python bool, a
    # z3 bool, or what?
    return BitVecRef(Z3_mk_bvadd_no_overflow(ctx.ref(), a.as_ast(), b.as_ast(), 1), ctx) 

1 个答案:

答案 0 :(得分:3)

事实上,似乎这些功能尚未在更高级别的API中提供。这些方面的某些内容可能会为您完成任务:

def bvadd_no_overflow(x, y, signed=False):
    assert x.ctx_ref()==y.ctx_ref()
    a, b = z3._coerce_exprs(x, y)
    return BoolRef(Z3_mk_bvadd_no_overflow(a.ctx_ref(), a.as_ast(), b.as_ast(), signed))

以下是使用此功能的示例,该功能对我有用:

q = BitVec('q', 32)
r = BitVec('r', 32)
s.add(bvadd_no_overflow(q, r))
print(s)

打印

[Extract(32, 32, ZeroExt(1, q) + ZeroExt(1, r)) == 0]

(在内部,这表示为取两个位向量的+,然后提取最高位。)