是否可以使用LLVM字节码作为Z3输入



我在LLVM字节码中有一个描述,我需要作为Z3输入传递。如果可以做到,如何做到??如果没有,有什么工具可以做到这一点吗??

两个可以从C代码转换为Z3可以处理的形式的工具:

1) 拍打(https://github.com/smackers/smack)

这将带注释的C代码转换为Boogie语言,使用LLVM位代码作为中间表示。Boogie工具(http://boogie.codeplex.com)然后可以用于生成可以由Z3检查的验证条件。然而,代码的手动注释可能是一项艰巨的任务。特别是,您必须为所有循环和C函数的前/后条件编写归纳不变量,这些条件足以证明您的程序满足其规范。

2) 不明飞行物(https://bitbucket.org/arieg/ufo/wiki/Home)

该工具可以再次通过LLVM位代码将C转换为SMT-LIB Horn逻辑。结果可以通过Z3的一个定点引擎进行检查。在这种方法中,您不必手动注释循环和过程(因为Z3自己发现这些注释),但工具的容量要小得多。

这个问题还没有完全提出或明确,但可以看看SMACK工具(https://github.com/smackers/smack/wiki),它使用LLVM的clang编译C程序(带有断言),并使用Boogie的中间表示(https://boogie.codeplex.com/)这样您就可以查询Z3程序中的断言。

如果这不能直接满足您的需求,那么源代码是可用的,因此您可以看到它如何将断言和LLVM位代码文件转换为Boogie的中间表示。

PAGAI对LLVM位代码执行静态分析。它自动计算循环不变量,并检查某些故障条件(如不明飞行物)的可达性;您可以使用断言和假设。它在内部做的一件事是将LLVM位代码中的无循环程序转换为表示其语义的SMT公式。

最新更新