Z3 API:解析定点SMTLib字符串时崩溃
我试图使用Z3的C/C++API解析SMTLib2格式的定点约束(特别是SeaHorn生成的文件)。但是,我的应用程序在解析字符串时崩溃(我使用的是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\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++接口呢?