符号模型看起来像什么

时间:2018-06-06 04:48:45

标签: logic formal-verification model-checking

我试图了解符号执行引擎的工作原理。 This paper使用C调查技术。他们提到了符号记忆:

  

3.1完全符号记忆

     

在最高级别的通用性中,引擎可能会将内存地址视为完全符号......

     

以紧凑的形式表示内存。这种方法是在[32]中进行的,该方法进行了映射   符号 - 而不是具体 - 表达数据的表达式,代表可能的   在紧凑的情况下使用符号地址引用内存所产生的替代状态   隐式表格

This paper也有点像Java的象征性堆:

  

4.1符号状态表示

     

符号状态s由符号堆H组成   原始类型字段的估值,路径条件   PC和程序计数器。

我想知道在实践中这意味着什么,这个象征性的堆。对我来说,这意味着符号执行中使用的所有数据结构都将使用符号内存而不是实际内存。这意味着像数组这样的结构需要具有符号模型。我想知道这些模型的高级版本。我不知道你怎么能“象征性地模拟数组长度”。在我看来它是一个整数,所以它将是一个整数值。但作为一种象征价值,想知道这意味着什么。我还没有看到它。想知道是否可以在高层次解释如何象征性地模拟某些数据结构,如数组或具有不同字段值的结构,因此它在符号执行中很有用。

This older paper提及:

  

也可以   定义另一种“符号执行”语义   用于编程语言的真实数据对象   不需要使用但可以任意表示   符号。

不确定这看起来如何。

2 个答案:

答案 0 :(得分:1)

完全记录的符号执行引擎的开源示例是JPF - Symbolic Pathfinder。它在Java虚拟机级别上执行。它还应该回答您关于复杂数据结构(如数组或对象数组)的问题。

这里有一篇非常好的出版物: “Symbolic PathFinder:将符号执行与Java字节码分析的模型检查集成”,自动化软件工程期刊20(3)2013 https://ti.arc.nasa.gov/publications/5269/download/

在这里你可以看到一个详细的例子(第4.9节),关于具体代码如何被重写"并转化为符号代码。尤其是如何处理堆栈和堆内存以及依赖于此符号内存的代码条件(图6 + 7)。您不能简单地将内存与条件路径执行区分开来。

非常简化:条件被所有"符号"的循环所取代。分支(不确定性选择)。内存被符号值(就像你提到的那样 - 在这里通过所谓的属性传播)和这些值的约束取决于分支循环。约束求解器用于进一步减少不可能的分支(回溯)并最终解决约束。

.Net代码的另一个非常好的动手示例是使用" Combination.KeepUnexpanded"以完整的符号模式运行Microsoft SpecExplorer(XRT)。在生成的探索遍历路径图中,您可以看到一个很好的示例,表示符号内存和约束的表示方式。不幸的是,XRT不是开源的。

P.S .: 实际上,符号变量的表示是一个巨大的挑战。以下是一些非常好的出版物:

答案 1 :(得分:0)

“数组X的大小为100,位置5的元素的值为7”是数组的符号表示。 象征性表征的关键在于你只专注于解释重要的事情。

如果你想表示一个更具特异性的数组,你也可以通过说“X的大小为L”来表示它的大小符号,在你的分析中你可能会发现L = 100或L> 90。

您捕获多少不同的数据结构取决于您想要做什么。链表是一堆内存区还是更多内容?