2013-11-05 1 views
3

에 나는이 C 코드를 가지고 :증명하는 방법에 잠시/대한 이자벨/HOL

내가 입증 할
while(p->next) p = p->next; 

이이 루프가 끝날 때 목록이 p->nextNULL 동일, 얼마나 오래 상관없이 및 EIP는이 루프 이후의 다음 명령어를 참조합니다.

하지만 그렇게 할 수는 없습니다. 누구든지 루프를 증명하는 방법을 알고 있습니까 이사벨/호브?

+1

Isabelle/HOL 내부의 C 코드 속성을 직접적으로 증명할 수있는 방법을 모르겠습니다. 당신이 성취하고자하는 것에 대해 더 자세히 설명해 주시겠습니까? 아마도 http://afp.sourceforge.net/entries/Simpl.shtml이 관심의 대상 일 수 있습니다. Btw : "EIP"는 무엇입니까? – chris

+0

사용할 교정 도구와 독립적입니다. 목록이 원형 인 경우 (즉, 루프가 종료되지 않는 경우)를 어떻게 처리합니까? – chris

+0

안녕하세요. @ 크리스. 미안하지만 세부 사항을 너무 많이 말할 수는 없지만 팀 작업이며 아직 게시되지 않았습니다.내가 말할 수있는 것은 mov, jmp와 같은 Isabelle의 X86 ISA 명령어를 시뮬레이트하고 있다는 것입니다. gcc에 의해 생성 된 어셈블리 코드는 Isabelle로 변환되어 Isabelle에서 실행됩니다. 루프가 없으면 결과가 매우 좋습니다. 그러나 우리는 루프를 처리 할 수 ​​없으며 훨씬 더 어렵습니다. 우리는 모든 n에 대해 this 루프가 p-> next가 NULL이되고 eip (pc)가 루프 아래의 다음 명령어를 가리킨다는 것을 증명하기를 원합니다. – njuguoyi

답변

8

더 많은 추론을 위해 C 코드를 Isabelle/HOL로 가져올 수있는 일련의 도구 (부인 : 저는 후자입니다)는 Michael Norrish의 C ParserAutoCorres입니다. 명령 사용 이자벨에

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" 

우리는 다음 내용의 호어 트리플 증명할 수, 즉 모든 입력 상태에 대해 함수의 반환 값은 :

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입니다. 그의 정확성 정리는 부분 정확도 정리인데 다소은 당신이 요구 한 것을 말합니다. (특히 일 경우 함수가 종료되고 이면이면 오류가 발생하지 않으며 사후 조건은 true입니다).

보다 완벽한 증거를 들어

, 당신은 위의 몇 가지를 추가해야합니다 :

  1. 하는 당신은 목록이 유효한지 알 필요가; 예를 들어 중간 노드가 잘못된 주소 (예 : 정렬되지 않은 주소)를 가리 키지 않으며 목록이 루프를 형성하지 않는다는 것을 의미합니다 (while 루프가 절대로 종료되지 않음을 의미).

  2. 또한 해지를 입증해야합니다. 위의 두 번째 조건과 관련이 있지만, 왜 그것이 사실인지에 대한 논의를해야 할 것입니다. (일반적인 방법은 목록의 길이가 항상 감소하므로 결국 루프가 종료 됨).

AutoCorres는 명령 포인터의 개념을 지시하지 않지만 일반적으로 이러한 개념은 어셈블리 수준에서만 존재합니다. 그러나 종료 증명은 비슷합니다.

AutoCorres는 DataStructures.thy에 연결된 목록에 대한 추론을위한 몇 가지 기본 라이브러리를 제공합니다. 이는 좋은 시작점입니다.