[英]Value Dependency Analysis with Frama-C
在以下程序的結尾,變量x
的值取決於變量{x,y,z,c}
的集合。 同樣,變量y
的值取決於變量{y,c}
的集合。
int main(){
int x = 100;
int y = 50;
int z = 20;
int c = g();
if (c){
x += y + 1;
}else{
x += z + 1;
y = y + 1;
}
return 0;
}
我可以從命令行的Frama-c工具獲取此信息嗎? 如果是的話,如果有人可以幫助我,我將不勝感激。
您不能從提供的main
功能上的Frama-C的現有插件之一獲得此結果。 但是,如果您稍稍修改了代碼,則插件From
會完全返回您想要的信息。
// test.c
int x = 100;
int y = 50;
int z = 20;
extern int c; // unknown value
int main(){
if (c){
x += y + 1;
}else{
x += z + 1;
y = y + 1;
}
return 0;
}
frama-c -deps test.c
[from] Done for function main
[from] ====== DEPENDENCIES COMPUTED ======
These dependencies hold at termination for the executions that terminate:
[from] Function main:
x FROM x; y; z; c
y FROM y; c (and SELF)
\result FROM \nothing
[from] ====== END OF DEPENDENCIES ======
x
的結果不言自明。 對於y
,您獲得了自函數開始以來y
可能不變的附加信息,因此(and SELF)
。
通過從main
初始化變量來獲得不同結果的原因是由於-deps
分析使用函數開頭的狀態來計算其結果。 在您的main
,由於x
, y
和z
設置為常數,因此它們的最終結果僅取決於c
,而后者反過來僅取決於g
讀取的內容以計算其結果。
您可以嘗試使用frama-c -pdg -pdg-print
選項。 它調用PDG( 程序依賴圖 )插件。 但是,您將需要對輸出進行解碼,這是一種神秘的方法。
您還可以使用-pdg-dot
選項使用dot
圖格式(來自Graphviz )獲得更友好的表示形式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.