我是否在 Linux 的 C++ 接口中正确使用 z3:timeout?

Am I using z3 :timeout correctly with C++ interface for Linux?

我正在尝试使用 C++ 接口让 z3 解算器在这个示例中的 0.1 秒后超时(分解两个素数的 32 位乘积)。它适用于 Windows (VC++ 2013),但不适用于 Linux (CentOS 6.5),求解器在大约 2.5 秒内运行完成(调试构建)。 This post 表示命令行超时仅在 2012 年的 Windows 上支持 z3 v3.2,但这应该在下一个版本中修复 - 我们使用的是 z3 v4.4 , 根据 RELEASE_NOTES。我是否正确使用了 C++ 接口的超时功能,或者 Linux 不支持此功能?

(注意:此代码示例使用来自 的 concat 定义。TEST、EXPECT_EQ 和 EXPECT_TRUE 宏是 gtest 测试宏,应该是不言自明的。 )

    TEST(Z3Basic, Factorize32BitWithTimeout) {
    try {
        context c;
        solver s(c);

        expr x = c.bv_const("x", 16);
        expr y = c.bv_const("y", 16);
        expr prod = c.bv_val(0xc4f7d27bll, 32);

        expr pad = c.bv_val(0, 16);

        params p(c);
        p.set(":timeout", 100u);
        s.set(p);
        expr conjecture = prod == concat(pad, x) * concat(pad, y);
        s.add(conjecture);
        check_result r = s.check();
        EXPECT_EQ(unknown, r);
        if (r == sat)
            std::cout << s.get_model() << "\n";
    }
    catch (exception ex) {
        EXPECT_TRUE(false) << "Exception thrown: " << ex << "\n";
    }

}

在 Windows 调试时,这会在大约 210 毫秒内运行整个测试,并通过未知的 return 代码。在 Linux,它运行到完成并失败:

[ RUN      ] Z3Basic.Factorize32BitWithTimeout
/home/dave_local/Projects/trunk/CoreApp/z3Interface/UnitTests/TestZ3.cpp:492: Failure
Value of: r
  Actual: sat
Expected: unknown
(define-fun y () (_ BitVec 16)
  #xd279)
(define-fun x () (_ BitVec 16)
  #xef93)
[  FAILED  ] Z3Basic.Factorize32BitWithTimeout (2565 ms)

任何suggestions/information?

通过API超时肯定是支持的。也许 Linux 盒子上的 100 毫秒太多了?你能试试更小的超时时间吗?

如果仍然失败,您能否提交一份错误报告以及一个简短的、独立的、可重现的测试用例?谢谢!