我有這樣的C代碼:如何證明時/在伊莎貝爾/ HOL
while(p->next) p = p->next;
我想證明,無論列表有多長,當這個循環結束,p->next
等於NULL
,並EIP指的是這個循環之後的下一條指令。
但我不能。有沒有人知道如何證明在Isabelle/HOL?
我有這樣的C代碼:如何證明時/在伊莎貝爾/ HOL
while(p->next) p = p->next;
我想證明,無論列表有多長,當這個循環結束,p->next
等於NULL
,並EIP指的是這個循環之後的下一條指令。
但我不能。有沒有人知道如何證明在Isabelle/HOL?
一套工具(免責聲明:我是後者的作者),允許您將C代碼導入Isabelle/HOL,以進一步推理Michael Norrish的C Parser和AutoCorres。使用命令
struct node {
struct node *next;
int data;
};
struct node * traverse_list(struct node *list)
{
while (list)
list = list->next;
return list;
}
到伊莎貝爾:
使用AutoCorres,我可以分析下面的C文件
theory List
imports AutoCorres
begin
install_C_file "list.c"
autocorres [ts_rules = nondet] "list.c"
然後,我們可以證明,霍爾三重其中指出,對於任何輸入狀態,函數的返回值將爲NULL
:
lemma "⦃ λs. True ⦄ traverse_list' l ⦃ λrv s. rv = NULL ⦄"
(* Unfold the function definition. *)
apply (unfold traverse_list'_def)
(* Add an invariant to the while loop. *)
apply (subst whileLoop_add_inv [where I="λnext s. True"])
(* Run a VCG, and solve the conditions using the simplified. *)
apply wp
apply simp
done
T他是一個部分正確性定理,其中有點陳述你所要求的。 (特別是,它指出如果功能終止,而如果它沒有錯,那麼後置條件爲真)。
爲了更完整的證明,你將需要一些更多的東西添加到上面:
你需要知道的是,名單是有效的;例如,中間節點不指向無效地址(例如,未對齊的地址),並且該列表不構成循環(意味着while循環將永不終止)。
您還需要證明終止。這與上面的第二個條件有關,但您可能仍然需要爲什麼它是真實的進行爭論。 (一種典型的方法是說列表的長度總是減少,因此循環最終會終止)。
AutoCorres沒有指示指令指針的概念(通常這些概念只存在於彙編級別),但終止的證明是類似的。
AutoCorres在DataStructures.thy
中提供了推理鏈接列表的一些基本庫,這將是一個很好的起點。
我不知道有任何直接的方法來驗證Isabelle/HOL中C代碼的屬性。你能否提供你想要達到的更多細節以及你在哪裏使用(或期望使用)來做到這一點?也許http://afp.sourceforge.net/entries/Simpl.shtml是有趣的。順便說一句:什麼是「EIP」? – chris
獨立於您想要使用的證明工具。你打算如何處理列表是循環的情況(即循環沒有終止)? – chris
你好@chris。對不起,我不能告訴你太多的細節,這是一個團隊工作,並沒有發佈。我可以告訴你的是,我們正在模擬Isabelle中的X86 ISA指令,如mov,jmp。由gcc生成的彙編代碼被翻譯成Isabelle,並在Isabelle中運行。當沒有循環時,結果非常好。但是我們無法處理循環,這是非常困難的。我們想證明對於所有的n,這個while循環將以p-> next等於NULL結束,並且eip(pc)將指向循環下面的下一條指令。 – njuguoyi