我试图找到一个关于LTL操作符_F_的例子,这意味着Aorai致命,但我无法弄清楚这个操作员的目标是什么,并且存储库中没有例子"测试&#34 ;奥拉 例如,我写了这个公式
CALL(main) && _X_ (CALL(a) && _X_(RETURN(a) && _F_ (RETURN(b) && _X_ (RETURN(main)) ) ))
这说明在我的程序主程序中,我必须调用函数a(),然后我不明白操作员会发生什么致命的事情,但它似乎需要并接受我们在函数后调用的任何内容a()没有来自Aorai的警告或错误。如果有人可以帮助我,或者可以提供一个正确的例子。 例如,我有这个程序,我想用上面的公式测试
void a()
{}
void b()
{}
int main()
{ a();
a();
b();
b();
a();
return 0;}
我输入frama-c -aorai-ltl test.ltl test.c
通常,Aorai应该有错误或警告。否?
答案 0 :(得分:1)
你的问题更多是关于时间逻辑而不是Frama-C / Aorai本身,但这个公式的含义是main
必须调用a
,然后做任何想做的事情,然后再调用{{1}之后就回来了。
注意:注意Aorai只跟踪呼叫和返回事件,例如“就在这之后”这意味着b
在上次调用main
后无法调用任何函数,但仍然可以执行某些操作,例如b
。
<强>更新强>
我在Frama-C上运行了完整的例子。实际上,Aorai生成的x++;
合同中缺少后置条件,即main
(main
)末尾生成的自动机的状态应该是接受的,这不是这种情况。这是一个错误。如果您用T0_S4
语言明确地写出等效的自动机,那么
ya
然后生成的%init: S0;
%accept: Sf;
S0: { CALL(main) } -> S1;
S1: { [ a() ] } -> S2;
S2: { RETURN(b) } -> S3
| other -> S2;
S3: { RETURN(main) } -> Sf;
Sf: -> Sf;
合约包含main
,这确实表明该函数不符合自动机,Aoraï警告说。
但请注意,在一般情况下,Aoraï不会发出任何警告。它生成的合同如果满足,则意味着整个程序符合自动机。合同证明必须由另一个插件(例如WP或价值分析)
完成