我对许多X86指令的行为进行了精确和有效的描述,这些描述适用于QF_ABV
中的编码并直接使用标准求解器解决(不使用特殊求解策略)。我写了一个SMT-LIB脚本,其界面完全符合我的最终目标:
X86State
,描述x86机器状态的记录排序(寄存器和标志为bitvectors,内存为数组)。X86Instr
,描述x86指令的记录排序(枚举助记符,操作数作为描述寄存器,内存表达式等的类似ML的区别联合)。x86-translate
获取X86State
和X86Instr
,并返回新的X86State
。它会对X86Instr
进行解码,并根据给定X86State
对输入X86Instr
的符号效果生成新的X86State
。它非常适合原型设计:用户可以轻松直接地编写x86。在简化使用库构建的公式之后,将消除所有函数和无关数据类型,留下QF_ABV
表达式。我希望用户只需(set-logic QF_ABV)
和#include
我的脚本(唉,既不是SMT-LIB标准也不是Z3支持#include
)。
不幸的是,通过定义函数和类型,脚本需要诸如未解释函数之类的理论,因此由于类型的原因需要QF_ABV
以外的逻辑(或甚至QF_AUFBV
)。我对SMT求解器的经验表明,应该指定最低可接受逻辑以获得最佳求解时间。此外,我不清楚是否可以按照我的意愿在程序化上下文(例如OCaml,Python,C)中重用我的SMT-LIB脚本。最后,由于缺少高阶函数,而且我无法访问导致代码重复的par
,脚本有点冗长。
因此,尽管已经完成了我的技术目标,但我认为SMT-LIB可能是错误的方法。是否有更自然的途径与Z3交互以实现我的x86指令描述/ QF_ABV
翻译方案? SMT-LIB脚本在这些途径中是否可以重复使用?例如,您可以构建“自定义OCaml顶级”,即具有“刻录到其中”的脚本的解释器。这样的事可能会很好。或者我是否必须在通过理论扩展(C DLL)与Z3交互的程序中重新实现另一种语言的功能?这里最好的选择是什么?
答案 0 :(得分:0)
好吧,我不认为人们手工编写.smt2文件。这些通常由某些程序自动生成。 我发现Z3 Python界面相当不错,所以我想你可以尝试一下。但是你总是可以用任何语言编写一个简单的.smt2翻译器。
顺便说一下,您是否计划发布您为X86编写的规范?我真的很感兴趣!