Как использовать retval-postcondition для переменной, содержащей возвращаемое значение?

Моя простая программа vars.c:

int pure0 ()
{
    return 0;
}

int get0(int* arr)
{
    int z = pure0();
    return z;
}

Я начал доказательство (файл verif_vars.c):

Require Import floyd.proofauto.
Require Import vars.

Local Open Scope logic.
Local Open Scope Z.

Definition get0_spec :=
  DECLARE _get0
    WITH sh : share, arr : Z->val, varr : val
    PRE [_arr OF (tptr tint)]
        PROP ()
        LOCAL (`(eq varr) (eval_id _arr);
               `isptr (eval_id _arr))
        SEP (`(array_at tint sh arr 0 100) (eval_id _arr))
    POST [tint] `(array_at tint sh arr 0 100 varr) &&
                 local(`(eq (Vint (Int.repr 0))) retval).

Definition pure0_spec :=
  DECLARE _pure0
    WITH sh : share
    PRE []
        PROP ()
        LOCAL ()
        SEP ()
    POST [tint] local(`(eq (Vint (Int.repr 0))) retval).

Definition Vprog : varspecs := nil.
Definition Gprog : funspecs := get0_spec :: pure0_spec ::nil.

Lemma body_pure0: semax_body Vprog Gprog f_pure0 pure0_spec.
Proof.
  start_function.
  forward.
Qed.


Lemma body_get0: semax_body Vprog Gprog f_get0 get0_spec.
Proof.
  start_function.
  name arrarg _arr.
  name zloc _z.
  name zloc' _z'.
  forward_call (sh).
  entailer!.
  auto with closed.
  after_call.
  forward.
  entailer!.

И закончились двумя подцелями:

  Espec : OracleKind
  sh : share
  arr : Z -> val
  Struct_env := abbreviate : type_id_env.type_id_env
  Delta := abbreviate : tycontext
  zloc0 : val
  arrarg : val
  zloc : int
  TC : is_pointer_or_null arrarg
  Parrarg : isptr arrarg
  ============================
   Int.repr 0 = zloc

subgoal 2 (ID 1273) is:
 !!(Int.repr 0 = zloc) |-- emp
  • Первый следует непосредственно из pure0_spec Постусловие. Но как я могу сказать это Coq?
  • Вторая цель может быть упрощена admit. entailer.) чтобы TT |-- emp, Который кажется снова тривиальным, и все же, как можно это доказать (SearchAbout derives а также SearchAbout emp не показывать никаких общих лемм)?

Я использую: VST 1.5 (6834P в 2014-10-02), CompCert 2.4, Coq 8.4pl3(январь 14) с OCaml 4.01.0.

1 ответ

Решение

Во-первых: от руки, не пытаясь воспроизвести это сам - возможно ли, что использование entailer! слишком "рискованно", потому что (как задокументировано) entailer! иногда может превратить доказуемую цель в недоказуемую. Попробуй с entailer без взрыва, и посмотреть, выглядит ли это лучше.

Во-вторых, TT |-- emp неправда. TT относится к любой куче, и emp применяется только к пустым кучам. Вы можете исправить это, изменив постусловие pure функция к,

POST [tint] local(`(eq (Vint (Int.repr 0))) retval) && emp.
Другие вопросы по тегам