簡體   English   中英

Frama-C的價值依賴分析

[英]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 ,由於xyz設置為常數,因此它們的最終結果僅取決於c ,而后者反過來僅取決於g讀取的內容以計算其結果。

您可以嘗試使用frama-c -pdg -pdg-print選項。 它調用PDG( 程序依賴圖 )插件。 但是,您將需要對輸出進行解碼,這是一種神秘的方法。

您還可以使用-pdg-dot選項使用dot圖格式(來自Graphviz )獲得更友好的表示形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM