簡體   English   中英

Aorai的frama-c YA語言需要澄清

[英]In need for clarification of Aorai's frama-c YA language

在奧萊插件https://frama-c.com/download/frama-c-aorai-manual.pdf官方手冊提供的例子中example.ya文件如下

%accept: S1, S2, S3, S4, S5, S6, S7;

S1 : { CALL(main)   } -> S2 
   ;
S2 : { opa().r>=0 } -> S3 
   ;
S3 : { opa().return<=5000 } -> S4
   ;
S4 : { !RETURN(opa) } -> S5
   ;
S5 : { RETURN(opb)  } -> S6
     ;
S6 : { RETURN(main) } -> S7
     ;
S7 :                  -> S7     
   ;

我的問題是為什么我們必須在 state S4 中指定{!RETURN(opa)}為什么我們不將其替換為{ CALL(opb) }

這個自動機對應的主要function是

int main() {
  if (rr<5000) rr=opa(rr);
  opb();
  goto L6;
  opc();
 L6:
  return 1;
}

!RETURN(opa)表示當前事件不能是來自opa function 的return 如果你看看整個自動機:

%init: S0;
%accept: S0, S1, S2,S3,S4,S5,S6;
S0 : { CALL(main) } -> S1;
;
S1 : { opa().r<5000 }
 -> S2
;
S2 : { opa().return<=5000 } -> S3
;
S3 : { !RETURN(opa) } -> S4
;
S4 : { RETURN(opb) } -> S5
;
S5 : { RETURN(main)} -> S6
;
S6 : -> S6
;

並且考慮到每次調用或返回事件都必須跨越一個轉換,我們可以看到實際上這個事件必須是對opb的調用(這樣我們就可以在從S4S5的轉換期間從opb返回。事實上,如果代碼相對於自動機是正確的,則在 state S1中調用opa (參數小於5000 ),然后從opa返回(結果小於或等於5000 ),帶來程序回到main (從S0S1的第一次轉換是在程序開始時完成的)。

在更新原始問題后進行編輯:從上面的描述中應該清楚,是的, S3S4之間的保護可以寫成{CALL(opb)}而沒有真正改變規范。

暫無
暫無

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

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