我想從C源代碼生成程序依賴圖(PDG)。我找到了解釋如何做的論文,但都使用了商業化的CodeSurfer工具。可以使用哪些免費工具來生成c代碼的程序依賴圖
有沒有可以完成這項工作的免費工具或開源項目?
我想從C源代碼生成程序依賴圖(PDG)。我找到了解釋如何做的論文,但都使用了商業化的CodeSurfer工具。可以使用哪些免費工具來生成c代碼的程序依賴圖
有沒有可以完成這項工作的免費工具或開源項目?
郵資-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.dot
graph.f.dot
和含有main()
和f()
該PDG分別。
您可以使用dot
程序漂亮地打印他們這樣的一個:dot -Tpdf graph.main.dot > graph.pdf
結果如下:
注意從節點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;
}
如果您想要顯示互相調用的方法的依賴關係,並且使用的是gcc
,那麼gcc
的選項-fdump-rtl-expand
可能會對您感興趣。
對於使用選項-fdump-rtl-expand
gcc
編譯的每個源文件都會輸出一個*.expand
文件。
提供給工具egypt的那些文件產生顯示該方法依賴性的圖。
甲PDG是其節點是語句的曲線圖。請參閱http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html – 2012-03-21 22:18:09
非常感謝您的卓越幫助。我開始學習如何使用Frama-C。在Frama-C的參考文獻中,我無法找到graph.main.dot圖中該行的均值。不同的線條樣式意味着什麼?或者有沒有關於此的任何材料。 – user1283336 2012-03-25 02:40:56
@ 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
我認爲它必須是'-pdg-dot'而不是'-dot-pdg'吧?至少對我而言,它只能以前一種方式工作 – Paddre 2016-07-16 16:54:10