DataLog学习
一直听说用datalog来做程序分析很NB,所以一直想学习他的使用方式。
参考: https://souffle-lang.github.io/tutorial
有向图可达性分析
1 | .decl edge(n: symbol, m: symbol) |
对于这样一个有向图,做可达性分析, 只要做好了顶点之间的边的关系,您不需要dfs, bfs,几行代码就可以搞定:
这全靠着datalog支持递归。
比如第二条规则
1 | reacheable(x, z) :- reachable(x, y),reachable(y, z). |
其中你告诉引擎, 如果一个符号x连接y, y连接z,那么x, z相连。 比如a到d, 引擎先根据第一条推导出a->b,b->c, c->d,然后开始递归,即然a->b, b->c那么a->c,即然a->c, c->d那么a->d。
二叉树同级节点
给定一颗二叉树,找出同级节点: 如b, c同级; d, f同级。
1 | .decl Parent(n: symbol, m: symbol) |
注:自己和自己一定同级。
0x03 Data-flow analysis
这里有一个程序流图,做一个数据流分析。
Data-flow analysis(DFA) aims to determine static properties of programs.
正向来分析变量v的reaching definition
:
1 | // define control flow graph |
推导式:
1 | Reachable(u,d) :- GenDef(u,d). // 初始化define点, 相当于Gen_B |
递归地实现了reaching definition 的迭代数据流算法:
参考南大程序分析第三节