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依赖SymbolResolverimg
SymbolResolver依赖TypeResolver,TypeHierarchyResolver,EvaluationOrderGraphPass
TypeHierarchyResolver依赖TypeResolver
TypeResolver,EvaluationOrderGraphPass不需要依赖其他Pass
这些Pass间的依赖关系与图中从左到右的顺序是对应的,大家可直接看图,比较直观
DFG边:
CallExpression的实参流向被调用方法的形参
被调用方法的声明流向CallExpression
DFG边:
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.扫码进群