亚洲乱码一卡二卡四卡乱码新区_亚洲乱码中文字幕小综合_亚洲人成电影在线播放_亚洲性色AV一区二区三区_亚洲一区二区三区影院_亚洲中文字幕久久精品无码A_亚洲中文字幕无码专区_伊人热热久久原色播放WWW_在线观看AV永久免费_最新欧洲大片免费在线,欧美日韩成人三级免费看,久久黄色网址,欧美激情内射喷水高潮

首頁
社區(qū)
課程
招聘
逃逸變量的判斷為什么是這樣的I.isUsedOutsideOfBlock(&BB)

為什么當前指令在其他基本塊中使用了,就算是逃逸變量了呢?

收藏
2條回答
34r7hm4n 2023-6-1

注意看fixstack函數(shù)的源碼,,只有在判斷指令類型是AllocaInst的情況下才會修復(fù):https://github.com/bluesadi/Pluto-Obfuscator/blob/3c332857429162015aef94d875eafc95a60112f8/llvm/lib/Transforms/Obfuscation/Utils.cpp#L30

回復(fù) 已采納
ashLL: 那是不是應(yīng)該這樣寫啊
  if  (!(isa<AllocaInst>(&I)  &&  I.getParent()  ==  &entryBB)  &&
                                        isa<AllocaInst>(&I)&&I.isUsedOutsideOfBlock(&BB))
回復(fù) 2023-6-2
34r7hm4n: @AshCrimson 抱歉,這里說錯了,。不是只處理AllocaInst指令,,是除了在入口塊的AllocaInst指令都要處理,,包括Add指令,,Load指令之類的。
回復(fù) 2023-6-3
34r7hm4n: @AshCrimson 就比如說`x  =  add  y,  z`指令在別的基本塊被使用了,,就說明那個基本塊使用了x變量,,這時候把x稱為逃逸變量。
回復(fù) 2023-6-3
34r7hm4n 2023-6-1 2023-6-1編輯

在fixStack里只會處理AllocaInst指令,,所以這里的I的類型是AllocaInst,,可以看作是C語言里的定義變量操作。I.isUsedOutsideOfBlock(&BB)也就是判斷AllocaInst對應(yīng)的變量有沒有在當前基本塊以外被使用,。

 

假設(shè)原程序在一個基本塊中定義了變量a,,在這個基本塊的下一個基本塊中使用了變量a。這時候編譯這個程序不會出問題,,因為編譯器知道變量a在被使用之前一定在前一個基本塊被定義了,。

 

然而平坦化之后基本塊之間的順序被打亂了,編譯器也無法知道變量a在使用之前會不會被定義,,所以會在編譯時直接報錯,。解決這個問題的方法是把所有a變量的定義提前到函數(shù)的入口塊,這個過程就叫做修復(fù)逃逸變量,。更具體的解釋可以看我在看雪上發(fā)的文章:https://bbs.kanxue.com/thread-268789.htm

回復(fù)
LLVM與代碼混淆技術(shù)
  參與學習     331 人
  提問次數(shù)     13 個
《LLVM與代碼混淆技術(shù)》詳解3種經(jīng)典代碼混淆方式+2種變體
0
我的提問
0
我的回答
0
學習收益