我正在尝试使用基于 SMT Solver Z3 的符号执行逻辑生成测试用例。
我有以下代码。
void foo(int a, int b, int c){
int x = 0, y = 0, z = 0;
if(a){
x = -2;
}
if (b < 5){
if (!a && c) { y = 1; }
z = 2;
}
assert(x + y + z != 3);
}
现在,在 SMT 解决过程中发生错误,生成的错误日志如下所示。
(set-option :produce-unsat-cores true)
(set-option :produce-models true)
(set-option :produce-proofs true)
(define-sort bot () Int)
(declare-const sv_1 Int)
(declare-const sv_5 Int)
(define-fun strcmp ((a String) (b String)) Int (ite (= a b) 0 1))
(assert (! (not (= sv_1 0)) :named __a0))
(assert (! (< sv_5 5) :named __a1))
(assert (! (not (not (= sv_1 0))) :named __a2))
(assert (! (not (not (= (+ (+ (bvneg 2) 0) 2) 3))) :named __a3))
(check-sat)
(get-unsat-core)
(get-model)
我已经用这段代码做了一些测试。
如果我不在 assert 函数中使用 x, y, z ,则没有错误。
如果第一个'if 语句'为真(即a != 0),那么程序将永远不会进入'if (!a && c) 语句。如果我删除这些“if 语句”之一,则没有错误。但我不明白为什么会发生这个错误。谁能向我解释为什么 Z3 无法解决这个问题?谢谢你。