簡體   English   中英

“默認行為:嘗試使用 Frama-C kernel”是什么意思? 意思是?

[英]What does “Default behavior: tried with Frama-C kernel.” mean?

我正在嘗試驗證來自 Frama-C + WP 的簡單程序。

#include <string.h>

/*@
        requires valid_read_string(s);
        assigns \result \from indirect:s[0..];
        ensures \result == strlen(s);
*/
size_t get_len(const char *s) {
        return strlen(s);
}

int main() {
        static const char foo[4] = { 'H', 'e', 'y', 0 };
        size_t sz = get_len(foo);
        //@ assert sz == 3;

        return 0;
}

除了一個證明之外,一切都正確驗證:

frama-c -rte -pp-annot -wp -wp-rte /tmp/test.c -c11 -then -report -report-no-proven
[    -    ] Default behavior
            tried with Frama-C kernel.

     1 To be validated
     1 Total

我似乎找不到任何有關此“默認行為”含義的信息,也無法弄清楚為什么它無法驗證它。

我在這里做錯了嗎?

一個 ACSL 合約可以被構建成一個行為列表,這些行為描述了 function 可能被調用的各種情況(有關更多信息,請參見ACSL 手冊)。 它們是這樣介紹的:

/*@ 
  behavior A:
    assumes some_condition;
    requires ...
    assigns ...
    ensures ...
  behavior B: ...
*/

如果調用 function 時assumes子句為真,則行為處於活動狀態,必須滿足行為中的其他子句。

所謂的默認行為包含不屬於顯式行為的條款:這有點像您將合同寫成這樣:

/*@
  behavior Default:
    assumes \true;
    requires valid_read_string(s);
    assigns \result \from indirect:s[0..];
    ensures \result == strlen(s);
*/

行為的有效性狀態(包括默認行為)只是其組件狀態的合並(即,當且僅當所有組件都被驗證時,它才有效)。 它由 kernel 根據插件(此處為 WP)放置在每個單獨組件上的狀態計算得出。

現在,“未知”來自哪里,因為看起來所有注釋都已被證明? 事實上,情況並非如此:您編寫 assigns 子句的方式是assigns \result \from indirect:s[0..]; 暗示有兩點要證明:一是function沒有修改程序的全局state(這個是WP驗證的),二是結果只取決於s的內容(這個沒做,在事實上,目前沒有插件能夠做到這一點)。 這是第二個屬性,通常稱為from子句,它導致 kernel 認為默認行為未得到充分證明。 不幸的是,報告的 output 中似乎甚至沒有這個from子句,這讓事情變得更加混亂。

更新正如一位尊敬的前同事所建議的那樣,我對from子句缺少報告進行了一些研究:默認情況下-report不顯示未嘗試的屬性,您必須顯式設置-report-untried (然后為您提供您不調用的標准庫的 function 的所有先決條件,以及get_lenfrom符合預期)。

Virgile 的回答非常好(FD:我們是以前的同事),但我想指出,在您非常嚴格的情況下,您可以證明合同的from條款。 更准確地說,一旦它被糾正,你就可以證明它。 正確的條款是

        assigns \result \from direct:s[0..], indirect:s

實際上,您需要讀取s指向的字符串的內容來計算其長度,並且間接依賴於指針s來訪問要讀取的 memory。 direct / indirect依賴的概念不是 ACSL 的一部分,它被添加以使from子句對使用Eva插件驗證程序更有用。)

更精確的版本是

        assigns \result \from direct:s[0..StrLen(s)], indirect:s

但這變得更難證明s和它指向的 memory 是否不准確。

最后,能夠執行證明的插件是插件From ,啟用了選項-from-verify-assigns 請注意,證明不是由 WP 完成的,而是由 Eva+From 完成的。 特別是,證明不是模塊化的。 相反,合約會檢查從main開始的執行期間發生的所有get_len 這可能是也可能不是您正在尋找的。

暫無
暫無

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

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