将IR转换为Z3公式?

将IR转换为Z3公式?,z3,Z3,我在IR中有一些代码,这些代码已经是SSA格式的了。 现在我正在尝试将此代码转换为SMT公式,然后将其提供给Z3进行验证。我有一些问题: 是否有任何技术文件详细说明如何将SSA IR转换为SMT公式?我四处寻找,但没有结果 对于这些计算指令,转换为Z3公式没有太多问题。然而,我仍然在为无条件和有条件分支指令而挣扎。关于如何将这些说明转换为Z3公式,有什么建议吗 非常感谢 我认为将基于SMT的程序验证工具分为两大类是公平的: 模糊者和臭虫发现者。这些工具基本上将程序的一条执行路径编码为SMT公式

我在IR中有一些代码,这些代码已经是SSA格式的了。 现在我正在尝试将此代码转换为SMT公式,然后将其提供给Z3进行验证。我有一些问题:

  • 是否有任何技术文件详细说明如何将SSA IR转换为SMT公式?我四处寻找,但没有结果

  • 对于这些计算指令,转换为Z3公式没有太多问题。然而,我仍然在为无条件和有条件分支指令而挣扎。关于如何将这些说明转换为Z3公式,有什么建议吗


  • 非常感谢

    我认为将基于SMT的程序验证工具分为两大类是公平的:

    • 模糊者和臭虫发现者。这些工具基本上将程序的一条执行路径编码为SMT公式。这些工具使用SMT检查特定的执行路径是否可行。示例或此类工具有:。基于您的问题,您似乎已经知道如何将一条路径编码到SMT中

    • 扩展静态检查器和验证编译器。这些工具通常将程序简化为中间形式。然后,生成多个验证条件(VCs)并发送给SMT解算器。大多数(全部?)都尝试进行模块化验证,因为将整个程序作为单个SMT问题进行验证成本太高。Boogie PL是一种非常流行的中间格式。如果将IR映射到Boogie PL,则可以使用生成SMT格式的VCs。文章“”描述了Boogie PL是如何编码到公式中的。注意,Boogie是开源的,代码可读性很强。因此,您也可以浏览代码以澄清细节。还有一系列幻灯片,解释如何将Boogie VCs编码为公式。其他相关项目包括:

    编辑(处理循环):处理循环的最简单方法就是将循环展开给定次数。当我们这样做时,我们的验证工具就变成了一个“bug查找器”,因为我们基本上放弃了对所有可能路径的分析。此外,还使用了一些工具(如ESC/Java、Why3、VeriFast)。Rustan对循环不变量有很好的理解。循环不变量可以由用户提供,也可以自动计算。关于“循环不变综合”的论文很多

    循环不变示例:本示例中的函数
    duplet

    还有一种可能是将IR编码为。muZ是Z3中可用的定点引擎。 在这种方法中,循环可以直接编码(参见muZ页面上的文章),并且不需要提供循环不变量。
    然而,像muZ这样的引擎作为最先进的SMT解决方案尚未成熟

    像往常一样,你的回答很好,狮子座!然而,我仍然有一个问题:我读了上面提到的论文“非结构化程序的最弱前提”,不明白为什么在生成公式之前必须有一个无循环的代码?(作者移除了环的所有后边缘)。这个问题与我有关,因为我的IR代码有条件和无条件分支,我仍然不知道如何处理它们。非常感谢,利奥!我添加了关于循环的附加注释。