我正在使用 Z3 解决由符号执行器产生的路径条件,它以深度优先顺序探索状态空间,与 CUTE、DART 或(可能)SAGE 非常相似。我们正在尝试使用 Z3 的不同方式。在一个极端情况下,我们将每个查询发送到 Z3 并立即(重置)它。另一方面,我们(推)每个额外的分支约束,并且(弹出)(弹出)回溯正确削弱路径条件所需的最小值。问题是,在所有情况下,似乎没有一种策略比其他任何策略都更有效。推送似乎提供了最大的优势,但我们遇到了一些情况,每次查询后重置 Z3 比推送/弹出快一个数量级以上。请注意,通信开销可以忽略不计:几乎所有时间都花在 check-sat 中。
有没有人有任何经验可以分享,或者关于 Z3 内部保存的状态的一些指示(引理等),这可以帮助澄清它的行为?那么其他 SMT 求解器的行为呢?