[英]How to use Why3 proofs in Frama-C GUI?
這聽起來像一個愚蠢的問題,但我很困惑。 我正在嘗試使用Frama-C Sodium和Why3 0.86.1(均通過OPAM安裝)來證明一些簡單的屬性。 考慮以下程序( toy.c
):
int main(void) {
char *hello = "hello world!";
/*@ assert \valid_read(hello+(0..11)); */
return 0;
}
我想使用Frama-C GUI和Why3證明這一斷言。 因此,我運行frama-c-gui toy.c
,選擇“ Why3(ide)”作為證明者,並在主要功能上運行“通過WP證明功能注釋”。 (或者:我導航到“ WP Goals”選項卡,然后從那里運行Why3 IDE。)Why3出現,我呼叫我選擇的證明者將所有內容變為綠色,保存會話並退出Why3,然后在Frama中什么也沒有發生-C GUI:該屬性仍標記為橙色/“試圖驗證但無法確定”。
我如何告訴Frama-C實際使用Why3產生的證明? 證據本身肯定存在:如果再次打開Why3,一切仍然是綠色的,因此會話已正確保存。 另外,Frama-C知道發生了一些事情:打開Why3 IDE時,WP目標選項卡中會出現一個小齒輪符號,當我關閉Why3時,該符號會消失。
(我意識到可以通過Alt-Ergo證明此特殊屬性,而無需涉及Why3,但對於更困難的問題,我確實需要Why3。)
對我自己的初步答案:看起來Frama-C的Why3會話XML文件解析器與Why3 0.86.1生成的XML不匹配。 此補丁似乎可以解決此問題:
diff -ur frama-c-Sodium-20150201/src/wp/why3_session.ml frama-c-Sodium-20150201-hacked/src/wp/why3_session.ml
--- frama-c-Sodium-20150201/src/wp/why3_session.ml 2015-03-06 16:28:27.000000000 +0100
+++ frama-c-Sodium-20150201-hacked/src/wp/why3_session.ml 2015-09-17 21:35:30.717409735 +0200
@@ -160,6 +160,20 @@
let name = string_attribute "name" elt in
name
+let load_result parent_goal r =
+ match r.Xml.name with
+ | "result" ->
+ let status = string_attribute "status" r in
+ assert (parent_goal.goal_verified = false);
+ parent_goal.goal_verified <- (status = "valid")
+ | _ -> ()
+
+let load_proof parent p =
+ match p.Xml.name with
+ | "proof" ->
+ List.iter (load_result parent) p.Xml.elements
+ | _ -> ()
+
let rec load_goal parent g =
match g.Xml.name with
| "goal" ->
@@ -168,7 +182,9 @@
let mg =
raw_add_no_task parent gname
in
- mg.goal_verified <- verified
+ mg.goal_verified <- verified;
+ (* hack for different(?) session file format *)
+ List.iter (load_proof mg) g.Xml.elements
| "label" -> ()
| s ->
Wp_parameters.debug
無法保證這將對其他任何人都有效(即使我確實如此,也不能保證它對我自己的用途是正確的)。
這里有任何Frama-C開發人員,誰能發表評論?
感謝您報告錯誤。 建議的修復程序似乎有效。
但是,我們希望與Why-3會話更緊密地集成在一起,並導入到Frama-C,證明者將履行每項證明義務。 實際上,我們將在重構期間修復該錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.