CPG中的DFG系列共分为三篇,三篇文章加起来将近10000字了,针对每个表达式类型都做了非常详尽的讲解,内容已经非常全面且细致了,绝对值得一读,先放个链接哈,想要学习的同学可直接点击链接跳转哈:
但笔者转念一想,想要从这么多内容中提取要点(或者自己关注的点)还是需要点功夫的,所以嘞,笔者就以自己粗浅的开发经验,从如何利用CPG中的DFG做开发工作的角度,总结一下常见的使用场景,方便大家更快地理解掌握重点(若对总结的要点有疑惑的,可以点击文章底部合集标签代码属性图CPG,去对应的文章中找详细的介绍)
tips:本文几乎不会讲解新的内容,本文是一个精简版,是对前文CPG中的DFG的提炼,若对这块很熟的同学可以忽略哈~
OK,正文开始~
CPG的运行逻辑图回顾:
不知道大家有没有详细看这张图,我们之前讲的DFG相关的内容都是属于图中红色方框标出来的模块,也就是Passes
阶段的Data Flow Graph,当然,在抽丝剥茧代码属性图CPG-第三弹:CPG中的DFG-2Reference
小节中,提到了ControlFlowSensitiveDFGPass
,这个是属于图中黄色方框模块的,也就是Control-Flow Sensitive Data Flow Graph。对这块不太熟的同学,建议大家点击 抽丝剥茧代码属性图CPG-第一弹:CPG介绍 回顾一下。
在第一篇文章中讲到,CPG中的Pass
是有执行顺序的,也就是说,有的Pass要依赖其他Pass的输出结果。
tips: Data Flow Graph 对应源码中的
DFGPass
,Control-Flow Sensitive Data Flow Graph 对应源码中的ControlFlowSensitiveDFGPass
现在我们来看看DFGPass
和ControlFlowSensitiveDFGPass
与其他Pass的依赖关系
DFGPass
依赖SymbolResolver
img
SymbolResolver
依赖TypeResolver
,TypeHierarchyResolver
,EvaluationOrderGraphPass
TypeHierarchyResolver
依赖TypeResolver
TypeResolver
,EvaluationOrderGraphPass
不需要依赖其他Pass
这些Pass间的依赖关系与图中从左到右的顺序是对应的,大家可直接看图,比较直观
DFG边:
CallExpression的实参流向被调用方法的形参
被调用方法的声明流向CallExpression
DFG边:
rhs 流向 lhs
Reference
(引用类型)是在日常开发中最常见的的节点类型。
抽丝剥茧代码属性图CPG-第三弹:CPG中的DFG-2中讲到的Reference
(引用类型)的DFG构建分为普通的DFGPass
与控制流敏感的ControlFlowSensitiveDFGPass
,经笔者研究,DFGPass
实用性极低,故此处就不再总结。
一元操作符(
++
,--
)及复杂二元操作符(+=
、-=
、*=
、/=
)此处不作总结。
DFG边:
变量声明:initializer --> VariableDeclaration
变量读取:当前读取语句之前的最后一次写入 --> 当前读取
tips:若在变量读取前有分支语句,并且if块和else块内都有对变量的写入操作,CPG会将if块和else块的变量写入语句都流向当前的变量
变量简单赋值(operatorCode为=
):
rhs --> lhs
lhs --> next read access of reference
成员表达式(MemberExpression)关注以下字段:
base: Expression
: 被访问字段所属的对象表达式
refersTo: Declaration?
: 被访问字段的声明,如果源码中未实现相应的类,则该字段为null
成员表达式(MemberExpression)代表对对象字段的访问,并通过 base
属性 对 Reference
类进行了扩展。
如果相应类的实现可用(refersTo
不为null
),其处理方式与Reference
一致。如果refersTo
字段为null
,则base
会流向该MemberExpression
。
DFG边:
refersTo != null
MemberExpression
是Reference
的子类,若其refersTo
字段不为null
,那么其处理方式与Reference
一致
refersTo == null
base --> MemberExpression
for循环语句(ForStatement
)关注以下字段:
condition: Statement
: for循环的条件
conditionDeclaration: Statement
: 条件声明语句
DFG边:
condition --> ForStatement
conditionDeclaration --> ForStatement
if语句(IfStatement
)关注以下字段:
condition: Statement
: if语句的条件
conditionDeclaration: Statement
: 条件声明语句
DFG边:
condition --> IfStatement
conditionDeclaration --> ForStatement
进群方式:
1.点击公众号菜单栏"点击进群",加笔者好友(备注进群)-- 推荐
2.扫码进群