长亭百川云 - 文章详情

代码属性图CPG之数据流图DFG-精简版

CodeAnalyzer Ultra

87

2024-07-13

引言

CPG中的DFG系列共分为三篇,三篇文章加起来将近10000字了,针对每个表达式类型都做了非常详尽的讲解,内容已经非常全面且细致了,绝对值得一读,先放个链接哈,想要学习的同学可直接点击链接跳转哈:

但笔者转念一想,想要从这么多内容中提取要点(或者自己关注的点)还是需要点功夫的,所以嘞,笔者就以自己粗浅的开发经验,从如何利用CPG中的DFG做开发工作的角度,总结一下常见的使用场景,方便大家更快地理解掌握重点(若对总结的要点有疑惑的,可以点击文章底部合集标签代码属性图CPG,去对应的文章中找详细的介绍)

tips:本文几乎不会讲解新的内容,本文是一个精简版,是对前文CPG中的DFG的提炼,若对这块很熟的同学可以忽略哈~

OK,正文开始~

DFG常见使用场景总结

1.CPG运行逻辑回顾

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

现在我们来看看DFGPassControlFlowSensitiveDFGPass与其他Pass的依赖关系

  • DFGPass依赖SymbolResolver

img

  • SymbolResolver依赖TypeResolverTypeHierarchyResolverEvaluationOrderGraphPass

  • TypeHierarchyResolver依赖TypeResolver

  • TypeResolverEvaluationOrderGraphPass不需要依赖其他Pass

这些Pass间的依赖关系与图中从左到右的顺序是对应的,大家可直接看图,比较直观

2.CallExpression之Known function

DFG边

  • CallExpression的实参流向被调用方法的形参

  • 被调用方法的声明流向CallExpression

3. AssignExpression

DFG边

  • rhs 流向 lhs

4.Reference之ControlFlowSensitiveDFGPass

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

5.MemberExpression

成员表达式(MemberExpression)关注以下字段:

  • base: Expression: 被访问字段所属的对象表达式

  • refersTo: Declaration?: 被访问字段的声明,如果源码中未实现相应的类,则该字段为null

成员表达式(MemberExpression)代表对对象字段的访问,并通过 base 属性 Reference 类进行了扩展

如果相应类的实现可用(refersTo不为null),其处理方式与Reference一致。如果refersTo字段为null,则base会流向该MemberExpression

DFG边:

  • refersTo != null

  • MemberExpressionReference的子类,若其refersTo字段不为null,那么其处理方式与Reference一致

  • refersTo == null

  • base --> MemberExpression

6.ForStatement

for循环语句(ForStatement)关注以下字段:

  • condition: Statement: for循环的条件

  • conditionDeclaration: Statement: 条件声明语句

DFG边:

  • condition --> ForStatement

  • conditionDeclaration --> ForStatement

7.IfStatement

if语句(IfStatement)关注以下字段:

  • condition: Statement: if语句的条件

  • conditionDeclaration: Statement: 条件声明语句

DFG边:

  • condition --> IfStatement

  • conditionDeclaration --> ForStatement

技术交流群

进群方式:

1.点击公众号菜单栏"点击进群",加笔者好友(备注进群)-- 推荐

2.扫码进群

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2