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)
答案 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]
(在内部,这表示为取两个位向量的+,然后提取最高位。)