簡體   English   中英

這個 C 程序對應的自動機 YA 文件是什么?

[英]What would be the automaton YA file corresponding to this C program?

在使用 Frama-c 的 Aorai 插件驗證該程序的上下文中,對應的自動機 in.ya 文件格式是什么?

void f() {
    ;
}

void g(){
    ;
}

int main(){
    f();
    g();
    return 0;
}

我的猜測是這個

%init: S0;
%accept: S4;

S0 : { CALL(main) } -> S1
   ;
S1 : { CALL(f) } -> S2
   ;
S2 : { CALL(g) } -> S3
   ;
S3 : {RETURN(main) } -> S4
   ;
S4 : -> S4
   ;

但是我使用 Aorai 插件得到了這個錯誤

[aorai] Warning: Call to main does not follow automaton's specification. This path is assumed to be dead
[aorai] Threestateaut.c:12: Warning: 
  Call to main not conforming to automaton (pre-cond). Assuming it is on a dead path

不要忘記,在每個事件中,都必須從自動機的當前 state 中進行轉換。 在這里,當您在CALLf之后在S2中時,發生的下一個事件是從fmainRETURN ,但是從S2的唯一轉換由CALL(g)保護(自動機的開頭因此描述了一個程序,其中f本身調用g )。

要解決此問題,您可以將RETURN考慮在內,如

...
S2: { RETURN(f) } -> S3;
S3: { CALL(g)   } -> S4;
...

或使用 YA 擴展(如手冊第 3.1.3 節所述,特別是允許指示您有一個CALL(f)直接后跟一個RETURN(f)

...
S2: { f() } -> S3;
...

實際上,通過這些擴展,可以以更緊湊的方式指定完整的執行流程,因為您可以嵌套調用序列:

%init: S0;
%accept: S1;

S0 : { main([f();g()]) } -> S1;

S1: -> S1;

暫無
暫無

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

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