簡體   English   中英

為什么Frama-c的Eva插件在實際上找到一個斷言的反例時返回unkown

[英]Why Eva plugin of Frama-c return unkown when it acctually found a counter example of an assertion

我試圖在函數內插入一個斷言。 這是我做的:

void foo(int a) {
    //@ assert a == 1;
}

void main() {
   foo(1);
   foo(2);
}

我希望得到一個無效的結果,但Frama-C返回一個未知的結果,而它可以提供一個反應調用堆棧的反例。

這是我用Frama-C運行示例時的屏幕截圖:

Frama-C GUI的屏幕截圖,其中包含Eva計算的每個callstack的值

Eva表示狀態未知,因為它已經觀察到一個callstack,其中斷言是有效的,另一個是無效的。 但是,因為插件執行過度逼近(好吧,不是這里,因為你的程序很簡單,但在一般情況下會有),它無法確保兩者都可以在具體的執行中發生:由於Eva使用的抽象范圍之外的條件,在分支中(或者驗證斷言的那個或者使它無效的那個)可能無法在具體的世界中達到。 因此,包含所有可能性的唯一聲音可能性是在此處設置Unknown狀態。

如果你注釋掉foo(1)調用,你也可以看到同樣的問題。 然后Eva將報告該斷言是無效的,但只要它確實可以達到

最后,這種注釋確實是你通常首先想要調查的那些(與“普通”未知狀態的注釋相反),而在較新版本的Frama-C(從v17.0開始),你有一個注釋附加面板Red Alarms ,列出對至少一個callstack無效的屬性。

暫無
暫無

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

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