我正在尝试使用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()
在哪里?
答案 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("....");
}