数据流分析和抽象解释之间有什么区别,它们是否用于同一目的?这两者相对于彼此的利弊是什么。
答案 0 :(得分:9)
简而言之,它们属于不同的类别。这就像比较布料和裤子。
抽象解释是一个使用抽象域和抽象传递函数形式化定点计算的框架。抽象解释保证如果满足某些条件,则应在有限步骤中找到固定点(详情:http://www.di.ens.fr/~cousot/COUSOTpapers/POPL77.shtml)。抽象解释的伟大之处来自于扩大和缩小。抽象解释可以计算无限域上的固定点。
IMO,数据流分析只是抽象解释的一个实例。由于数据流分析使用的大多数具体领域都是有限的,因此您甚至不需要扩大和缩小范围。
答案 1 :(得分:0)
归结为“效率与准确性”。
数据流分析尝试合并路径数据远远超过抽象解释。抽象解释遍历所有路径,保持数据值抽象。
答案 2 :(得分:0)
我不确定这里的答案是否真的能解决原始问题的意图,这似乎是在寻求一种直观而非技术的解释。数据流分析与在给定位置获取某些信息的价值有关。 “信息”的示例包括哪些定义到达给定位置,哪些变量存在于给定位置,哪些表达式在给定位置恒定等。数据流框架通常会要求值的域形成有限的格,传递函数是单调的(传递函数决定了信息如何从块的入口传播到出口),所有这些都是为了能够计算出数据流值的定点。它在编译器中使用。
抽象解释(AI)OTOH旨在构建语言的抽象解释器。目的是确定“这段代码将计算什么?让我们以抽象的方式尝试回答该问题”。例如,如果计算返回某个索引变量i的值,则AI可能会计算i的范围,因此您可以回答是否存在边界违反或其他问题。因此,抽象值的域略有不同,可能是范围域,多面域等。因此,AI对数据流施加了不同的约束:具体和抽象域通常需要通过所谓的伽罗瓦连接来关联,它将具体值集与抽象值相关联。由于使用的域不是必须有限的,因此AI不会总是在没有干预的情况下以加宽/缩小操作的形式收敛。 AI用于形式验证工具。他们俩都有一个共同的愿望,那就是函数迭代收敛,但仅此而已。因此,如果您想知道某个位置某物的价值,请使用数据流分析,如果您想知道程序抽象计算的内容,请使用AI。
数据流和AI可以一起使用。例如,反汇编工具Jakstab结合了这两种方法-数据流用于确定间接跳转目标的值(即,新计算的将要加载的PC的值),而AI用于抽象地评估二进制代码