今天繼續提交讀程式筆記,這次比較少,而且相對簡單些。
ConnectorComputation
- compute()
如果workList還有元素,就繼續迴圈,但是第一次進入迴圈時候根據構造方法來看workList只有一個元素<mainFunction, emptyCallString>。然後從workList中取出第一個元素,擷取TacFunction和CallString(gamma),根據TacFunction(p)從function2ECS中得到ECS(ecs_p),實際上此時functions2ECS中第一個元素對應的TacFunction即為_main。得到gamma在ecs_p中的位置,即是在一個CallString的鏈表中的位置
隨後,將p這個TacFunction包含的所有的CfgNodeCall迭代一遍,對於每一個callNode,得到其callee(即被調用的函數q),在q!=null的情況下,以callNode建立一個新的CallString(gamma_2),從function2ECS中得到q對應的ECS(ecs_q),擷取ecs_q中gamma_2的位置,如果為-1,就將gamma_2添加到ecs_q的CallStrings隊列中去,並以q和gamma_2建立元素添加到workList中去,expand it。
接下來擴充什麼ConnectorFunction因為都在for迴圈裡邊,是對局部變數的操作,所以沒有什麼用處。
在while迴圈結束之後,調用makeCallGraph()方法。
- makeCallGraph()
首先以mainFunction初始化一個CallGraph,獲得mainFunction所包含的方法調用列表processUs<CfgNodeCall>,並建立一個以訪問的集合visited,將mainFunction添加進集合裡邊。
當processUs不為空白,依次取出元素callNode,得到它的caller和callee,如果callee!=null,向callGraph中添加元素。如果callee還沒有被處理過,則將其所包含的所有函數調用添加進processUs,並將其放進visited。
Checker
根據初始提供的run-all.bat的參數來看,實際上aliases analyze和literal analyze並沒有進行,只是gta.analyze()進行了,實際上也就是只有dependance analyze執行了。通過以來關係最後決定vulns。