Datalog-Based Program Analysis
新年第一天,从「恋×シンアイ彼女」开始!
新年第一天,从 Program Analysis 开始!
Info
南京大学「软件分析」课程 Datalog-Based Program Analysis 部分的学习笔记。
Motivation¶
- imperative: how to do (~implementation)
- E.g. C. 需要告诉机器要如何去实现
- declarative: what to do (~specification)
- E.g. SQL. 仅仅需要指明你想要什么,如何实现则交给程序(DBMS)自行选择
在 program analysis 中,我们指明对于不同的 statement 对应不同的 rule,这就是一种 specification,而在 algorithm 中,我们则指明了每一步具体要怎么做,在实际的代码实现里更是要考虑更多的 implementation details。可以看出,前面所学的 program analysis 即是 declarative 也是 imperative 的。
在 tai-e assignments 中,我们使用 imperative 的方式实现 program analysis,同样的,我们也可以通过 declarative 的方式来实现。(via Datalog)
Introduction to Datalog¶
datalog 最早是以 database language 的身份出现的1,现在有了更广泛的应用。
- Datalog = Data + Logic (and, or, not)
- no side-effects
- no control flows
- no functions
- not turing-complete
Predicates (Data)¶
在 datalog 中,一个 predicate (relation) 就是值一系列的 statemetns,本质上其实是 a table of data。而 fact 则是指这个 table 中某个 tuple。
atoms 是 datalog 的 basic elements。
P(X1, X2, ..., Xn)
的形式表示一个 relation atom,其中 P 是 predicate 的名字,Xi 则是 arguments, 它的值可以是一个 variable 也可以是 constant。一个 relation atom 的值为 true 当且仅当 P 中存在 (X1, X2, ..., Xn)
这个 tuple。
除了 relation atoms,datalog 还有 arithmetic atoms。
Datalog Rules (Logic)¶
rule 用来表示 logic inferences,并且表明 facts 是如何被 deduced 的,它的形式为 H <- B1, B2, ,,,, Bn
,其中 head 和 body 中的每一项都是 atom,Bi
也被称为 subgoal。
一个 datalog program 由 facts 和 rules 组成。更多的语法直接看 slides 吧,懒得写了(
datalog 的 predicates 被分为 EDB 和 IDB 两种:
- EDB (extensional database)
- 提前定义好的 predicates
- relations are immutable
- 可以看作 input relations - IDB (intensional database)
- 由 rules 推导出的 predicates
- 可以看作是 output relations
datalog 支持 recursive rules,从而可以从自身进行 deduce。
考虑以下两条 rules:
A(x) <- B(y), x > y.
A(x) <- B(y), !C(x, y).
可以发现它们都有可能使得 A 称为一个 infinite relation,但是这并不是我们使用 datalog 想要得到的结果,所以我们要避免 infinite relation,也就因此引入了 rule safety 的概念。
注意到 EDB 的元素是有限个的,因此对于一个 non-negated realtion atom,它能 deduce 的元素也会是有限的,所以我们只需要保证 head 中的每一个 variable 至少被一个 non-negated atom relation 给限制住了即可。在 datalog 中,只有满足 safe rules 是被允许的。
再考虑这条 rule:
A(x) <- B(x), !A(x)
显然这是一条自相矛盾的 rule,但是它满足了 safe rule 的条件,因此我们需要另外添加限制。观察可以发现这种 contradictory rule 必然也是 recursive 的形式,并且是在 body 中对 head 进行 negate,因此,在 datalog 中,我们规定 recursion and negation of an atom must be separated。
Execution of Datalog Programs¶
- datalog 使用 datalog engine 根据 EDB 和 rules 进行 deduce 并输出 IDB
- monotonicity: facts 只会从 rules 中产生而不会因为 deduction 而减少
- termination: 通过 rule safety 保证了能被 deduce 的 facts 必然是 finite 的,因此 datalog program 必然是可以终止的
Pointer Analysis via Datalog¶
其实只要用 datalog 的语言描述出前面 pointer analysis 的 rules 即可,同样也需要考虑一些细节以及每个 atom 的 arguments 要如何设计。
Taint Analysis via Datalog¶
使用 datalog 来实现 program analysis 有以下优点和缺点:
- pros
- 简洁、可读性高
- 容易实现,写 bug 的概率也小很多
- off-the-shelf optimized datalog engines 可以让你少考虑一些优化上的细节,make your life easier
- cons
- 表达能力有限,某些 logics 很难用 datalog 表示甚至根本表示不了
- datalog engine 作为一个 black box 的存在使得我们很难用更优秀、更有针对性的 algorithm 来实现更优越的性能
-
David Maier, K. Tuncay Tekle, Michael Kifer, and David S. Warren, "Datalog: Concepts, History, and Outlook". Chapter, 2018. ↩