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

Z3 API:解析定点SMTLib字符串时崩溃,z3,Z3,我试图使用Z3的C/C++API解析SMTLib2格式的定点约束(特别是SeaHorn生成的文件)。但是,我的应用程序在解析字符串时崩溃(我使用的是Z3\u fixedpoint\u from\u string方法)。我正在使用的Z3版本是4.5.1 64位版本 我试图解析的SMTLib文件使用Z3二进制文件进行查找,我从源代码中编译了Z3二进制文件,但在从字符串调用Z3\u fixedpoint\u时遇到了分段错误。我将问题缩小到我认为问题与向定点上下文添加关系有关的程度。在我的机器上产生se

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

我试图解析的SMTLib文件使用Z3二进制文件进行查找,我从源代码中编译了Z3二进制文件,但在从字符串调用
Z3\u fixedpoint\u时遇到了分段错误。我将问题缩小到我认为问题与向定点上下文添加关系有关的程度。在我的机器上产生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应该如何使用,要么某个地方存在问题。不幸的是,我找不到任何关于如何以编程方式使用定点引擎的示例。但是,从字符串(c,f,“(declare var x Int)”)调用
Z3_fixedpoint_工作正常

顺便说一句,其中是
Z3_del_fixedpoint()

固定点对象“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("....");       
}

没有所谓的C/C++语言。你使用哪种语言?这个例子使用C API,但是我计划混合C和C++ API调用。我用g++4.9编译了这个示例。我现在添加了这个,以防您和其他人可以使用它。非常感谢。非常感谢,很有魅力!非常感谢。你们太棒了。但是为什么没有固定接口设施的C++接口呢?