Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/HelloLeaf.v

GNU Hello's leaf functions through the program logic of Logic.v (docs/logic.md, "GNU Hello through the logic", milestone 2).

Four small gnulib helpers of the linked module (hello_module) each make one libc call and return, and each gets a Hoare triple from that call's triple: mbszero from wp_memset (mbszero_spec), memeq from wp_memcmp (memeq_spec), streq from wp_strcmp (streq_spec) and strnlen1 from wp_memchr_string (strnlen1_spec). Callers in the module use them through wp_call_bind, as count_l uses next_l in CountLogic.v.

The triples hold in any genv that links Hello: one whose module is hello_module, whose symbols include the module's own (hello_globals) and none of the libc functions it calls (hello_linked). The registry and the world interpretation are any that hold the contracts the calls name, so the same triples serve the whole program, whose world is Campaign 4's.

From iris.proofmode Require Import proofmode
From iris.base_logic.lib Require Import gen_heap
From iris.program_logic Require Import language weakestpre
From Stdlib Require Import ZArith Lia
From Stdlib Require String
From Nanofil Require Import Term Syntax Values Memory Runtime Ops Semantics Run StepRules Symbolic ExternalCalls ExternalMachine Pieces Heap ContractFrame Language Logic StringLogic MemLogic LentLogic HelloModule
Open Scope Z_scope
Open Scope list_scope
Arguments Z.add : simpl nomatch
Arguments Z.sub : simpl nomatch
Arguments Z.mul : simpl nomatch

Integer arithmetic on an unknown stays folded when a premise is computed (Symbolic.v).

The module's symbols and functions

The symbols laying out hello_module gives, from 65536 on (initial_memory): 115 of them, functions and data.

41Definition hello_globals: listname × ptr ≔
Eval vm_compute in match initial_memoryhello_module with Someg, _ ⇒ g | None ⇒ [ ] end

A genv links Hello: its module is hello_module, each of the module's symbols is where hello_globals puts it, and no libc function the module calls (hello_externals) is a symbol, so each such call is an external_site. Startup may add libc's data symbols, such as program_invocation_name.

49Definition hello_linkedge : genv : Prop ≔
ge_modulege = hello_module ∧ ∀n p, lookupn hello_globals = Somep → lookupn ge_globalsge = Somep ∧ ∀s, existsbString.eqbs hello_externals = true → lookupTAtoms ge_globalsge = None

The module md defines no function named s (find_fn).

55Definition outsidemd : module s : String.string : bool ≔
match find_fnmkGenvmd [ ] λ_ _ ⇒ None TAtoms with
None
⇒
true
Some_
⇒
false

A function md does not define is no function of a genv with module md: find_fn reads only the module.

63Lemma outside_find
∀ ge s
outsidege_modulege s = true
find_fnge TAtoms = None
Explore proof 5 tactics

Initial goal

ge :
⊢
outsidege_modulege s = true → find_fnge TAtoms = None

unfold outside , find_fn

ge :
⊢
match match find_directTAtoms ge_modulege_module ≔ ge_modulege; ge_globals ≔ [ ]; ge_free ≔ λ_ : word _ : mem ⇒ None with Somed ⇒ Somed | None ⇒ let* t ≔ find_aliasTAtoms ge_modulege_module ≔ ge_modulege; ge_globals ≔ [ ]; ge_free ≔ λ_ : word _ : mem ⇒ None in find_directt ge_modulege_module ≔ ge_modulege; ge_globals ≔ [ ]; ge_free ≔ λ_ : word _ : mem ⇒ None end with
Some_
⇒
false
None
⇒
true
=
true
→
Somed
⇒
Somed
None
⇒
=
None

cbn [ ge_module ]

ge :
⊢
match match find_directTAtoms ge_modulege with Somed ⇒ Somed | None ⇒ let* t ≔ find_aliasTAtoms ge_modulege in find_directt ge_modulege end with
Some_
⇒
false
None
⇒
true
=
true
→
Somed
⇒
Somed
None
⇒
=
None

destruct find_direct_ _ ; discriminate |

ge :
⊢
match let* t ≔ find_aliasTAtoms ge_modulege in find_directt ge_modulege with
Some_
⇒
false
None
⇒
true
=
true
→

destruct find_alias_ _ as t | ; cbn ; | reflexivity

ge :
t :
⊢
match find_directt ge_modulege with
Some_
⇒
false
None
⇒
true
=
true
→

destruct find_directt _ ; discriminate | reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold outside , find_fn
cbn [ ge_module ]
destruct find_direct_ _ ; discriminate |
destruct find_alias_ _ as t | ; cbn ; | reflexivity
destruct find_directt _ ; discriminate | reflexivity

The libc function s, one Hello calls, is no function of a genv with Hello's module.

71Lemma hello_outside
∀ ge s
find_fnge TAtoms = None
Explore proof 9 tactics

Initial goal

ge :
⊢
ge_modulege = hello_module → existsbString.eqbs hello_externals = true → find_fnge TAtoms = None

intros Hm Hs

ge :
Hs :
existsbString.eqbs hello_externals = true
⊢
find_fnge TAtoms = None

apply outside_find

ge :
Hs :
existsbString.eqbs hello_externals = true
⊢
outsidege_modulege s = true

rewrite Hm

ge :
Hs :
existsbString.eqbs hello_externals = true
⊢

assert H : forallboutsidehello_module hello_externals = true by vm_compute ; reflexivity

rewrite forallb_forall in H

ge :
Hs :
existsbString.eqbs hello_externals = true
H :
∀x : string, Inx hello_externals → outsidehello_module x = true
⊢

apply existsb_exists in Hs as s′ & Hin & Hs

ge :
s′ :
Hin :
Hs :
s =? s′%string = true
H :
∀x : string, Inx hello_externals → outsidehello_module x = true
⊢

apply String.eqb_eq in Hs

ge :
s′ :
Hin :
Hs :
s = s′
H :
∀x : string, Inx hello_externals → outsidehello_module x = true
⊢

rewrite <- Hs in Hin

ge :
s′ :
Hs :
s = s′
H :
∀x : string, Inx hello_externals → outsidehello_module x = true
⊢

exact Hs Hin

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hm Hs
rewrite Hm
assert H : forallboutsidehello_module hello_externals = true by vm_compute ; reflexivity
rewrite forallb_forall in H
apply existsb_exists in Hs as s′ & Hin & Hs
apply String.eqb_eq in Hs
rewrite <- Hs in Hin
exact Hs Hin

The function f called with the words xs, at its entry, as call_frame makes it; a direct call to f binds this frame.

83Definition invocationf : func xs : listword : frame ≔
match call_framef xs with
Somefr
⇒
fr
None
⇒
mkFramef [ ] [ ] None EnterTAtom"start" None

Block l of f, or an empty one.

90Definition hblkf : func l : String.string : block ≔
Someb
⇒
b
None
⇒

mbszero(p): memset of 8 zero bytes, gnulib's mbstate_t reset.

97Definition mbszero_fn: func ≔
Eval vm_compute in hello_fn"mbszero"

memeq(p, q, n): memcmp, compared with 0.

99Definition memeq_fn: func ≔
Eval vm_compute in hello_fn"memeq"

streq(p, q): strcmp, compared with 0.

101Definition streq_fn: func ≔
Eval vm_compute in hello_fn"streq"

strnlen1(p, n): memchr for the NUL in n bytes; one past it, or n.

103Definition strnlen1_fn: func ≔
Eval vm_compute in hello_fn"strnlen1"

xmalloc(n): malloc, and xalloc_die on null.

105Definition xmalloc_fn: func ≔
Eval vm_compute in hello_fn"xmalloc"

mbszero's one block.

108Definition z_start: block ≔
Eval vm_compute in hblkmbszero_fn "start"

memeq's one block.

110Definition e_start: block ≔
Eval vm_compute in hblkmemeq_fn "start"

streq's one block.

112Definition q_start: block ≔
Eval vm_compute in hblkstreq_fn "start"

strnlen1's entry: memchr, then is its result null?

114Definition n_start: block ≔
Eval vm_compute in hblkstrnlen1_fn "start"

strnlen1 after a hit: one past it.

116Definition n_L8: block ≔
Eval vm_compute in hblkstrnlen1_fn "L8"

strnlen1 after no hit: n.

118Definition n_L9: block ≔
Eval vm_compute in hblkstrnlen1_fn "L9"

xmalloc's entry: malloc, then is the result null?

121Definition x_start: block ≔
Eval vm_compute in hblkxmalloc_fn "start"

xmalloc's return.

123Definition x_join: block ≔
Eval vm_compute in hblkxmalloc_fn "iw_1.join"

mbszero has its block.

126Lemma find_z_start
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v3" P GlobalTAtom"memset" ArgP TmpTAtom"v0"; ArgW Const0; ArgL Const8; b_jump ≔ JRetVoid = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v3" P GlobalTAtom"memset" ArgP TmpTAtom"v0"; ArgW Const0; ArgL Const8; b_jump ≔ JRetVoid

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

memeq has its block.

129Lemma find_e_start
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v9" W GlobalTAtom"memcmp" ArgP TmpTAtom"v0"; ArgP TmpTAtom"v2"; ArgL TmpTAtom"v4"; LetTAtom"v10" W CmpEq W TmpTAtom"v9"; Const0; b_jump ≔ JRetTmpTAtom"v10" = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v9" W GlobalTAtom"memcmp" ArgP TmpTAtom"v0"; ArgP TmpTAtom"v2"; ArgL TmpTAtom"v4"; LetTAtom"v10" W CmpEq W TmpTAtom"v9"; Const0; b_jump ≔ JRetTmpTAtom"v10"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

streq has its block.

132Lemma find_q_start
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v6" W GlobalTAtom"strcmp" ArgP TmpTAtom"v0"; ArgP TmpTAtom"v2"; LetTAtom"v7" W CmpEq W TmpTAtom"v6"; Const0; b_jump ≔ JRetTmpTAtom"v7" = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v6" W GlobalTAtom"strcmp" ArgP TmpTAtom"v0"; ArgP TmpTAtom"v2"; LetTAtom"v7" W CmpEq W TmpTAtom"v6"; Const0; b_jump ≔ JRetTmpTAtom"v7"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

strnlen1 has its entry.

135Lemma find_n_start
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v7" P GlobalTAtom"memchr" ArgP TmpTAtom"v0"; ArgW Const0; ArgL TmpTAtom"v2"; LetTAtom"v12" L Ptoi TmpTAtom"v7"; LetTAtom"v13" L Ptoi Const0; LetTAtom"v14" W CmpNe L TmpTAtom"v12"; TmpTAtom"v13"; b_jump ≔ JBranchTmpTAtom"v14" ToTAtom"L8" ToTAtom"L9" = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v7" P GlobalTAtom"memchr" ArgP TmpTAtom"v0"; ArgW Const0; ArgL TmpTAtom"v2"; LetTAtom"v12" L Ptoi TmpTAtom"v7"; LetTAtom"v13" L Ptoi Const0; LetTAtom"v14" W CmpNe L TmpTAtom"v12"; TmpTAtom"v13"; b_jump ≔ JBranchTmpTAtom"v14" ToTAtom"L8" ToTAtom"L9"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

strnlen1 has its hit block.

138Lemma find_n_L8
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"L8"; b_phis ≔ [ ]; b_insts ≔ LetTAtom"v18" L Ptoi TmpTAtom"v0"; LetTAtom"v19" L Sub TmpTAtom"v12"; TmpTAtom"v18"; LetTAtom"v20" L Add TmpTAtom"v19"; Const1; b_jump ≔ JRetTmpTAtom"v20" = Someb_label ≔ TAtom"L8"; b_phis ≔ [ ]; b_insts ≔ LetTAtom"v18" L Ptoi TmpTAtom"v0"; LetTAtom"v19" L Sub TmpTAtom"v12"; TmpTAtom"v18"; LetTAtom"v20" L Add TmpTAtom"v19"; Const1; b_jump ≔ JRetTmpTAtom"v20"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

strnlen1 has its miss block.

141Lemma find_n_L9
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"L9"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"v2" = Someb_label ≔ TAtom"L9"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"v2"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

xmalloc has its entry.

145Lemma find_x_start
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v3" P GlobalTAtom"malloc" ArgL TmpTAtom"v0"; LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0; b_jump ≔ JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" = Someb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ CallCResultTAtom"v3" P GlobalTAtom"malloc" ArgL TmpTAtom"v0"; LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0; b_jump ≔ JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

xmalloc has its return block.

148Lemma find_x_join
Explore proof 2 tactics

Initial goal

vm_compute

⊢
Someb_label ≔ TAtom"iw_1.join"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"v3" = Someb_label ≔ TAtom"iw_1.join"; b_phis ≔ [ ]; b_insts ≔ [ ]; b_jump ≔ JRetTmpTAtom"v3"

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
vm_compute
reflexivity

mbszero's entry binds its pointer.

152Lemma mbszero_entry
∀ p
Explore proof 1 tactics

Initial goal

p :
⊢
invocationmbszero_fn WPtrp = fr_fn ≔ mbszero_fn; fr_env ≔ TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

memeq's entry binds its pointers and length.

157Lemma memeq_entry
∀ p q n
invocationmemeq_fn WPtrp; WPtrq; WIntn = mkFramememeq_fn TAtom"v4", WIntn; TAtom"v2", WPtrq; TAtom"v0", WPtrp [ ] None EnterTAtom"start" None
Explore proof 1 tactics

Initial goal

p, q :
n :
Z
⊢
invocationmemeq_fn WPtrp; WPtrq; WIntn = fr_fn ≔ memeq_fn; fr_env ≔ TAtom"v4", WIntn; TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

streq's entry binds its pointers.

163Lemma streq_entry
∀ p q
invocationstreq_fn WPtrp; WPtrq = mkFramestreq_fn TAtom"v2", WPtrq; TAtom"v0", WPtrp [ ] None EnterTAtom"start" None
Explore proof 1 tactics

Initial goal

p, q :
⊢
invocationstreq_fn WPtrp; WPtrq = fr_fn ≔ streq_fn; fr_env ≔ TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

strnlen1's entry binds its pointer and bound.

168Lemma strnlen1_entry
∀ p n
Explore proof 1 tactics

Initial goal

p :
n :
Z
⊢
invocationstrnlen1_fn WPtrp; WIntn = fr_fn ≔ strnlen1_fn; fr_env ≔ TAtom"v2", WIntn; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

xmalloc's entry binds its size.

174Lemma xmalloc_entry
∀ n
Explore proof 1 tactics

Initial goal

n :
Z
⊢
invocationxmalloc_fn WIntn = fr_fn ≔ xmalloc_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
reflexivity

Prove a premise that names words: by computation, with the environment's facts.

181Ltac word_premise  ≔
first reflexivity | compute_premise

Prove an address premise: drop the wraps of raw_address and of a flight's sum where arithmetic shows them the identity, then arithmetic.

186Ltac addr_premise  ≔

Hello's leaf functions over any runtime R.

189Module HelloLeafOn R : Runtime LG0 : LogicSigR
190Module LL ≔ LentLogicOn R LG0
191Module ML ≔ LL.ML
192Module SL ≔ ML.SL
193Module LG ≔ ML.LG
194Module L ≔ LG.L
Import L LG SL ML
197Section leaves
198Context `{!invGS_genhlc Σ, !gen_heapGSpiece pval Σ}
199Context world : Type registry : name → optioncontractworld wi : mem → world → gmappiece pval → Prop `{!SafepointStablewi} ge : genv

The genv links Hello (hello_linked).

203Context Hlinked : hello_linkedge

The Iris instance of the registry and wi.

206Instance leaf_irisGS: irisGS_genhlc nanofil_langregistry ge Σ ≔
nanofil_irisGSregistry wi ge

The expressions of the language.

210Notation hexpr ≔ language.exprnanofil_langregistry ge

The libc function s that Hello calls is no function of the genv.

213Lemma linked_outside
∀ s
existsbString.eqbs hello_externals = true
find_fnge TAtoms = None
Explore proof 2 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
⊢
existsbString.eqbs hello_externals = true → find_fnge TAtoms = None

apply hello_outside

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :

exact proj1Hlinked

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
exact proj1Hlinked

The libc function s that Hello calls is no symbol of the genv.

217Lemma linked_unbound
∀ s
existsbString.eqbs hello_externals = true
Explore proof 1 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
⊢
existsbString.eqbs hello_externals = true → lookupTAtoms ge_globalsge = None

apply proj2proj2Hlinked

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply proj2proj2Hlinked

mbszero's triple, from wp_memset: owning the 8 bytes xs and their aux slots cs at the 8-aligned offset o of the live object b, at a multiple of 8, where the fill keeps the world interpretation, the call zeroes them and clears the slots.

224Lemma mbszero_spec
∀ b reg o xs cs Φ
registryTAtom"memset" = Somememset_contractworld
lengthxs = 8%nat
lengthcs = 8%nat
b mod 8 = 0
o mod 8 = 0
0 ≤ o
b + o + 8 ≤ r_endreg
∀m m′ wd h, memset_resultm mkPtrb + o Objb 0 8 m′ → ∀l v, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
liveb reg −∗ bytesb o xs −∗ auxesb o cs −∗ ▷liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid −∗ WPERuninvocationmbszero_fn WPtrmkPtrb + o Objb : hexpr {Φ}
Explore proof 13 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
⊢
registryTAtom"memset" = Somememset_contractworld → lengthxs = 8%nat → lengthcs = 8%nat → b mod 8 = 0 → o mod 8 = 0 → 0 ≤ o → b + o + 8 ≤ r_endreg → ∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h → liveb reg −∗ bytesb o xs −∗ auxesb o cs −∗ ▷liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid −∗ WPERuninvocationmbszero_fn WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb : hexpr {v. Φv}

intros Hreg Hx Hc Hb8 Ho8 Ho Hend Hwi

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
⊢
liveb reg −∗ bytesb o xs −∗ auxesb o cs −∗ ▷liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid −∗ WPERuninvocationmbszero_fn WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb : hexpr {v. Φv}

iIntros Hl Hx Hcs HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
Hl :
liveb reg
Hx :
bytesb o xs
Hcs :
auxesb o cs
HΦ :
▷liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
WPERuninvocationmbszero_fn WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb {v. Φv}

rewrite mbszero_entry

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
Hl :
liveb reg
Hx :
bytesb o xs
Hcs :
auxesb o cs
HΦ :
▷liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
WPERunfr_fn ≔ mbszero_fn; fr_env ≔ TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {v. Φv}

iApply wp_enter ; exact find_z_start | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
Hl :
liveb reg
Hx :
bytesb o xs
Hcs :
auxesb o cs
HΦ :
▷liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ mbszero_fn; fr_env ≔ TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsz_start b_jumpz_start {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
Hl :
liveb reg
Hx :
bytesb o xs
Hcs :
auxesb o cs
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ mbszero_fn; fr_env ≔ TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsz_start b_jumpz_start {v. Φv}

cbn [ b_insts b_jump z_start ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
Hl :
liveb reg
Hx :
bytesb o xs
Hcs :
auxesb o cs
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ mbszero_fn; fr_env ≔ TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" CallCResultTAtom"v3" P GlobalTAtom"memset" ArgP TmpTAtom"v0"; ArgW Const0; ArgL Const8 JRetVoid {v. Φv}

iApply wp_memset_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0 with Hl Hx Hcs ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | word_premise | word_premise | rewrite Hx ; word_premise | lia | exact Hb8 | exact Ho8 | exact Ho | rewrite Hx ; exact Hend | rewrite Hc Hx ; reflexivity | rewrite Hx ; exact Hwi |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
▷LG.liveb reg −∗ bytesb o replicatelengthxs 0 mod 256 −∗ auxesb o clear_slotso cs −∗ WPL.ERunfr_fn ≔ mbszero_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetVoid {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
∗
LG.liveb reg −∗ bytesb o replicatelengthxs 0 mod 256 −∗ auxesb o clear_slotso cs −∗ WPL.ERunfr_fn ≔ mbszero_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetVoid {v. Φv}

iIntros Hl Hx Hcs

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
Hl :
LG.liveb reg
Hx :
bytesb o replicatelengthxs 0 mod 256
Hcs :
∗
WPL.ERunfr_fn ≔ mbszero_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetVoid {v. Φv}

rewrite Hx

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
Hl :
LG.liveb reg
Hx :
bytesb o replicate8 0 mod 256
Hcs :
∗
WPL.ERunfr_fn ≔ mbszero_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ Objb; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetVoid {v. Φv}

iApply wp_ret_void

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
Hl :
LG.liveb reg
Hx :
bytesb o replicate8 0 mod 256
Hcs :
∗
▷ΦRetVoid

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
cs :
listcap
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memset" = Somememset_contractworld
Hx :
lengthxs = 8%nat
Hc :
lengthcs = 8%nat
Hb8 :
b mod 8 = 0
Ho8 :
o mod 8 = 0
Ho :
0 ≤ o
Hend :
b + o + 8 ≤ r_endreg
Hwi :
∀m m′ : mem wd : world h : gmappiece pval, memset_resultm ptr_addr ≔ b + o; ptr_cap ≔ Objb 0 8 m′ → ∀l : piece v : pval, l, v ∈ block_psb reg o xs cs → h !! l = Somev → wim wd h → wim′ wd overwriteblock_psb reg o replicate8 0 clear_slotso cs h
HΦ :
liveb reg −∗ bytesb o replicate8 0 −∗ auxesb o clear_slotso cs −∗ ΦRetVoid
Hl :
LG.liveb reg
Hx :
bytesb o replicate8 0 mod 256
Hcs :
∗

iApply HΦ with Hl Hx Hcs

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hreg Hx Hc Hb8 Ho8 Ho Hend Hwi
iIntros Hl Hx Hcs HΦ
iApply wp_enter ; exact find_z_start | reflexivity |
iNext
iApply wp_memset_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0 with Hl Hx Hcs ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | word_premise | word_premise | rewrite Hx ; word_premise | lia | exact Hb8 | exact Ho8 | exact Ho | rewrite Hx ; exact Hend | rewrite Hc Hx ; reflexivity | rewrite Hx ; exact Hwi |
iNext
iIntros Hl Hx Hcs
rewrite Hx
iNext
iApply HΦ with Hl Hx Hcs

memeq's triple, from wp_memcmp: owning as many bytes xs and ys of two live objects, through read-write or read-only capabilities, n their count, it returns an int and hands them back.

249Lemma memeq_spec
∀ b reg o xs c b′ reg′ o′ ys c′ n Φ
registryTAtom"memcmp" = Somememcmp_contractworld
n = Z.of_natlengthxs
c = Objb ∨ c = Rob
c′ = Objb′ ∨ c′ = Rob′
lengthys = lengthxs
0 ≤ o
0 ≤ o′
b + o + Z.of_natlengthxs ≤ r_endreg
b′ + o′ + Z.of_natlengthxs ≤ r_endreg′
Z.of_natlengthxs < 2 ^ 64
Forallλx ⇒ 0 ≤ x < 256 xs
Forallλx ⇒ 0 ≤ x < 256 ys
liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ▷∀k, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk −∗ WPERuninvocationmemeq_fn WPtrmkPtrb + o c; WPtrmkPtrb′ + o′ c′; WIntn : hexpr {Φ}
Explore proof 14 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
n :
Z
Φ :
outcome → iPropIΣ
⊢
registryTAtom"memcmp" = Somememcmp_contractworld → n = lengthxs → c = Objb ∨ c = Rob → c′ = Objb′ ∨ c′ = Rob′ → lengthys = lengthxs → 0 ≤ o → 0 ≤ o′ → b + o + lengthxs ≤ r_endreg → b′ + o′ + lengthxs ≤ r_endreg′ → lengthxs < 2 ^ 64 → Forallλx : Z ⇒ 0 ≤ x < 256 xs → Forallλx : Z ⇒ 0 ≤ x < 256 ys → liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ▷∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk −∗ WPERuninvocationmemeq_fn WPtrptr_addr ≔ b + o; ptr_cap ≔ c; WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; WIntn : hexpr {v. Φv}

intros Hreg → Hc Hc′ Hlen Ho Ho′ Hend Hend′ Hn Hx Hy

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
⊢
liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ▷∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk −∗ WPERuninvocationmemeq_fn WPtrptr_addr ≔ b + o; ptr_cap ≔ c; WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; WIntlengthxs {v. Φv}

iIntros Hl Hx Hl′ Hy HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
Hl :
liveb reg
Hx :
bytesb o xs
Hl′ :
liveb′ reg′
Hy :
bytesb′ o′ ys
HΦ :
▷∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
WPERuninvocationmemeq_fn WPtrptr_addr ≔ b + o; ptr_cap ≔ c; WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; WIntlengthxs {v. Φv}

rewrite memeq_entry

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
Hl :
liveb reg
Hx :
bytesb o xs
Hl′ :
liveb′ reg′
Hy :
bytesb′ o′ ys
HΦ :
▷∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
WPERunfr_fn ≔ memeq_fn; fr_env ≔ TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {v. Φv}

iApply wp_enter ; exact find_e_start | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
Hl :
liveb reg
Hx :
bytesb o xs
Hl′ :
liveb′ reg′
Hy :
bytesb′ o′ ys
HΦ :
▷∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ memeq_fn; fr_env ≔ TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instse_start b_jumpe_start {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
Hl :
liveb reg
Hx :
bytesb o xs
Hl′ :
liveb′ reg′
Hy :
bytesb′ o′ ys
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ memeq_fn; fr_env ≔ TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instse_start b_jumpe_start {v. Φv}

cbn [ b_insts b_jump e_start ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
Hl :
liveb reg
Hx :
bytesb o xs
Hl′ :
liveb′ reg′
Hy :
bytesb′ o′ ys
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ memeq_fn; fr_env ≔ TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" CallCResultTAtom"v9" W GlobalTAtom"memcmp" ArgP TmpTAtom"v0"; ArgP TmpTAtom"v2"; ArgL TmpTAtom"v4"; LetTAtom"v10" W CmpEq W TmpTAtom"v9"; Const0 JRetTmpTAtom"v10" {v. Φv}

iApply wp_memcmp with Hl Hx Hl′ Hy ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | reflexivity | exact Hc | reflexivity | exact Hc′ | cbn ; rewrite Z.mod_small ; reflexivity | lia | exact Hlen | exact Ho | exact Ho′ | exact Hend | exact Hend′ | exact Hx | exact Hy |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
▷∀bits : Z, LG.liveb reg −∗ bytesb o xs −∗ LG.liveb′ reg′ −∗ bytesb′ o′ ys −∗ WPL.ERunfr_fn ≔ memeq_fn; fr_env ≔ putTAtom"v9" WIntbits TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"v10" W CmpEq W TmpTAtom"v9"; Const0 JRetTmpTAtom"v10" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
∗
∀bits : Z, LG.liveb reg −∗ bytesb o xs −∗ LG.liveb′ reg′ −∗ bytesb′ o′ ys −∗ WPL.ERunfr_fn ≔ memeq_fn; fr_env ≔ putTAtom"v9" WIntbits TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"v10" W CmpEq W TmpTAtom"v9"; Const0 JRetTmpTAtom"v10" {v. Φv}

iIntros bits Hl Hx Hl′ Hy

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
bits :
Z
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
Hl :
LG.liveb reg
Hx :
bytesb o xs
Hl′ :
LG.liveb′ reg′
Hy :
bytesb′ o′ ys
∗
WPL.ERunfr_fn ≔ memeq_fn; fr_env ≔ putTAtom"v9" WIntbits TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"v10" W CmpEq W TmpTAtom"v9"; Const0 JRetTmpTAtom"v10" {v. Φv}

iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
bits :
Z
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
Hl :
LG.liveb reg
Hx :
bytesb o xs
Hl′ :
LG.liveb′ reg′
Hy :
bytesb′ o′ ys
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ memeq_fn; fr_env ≔ putTAtom"v10" WIntif bits mod 2 ^ 32 =? 0 mod 2 ^ 32 then 1 else 0 putTAtom"v9" WIntbits TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetTmpTAtom"v10" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
bits :
Z
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
Hl :
LG.liveb reg
Hx :
bytesb o xs
Hl′ :
LG.liveb′ reg′
Hy :
bytesb′ o′ ys
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ memeq_fn; fr_env ≔ putTAtom"v10" WIntif bits mod 2 ^ 32 =? 0 mod 2 ^ 32 then 1 else 0 putTAtom"v9" WIntbits TAtom"v4", WIntlengthxs; TAtom"v2", WPtrptr_addr ≔ b′ + o′; ptr_cap ≔ c′; TAtom"v0", WPtrptr_addr ≔ b + o; ptr_cap ≔ c; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetTmpTAtom"v10" {v. Φv}

iApply wp_ret ; reflexivity | word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
bits :
Z
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
Hl :
LG.liveb reg
Hx :
bytesb o xs
Hl′ :
LG.liveb′ reg′
Hy :
bytesb′ o′ ys
∗
▷ΦRetWIntif bits mod 2 ^ 32 =? 0 mod 2 ^ 32 then 1 else 0 mod 2 ^ 32

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
b :
Z
reg :
o :
Z
xs :
listZ
c :
b′ :
Z
reg′ :
o′ :
Z
ys :
listZ
c′ :
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"memcmp" = Somememcmp_contractworld
Hc :
c = Objb ∨ c = Rob
Hc′ :
c′ = Objb′ ∨ c′ = Rob′
Hlen :
lengthys = lengthxs
Ho :
0 ≤ o
Ho′ :
0 ≤ o′
Hend :
b + o + lengthxs ≤ r_endreg
Hend′ :
b′ + o′ + lengthxs ≤ r_endreg′
Hn :
lengthxs < 2 ^ 64
Hx :
Forallλx : Z ⇒ 0 ≤ x < 256 xs
Hy :
Forallλx : Z ⇒ 0 ≤ x < 256 ys
bits :
Z
HΦ :
∀k : Z, liveb reg −∗ bytesb o xs −∗ liveb′ reg′ −∗ bytesb′ o′ ys −∗ ΦRetWIntk
Hl :
LG.liveb reg
Hx :
bytesb o xs
Hl′ :
LG.liveb′ reg′
Hy :
bytesb′ o′ ys
∗
Φ
bits mod 2 ^ 32 =? 0 mod 2 ^ 32
→
1
else
0
mod
2 ^ 32

iApply HΦ with Hl Hx Hl′ Hy

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hreg → Hc Hc′ Hlen Ho Ho′ Hend Hend′ Hn Hx Hy
iIntros Hl Hx Hl′ Hy HΦ
rewrite memeq_entry
iApply wp_enter ; exact find_e_start | reflexivity |
iNext
iApply wp_memcmp with Hl Hx Hl′ Hy ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | reflexivity | exact Hc | reflexivity | exact Hc′ | cbn ; rewrite Z.mod_small ; reflexivity | lia | exact Hlen | exact Ho | exact Ho′ | exact Hend | exact Hend′ | exact Hx | exact Hy |
iNext
iIntros bits Hl Hx Hl′ Hy
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_ret ; reflexivity | word_premise |
iNext
iApply HΦ with Hl Hx Hl′ Hy

streq's triple, from wp_strcmp: owning the strings at p and q, it returns an int and hands them back.

274Lemma streq_spec
∀ p b reg xs q b′ reg′ ys Φ
registryTAtom"strcmp" = Somestrcmp_contractworld
stringp b reg xs −∗ stringq b′ reg′ ys −∗ ▷∀k, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk −∗ WPERuninvocationstreq_fn WPtrp; WPtrq : hexpr {Φ}
Explore proof 14 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
⊢
registryTAtom"strcmp" = Somestrcmp_contractworld → stringp b reg xs −∗ stringq b′ reg′ ys −∗ ▷∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk −∗ WPERuninvocationstreq_fn WPtrp; WPtrq : hexpr {v. Φv}

intros Hreg

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
⊢
stringp b reg xs −∗ stringq b′ reg′ ys −∗ ▷∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk −∗ WPERuninvocationstreq_fn WPtrp; WPtrq : hexpr {v. Φv}

iIntros Hs Ht HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
HΦ :
▷∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗

rewrite streq_entry

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
HΦ :
▷∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗
WPERunfr_fn ≔ streq_fn; fr_env ≔ TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {v. Φv}

iApply wp_enter ; exact find_q_start | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
HΦ :
▷∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ streq_fn; fr_env ≔ TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsq_start b_jumpq_start {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ streq_fn; fr_env ≔ TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsq_start b_jumpq_start {v. Φv}

cbn [ b_insts b_jump q_start ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ streq_fn; fr_env ≔ TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" CallCResultTAtom"v6" W GlobalTAtom"strcmp" ArgP TmpTAtom"v0"; ArgP TmpTAtom"v2"; LetTAtom"v7" W CmpEq W TmpTAtom"v6"; Const0 JRetTmpTAtom"v7" {v. Φv}

iApply wp_strcmp with Hs Ht ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | reflexivity | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗
▷∀bits : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ WPHelloLeafOn.SL.L.ERunfr_fn ≔ streq_fn; fr_env ≔ putTAtom"v6" WIntbits TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"v7" W CmpEq W TmpTAtom"v6"; Const0 JRetTmpTAtom"v7" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
∗
∀bits : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ WPHelloLeafOn.SL.L.ERunfr_fn ≔ streq_fn; fr_env ≔ putTAtom"v6" WIntbits TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"v7" W CmpEq W TmpTAtom"v6"; Const0 JRetTmpTAtom"v7" {v. Φv}

iIntros bits Hs Ht

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
bits :
Z
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
∗
WPHelloLeafOn.SL.L.ERunfr_fn ≔ streq_fn; fr_env ≔ putTAtom"v6" WIntbits TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"v7" W CmpEq W TmpTAtom"v6"; Const0 JRetTmpTAtom"v7" {v. Φv}

iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
bits :
Z
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ streq_fn; fr_env ≔ putTAtom"v7" WIntif bits mod 2 ^ 32 =? 0 mod 2 ^ 32 then 1 else 0 putTAtom"v6" WIntbits TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetTmpTAtom"v7" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
bits :
Z
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ streq_fn; fr_env ≔ putTAtom"v7" WIntif bits mod 2 ^ 32 =? 0 mod 2 ^ 32 then 1 else 0 putTAtom"v6" WIntbits TAtom"v2", WPtrq; TAtom"v0", WPtrp; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetTmpTAtom"v7" {v. Φv}

iApply wp_ret ; reflexivity | word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
bits :
Z
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
∗
▷ΦRetWIntif bits mod 2 ^ 32 =? 0 mod 2 ^ 32 then 1 else 0 mod 2 ^ 32

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
p :
b :
Z
reg :
xs :
listZ
q :
b′ :
Z
reg′ :
ys :
listZ
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"strcmp" = Somestrcmp_contractworld
bits :
Z
HΦ :
∀k : Z, stringp b reg xs −∗ stringq b′ reg′ ys −∗ ΦRetWIntk
Hs :
stringp b reg xs
Ht :
stringq b′ reg′ ys
∗
Φ
bits mod 2 ^ 32 =? 0 mod 2 ^ 32
→
1
else
0
mod
2 ^ 32

iApply HΦ with Hs Ht

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hreg
iIntros Hs Ht HΦ
rewrite streq_entry
iApply wp_enter ; exact find_q_start | reflexivity |
iNext
iApply wp_strcmp with Hs Ht ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | reflexivity | reflexivity |
iNext
iIntros bits Hs Ht
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_ret ; reflexivity | word_premise |
iNext
iApply HΦ with Hs Ht

strnlen1's triple on a string, from wp_memchr_string: owning the string at p with contents bytes, a bound n returns one past its NUL when that lies within n bytes, and n otherwise. The bytes after the NUL need not exist.

294Lemma strnlen1_spec
∀ p b reg bytes n Φ
registryTAtom"memchr" = Somememchr_contractworld
0 ≤ n < 2 ^ 64
SL.stringp b reg bytes −∗ ▷SL.stringp b reg bytes −∗ ΦRetWIntZ.minZ.of_natlengthbytes + 1 n −∗ WPERuninvocationstrnlen1_fn WPtrp; WIntn : hexpr {Φ}
Proof 66 steps Qed
intros Hreg Hn
iIntros Hs HΦ
iDestruct Hs as [%Hok Hs]
pose proof Hok as _ & Hb0 & Hlo & Hhi & H48 & _
iApply wp_enter ; exact find_n_start | reflexivity |
iNext
iApply ML.wp_memchr_string_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0 n with [$Hs //] ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | reflexivity | reflexivity | lia | reflexivity | cbn ; rewrite Z.mod_small ; reflexivity | lia | exact Hn |
iNext
iIntros Hs
unfold nul_found
destruct Z.of_natlengthbytes <? n eqn: E ; apply Z.ltb_lt in E | apply Z.ltb_ge in E
–iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_branch ; reflexivity |
iNext
match goal with|- context [if ?t =? 0 then _ else _]⇒replace t with 1end;||cbn [ ptr_addr ] ; rewrite ! Zmod_0_l Z.mod_smallptr_addrp + _ ; | lia ; rewrite proj2Z.eqb_neq_ 0 ; reflexivity | lia
iApply wp_enter ; exact find_n_L8 | reflexivity |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_ret ; reflexivity | word_premise |
iNext
cbn [ ptr_addr ]
assert Ht : ∀a l, 0 ≤ a → 0 ≤ l → a + l + 1 < 2 ^ 64 → a + l mod 2 ^ 64 − a mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64 + 1 mod 2 ^ 64 mod 2 ^ 64 mod 2 ^ 64 = l + 1
{intros a l Ha Hl Hal
rewrite Z.mod_smalla + l ; | lia
rewrite Z.mod_smalla ; | lia
replace a + l − a with l by lia
rewrite Z.mod_smalll ; | lia
rewrite Z.mod_smalll ; | lia
rewrite Z.mod_small1 ; | lia
rewrite Z.mod_smalll + 1 ; | lia
rewrite Z.mod_smalll + 1 ; reflexivity | lia
rewrite Htptr_addrp Z.of_natlengthbytes ; | lia | lia | lia
rewrite Z.min_l ; | lia
iApply HΦ with Hs
–iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_branch ; reflexivity |
iNext
match goal with|- context [if ?t =? 0 then _ else _]⇒replace t with 0 by reflexivityend
iApply wp_enter ; exact find_n_L9 | reflexivity |
iNext
iApply wp_ret ; reflexivity | word_premise |
iNext
rewrite Z.min_r ; | lia
rewrite Z.mod_smalln ; | lia
iApply HΦ with Hs

xmalloc's triple, from wp_malloc: for a size n, where an allocation keeps the world interpretation, it returns the base pointer of a fresh heap object of n bytes, whose pieces it owns. The selected malloc never returns null, so xalloc_die, and the abort it may reach, are never called.

347Lemma xmalloc_spec
∀ n Φ
registryTAtom"malloc" = Somemalloc_contractworld
0 ≤ n < 2 ^ 64
∀m wd h base, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
▷∀base, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrmkPtrbase Objbase −∗ WPERuninvocationxmalloc_fn WIntn : hexpr {Φ}
Explore proof 28 tactics

Initial goal

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
⊢
registryTAtom"malloc" = Somemalloc_contractworld → 0 ≤ n < 2 ^ 64 → ∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h → ▷∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase −∗ WPERuninvocationxmalloc_fn WIntn : hexpr {v. Φv}

intros Hreg Hn Hwi

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
⊢
▷∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase −∗ WPERuninvocationxmalloc_fn WIntn : hexpr {v. Φv}

iIntros HΦ

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
▷∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗

rewrite xmalloc_entry

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
▷∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗
WPERunfr_fn ≔ xmalloc_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"start" None {v. Φv}

iApply wp_enter ; exact find_x_start | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
▷∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsx_start b_jumpx_start {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗

cbn [ b_insts b_jump x_start ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" CallCResultTAtom"v3" P GlobalTAtom"malloc" ArgL TmpTAtom"v0"; LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iApply wp_malloc_ _ _ _ _ _ _ _ _ _ _ n ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | cbn ; rewrite Z.mod_small ; reflexivity | lia | exact Hn | exact Hwi |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗
▷∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ LG.objbase heap_req16 n −∗ WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
HΦ :
∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase
∗
∀base : Z, ⌜0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ LG.objbase heap_req16 n −∗ WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iIntros base Hb Hobj

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb :
0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

destruct Hb as Hb0 & Hb16 & Hbend & Hmax

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

assert Hext : 0 ≤ req_extentheap_req16 n

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
⊢
focused goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

{unfold req_extent , heap_req

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
⊢
0 ≤ n + 15 / 16 × 16
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

cbn

2 open

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
⊢
0 ≤ n + 15 / 16 × 16
deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

apply Z.mul_nonneg_nonneg ; apply Z.div_pos | ; lia

deferred goal
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPL.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v6" L Ptoi TmpTAtom"v3"; LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" LetTAtom"iw_1.v8" W CmpEq L TmpTAtom"iw_1.v6"; Const0 JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JBranchTmpTAtom"iw_1.v8" ToTAtom"iw_1.L2" ToTAtom"iw_1.join" {v. Φv}

iApply wp_branch_ _ _ _ _ _ _ _ _ _ 0 ; word_premise |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif 0 =? 0 then ToTAtom"iw_1.join" else ToTAtom"iw_1.L2" SomeTAtom"start" {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ Enteredge_labelif 0 =? 0 then ToTAtom"iw_1.join" else ToTAtom"iw_1.L2" SomeTAtom"start" {v. Φv}

cbn [ Z.eqb edge_label ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ EnterTAtom"iw_1.join" SomeTAtom"start" {v. Φv}

iApply wp_enter ; exact find_x_join | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
▷WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"iw_1.join" b_instsx_join b_jumpx_join {v. Φv}

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"iw_1.join" b_instsx_join b_jumpx_join {v. Φv}

cbn [ b_insts b_jump x_join ]

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
WPHelloLeafOn.LG.L.ERunfr_fn ≔ xmalloc_fn; fr_env ≔ putTAtom"iw_1.v8" WIntif ptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase mod 2 ^ 64 =? 0 mod 2 ^ 64 then 1 else 0 putTAtom"iw_1.v6" WIntptr_addrptr_addr ≔ base; ptr_cap ≔ Objbase putTAtom"v3" WPtrptr_addr ≔ base; ptr_cap ≔ Objbase TAtom"v0", WIntn; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"iw_1.join" [ ] JRetTmpTAtom"v3" {v. Φv}

iApply wp_ret ; reflexivity | reflexivity |

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
▷ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase

iNext

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
HΦ :
∀base0 : Z, ⌜0 < base0 ∧ base0 mod 16 = 0 ∧ base0 + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size⌝ −∗ objbase0 heap_req16 n −∗ ΦRetWPtrptr_addr ≔ base0; ptr_cap ≔ Objbase0
Hobj :
∗
ΦRetWPtrptr_addr ≔ base; ptr_cap ≔ Objbase

iApply HΦ with [%] Hobj

hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
world :
Type
registry :
name → optioncontractworld
wi :
mem → world → gmappiece pval → Prop
SafepointStable0 :
ge :
Hlinked :
n :
Z
Φ :
outcome → iPropIΣ
Hreg :
registryTAtom"malloc" = Somemalloc_contractworld
Hn :
0 ≤ n < 2 ^ 64
Hwi :
∀m : mem wd : world h : gmappiece pval base : Z, freshm heap_req16 n base → wim wd h → wiallocatedm heap_req16 n base wd overwriteobj_psbase heap_req16 n h
base :
Z
Hb0 :
0 < base
Hb16 :
base mod 16 = 0
Hbend :
base + req_extentheap_req16 n ≤ 2 ^ 48
Hmax :
Hext :
⊢
0 < base ∧ base mod 16 = 0 ∧ base + req_extentheap_req16 n ≤ 2 ^ 48 ∧ n ≤ max_allocation_size

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hreg Hn Hwi
iIntros HΦ
iApply wp_enter ; exact find_x_start | reflexivity |
iNext
iApply wp_malloc_ _ _ _ _ _ _ _ _ _ _ n ; exact Hreg | apply linked_outside ; reflexivity | apply linked_unbound ; reflexivity | cbn ; rewrite Z.mod_small ; reflexivity | lia | exact Hn | exact Hwi |
iNext
iIntros base Hb Hobj
destruct Hb as Hb0 & Hb16 & Hbend & Hmax
assert Hext : 0 ≤ req_extentheap_req16 n
cbn
apply Z.mul_nonneg_nonneg ; apply Z.div_pos | ; lia
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_let ; reflexivity | reflexivity | word_premise | intros m ; word_premise |
iNext
iApply wp_branch_ _ _ _ _ _ _ _ _ _ 0 ; word_premise |
iNext
iApply wp_enter ; exact find_x_join | reflexivity |
iNext
iApply wp_ret ; reflexivity | reflexivity |
iNext
iApply HΦ with [%] Hobj
auto

HelloLeafOn over a Logic instance of its own.

375Module HelloLeaf R : Runtime
376Module LG0 ≔ Logic R
Include HelloLeafOn R LG0