校验; get_model;检查导致Z3 C API中的段错误

时间:2013-04-09 19:23:55

标签: z3

我正在尝试通过C API和smtlib2使用Z3进行增量求解。不幸的是,当断言一些简单的公式,检查它,获取它的模型,断言其他东西然后再次检查时,我遇到了分段违规。这也是在没有声明新内容的情况下发生的,即在检查,检索模型和再次检查时。以下是重现错误的最小示例:

#include<z3.h>

int main()
{
  Z3_config cfg = Z3_mk_config();
  Z3_context ctx = Z3_mk_context(cfg);
  Z3_ast fs = Z3_parse_smtlib2_string(ctx, "(declare-fun a () Int) (assert (= a 0))", 0, 0, 0, 0, 0, 0);
  Z3_solver solver = Z3_mk_solver(ctx);
  Z3_solver_assert(ctx, solver, fs);
  Z3_solver_check(ctx, solver);
  Z3_model m = Z3_solver_get_model(ctx, solver);
  Z3_solver_check(ctx, solver);
  Z3_del_config(cfg);
  return 0;
}

我尝试了两个Z3版本(Mac 64位上为4.3.1,Ubuntu 64位上为4.1)。

我感谢任何帮助,提示或解决方法 - 也许我只是以错误的方式使用API​​?

非常感谢,

伊丽莎白

1 个答案:

答案 0 :(得分:1)

以下是使用引用计数的代码版本。 当我删除引用计数时它会崩溃。

void main() {
    Z3_config cfg = Z3_mk_config();
    Z3_context ctx = Z3_mk_context(cfg);
    Z3_ast fs = Z3_parse_smtlib2_string(ctx, "(declare-fun a () Int) (assert (= a 0))", 0, 0, 0, 0, 0, 0);
    Z3_inc_ref(ctx, fs);
    Z3_solver solver = Z3_mk_solver(ctx);
    Z3_solver_inc_ref(ctx, solver);
    Z3_solver_assert(ctx, solver, fs);
    Z3_solver_check(ctx, solver);
    Z3_model m = Z3_solver_get_model(ctx, solver);
    Z3_model_inc_ref(ctx, m);
    Z3_solver_check(ctx, solver);


    // work with model

    Z3_solver_dec_ref(ctx, solver);
    Z3_model_dec_ref(ctx, m);
    Z3_dec_ref(ctx, fs);
    Z3_del_config(cfg);
 }

顺便说一句。 C ++ API隐藏了所有引用计数详细信息。使用它会更方便。