2012-03-21 16 views

回答

16

郵資-C是一個開源的靜態分析平臺a slicer for C programs根據程序依賴圖的計算。

請注意,切片用真正的編程語言(如C)編寫的實際程序涉及許多在科學出版物中被瀏覽的特殊情況和概念。不過,我相信,你不會找到比郵資-C的PDG計算什麼簡單的,首先是因爲它是唯一的開源一個可用的(我知道的),二是因爲處理的C程序的任何其他PDG計算將有解決相同的問題並引入相同的概念。

這裏是一個例子:

int a, b, d, *p; 

int f (int x) { 
    return a + x; 
} 

int main (int c, char **v) { 
    p = &b; 
    a = 1; 
    *p = 2; 
    d = 3; 
    c = f(b); 
} 

命令frama-c -pdg -dot-pdg graph -pdg-print t.c生成點文件graph.main.dotgraph.f.dot和含有main()f()該PDG分別。

您可以使用dot程序漂亮地打印他們這樣的一個:dot -Tpdf graph.main.dot > graph.pdf

結果如下:

PDG of main()

注意從節點c = f(b);邊緣節點*p = 2;。聲稱對C程序有用的PDG計算必須處理別名。

在另一方面,使用該PDG切片的準則「的聲明c = f(b);輸入」切片器將能夠去除d = 3;,不能影響函數調用,甚至通過指針訪問*p。 Frama-C的限幅器使用PDG指示的依賴關係只保留對用戶指定的限幅標準有用的語句。例如,該命令frama-c -slice-wr c t.c -then-on 'Slicing export' -print產生下面的縮小程序,其中,分配給d已被移除:

/* Generated by Frama-C */ 
int a; 
int b; 
int *p; 
int f_slice_1(int x) 
{ 
    int __retres; 
    __retres = a + x; 
    return (__retres); 
} 

void main(int c) 
{ 
    p = & b; 
    a = 1; 
    *p = 2; 
    c = f_slice_1(b); 
    return; 
} 
+0

非常感謝您的卓越幫助。我開始學習如何使用Frama-C。在Frama-C的參考文獻中,我無法找到graph.main.dot圖中該行的均值。不同的線條樣式意味着什麼?或者有沒有關於此的任何材料。 – user1283336 2012-03-25 02:40:56

+0

@ user1283336有3種箭頭:分別是數據,控制和地址依賴性。程序'int a,b,* p; void main(int x,int y,int z) { p =&a; * p = x; if(y) b = z; } '包含所有3種依賴關係。使用與第一個示例相同的命令行,您應該不難識別哪個是哪個命令行。沒有用戶可用的切片機的內部描述,對不起,只有關於如何使用它的外部描述。 – 2012-03-25 03:36:33

+1

我認爲它必須是'-pdg-dot'而不是'-dot-pdg'吧?至少對我而言,它只能以前一種方式工作 – Paddre 2016-07-16 16:54:10

4

如果您想要顯示互相調用的方法的依賴關係,並且使用的是gcc,那麼gcc的選項-fdump-rtl-expand可能會對您感興趣。

對於使用選項-fdump-rtl-expandgcc編譯的每個源文件都會輸出一個*.expand文件。

提供給工具egypt的那些文件產生顯示該方法依賴性的圖。

+0

甲PDG是其節點是語句的曲線圖。請參閱http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html – 2012-03-21 22:18:09

相關問題