Z3 API:解析定点SMTLib字符串时崩溃

时间:2017-03-09 12:28:34

标签: z3

我正在尝试使用Z3的C / C ++ API来解析SMTLib2格式的固定点约束(特别是SeaHorn生成的文件)。但是,我的应用程序在解析字符串时崩溃(我正在使用Z3_fixedpoint_from_string方法)。我正在使用的Z3版本是版本4.5.1 64位。

我尝试解析的SMTLib文件使用Z3二进制文件查找,我从源代码编译,但在调用Z3_fixedpoint_from_string时会遇到分段错误。我将问题缩小到了我认为问题与向定点上下文添加关系有关的问题。在我的机器上产生seg故障的一个简单示例如下:

#include "z3.h"

int main()
{
    Z3_context c = Z3_mk_context(Z3_mk_config());
    Z3_fixedpoint f = Z3_mk_fixedpoint(c);

    Z3_fixedpoint_from_string (c, f, "(declare-rel R ())");

    Z3_del_context(c);
}

使用valgrind运行此代码会报告大量无效的读写操作。所以,这不是API应该如何使用,或者某个地方存在问题。不幸的是,我找不到任何关于如何以编程方式使用定点引擎的示例。但是,例如调用Z3_fixedpoint_from_string (c, f, "(declare-var x Int)");就可以了。

BTW,Z3_del_fixedpoint()在哪里?

1 个答案:

答案 0 :(得分:1)

定点对象" f"是参考计数。调用者负责在创建后立即获取引用计数。使用C ++智能指针来控制它更容易,类似于我们如何控制其他对象。 C ++ API没有固定点对象的包装器,因此您必须以其他包装器的样式创建自己的包装器。

使用引用计数器而不是del_fixedpoint。

class fixedpoint : public object {
     Z3_fixedpoint m_fp;
public:
    fixedpoint(context& c):object(c) { mfp = Z3_mk_fixedpoint(c); Z3_fixedpoint_inc_ref(c, m_fp); }
    ~fixedpoint() { Z3_fixedpoint_dec_ref(ctx(), m_fp); }
    operator Z3_fixedpoint() const { return m_fp; }

    void from_string(char const* s) {
         Z3_fixedpoint_from_string (ctx(), m_fp, s);
    }

};

int main()
{
   context c;
   fixedpoint f(c);
   f.from_string("....");       
}