可以使用LLVM字节码作为Z3输入吗?

时间:2014-02-11 17:09:51

标签: llvm z3

我在LLVM字节码中有描述,我需要传递为Z3输入。如果可以做到,它是如何完成的?如果没有,是否有任何工具可以做到?

3 个答案:

答案 0 :(得分:4)

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

1)SMACK(https://github.com/smackers/smack

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

2)UFO(https://bitbucket.org/arieg/ufo/wiki/Home

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

答案 1 :(得分:2)

这个问题并不完全正确或明确,但可以查看SMACK工具(https://github.com/smackers/smack/wiki),它使用LLVM的clang编译C程序(带断言)并使用Boogie的中间表示({{3所以你可以在Z3中查询程序中的断言。

如果没有直接执行您需要的操作,则源可用,因此您可以看到它如何将断言和LLVM bitcode文件转换为Boogie的中间表示。

答案 2 :(得分:1)

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