【課程筆記】南大軟件分析課程6——指針?lè)治鼋榻B(課時(shí)8)

目錄:

  1. Motivation
  2. 指針?lè)治鼋榻B
  3. 影響指針?lè)治龅年P(guān)鍵要素
  4. 分析哪些語(yǔ)句

重點(diǎn):

什么是指針?lè)治觯坑绊懼羔樂(lè)治龅年P(guān)鍵因素是什么?指針?lè)治鲆治瞿男┲噶睿?/p>


1.Motivation

指針?lè)治霰匾?/strong>:

6-1-PTA-motivation.png


2.指針?lè)治?/h1>

目標(biāo):分析程序指針可以指向哪些內(nèi)存。對(duì)于Java等面向?qū)ο笳Z(yǔ)言,主要分析指針指向哪個(gè)對(duì)象。

說(shuō)明:指針?lè)治鰧儆趍ay analysis,分析的結(jié)果是某指針?biāo)锌赡苤赶蚰男?duì)象,是個(gè)over-approximation集合。

示例:面向?qū)ο笳Z(yǔ)言中的指針指向問(wèn)題。對(duì)于setB()函數(shù),this指向new A(),因?yàn)槭钦{(diào)用者是a.setB();setB()中的b是x傳過(guò)來(lái)的,所以b指向new B(),A.b指向 new B()。

6-2-1-PTA示例.png

區(qū)別

  • 指針?lè)治觯悍治鲋羔標(biāo)锌赡苤赶虻膶?duì)象。
  • 別名分析:分析兩個(gè)指針是否指向相同的對(duì)象,可通過(guò)指針?lè)治鰜?lái)推導(dǎo)得到。

應(yīng)用:基本信息(別名分析/調(diào)用圖),編譯優(yōu)化(嵌入虛擬調(diào)用),漏洞(空指針),安全分析(信息流)。


3.影響指針?lè)治龅年P(guān)鍵要素

指標(biāo):精度(precision)& 效率(efficiency)。

影響因素:本課程,我們主要分析分配點(diǎn)的堆抽象技術(shù)、上下文敏感/不敏感、流不敏感、全程序分析。

因素 問(wèn)題 選項(xiàng)
Heap abstraction 如何建模堆內(nèi)存? ? Allocation-site ? Storeless
Context sensitivity 如何建模調(diào)用上下文? ? Context-sensitive ? Context-insensitive
Flow sensitivity 如何建??刂屏?? ? Flow-sensitive ? Flow-insensitive
Analysis scope 分析哪部分程序? ? Whole-program ? Demand-driven

(1)堆抽象(內(nèi)存建模)

問(wèn)題:程序動(dòng)態(tài)執(zhí)行時(shí),堆對(duì)象個(gè)數(shù)理論上是無(wú)窮無(wú)盡的,但靜態(tài)分析無(wú)法處理這個(gè)問(wèn)題。所以為保證指針?lè)治隹梢越K止,我們采用堆抽象技術(shù),將無(wú)窮的具體對(duì)象抽象成有限的抽象對(duì)象。也即,將有共性的對(duì)象抽象成1個(gè)靜態(tài)對(duì)象,從而限制靜態(tài)分析對(duì)象的個(gè)數(shù)。

// 示例
for (...) {
    A a = new A();
}

技術(shù)概覽

6-3-1-堆抽象技術(shù)概覽.png

我們只學(xué)習(xí)Allocation-Site技術(shù),最常見(jiàn)也最常被使用。

Allocation-Site原理:將動(dòng)態(tài)對(duì)象抽象成它們的創(chuàng)建點(diǎn)(Allocation-Site),來(lái)表示在該點(diǎn)創(chuàng)建的所有動(dòng)態(tài)對(duì)象。Allocation-Site個(gè)數(shù)是有限的。

示例:循環(huán)創(chuàng)建了3個(gè)對(duì)象,我們用O2來(lái)抽象表示這3個(gè)動(dòng)態(tài)對(duì)象。

6-3-2-堆抽象示例.png

(2)上下文敏感 Context Sensitivity

問(wèn)題:考慮是否區(qū)分不同call-site對(duì)同一函數(shù)的調(diào)用。

  • Context-sensitive:根據(jù)某函數(shù)調(diào)用上下文的不同,多次分析同一函數(shù)。
  • Context-insensitive:每個(gè)函數(shù)只分析一次。


    6-3-3-上下文敏感示例.png

(3)流敏感 Flow Sensitivity

問(wèn)題:考慮語(yǔ)句順序(控制流)的影響 vs 把程序當(dāng)做無(wú)序語(yǔ)句的集合。

方法:流敏感會(huì)在每個(gè)程序點(diǎn)都保存一份指針指向關(guān)系映射,而流不敏感則對(duì)整個(gè)程序保存一份指向關(guān)系映射。

說(shuō)明:目前流敏感對(duì)Java提升不大,不過(guò)在C中很有效,本課程分析的是Java,所以重點(diǎn)討論流不敏感技術(shù)。

指針?lè)治鍪纠?/strong>:

6-3-4-流敏感示例.png

(4)分析范圍 Analysis Scope

問(wèn)題:分析程序的哪一部分?

  • Whole-program 全程序:分析全程序的指向關(guān)系。
  • Demand-driven 需求驅(qū)動(dòng):只分析影響特定域的指針的指向關(guān)系。

4.分析哪些語(yǔ)句

問(wèn)題:哪些語(yǔ)句會(huì)影響指針指向,那就只分析這些語(yǔ)句。

Java指針類(lèi)型

  1. Lacal variable: x

  2. Static field:C.f (有時(shí)稱(chēng)為全局變量)——不分析

  3. Instance field: x.f (對(duì)象的field)

  4. Array element: array[i] ——不分析,因?yàn)殪o態(tài)分析無(wú)法確定下標(biāo),所以將array中所有成員映射到一個(gè)field中,等價(jià)于Instance field,所以不重復(fù)分析。如下圖所示:

    6-4-1-數(shù)組處理.png

影響指針指向的語(yǔ)句

  1. New: x = new T()
  2. Assign:x = y
  3. Store: x.f = y
  4. Load: y = x.f
  5. Call: r = x.k(a,...)
    • Static call: C.foo()
    • Special call: super.foo() / x.<init>() / this.privateFoo()
    • Virtual call:x.foo()

復(fù)雜的內(nèi)存訪(fǎng)問(wèn)可以通過(guò)引入臨時(shí)變量,轉(zhuǎn)化為三地址代碼:

x.f.g.h = y;
// 轉(zhuǎn)化為
t1 = x.f;
t2 = t1.g;
t2.h = y;

參考

軟件分析筆記4:指針?lè)治?/a>

友情鏈接更多精彩內(nèi)容