我在LLVM字节码中有描述,我需要传递为Z3输入。如果可以做到,它是如何完成的?如果没有,是否有任何工具可以做到?
答案 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公式。