从python检查z3位向量溢出?

从python检查z3位向量溢出?,z3,z3py,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_

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) 

实际上,这些函数在更高级别的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]

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

Christoph,谢谢!当被调用时,这段代码会随着“在位置2参数上的排序不匹配”而消失,但我确信它很接近,我会继续尝试。好吧,我尝试了很多关于这个主题的小变化,并不断得到相同的错误消息,argh。我已经通过调用z3来更新它。_强制执行_exprs(API就是这么做的)。这个版本和以前的版本都适合我。我已经添加了一个使用它的例子,以防出现问题。谢谢Christoph!我将提交一个拉请求,一旦我得到这个集成。