[英]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
的調用(這樣我們就可以在從S4
到S5
的轉換期間從opb
返回。事實上,如果代碼相對於自動機是正確的,則在 state S1
中調用opa
(參數小於5000
),然后從opa
返回(結果小於或等於5000
),帶來程序回到main
(從S0
到S1
的第一次轉換是在程序開始時完成的)。
在更新原始問題后進行編輯:從上面的描述中應該清楚,是的, S3
和S4
之間的保護可以寫成{CALL(opb)}
而沒有真正改變規范。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.