DSA算法运行示例

Explain DSA Algorithm Through A Simple Example Step By Step

关于DSA算法可参考:https://blog.youkuaiyun.com/wcventure/article/details/105061321

 

由于DSA论文中的例子省略了很多步骤,不利于理解,本文使用一个简单例子一步一步地运行一下DSA算法。让我们考虑如下例子,两个函数(addList和ProcessLists),两个不想交的List的实例(L1和L2):

 

1. 首先,本文给出的图基本上只有以下四种元素。

18201uploading.4e448015.gif正在上传…重新上传取消

 

 

2. 过程内分析阶段会为每一个函数构建局部DS图。我们先给ProcessList函数建立局部DS图,将函数中的指针变量表示出来,为每个堆对象创建一个空的Node,例如L1指向List对象实例(每个Node都可能有很多个feild,但此时不知道List的具体数据结构,只能先认为List只有一个feild),tmp1指向Patient的对象实例。

 

3. 由于ProcessList函数调用了addList函数,每次函数调用我们都创建一个Call Node,下图紫色的节点就代表Call Node,fn代表被调用的函数,list和data是传递给被调用函数的参数,应该指向具体的对象实例。此时ProcessList函数的局部DS图已经构建完成。

 

4. 接下来考虑AddList函数的局部DS图,同理,为每个指针变量和堆对象创建节点。为了方便读者阅读,节点的颜色与代码中的颜色是对应的。但此时图还不完善,还需要考利用指针操作(对内存区域的读和写)的信息来完善局部DS图。

 

5. 从nlist->data = data这条语句中可以得知nlist->data指向data所指向的对象

 

6. 从list=list->next中,可以得知list指向list->next所指向的对象,需要为list->next所指向的对象建立新的node,此时DS图的构建如下所示。

 

7. 但是此时list变量有两个输出边,默认list所指向的对象类型一样,可以合并。合并后的结果如下图所示。

 

8. 从b->next=nlist中,可以得知b->next指向nlist所指向的对象,需要为b->next到nlist所指向的对象添加一条边,此时DS图的构建如下所示。

 

9. 注意到b->next节点的出度为2,默认b->next所指向的对象具有相同的类型,可以进行合并。

 

10. 合并后的结果如下图所示,表明list,b,nlist指向同一个对象。

 

11. 此时函数addList和ProcessLists的局部DS图都已经构建完成,接下来进行自底向上的分析阶段,即过程间分析阶段处理函数调用,获得上下文信息。

 

12. 由于函数ProcessList调用了将函数addList,为处理图中标黄的call node,需要将函数addList的DS图内嵌到函数ProcessList的DS图中,此阶段构造的DS图又称为BU图。

 

13. 将函数的参数连线到对应的node。此时list的出度为2,需要合并。

 

14. 由于在ProcessList的DS图中,并不知道List的feild,合并了List对象以后,完善了field信息,如下图所示。

 

15. 此时,data的出度为二,继续合并。

 

16. 函数addList (L2, tmp2)已经处理完毕,接下来处理addList (L1, tmp1)。同理。

 

17. 将函数调用解决后,ProcessLists的BU图如下所示,下一阶段是自顶向下的分析阶段,将函数的BU图内嵌到callee中,进一步改进上下文信息,跟自底向上阶段是类似的。就此例而言,最终的图就是BU图。此时已经证明了L1和L2是两个不想交的对象实例。

 

18. 下图为自顶向下阶段分析addList的过程,利用函数的参数的指向关系进一步完善Node的信息。实际上DSA算法在实现的时候做了一下优化,自顶向下阶段只分析特殊的函数,提高效率。

 

19. 由于该例子比较简单,但如果遇到递归函数怎么处理?实际上DSA做自底向下分析的时候不是在Call Graph上做的,而是需要对Call Graph分析强连通向量(Strongly Connected Components (SCCs)),基于SCC的逆序做函数的内嵌。如下图的(a)所示,BDEC为递归函数,BFEC的整体就作为SCC。但另一种情况是有间接调用的情况(如E->C),此时自底向上阶段的分析解决不了,自顶向下的分析结束后就能把BDEC这个SCC的完整DS图构建好了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值