2012-03-29 47 views
2

產生我用郵資-C的工具來分析以下中的代碼PDGS圓節點的意義。什麼這是由郵資-C

int main (int argc, char *argv[]) 
    { 
    int i,a; 
    for (i = 0; i < 100; i += 1) 
    { 
     a=0; 
     if (a==0) 
     { 
      continue; 
     } 
     else 
     { 
      break; 
     } 
    } 
    return 0; 
    } 

的cmd是

frama-c -pdg -dot-pdg graph main.c 

11

我的問題是有關控制的依賴。圓節點的含義是什麼?我試圖解釋「而」節點,也許它代表一個時間循環,因爲「我< 100」,所以有控制關係(一個循環開始「我< 100」 ------○「而」 )。我猜對了嗎?但是什麼是「休息」節點呢?我猜那個節點「goto __Cont;」與「打破」有關;語句在「else」塊中。
我覺得我沒有清晰的抽象模型來理解完全和準確的控制依賴。你能幫我或給我任何建議嗎?很多先謝道。

回答

1

命令frama-c -print main.c看看程序是如何翻譯的(我在下面包括翻譯版本)。

在規範化版本聲明goto __Cont;continue;在原來的翻譯。

而且,正如Binyamin所說,for循環歸一化爲while循環。

int main(int argc, char **argv) 
{ 
    int __retres; 
    int i; 
    int a; 
    i = 0; 
    while (i < 100) { 
    a = 0; 
    if (a == 0) { goto __Cont; } 
    else { break; } 
    __Cont: /* internal */ i ++; 
    } 
    __retres = 0; 
    return (__retres); 
} 
+0

爲什麼「a = 0」和「a == 0」對循環「break」有控制依賴性?因爲休息會讓他們不再執行任何事情? – user1283336 2012-03-30 02:21:58

1

大部分是自解釋的:

  • 圓 - 流控制(分支)
  • 菱形 - 條件(a == 0等)
  • 正方形 - 分配

你的for循環被翻譯while循環