Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/Libc.v

Hello's composite trusted libc boundary. One locale/stdio/errno/getopt payload accompanies the existing authoritative shutdown state; there is no second output queue or callback inventory. The conversion contract describes logical represented endpoints, not every native instruction or collector prefix. Libc satisfaction remains trusted.

From Stdlib Require Import String ZArith List Bool Lia
From Nanofil Require Import Term Syntax Values Memory Runtime Ops Semantics ExternalCalls ExternalMachine Locale Stdio Shutdown Getopt
Import ListNotations
Open Scope Z_scope
Open Scope list_scope

A represented FILE's handle, physical pending count and private storage. No logical output queue is stored in this record. Owned heaps exclude static FILE objects and caller setvbuf storage.

17Record libc_file: Type ≔ mkLibcFile
file_handle
 : ptr
file_pending
 : Z
file_reads
 : listspan
file_roots
 : listspan
file_owned
 : listZ

Stdout's open flag remains stdout_usable, and its protocol remains shutdown_stdout. Stderr has its own protocol and open flag. These fields supply the physical information absent from stdio_world.

28Record libc_stream_inventory: Type ≔ mkLibcStreams
libc_stdout_file
libc_stderr_file
libc_stderr_open
 : bool
libc_stderr_state
35Record libc_payload: Type ≔ mkLibcPayload
libc_locale
libc_stdio
libc_errno
 : ptr
libc_streams
libc_getopt

Definitionally the payload * shutdown_state used by Linked.

44Definition libc_world: Type ≔

Parser state is an independent component of the same libc world; optarg and optind may evolve without changing locale or stdout.

48Definition libc_getopt_vieww : libc_world : getopt_world ≔

The full representation owns coherent libc/TLS state and exclusive private release rights. Structural facts alone do not establish it. In a callback, uniqueness is not evidence that its token was popped. Readiness does not require stdout open: errno lookup, locale and conversion remain valid after fclose. Output admits an open handle separately. Retired stdio roots must be removed, not kept writable.

56Definition libc_readyrep : mem → libc_world → Prop m w : Prop ≔
repm w
∧
locale_readyλ_ _ ⇒ True m libc_localefstw
∧
∧
∧
∧
∧
−2 ^ 31 ≤ shutdown_statussndw < 2 ^ 31
∧
match shutdown_atsndw with
_
⇒
True

Native initialization/continuation is an independent premise, not a consequence of the exposed option cells. Errno uses the existing TLS cell, not a second cell. Native representation and call admission must also justify separation from locale/stdout storage: a pure world frame is not a native-memory or cross-pool ownership frame.

72Definition libc_getopt_repinitialized : mem → libc_world → Prop m w : Prop ≔

A separate native predicate permits unfinished parser state at a logical prefix. Completed public-cell coherence is required only by getopt_pre/post. Ordinary endpoints must satisfy BOTH running and initialized predicates; no implication between them is assumed.

80Definition libc_getopt_inflightrunning : mem → libc_world → Prop m w : Prop ≔

Preserve the one locale/stdout/shutdown inventory and TLS identity. Diagnostic stderr retains its handle/open flag but may change private storage and protocol. This relation deliberately does not relate its FIFO to the trace, even when the trace is empty.

88Definition libc_getopt_stablew w′ : libc_world : Prop ≔

Conservative safety binding over this same world, with no machine application. Native/consumer obligations still include diagnostic trace/protocol correspondence, stream readiness and cross-call parser continuity (including refreshed errno). Other libc contracts do not freeze this entire parser record. Input and registry are fixed for one launch after startup witnesses are chosen, not per permutation.

103Definition libc_getopt_contractinput initialized running requests : listword → mem → libc_world → Z → Z → Prop : contractlibc_world ≔

Borrowed-name facts survive projection through the composite world. No separate ghost copy of the locale names is introduced here.

110Lemma libc_name
∀ rep m w category
libc_readyrep m w
ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category ∧ ∃base, ptr_caplocale_namelibc_localefstw category = Objbase ∨ ptr_caplocale_namelibc_localefstw category = Robase ∧ base mod 8 = 0
Explore proof 5 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop m : mem w : libc_world category : Z, libc_readyrep m w → Incategory locale_categories → ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category ∧ ∃base : Z, ptr_caplocale_namelibc_localefstw category = Objbase ∨ ptr_caplocale_namelibc_localefstw category = Robase ∧ base mod 8 = 0

intros rep m w category _ & Hlocale & _ Hcategory

rep :
mem → libc_world → Prop
m :
category :
Z
Hlocale :
locale_readyλ_ : mem _ : locale_world ⇒ True m libc_localefstw
Hcategory :
⊢
ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category ∧ ∃base : Z, ptr_caplocale_namelibc_localefstw category = Objbase ∨ ptr_caplocale_namelibc_localefstw category = Robase ∧ base mod 8 = 0

destruct Hlocale as _ & _ & Hnames & _ & _ & Haligned

rep :
mem → libc_world → Prop
m :
category :
Z
Hnames :
∀category : Z, Incategory locale_categories → ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category
Hcategory :
⊢
ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category ∧ ∃base : Z, ptr_caplocale_namelibc_localefstw category = Objbase ∨ ptr_caplocale_namelibc_localefstw category = Robase ∧ base mod 8 = 0

destruct Hnamescategory Hcategory as Hnonnull Hstring

rep :
mem → libc_world → Prop
m :
category :
Z
Hnames :
∀category : Z, Incategory locale_categories → ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category
Hcategory :
Hnonnull :
ptr_addrlocale_namelibc_localefstw category ≠ 0
Hstring :
⊢
ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category ∧ ∃base : Z, ptr_caplocale_namelibc_localefstw category = Objbase ∨ ptr_caplocale_namelibc_localefstw category = Robase ∧ base mod 8 = 0

split ; exact Hnonnull |

rep :
mem → libc_world → Prop
m :
category :
Z
Hnames :
∀category : Z, Incategory locale_categories → ptr_addrlocale_namelibc_localefstw category ≠ 0 ∧ c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category
Hcategory :
Hnonnull :
ptr_addrlocale_namelibc_localefstw category ≠ 0
Hstring :
⊢
c_stringm locale_namelibc_localefstw category locale_textlibc_localefstw category ∧ ∃base : Z, ptr_caplocale_namelibc_localefstw category = Objbase ∨ ptr_caplocale_namelibc_localefstw category = Robase ∧ base mod 8 = 0

split ; exact Hstring | exact Halignedcategory Hcategory

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep m w category _ & Hlocale & _ Hcategory
destruct Hlocale as _ & _ & Hnames & _ & _ & Haligned
destruct Hnamescategory Hcategory as Hnonnull Hstring
split ; exact Hnonnull |
split ; exact Hstring | exact Halignedcategory Hcategory

These two labels identify the independently audited profiles, not strings from which converter behavior can be inferred. The supplied audit maps opaque codec identities to actual selected converters.

128Inductive audited_codec: Type ≔
|CodecC
|CodecCUtf8
130Definition audited_codec_namekind : audited_codec : listZ ≔
match kind with
⇒
67
⇒
67; 46; 85; 84; 70; 45; 56
133Definition hello_codec_profileaudit : term → optionaudited_codec w : libc_world : Prop ≔
∃kind, auditlocale_codeclibc_localefstw = Somekind ∧ locale_textlibc_localefstw 0 = audited_codec_namekind

The valid-state predicate is an explicit contract parameter keyed by codec and all eight current bytes. Initialization is a separate law, not a deduction from count bits or mere writable storage.

140Definition mbstate_bytesm : mem p : ptr : listZ ≔
mapλi ⇒ m_bytesm ptr_addrp + Z.of_nati seq0 8

A required law for the chosen state representation, not an axiom. Validity must also admit completed states with residual value bytes.

145Definition mbstate_zero_validvalid : term → listZ → Prop : Prop ≔
∀codec, validcodec repeat0 8

Valid represented states contain bytes, not arbitrary mathematical integers. This independent representation law closes state reuse; a zero load alone cannot establish it.

151Definition mbstate_valid_bytesvalid : term → listZ → Prop : Prop ≔
∀codec bytes, validcodec bytes → Forallλb ⇒ 0 ≤ b < 256 bytes
154Lemma mbstate_byte_range
∀ valid codec m p i
validcodec mbstate_bytesm p
0 ≤ i < 8
0 ≤ m_bytesm ptr_addrp + i < 256
Explore proof 16 tactics

Initial goal

⊢
∀valid : term → listZ → Prop codec : term m : mem p : ptr, mbstate_valid_bytesvalid → validcodec mbstate_bytesm p → ∀i : Z, 0 ≤ i < 8 → 0 ≤ m_bytesm ptr_addrp + i < 256

intros valid codec m p Hlaw Hvalid i Hi

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
⊢
0 ≤ m_bytesm ptr_addrp + i < 256

pose proof Hlaw_ _ Hvalid as Hbytes

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
Forallλb : Z ⇒ 0 ≤ b < 256 mbstate_bytesm p
⊢
0 ≤ m_bytesm ptr_addrp + i < 256

rewrite Forall_forall in Hbytes

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
0 ≤ m_bytesm ptr_addrp + i < 256

apply Hbytes

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256

unfold mbstate_bytes

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
Inm_bytesm ptr_addrp + i mapλi0 : nat ⇒ m_bytesm ptr_addrp + Z.of_nati0 seq0 8

apply in_map_iff

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
∃x : nat, m_bytesm ptr_addrp + Z.of_natx = m_bytesm ptr_addrp + i ∧ Inx seq0 8

exists Z.to_nati

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
m_bytesm ptr_addrp + Z.of_natZ.to_nati = m_bytesm ptr_addrp + i ∧ InZ.to_nati seq0 8

split

2 open

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
m_bytesm ptr_addrp + Z.of_natZ.to_nati = m_bytesm ptr_addrp + i
focused goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
InZ.to_nati seq0 8

–rewrite Z2Nat.id by lia

2 open

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
m_bytesm ptr_addrp + i = m_bytesm ptr_addrp + i
deferred goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
InZ.to_nati seq0 8

reflexivity

deferred goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
InZ.to_nati seq0 8

–apply in_seq

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
0 ≤ Z.to_nati < 0 + 8%nat

split ; lia |

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
Z.to_nati < 0 + 8%nat

apply Nat2Z.inj_lt

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
Z.of_natZ.to_nati < Z.of_nat0 + 8

rewrite Z2Nat.id by lia

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
i < Z.of_nat0 + 8

simpl

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
validcodec mbstate_bytesm p
i :
Z
Hi :
0 ≤ i < 8
Hbytes :
∀x : Z, Inx mbstate_bytesm p → 0 ≤ x < 256
⊢
i < 8

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid codec m p Hlaw Hvalid i Hi
pose proof Hlaw_ _ Hvalid as Hbytes
rewrite Forall_forall in Hbytes
apply Hbytes
apply in_map_iff
exists Z.to_nati
split
–rewrite Z2Nat.id by lia
reflexivity
–apply in_seq
split ; lia |
apply Nat2Z.inj_lt
rewrite Z2Nat.id by lia
simpl
lia
166Lemma mbstate_zero_admitted
∀ valid codec m p
∀i, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
validcodec mbstate_bytesm p
Explore proof 6 tactics

Initial goal

⊢
∀valid : term → listZ → Prop codec : term m : mem p : ptr, mbstate_zero_validvalid → ∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0 → validcodec mbstate_bytesm p

intros valid codec m p Hvalid Hzero

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
validcodec mbstate_bytesm p

assert mbstate_bytesm p = repeat0 8 as →

2 open

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
mbstate_bytesm p = repeat0 8
focused goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
validcodec repeat0 8

{unfold mbstate_bytes

2 open

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
mapλi : nat ⇒ m_bytesm ptr_addrp + Z.of_nati seq0 8 = repeat0 8
deferred goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
validcodec repeat0 8

simpl

2 open

valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
m_bytesm ptr_addrp + 0; m_bytesm ptr_addrp + 1; m_bytesm ptr_addrp + 2; m_bytesm ptr_addrp + 3; m_bytesm ptr_addrp + 4; m_bytesm ptr_addrp + 5; m_bytesm ptr_addrp + 6; m_bytesm ptr_addrp + 7 = 0; 0; 0; 0; 0; 0; 0; 0
deferred goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
validcodec repeat0 8

repeat f_equal ; apply Hzero ; lia

deferred goal
valid :
term → listZ → Prop
codec :
m :
p :
Hvalid :
Hzero :
∀i : Z, 0 ≤ i < 8 → m_bytesm ptr_addrp + i = 0
⊢
validcodec repeat0 8

apply Hvalid

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid codec m p Hvalid Hzero
assert mbstate_bytesm p = repeat0 8 as →
simpl
repeat f_equal ; apply Hzero ; lia
apply Hvalid

Byte-disjoint spans, even if their capabilities share an object.

178Definition spans_aparta b : span : Prop ≔

The composite setter borrows the same readable input as Locale's contract. Its independently writable errno cell is not private locale storage, release authority or a source of retained capabilities. Queries need none of these setter-only separation premises.

186Definition libc_setlocale_prerep xs m w : Prop ≔
libc_readyrep m w
∧
setlocale_preλ_ _ ⇒ True xs m libc_localefstw
∧
→
True
else
∀root, Inroot locale_rootslibc_localefstw → spans_apartroot mkSpanlibc_errnofstw 4 ∧ ∀base, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

Refusal/loading may write errno; a query may not. No errno pointer is added to the capability sources or delegated private roots.

202Definition libc_setlocale_writesxs w : libc_world : listspan ≔

Reuse Locale's selected/delegated endpoint rather than another locale inventory. Other authoritative world components remain exact. As for conversion, scalar errno stores leave caller aux unchanged, and the frame tests private authority in entry memory, not after a free.

210Definition libc_setlocale_prefixrep xs m w born trace m′ w′ : Prop ≔
setlocale_prefixλ_ _ ⇒ True xs m libc_localefstw born trace m′ libc_localefstw′
∧
→
w′ = w
else
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a

This is the composite call candidate, not a native satisfaction or world-interpretation theorem. Locale changes may select a new codec. Runtime resource endings retain only their actual coherent prefix.

225Definition libc_setlocale_contractrep requests : listword → mem → libc_world → Z → Z → Prop : contractlibc_world ≔
mkContractlibc_world RClassP setlocale_abi libc_setlocale_prerep λxs m w ⇒ locale_sourcesxs m libc_localefstw λxs _ w ⇒ libc_setlocale_writesxs w λxs _ w ⇒ locale_releasesxs libc_localefstw λxs m w align size ⇒ locale_queryxs = false ∧ requestsxs m w align size libc_setlocale_prefixrep λxs m w born trace ending m′ w′ ⇒ setlocale_postxs m libc_localefstw born trace ending m′ libc_localefstw′ resource_reason λwhy ⇒ Inwhy NullCapability; OutOfBounds; Misaligned; Readonly; ArgumentSize; ReturnSize
238Definition mbrtowc_abir : call_result args : listarg : Prop ≔
r = CVoid ∨ ∃d, r = CResultd L ∧ ∃out src n state, args = ArgP out; ArgP src; ArgL n; ArgP state

Null output/source/state forms and caller aliasing are outside this first slice. Private releases cannot end any argument/errno object.

244Definition mbrtowc_prevalid : term → listZ → Prop rep xs m w : Prop ≔
libc_readyrep m w ∧ mbstate_zero_validvalid ∧ mbstate_valid_bytesvalid ∧ ∃out src n state, xs = WPtrout; WPtrsrc; WIntn; WPtrstate ∧ ptr_addrout ≠ 0 ∧ ptr_addrsrc ≠ 0 ∧ ptr_addrstate ≠ 0 ∧ readable_bytesm src n ∧ writable_spanm mkSpanout 4 ∧ ptr_addrout mod 4 = 0 ∧ writable_spanm mkSpanstate 8 ∧ readable_bytesm state 8 ∧ ptr_addrstate mod 4 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm state ∧ spans_apartmkSpansrc n mkSpanout 4 ∧ spans_apartmkSpansrc n mkSpanstate 8 ∧ spans_apartmkSpanout 4 mkSpanstate 8 ∧ ∀p size, Inp, size src, n; out, 4; state, 8 → spans_apartmkSpanlibc_errnofstw 4 mkSpanp size ∧ ∀root, Inroot locale_rootslibc_localefstw → spans_apartroot mkSpanp size ∧ ∀base, Inbase locale_ownedlibc_localefstw → ∀p, Inp out; src; state; libc_errnofstw → ptr_capp ≠ Objbase ∧ ptr_capp ≠ Robase ∧ ∀root, Inroot locale_rootslibc_localefstw → spans_apartroot mkSpanlibc_errnofstw 4 ∧ ∀p, Inp out; src; state; libc_errnofstw → ∀base, ptr_capp = Objbase ∨ ptr_capp = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

Only old private libc sources supply capabilities to caches. Caller argument capabilities must not be retained in private aux slots.

272Definition mbrtowc_sourcesxs : listword m w : libc_world : listspan ≔
match xs with
⇒
n =? 0
→
[ ]
_
⇒
[ ]
279Definition mbrtowc_writesxs : listword w : libc_world : listspan ≔
match xs with
WPtrout; WPtr_; WIntn; WPtrstate
⇒
n =? 0
→
[ ]
else
_
⇒
[ ]
288Definition mbrtowc_releasesxs : listword w : libc_world : listZ ≔
match xs with
⇒
n =? 0
→
[ ]
_
⇒
[ ]

n=0 returns before converter lookup. All other prefixes retain the effective locale, stream/shutdown state and errno pointer. Private cache delegation deliberately excludes the caller's write roots. Ordinary wide/state/errno scalar writes do not change caller aux.

299Definition mbrtowc_prefixrep xs m w born trace : listevent m′ w′ : Prop ≔
trace = [ ]
∧
match xs with
⇒
n =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
_
⇒
False

Entry-memory byte claims never inspect an already modified input. Generic EILSEQ state stays unspecified. The audited stateless C converter rejects only non-ASCII and leaves all eight state bytes unchanged, including residual bytes. Both Hello codecs preserve valid initial count on EILSEQ and cannot reject a first-byte NUL. UTF-8 pending-state errors still have no reusable-state guarantee. Nonerror errno changes are permitted while lazy loading is unaudited.

322Definition mbrtowc_resultvalid : term → listZ → Prop audit m w out src n state result m′ : Prop ≔
0 ≤ result < 2 ^ 64 ∧ result = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → ∃i, 0 ≤ i < n ∧ m_bytesm ptr_addrsrc + i = 0 ∧ load_bytesm′ ptr_addrout 4 = 0 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∨ 0 < result ≤ n ∧ result < 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0 ∨ result = 2 ^ 64 − 1 ∧ load_bytesm′ ptr_addrlibc_errnofstw 4 = 84 ∧ ∀a, span_containsmkSpanout 4 a → m_bytesm′ a = m_bytesm a ∧ auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256 ∧ hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0 ∨ result = 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀a, span_containsmkSpanout 4 a → m_bytesm′ a = m_bytesm a ∧ hello_codec_profileaudit w → n < 16 ∧ ∀i, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
349Definition mbrtowc_postvalid audit xs m w _ : listZ _ : listevent ending m′ _ : libc_world : Prop ≔
∃ out src n state result  ,
xs = WPtrout; WPtrsrc; WIntn; WPtrstate
∧
ending = CallReturnWIntresult
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′

Plain P/P/L/P to L. Resource endpoints retain their actual effects prefix, not the normal completion's validity or EILSEQ guarantees.

359Definition mbrtowc_contractvalid audit rep requests : listword → mem → libc_world → Z → Z → Prop : contractlibc_world ≔
mkContractlibc_world RClassL mbrtowc_abi mbrtowc_prevalid rep mbrtowc_sources λxs _ w ⇒ mbrtowc_writesxs w λxs _ w ⇒ mbrtowc_releasesxs w λxs m w align size ⇒ ∃out src n state, xs = WPtrout; WPtrsrc; WIntn; WPtrstate ∧ n ≠ 0 ∧ requestsxs m w align size mbrtowc_prefixrep mbrtowc_postvalid audit resource_reason λwhy ⇒ Inwhy NullCapability; OutOfBounds; Misaligned; Readonly; ArgumentSize; ReturnSize

Consumer lemmas share the supplied machine's exact call relations.

369Module LibcOn R : Runtime M : ExternalMachineSigR
370Module E ≔ M.E

The existing TLS lookup contract with the exact composite projection. It exports the cell's capability, never ownership of its four bytes.

374Definition errno_contractrep : contractlibc_world ≔
377Theorem errno_admitted
∀ rep r args s m w
E.invokeerrno_contractrep r args [ ] s m w [ ] CallReturnWPtrlibc_errnofstw s m w
Explore proof 3 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop r : call_result args : listarg s : R.state m : mem w : libc_world, errno_location_abir args → libc_readyrep m w → E.invokeerrno_contractrep r args [ ] s m w [ ] CallReturnWPtrlibc_errnofstw s m w

intros rep r args s m w Habi Hready

rep :
mem → libc_world → Prop
args :
listarg
s :
R.state
m :
Habi :
Hready :
libc_readyrep m w
⊢
E.invokeerrno_contractrep r args [ ] s m w [ ] CallReturnWPtrlibc_errnofstw s m w

apply E.errno_location_return ; auto

rep :
mem → libc_world → Prop
args :
listarg
s :
R.state
m :
Habi :
Hready :
libc_readyrep m w

exact proj1proj2proj2proj2Hready

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep r args s m w Habi Hready
exact proj1proj2proj2proj2Hready
386Theorem errno_exact
∀ rep r args xs s m w trace ending s′ m′ w′
E.invokeerrno_contractrep r args xs s m w trace ending s′ m′ w′
trace = [ ] ∧ s′ = s ∧ m′ = m ∧ w′ = w ∧ ending = CallReturnWPtrlibc_errnofstw
Explore proof 3 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop r : call_result args : listarg xs : listword s : R.state m : mem w : libc_world trace : listevent ending : call_end s′ : R.state m′ : mem w′ : libc_world, E.invokeerrno_contractrep r args xs s m w trace ending s′ m′ w′ → trace = [ ] ∧ s′ = s ∧ m′ = m ∧ w′ = w ∧ ending = CallReturnWPtrlibc_errnofstw

intros rep r args xs s m w trace ending s′ m′ w′ Hcall

rep :
mem → libc_world → Prop
args :
listarg
xs :
listword
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hcall :
E.invokeerrno_contractrep r args xs s m w trace ending s′ m′ w′
⊢
trace = [ ] ∧ s′ = s ∧ m′ = m ∧ w′ = w ∧ ending = CallReturnWPtrlibc_errnofstw

destruct E.errno_location_invocation_ _ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as _ & _ & _ & _ & Htrace & Hs & Hm & Hw & Hend

rep :
mem → libc_world → Prop
args :
listarg
xs :
listword
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hcall :
E.invokeerrno_contractrep r args xs s m w trace ending s′ m′ w′
Htrace :
trace = [ ]
Hs :
s′ = s
Hm :
m′ = m
Hw :
w′ = w
Hend :
⊢
trace = [ ] ∧ s′ = s ∧ m′ = m ∧ w′ = w ∧ ending = CallReturnWPtrlibc_errnofstw

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep r args xs s m w trace ending s′ m′ w′ Hcall
destruct E.errno_location_invocation_ _ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as _ & _ & _ & _ & Htrace & Hs & Hm & Hw & Hend
auto

Admission and exact query inversion match HelloLocale's call-site premises over this machine, including identity of the entire world.

398Theorem setlocale_query_pre
∀ rep requests category p m w
libc_readyrep m w
ptr_addrp = 0
Explore proof 9 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop category : Z p : ptr m : mem w : libc_world, libc_readyrep m w → Incategory locale_categories → ptr_addrp = 0 → contract_prelibc_setlocale_contractrep requests WIntcategory; WPtrp m w

intros rep requests category p m w Hready Hcat Hnull

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢

split ; exact Hready |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
setlocale_preλ_ : mem _ : locale_world ⇒ True WIntcategory; WPtrp m libc_localefstw
∧
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

split

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
setlocale_preλ_ : mem _ : locale_world ⇒ True WIntcategory; WPtrp m libc_localefstw
focused goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

–split ; exact proj1proj2Hready |

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
∃category0 : Z p0 : ptr, WIntcategory; WPtrp = WIntcategory0; WPtrp0 ∧ Incategory0 locale_categories ∧ ptr_addrp0 = 0 ∨ ∃bytes : listZ, c_stringm p0 bytes
deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

exists category, p

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
WIntcategory; WPtrp = WIntcategory; WPtrp ∧ Incategory locale_categories ∧ ptr_addrp = 0 ∨ ∃bytes : listZ, c_stringm p bytes
deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

auto

deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

–cbn [ locale_query ]

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
ptr_addrp =? 0
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

rewrite Hnull

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
category :
Z
p :
m :
Hready :
libc_readyrep m w
Hcat :
Hnull :
ptr_addrp = 0
⊢
0 =? 0
→
True
else
∀root : span, Inroot locale_rootslibc_localefstw → spans_apartroot span_ptr ≔ libc_errnofstw; span_size ≔ 4 ∧ ∀base : Z, Inbase locale_ownedlibc_localefstw → ptr_caplibc_errnofstw ≠ Objbase ∧ ptr_caplibc_errnofstw ≠ Robase ∧ ∀base : Z, ptr_caplibc_errnofstw = Objbase ∨ ptr_caplibc_errnofstw = Robase → ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Objbase ∧ ¬available_caplocale_sources[ ] m libc_localefstw [ ] m Robase

exact I

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep requests category p m w Hready Hcat Hnull
split ; exact Hready |
split
–split ; exact proj1proj2Hready |
exists category, p
auto
–cbn [ locale_query ]
rewrite Hnull
exact I
409Theorem setlocale_query_admitted
∀ rep requests r args category p s m w
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w [ ] CallReturnWPtrlocale_namelibc_localefstw category s m w
Proof 29 steps Qed
intros rep requests r args category p s m w Habi Hready Hcat Hnull
assert Hquery : locale_queryWIntcategory; WPtrp = true
{unfold locale_query
rewrite Hnull
reflexivity
eapply E.invoke_normal with born := [ ]
–exact Habi
–exact setlocale_query_prerep requests category p m w Hready Hcat Hnull
–split ; constructor |
split
+split ; reflexivity |
rewrite Hquery
auto
+rewrite Hquery
reflexivity
–exists category, p
split ; reflexivity |
rewrite Hquery
reflexivity
–intros why Hbad
discriminate
–intros values Heq
injection Heq as ←
split
+eexists
split ; reflexivity
+constructor ; apply locale_name_available ; exact Hcat | constructor
–intros status Hbad
discriminate
432Theorem setlocale_query_exact
∀ rep requests r args category p s m w trace ending s′ m′ w′
ptr_addrp = 0
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
trace = [ ] ∧ s′ = s ∧ m′ = m ∧ w′ = w ∧ ending = CallReturnWPtrlocale_namelibc_localefstw category
Proof 20 steps Qed
intros rep requests r args category p s m w trace ending s′ m′ w′ Hnull Hcall
assert Hquery : locale_queryWIntcategory; WPtrp = true
{unfold locale_query
rewrite Hnull
reflexivity
destruct Hcall as trace ending s′ m′ w′ born Habi Hpre He Hp Hw Hpost Hresource Hvalues Hexit | why trace s′ m′ w′ born Habi Hpre He Hp Hw Hfailure Hresource
–destruct Hp as Htrace Hp
rewrite Hquery in Hp , Hw
destruct Hp as _ & Hm & _
destruct Hpost as cat & q & Hxs & Hend
injection Hxs as ← ←
rewrite Hquery in Hend
split ; exact Htrace |
split
+clear - He Hquery
induction He ; reflexivity | exact IHHe |
destruct H as Hbad _
congruence
+auto
–inversion Hfailure as align size Hbad _ Hsize Hrefuse | align size Hbad _ Hsize ; rewrite Hquery in Hbad ; discriminate

These constructions require admission and, for selection, an actual permitted effects prefix and independently represented endpoint. They do not assume invocation or guarantee native selection/termination.

458Theorem setlocale_refusal_admitted
∀ rep requests r args category p s m w
ptr_addrp ≠ 0
libc_setlocale_prerep WIntcategory; WPtrp m w
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w [ ] CallReturnWPtrmkPtr0 CNone s m w
Proof 34 steps Qed
intros rep requests r args category p s m w Habi Hnonnull Hpre
pose proof Hpre as Hready & Hlocale & _
assert Hquery : locale_queryWIntcategory; WPtrp = false by apply Z.eqb_neq ; exact Hnonnull
eapply E.invoke_normal with born := [ ]
–exact Habi
–exact Hpre
–split ; constructor |
split
+split ; reflexivity |
rewrite Hquery
split ; exact proj1Hlocale |
split ; apply locale_delegates_refl with rep := λ_ _ ⇒ True ; exact proj1Hlocale |
exists category, p
split ; reflexivity |
left
+rewrite Hquery
split ; exact Hready |
repeat split ; intros ; reflexivity
–exists category, p
split ; reflexivity |
rewrite Hquery
left
split ; reflexivity | apply locale_unchanged_refl
–intros why Hbad
discriminate
–intros values Heq
injection Heq as ←
split
+eexists
split ; reflexivity
+constructor ; left ; reflexivity | constructor
–intros status Hbad
discriminate
485Theorem setlocale_selected_admitted
∀ rep requests r args category p s m w born s′ m′ w′
ptr_addrp ≠ 0
libc_setlocale_prerep WIntcategory; WPtrp m w
E.prefixlibc_setlocale_contractrep requests WIntcategory; WPtrp s m w born [ ] s′ m′ w′
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w [ ] CallReturnWPtrlocale_namelibc_localefstw′ category s′ m′ w′
Proof 31 steps Qed
intros rep requests r args category p s m w born s′ m′ w′ Habi Hnonnull Hpre Hp Hselected
assert Hcat : Incategory locale_categories
{destruct Hpre as _ & _ & cat & q & Hxs & Hcat & _ & _
injection Hxs as ← ←
exact Hcat
assert Hquery : locale_queryWIntcategory; WPtrp = false by apply Z.eqb_neq ; exact Hnonnull
pose proof Hp as _ & _ & Hlocale & _
rewrite Hquery in Hlocale
destruct Hlocale as _ & Hd & _
eapply E.invoke_normal with born := born
–exact Habi
–exact Hpre
–exact Hp
–exists category, p
split ; reflexivity |
rewrite Hquery
right
auto
–intros why Hbad
discriminate
–intros values Heq
injection Heq as ←
split
+eexists
split ; reflexivity
+constructor ; | constructor
apply proj1proj2Hd
exact Hcat
–intros status Hbad
discriminate

Setter endpoints expose the selected new codec through the actual final locale, not a fixed codec hidden in the entry interpretation. New sources retain precisely Locale's old-private-or-born provenance.

519Theorem setlocale_setter_prefix
∀ rep requests r args category p s m w trace ending s′ m′ w′
ptr_addrp ≠ 0
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born, locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∀source, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′
Explore proof 18 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg category : Z p : ptr s : R.state m : mem w : libc_world trace : listevent ending : call_end s′ : R.state m′ : mem w′ : libc_world, ptr_addrp ≠ 0 → E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′ → trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

intros rep requests r args category p s m w trace ending s′ m′ w′ Hnonnull Hcall

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

assert Hquery : locale_queryWIntcategory; WPtrp = false by apply Z.eqb_neq ; exact Hnonnull

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

destruct E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & _ & Hp & Hw

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Hp :
setlocale_prefixλ_ : mem _ : locale_world ⇒ True WIntcategory; WPtrp m libc_localefstw born trace m′ libc_localefstw′
Hw :
→
w′ = w
else
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

destruct Hp as Htrace Hp

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hp :
→
born = [ ] ∧ m′ = m ∧ libc_localefstw′ = libc_localefstw
else
locale_readyλ_ : mem _ : locale_world ⇒ True m′ libc_localefstw′ ∧ locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∃category0 : Z p0 : ptr, WIntcategory; WPtrp = WIntcategory0; WPtrp0 ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory0 libc_localefstw libc_localefstw′
Hw :
→
w′ = w
else
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

rewrite Hquery in Hp , Hw

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hp :
locale_readyλ_ : mem _ : locale_world ⇒ True m′ libc_localefstw′ ∧ locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∃category0 : Z p0 : ptr, WIntcategory; WPtrp = WIntcategory0; WPtrp0 ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory0 libc_localefstw libc_localefstw′
Hw :
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

destruct Hp as _ & Hd & cat & q & Hxs & Hselected

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
cat :
Z
q :
Hxs :
WIntcategory; WPtrp = WIntcat; WPtrq
Hw :
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

injection Hxs as ← ←

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hw :
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

destruct Hw as Hready & Hstdio & Herrno & Hshutdown & _

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
trace = [ ] ∧ libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

split ; exact Htrace |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
libc_readyrep m′ w′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

split ; exact Hready |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

split ; exact Hstdio |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

split ; exact Herrno |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
sndw′ = sndw ∧ ∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

split ; exact Hshutdown |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
∃born0 : listZ, locale_delegatesWIntcategory; WPtrp m libc_localefstw born0 m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born0 ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

exists born

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′ ∧ ∀source : span, Insource locale_private_sourceslibc_localefstw′ → locale_retained_caplibc_localefstw born ptr_capspan_ptrsource ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ locale_selectedcategory libc_localefstw libc_localefstw′

split ; exact Hd |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw

split ; | exact Hselected

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢

intros source Hin

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace ending s′ m′ w′
Hquery :
locale_queryWIntcategory; WPtrp = false
born :
listZ
Htrace :
trace = [ ]
Hd :
locale_delegatesWIntcategory; WPtrp m libc_localefstw born m′ libc_localefstw′
Hselected :
Hready :
libc_readyrep m′ w′
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
source :

eapply locale_delegates_private ; eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep requests r args category p s m w trace ending s′ m′ w′ Hnonnull Hcall
assert Hquery : locale_queryWIntcategory; WPtrp = false by apply Z.eqb_neq ; exact Hnonnull
destruct E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & _ & Hp & Hw
destruct Hp as Htrace Hp
rewrite Hquery in Hp , Hw
destruct Hp as _ & Hd & cat & q & Hxs & Hselected
injection Hxs as ← ←
destruct Hw as Hready & Hstdio & Herrno & Hshutdown & _
split ; exact Htrace |
split ; exact Hready |
split ; exact Hstdio |
split ; exact Herrno |
split ; exact Hshutdown |
exists born
split ; exact Hd |
split ; | exact Hselected
intros source Hin
547Theorem setlocale_setter_returned
∀ rep requests r args category p s m w trace values s′ m′ w′
ptr_addrp ≠ 0
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
values = WPtrmkPtr0 CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category
Explore proof 17 tactics

Initial goal

⊢
∀rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg category : Z p : ptr s : R.state m : mem w : libc_world trace : listevent values : listword s′ : R.state m′ : mem w′ : libc_world, ptr_addrp ≠ 0 → E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′ → values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

intros rep requests r args category p s m w trace values s′ m′ w′ Hnonnull Hcall

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

destruct setlocale_setter_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ _ Hnonnull Hcall as _ & Hready & _

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

assert Hcat : Incategory locale_categories

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
⊢
focused goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

{inversion Hcall ; subst

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
born :
listZ
H0 :
H1 :
E.prefixlibc_setlocale_contractrep requests WIntcategory; WPtrp s m w born trace s′ m′ w′
H2 :
contract_postlibc_setlocale_contractrep requests WIntcategory; WPtrp m w born trace CallReturnvalues m′ w′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnslibc_setlocale_contractrep requests values0 ∧ Forallword_authoritycontract_sourceslibc_setlocale_contractrep requests WIntcategory; WPtrp m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

match goal withHpre : contract_pre_ _ _ _ |- _⇒destruct Hpre as _ & _ & cat & q & Hxs & Hcat & _ & _end

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
born :
listZ
cat :
Z
q :
Hxs :
WIntcategory; WPtrp = WIntcat; WPtrq
Hcat :
H1 :
E.prefixlibc_setlocale_contractrep requests WIntcategory; WPtrp s m w born trace s′ m′ w′
H2 :
contract_postlibc_setlocale_contractrep requests WIntcategory; WPtrp m w born trace CallReturnvalues m′ w′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnslibc_setlocale_contractrep requests values0 ∧ Forallword_authoritycontract_sourceslibc_setlocale_contractrep requests WIntcategory; WPtrp m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

injection Hxs as ← ←

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
born :
listZ
Hcat :
H1 :
E.prefixlibc_setlocale_contractrep requests WIntcategory; WPtrp s m w born trace s′ m′ w′
H2 :
contract_postlibc_setlocale_contractrep requests WIntcategory; WPtrp m w born trace CallReturnvalues m′ w′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnslibc_setlocale_contractrep requests values0 ∧ Forallword_authoritycontract_sourceslibc_setlocale_contractrep requests WIntcategory; WPtrp m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

exact Hcat

deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

assert Hpost : setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′
focused goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hpost :
setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

{inversion Hcall ; subst

2 open

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
born :
listZ
H0 :
H1 :
E.prefixlibc_setlocale_contractrep requests WIntcategory; WPtrp s m w born trace s′ m′ w′
H2 :
contract_postlibc_setlocale_contractrep requests WIntcategory; WPtrp m w born trace CallReturnvalues m′ w′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnslibc_setlocale_contractrep requests values0 ∧ Forallword_authoritycontract_sourceslibc_setlocale_contractrep requests WIntcategory; WPtrp m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′
deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hpost :
setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

assumption

deferred goal
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hpost :
setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

destruct Hpost as cat & q & Hxs & Hpost

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
cat :
Z
q :
Hxs :
WIntcategory; WPtrp = WIntcat; WPtrq
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

injection Hxs as ← ←

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

assert Hquery : locale_queryWIntcategory; WPtrp = false by apply Z.eqb_neq ; exact Hnonnull

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hquery :
locale_queryWIntcategory; WPtrp = false
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

rewrite Hquery in Hpost

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnvalues s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hquery :
locale_queryWIntcategory; WPtrp = false
⊢
values = WPtrptr_addr ≔ 0; ptr_cap ≔ CNone ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∨ values = WPtrlocale_namelibc_localefstw′ category ∧ locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

destruct Hpost as Hret Hunchanged | Hret Hselected ; injection Hret as → ; left ; auto | right ; split ; reflexivity |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnWPtrlocale_namelibc_localefstw′ category s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hselected :
Hquery :
locale_queryWIntcategory; WPtrp = false
⊢
locale_selectedcategory libc_localefstw libc_localefstw′ ∧ c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

split ; exact Hselected |

rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
category :
Z
p :
s :
R.state
m :
trace :
listevent
s′ :
R.state
m′ :
Hnonnull :
ptr_addrp ≠ 0
Hcall :
E.invokelibc_setlocale_contractrep requests r args WIntcategory; WPtrp s m w trace CallReturnWPtrlocale_namelibc_localefstw′ category s′ m′ w′
Hready :
libc_readyrep m′ w′
Hcat :
Hselected :
Hquery :
locale_queryWIntcategory; WPtrp = false
⊢
c_stringm′ locale_namelibc_localefstw′ category locale_textlibc_localefstw′ category

exact proj1proj2libc_namerep m′ w′ category Hready Hcat

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros rep requests r args category p s m w trace values s′ m′ w′ Hnonnull Hcall
destruct setlocale_setter_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ _ Hnonnull Hcall as _ & Hready & _
assert Hcat : Incategory locale_categories
{inversion Hcall ; subst
match goal withHpre : contract_pre_ _ _ _ |- _⇒destruct Hpre as _ & _ & cat & q & Hxs & Hcat & _ & _end
injection Hxs as ← ←
exact Hcat
assert Hpost : setlocale_postWIntcategory; WPtrp m libc_localefstw [ ] trace CallReturnvalues m′ libc_localefstw′
{inversion Hcall ; subst
assumption
destruct Hpost as cat & q & Hxs & Hpost
injection Hxs as ← ←
assert Hquery : locale_queryWIntcategory; WPtrp = false by apply Z.eqb_neq ; exact Hnonnull
rewrite Hquery in Hpost
destruct Hpost as Hret Hunchanged | Hret Hselected ; injection Hret as → ; left ; auto | right ; split ; reflexivity |
split ; exact Hselected |
exact proj1proj2libc_namerep m′ w′ category Hready Hcat

Input-only n=0 admission constructs a call with the exact snapshot. The full valid-state/readability premises are intentionally retained.

582Theorem mbrtowc_zero
∀ valid audit rep requests r args out src state s m w
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WInt0; WPtrstate s m w [ ] CallReturnWInt2 ^ 64 − 2 s m w
Explore proof 18 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg out src state : ptr s : R.state m : mem w : libc_world, mbrtowc_abir args → mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w → E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WInt0; WPtrstate s m w [ ] CallReturnWInt2 ^ 64 − 2 s m w

intros valid audit rep requests r args out src state s m w Habi Hpre

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WInt0; WPtrstate s m w [ ] CallReturnWInt2 ^ 64 − 2 s m w

eapply E.invoke_normal with born := [ ]

7 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_abimbrtowc_contractvalid audit rep requests r args
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate s m w [ ] [ ] s m w
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] [ ] CallReturnWInt2 ^ 64 − 2 m w
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exact Habi

6 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate s m w [ ] [ ] s m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] [ ] CallReturnWInt2 ^ 64 − 2 m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exact Hpre

5 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate s m w [ ] [ ] s m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] [ ] CallReturnWInt2 ^ 64 − 2 m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–split ; constructor |

5 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] [ ] m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] [ ] CallReturnWInt2 ^ 64 − 2 m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

repeat split ; reflexivity

4 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] [ ] CallReturnWInt2 ^ 64 − 2 m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exists out, src, 0, state, 2 ^ 64 − 2

4 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
WPtrout; WPtrsrc; WInt0; WPtrstate = WPtrout; WPtrsrc; WInt0; WPtrstate
∧
CallReturnWInt2 ^ 64 − 2 = CallReturnWInt2 ^ 64 − 2
∧
0 =? 0
→
2 ^ 64 − 2 = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src 0 state 2 ^ 64 − 2 m
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

repeat split ; reflexivity

3 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀why : reason, CallReturnWInt2 ^ 64 − 2 ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–intros why Hbad

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
why :
Hbad :
CallReturnWInt2 ^ 64 − 2 = CallResourcewhy
⊢
False
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

discriminate

2 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀values : listword, CallReturnWInt2 ^ 64 − 2 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–intros values Heq

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
values :
listword
Heq :
CallReturnWInt2 ^ 64 − 2 = CallReturnvalues
⊢
return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

injection Heq as ←

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
return_shapecontract_returnsmbrtowc_contractvalid audit rep requests WInt18446744073709551614 ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m WInt18446744073709551614
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

split

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
return_shapecontract_returnsmbrtowc_contractvalid audit rep requests WInt18446744073709551614
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m WInt18446744073709551614
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

+exists WInt2 ^ 64 − 2

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
WInt18446744073709551614 = WInt2 ^ 64 − 2 ∧ word_at_classL WInt2 ^ 64 − 2 = SomeWInt2 ^ 64 − 2
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m WInt18446744073709551614
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

split ; reflexivity

2 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w [ ] m WInt18446744073709551614
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

+constructor ; exact I | constructor

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
⊢
∀status : Z, CallReturnWInt2 ^ 64 − 2 = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–intros status Hbad

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WInt0; WPtrstate m w
status :
Z
Hbad :
CallReturnWInt2 ^ 64 − 2 = CallExitstatus
⊢
∃before : listevent, [ ] = before ++ ProcessExitstatus

discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit rep requests r args out src state s m w Habi Hpre
eapply E.invoke_normal with born := [ ]
–exact Habi
–exact Hpre
–split ; constructor |
repeat split ; reflexivity
–exists out, src, 0, state, 2 ^ 64 − 2
repeat split ; reflexivity
–intros why Hbad
discriminate
–intros values Heq
injection Heq as ←
split
+exists WInt2 ^ 64 − 2
split ; reflexivity
+constructor ; exact I | constructor
–intros status Hbad
discriminate

Non-setlocale conversion never changes effective locale/borrow facts or either authoritative stdio/shutdown state, including on resources.

603Theorem mbrtowc_world
∀ valid audit rep requests r args xs s m w trace ending s′ m′ w′
E.invokembrtowc_contractvalid audit rep requests r args xs s m w trace ending s′ m′ w′
trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw
Explore proof 12 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg xs : listword s : R.state m : mem w : libc_world trace : listevent ending : call_end s′ : R.state m′ : mem w′ : libc_world, E.invokembrtowc_contractvalid audit rep requests r args xs s m w trace ending s′ m′ w′ → trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

intros valid audit rep requests r args xs s m w trace ending s′ m′ w′ Hcall

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
xs :
listword
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args xs s m w trace ending s′ m′ w′
⊢
trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

assert Hpre : mbrtowc_prevalid rep xs m w by inversion Hcall ; assumption

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
xs :
listword
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args xs s m w trace ending s′ m′ w′
Hpre :
mbrtowc_prevalid rep xs m w
⊢
trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

destruct Hpre as _ & _ & _ & out & src & n & state & → & _

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
⊢
trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

destruct E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & _ & Htrace & Hp

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
n =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

cbn [ mbrtowc_prefix ] in Hp

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
n =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
trace = [ ] ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

split ; exact Htrace |

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
n =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

destruct n =? 0

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
born = [ ] ∧ m′ = m ∧ w′ = w
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

–destruct Hp as _ & _ & →

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w
born :
listZ
Htrace :
trace = [ ]
⊢
locale_unchangedlibc_localefstw libc_localefstw ∧ libc_stdiofstw = libc_stdiofstw ∧ libc_errnofstw = libc_errnofstw ∧ sndw = sndw
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

split ; apply locale_unchanged_refl |

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w
born :
listZ
Htrace :
trace = [ ]
⊢
libc_stdiofstw = libc_stdiofstw ∧ libc_errnofstw = libc_errnofstw ∧ sndw = sndw
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

repeat split ; reflexivity

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hp :
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

–destruct Hp as _ & Hlocale & _ & Hstdio & Herrno & Hshutdown & _

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
out, src :
n :
Z
state :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace ending s′ m′ w′
born :
listZ
Htrace :
trace = [ ]
Hstdio :
libc_stdiofstw′ = libc_stdiofstw
Herrno :
libc_errnofstw′ = libc_errnofstw
Hshutdown :
sndw′ = sndw
⊢
locale_unchangedlibc_localefstw libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit rep requests r args xs s m w trace ending s′ m′ w′ Hcall
assert Hpre : mbrtowc_prevalid rep xs m w by inversion Hcall ; assumption
destruct Hpre as _ & _ & _ & out & src & n & state & → & _
destruct E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & _ & Htrace & Hp
cbn [ mbrtowc_prefix ] in Hp
split ; exact Htrace |
destruct n =? 0
–destruct Hp as _ & _ & →
split ; apply locale_unchanged_refl |
repeat split ; reflexivity
–destruct Hp as _ & Hlocale & _ & Hstdio & Herrno & Hshutdown & _
auto

Nonzero normal completions need independent memory effects, endpoint representation/delegation and a result witness. This is not decoding existence or native termination, nor an assumption of invocation.

623Theorem mbrtowc_completed
∀ valid audit rep requests r args out src n state s m w born s′ m′ w′ result
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
n ≠ 0
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
mbrtowc_resultvalid audit m w out src n state result m′
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w [ ] CallReturnWIntresult s′ m′ w′
Explore proof 22 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg out src : ptr n : Z state : ptr s : R.state m : mem w : libc_world born : listZ s′ : R.state m′ : mem w′ : libc_world result : Z, mbrtowc_abir args → mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w → n ≠ 0 → E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′ → mbrtowc_resultvalid audit m w out src n state result m′ → E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w [ ] CallReturnWIntresult s′ m′ w′

intros valid audit rep requests r args out src n state s m w born s′ m′ w′ result Habi Hpre Hn Hp Hresult

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w [ ] CallReturnWIntresult s′ m′ w′

eapply E.invoke_normal with born := born

7 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_abimbrtowc_contractvalid audit rep requests r args
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born [ ] CallReturnWIntresult m′ w′
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exact Habi

6 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born [ ] CallReturnWIntresult m′ w′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exact Hpre

5 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born [ ] CallReturnWIntresult m′ w′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exact Hp

4 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born [ ] CallReturnWIntresult m′ w′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–exists out, src, n, state, result

4 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
WPtrout; WPtrsrc; WIntn; WPtrstate = WPtrout; WPtrsrc; WIntn; WPtrstate
∧
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

split ; reflexivity |

4 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

split ; reflexivity |

4 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

rewrite proj2Z.eqb_neq_ _ Hn

4 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
mbrtowc_resultvalid audit m w out src n state result m′
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

exact Hresult

3 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–intros why Hbad

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
why :
Hbad :
⊢
False
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

discriminate

2 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–intros values Heq

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
values :
listword
Heq :
CallReturnWIntresult = CallReturnvalues
⊢
return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

injection Heq as ←

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
return_shapecontract_returnsmbrtowc_contractvalid audit rep requests WIntresult ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ WIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

split

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ WIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

+exists WIntresult

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
WIntresult = WIntresult ∧ word_at_classL WIntresult = SomeWIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ WIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

split ; reflexivity |

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
word_at_classL WIntresult = SomeWIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ WIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

simpl

3 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
SomeWIntresult mod Z.pow_pos2 64 = SomeWIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ WIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

rewrite Z.mod_small ; reflexivity | exact proj1Hresult

2 open

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ WIntresult
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

+constructor ; exact I | constructor

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
⊢
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, [ ] = before ++ ProcessExitstatus

–intros status Hbad

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
born :
listZ
s′ :
R.state
m′ :
result :
Z
Habi :
Hpre :
mbrtowc_prevalid rep WPtrout; WPtrsrc; WIntn; WPtrstate m w
Hn :
n ≠ 0
Hp :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born [ ] s′ m′ w′
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
status :
Z
Hbad :
CallReturnWIntresult = CallExitstatus
⊢
∃before : listevent, [ ] = before ++ ProcessExitstatus

discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit rep requests r args out src n state s m w born s′ m′ w′ result Habi Hpre Hn Hp Hresult
eapply E.invoke_normal with born := born
–exact Habi
–exact Hpre
–exact Hp
–exists out, src, n, state, result
split ; reflexivity |
split ; reflexivity |
rewrite proj2Z.eqb_neq_ _ Hn
exact Hresult
–intros why Hbad
discriminate
–intros values Heq
injection Heq as ←
split
+exists WIntresult
split ; reflexivity |
simpl
rewrite Z.mod_small ; reflexivity | exact proj1Hresult
+constructor ; exact I | constructor
–intros status Hbad
discriminate

All normal return cases, extracted without assuming a particular decoder outcome. Resource endpoints do not obtain this theorem.

652Theorem mbrtowc_returned
∀ valid audit rep requests r args out src n state s m w trace values s′ m′ w′
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnvalues s′ m′ w′
∃ result  ,
values = WIntresult
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
Explore proof 7 tactics

Initial goal

⊢
∀ valid : term → listZ → Prop audit : term → optionaudited_codec rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg out src : ptr n : Z state : ptr s : R.state m : mem w : libc_world trace : listevent values : listword s′ : R.state m′ : mem w′ : libc_world  ,
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnvalues s′ m′ w′
→
∃ result : Z  ,
values = WIntresult
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′

intros valid audit rep requests r args out src n state s m w trace values s′ m′ w′ Hcall

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnvalues s′ m′ w′
⊢
∃ result : Z  ,
values = WIntresult
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′

inversion Hcall ; subst

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnvalues s′ m′ w′
born :
listZ
H :
contract_abimbrtowc_contractvalid audit rep requests r args
H0 :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
H1 :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born trace s′ m′ w′
H2 :
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born trace CallReturnvalues m′ w′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values0 ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
∃ result : Z  ,
values = WIntresult
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′

match goal withHpost : contract_post_ _ _ _ _ _ _ _ _ |- _⇒destruct Hpost as out′ & src′ & n′ & state′ & result & Hxs & Hend & Hresultend

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnvalues s′ m′ w′
born :
listZ
H :
contract_abimbrtowc_contractvalid audit rep requests r args
H0 :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
H1 :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born trace s′ m′ w′
out′, src′ :
n′ :
Z
state′ :
result :
Z
Hxs :
WPtrout; WPtrsrc; WIntn; WPtrstate = WPtrout′; WPtrsrc′; WIntn′; WPtrstate′
Hend :
CallReturnvalues = CallReturnWIntresult
Hresult :
n′ =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out′ src′ n′ state′ result m′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values0 ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
∃ result0 : Z  ,
values = WIntresult0
∧
n =? 0
→
result0 = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result0 m′

injection Hxs as ← ← ← ←

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
trace :
listevent
values :
listword
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnvalues s′ m′ w′
born :
listZ
H :
contract_abimbrtowc_contractvalid audit rep requests r args
H0 :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
H1 :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born trace s′ m′ w′
result :
Z
Hend :
CallReturnvalues = CallReturnWIntresult
Hresult :
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
H3 :
∀why : reason, CallReturnvalues ≠ CallResourcewhy
H4 :
∀values0 : listword, CallReturnvalues = CallReturnvalues0 → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values0 ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values0
H5 :
∀status : Z, CallReturnvalues = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
∃ result0 : Z  ,
values = WIntresult0
∧
n =? 0
→
result0 = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result0 m′

injection Hend as →

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
trace :
listevent
s′ :
R.state
m′ :
result :
Z
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnWIntresult s′ m′ w′
born :
listZ
H :
contract_abimbrtowc_contractvalid audit rep requests r args
H0 :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
H1 :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born trace s′ m′ w′
Hresult :
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
H5 :
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
H4 :
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
H3 :
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
⊢
∃ result0 : Z  ,
WIntresult = WIntresult0
∧
n =? 0
→
result0 = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result0 m′

exists result

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src :
n :
Z
state :
s :
R.state
m :
trace :
listevent
s′ :
R.state
m′ :
result :
Z
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WIntn; WPtrstate s m w trace CallReturnWIntresult s′ m′ w′
born :
listZ
H :
contract_abimbrtowc_contractvalid audit rep requests r args
H0 :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w
H1 :
E.prefixmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate s m w born trace s′ m′ w′
Hresult :
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′
H5 :
∀status : Z, CallReturnWIntresult = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
H4 :
∀values : listword, CallReturnWIntresult = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WIntn; WPtrstate m w born m′ values
H3 :
∀why : reason, CallReturnWIntresult ≠ CallResourcewhy
⊢
WIntresult = WIntresult
∧
n =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src n state result m′

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit rep requests r args out src n state s m w trace values s′ m′ w′ Hcall
inversion Hcall ; subst
match goal withHpost : contract_post_ _ _ _ _ _ _ _ _ |- _⇒destruct Hpost as out′ & src′ & n′ & state′ & result & Hxs & Hend & Hresultend
injection Hxs as ← ← ← ←
injection Hend as →
exists result
auto

n=0 has no allocation request and cannot end for resources. Every completion, not just the constructed one, has the identity snapshot.

670Theorem mbrtowc_zero_exact
∀ valid audit rep requests r args out src state s m w trace ending s′ m′ w′
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WInt0; WPtrstate s m w trace ending s′ m′ w′
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w
Explore proof 17 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec rep : mem → libc_world → Prop requests : listword → mem → libc_world → Z → Z → Prop r : call_result args : listarg out src state : ptr s : R.state m : mem w : libc_world trace : listevent ending : call_end s′ : R.state m′ : mem w′ : libc_world, E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WInt0; WPtrstate s m w trace ending s′ m′ w′ → trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

intros valid audit rep requests r args out src state s m w trace ending s′ m′ w′ Hcall

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
Hcall :
E.invokembrtowc_contractvalid audit rep requests r args WPtrout; WPtrsrc; WInt0; WPtrstate s m w trace ending s′ m′ w′
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

destruct Hcall as trace ending s′ m′ w′ born Habi Hpre He Ht Hp Hpost Hresource Hvalues Hexit | why trace s′ m′ w′ born Habi Hpre He Ht Hp Hfailure Hresource

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hpost :
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born trace ending m′ w′
Hresource :
∀why : reason, ending ≠ CallResourcewhy
Hvalues :
∀values : listword, ending = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m′ values
Hexit :
∀status : Z, ending = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

–cbn [ mbrtowc_prefix ] in Hp

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hpost :
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born trace ending m′ w′
Hresource :
∀why : reason, ending ≠ CallResourcewhy
Hvalues :
∀values : listword, ending = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m′ values
Hexit :
∀status : Z, ending = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

destruct Hp as _ & → & →

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
Hpost :
contract_postmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born trace ending m w
Hresource :
∀why : reason, ending ≠ CallResourcewhy
Hvalues :
∀values : listword, ending = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hexit :
∀status : Z, ending = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

destruct Hpost as out′ & src′ & n′ & state′ & result & Hxs & Hend & Hresult

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
out′, src′ :
n′ :
Z
state′ :
result :
Z
Hxs :
WPtrout; WPtrsrc; WInt0; WPtrstate = WPtrout′; WPtrsrc′; WIntn′; WPtrstate′
Hend :
ending = CallReturnWIntresult
Hresult :
n′ =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out′ src′ n′ state′ result m
Hresource :
∀why : reason, ending ≠ CallResourcewhy
Hvalues :
∀values : listword, ending = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hexit :
∀status : Z, ending = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

injection Hxs as ← ← ← ←

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
result :
Z
Hend :
ending = CallReturnWIntresult
Hresult :
0 =? 0
→
result = 2 ^ 64 − 2
else
mbrtowc_resultvalid audit m w out src 0 state result m
Hresource :
∀why : reason, ending ≠ CallResourcewhy
Hvalues :
∀values : listword, ending = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hexit :
∀status : Z, ending = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

cbn in Hresult

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
ending :
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
result :
Z
Hend :
ending = CallReturnWIntresult
Hresult :
result = 18446744073709551614
Hresource :
∀why : reason, ending ≠ CallResourcewhy
Hvalues :
∀values : listword, ending = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hexit :
∀status : Z, ending = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
⊢
trace = [ ] ∧ ending = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

subst result ending

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
Hexit :
∀status : Z, CallReturnWInt18446744073709551614 = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
Hvalues :
∀values : listword, CallReturnWInt18446744073709551614 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hresource :
∀why : reason, CallReturnWInt18446744073709551614 ≠ CallResourcewhy
⊢
trace = [ ] ∧ CallReturnWInt18446744073709551614 = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

split ; exact Ht |

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
Hexit :
∀status : Z, CallReturnWInt18446744073709551614 = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
Hvalues :
∀values : listword, CallReturnWInt18446744073709551614 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hresource :
∀why : reason, CallReturnWInt18446744073709551614 ≠ CallResourcewhy
⊢
CallReturnWInt18446744073709551614 = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

split ; reflexivity |

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
Hexit :
∀status : Z, CallReturnWInt18446744073709551614 = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
Hvalues :
∀values : listword, CallReturnWInt18446744073709551614 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hresource :
∀why : reason, CallReturnWInt18446744073709551614 ≠ CallResourcewhy
⊢
s′ = s ∧ m = m ∧ w = w
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

split ; | auto

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
trace :
listevent
s′ :
R.state
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
Ht :
trace = [ ]
Hexit :
∀status : Z, CallReturnWInt18446744073709551614 = CallExitstatus → ∃before : listevent, trace = before ++ ProcessExitstatus
Hvalues :
∀values : listword, CallReturnWInt18446744073709551614 = CallReturnvalues → return_shapecontract_returnsmbrtowc_contractvalid audit rep requests values ∧ Forallword_authoritycontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w born m values
Hresource :
∀why : reason, CallReturnWInt18446744073709551614 ≠ CallResourcewhy
⊢
s′ = s
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

clear - He

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
out, src, state :
s :
R.state
m :
s′ :
R.state
born :
listZ
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m born
⊢
s′ = s
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

induction He ; reflexivity | exact IHHe |

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
out, src, state :
m :
s :
R.state
m0 :
born :
listZ
align, size, base :
Z
s1, s′ :
R.state
m′ :
born′ :
listZ
H :
contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w align size
H0 :
0 ≤ size ≤ max_allocation_size
H1 :
R.allocs heap_reqalign size = Somebase, s1
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s1 allocatedm0 heap_reqalign size base base :: born s′ m′ born′
IHHe :
s′ = s1
⊢
s′ = s
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

destruct H as out′ & src′ & n′ & state′ & Hxs & Hn & _

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
out, src, state :
m :
s :
R.state
m0 :
born :
listZ
align, size, base :
Z
s1, s′ :
R.state
m′ :
born′ :
listZ
out′, src′ :
n′ :
Z
state′ :
Hxs :
WPtrout; WPtrsrc; WInt0; WPtrstate = WPtrout′; WPtrsrc′; WIntn′; WPtrstate′
Hn :
n′ ≠ 0
H0 :
0 ≤ size ≤ max_allocation_size
H1 :
R.allocs heap_reqalign size = Somebase, s1
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s1 allocatedm0 heap_reqalign size base base :: born s′ m′ born′
IHHe :
s′ = s1
⊢
s′ = s
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

injection Hxs as ← ← ← ←

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
out, src, state :
m :
s :
R.state
m0 :
born :
listZ
align, size, base :
Z
s1, s′ :
R.state
m′ :
born′ :
listZ
Hn :
0 ≠ 0
H0 :
0 ≤ size ≤ max_allocation_size
H1 :
R.allocs heap_reqalign size = Somebase, s1
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s1 allocatedm0 heap_reqalign size base base :: born s′ m′ born′
IHHe :
s′ = s1
⊢
s′ = s
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

contradiction

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
rep :
mem → libc_world → Prop
requests :
listword → mem → libc_world → Z → Z → Prop
args :
listarg
out, src, state :
s :
R.state
m :
why :
trace :
listevent
s′ :
R.state
m′ :
born :
listZ
Habi :
contract_abimbrtowc_contractvalid audit rep requests r args
Hpre :
contract_prembrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w
He :
E.effectscontract_sourcesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_writesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_releasesmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w contract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s m [ ] s′ m′ born
Ht :
trace = [ ]
Hp :
0 =? 0
→
born = [ ] ∧ m′ = m ∧ w′ = w
else
libc_readyrep m′ w′ ∧ locale_unchangedlibc_localefstw libc_localefstw′ ∧ locale_delegates[ ] m libc_localefstw born m′ libc_localefstw′ ∧ libc_stdiofstw′ = libc_stdiofstw ∧ libc_errnofstw′ = libc_errnofstw ∧ sndw′ = sndw ∧ libc_streamsfstw′ = libc_streamsfstw ∧ ∀a : Z, in_objectm a → ¬write_authoritylocale_rootslibc_localefstw [ ] m a → m_auxm′ a = m_auxm a
Hfailure :
E.resource_failurecontract_requestsmbrtowc_contractvalid audit rep requests WPtrout; WPtrsrc; WInt0; WPtrstate m w s′ why
Hresource :
contract_resourcembrtowc_contractvalid audit rep requests why
⊢
trace = [ ] ∧ CallResourcewhy = CallReturnWInt2 ^ 64 − 2 ∧ s′ = s ∧ m′ = m ∧ w′ = w

–inversion Hfailure as align size Hrequest Hsize Hrefuse | align size Hrequest Hsize ; destruct Hrequest as out′ & src′ & n′ & state′ & Hxs & Hn & _ ; injection Hxs as ← ← ← ← ; contradiction

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit rep requests r args out src state s m w trace ending s′ m′ w′ Hcall
destruct Hcall as trace ending s′ m′ w′ born Habi Hpre He Ht Hp Hpost Hresource Hvalues Hexit | why trace s′ m′ w′ born Habi Hpre He Ht Hp Hfailure Hresource
–cbn [ mbrtowc_prefix ] in Hp
destruct Hp as _ & → & →
destruct Hpost as out′ & src′ & n′ & state′ & result & Hxs & Hend & Hresult
injection Hxs as ← ← ← ←
cbn in Hresult
subst result ending
split ; exact Ht |
split ; reflexivity |
split ; | auto
clear - He
induction He ; reflexivity | exact IHHe |
destruct H as out′ & src′ & n′ & state′ & Hxs & Hn & _
injection Hxs as ← ← ← ←
contradiction
–inversion Hfailure as align size Hrequest Hsize Hrefuse | align size Hrequest Hsize ; destruct Hrequest as out′ & src′ & n′ & state′ & Hxs & Hn & _ ; injection Hxs as ← ← ← ← ; contradiction
693Module Libc R : Runtime
694Module M ≔ ExternalMachine R
Include LibcOn R M

Consumer facts expose the audited profile only where it is needed. A complete character is initial, not necessarily eight zero bytes.

700Theorem mbrtowc_positive
∀ valid audit m w out src n state result m′
mbrtowc_resultvalid audit m w out src n state result m′
0 < result < 2 ^ 64 − 2
result ≤ n ∧ 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀i, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0
Explore proof 4 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec m : mem w : libc_payload × shutdown_state out src : ptr n : Z state : ptr result : Z m′ : mem, mbrtowc_resultvalid audit m w out src n state result m′ → hello_codec_profileaudit w → 0 < result < 2 ^ 64 − 2 → result ≤ n ∧ 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0

intros valid audit m w out src n state result m′ _ & Hcases Hprofile Hpositive

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hcases :
result = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → ∃i : Z, 0 ≤ i < n ∧ m_bytesm ptr_addrsrc + i = 0 ∧ load_bytesm′ ptr_addrout 4 = 0 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∨ 0 < result ≤ n ∧ result < 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0 ∨ result = 2 ^ 64 − 1 ∧ load_bytesm′ ptr_addrlibc_errnofstw 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256 ∧ hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0 ∨ result = 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :
Hpositive :
0 < result < 2 ^ 64 − 2
⊢
result ≤ n ∧ 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0

destruct Hcases as → & _ | Hbound & _ & Hvalid & Hprofiled | → & _ | → & _ ; try lia

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hbound :
0 < result ≤ n
Hvalid :
Hprofiled :
hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :
Hpositive :
0 < result < 2 ^ 64 − 2
⊢
result ≤ n ∧ 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0

destruct HprofiledHprofile as Hwide & Hinitial & Hbytes

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hbound :
0 < result ≤ n
Hvalid :
Hprofiled :
hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :
Hpositive :
0 < result < 2 ^ 64 − 2
Hwide :
0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32
Hinitial :
load_bytesm′ ptr_addrstate 4 = 0
Hbytes :
∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0
⊢
result ≤ n ∧ 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0

intuition

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit m w out src n state result m′ _ & Hcases Hprofile Hpositive
destruct Hcases as → & _ | Hbound & _ & Hvalid & Hprofiled | → & _ | → & _ ; try lia
destruct HprofiledHprofile as Hwide & Hinitial & Hbytes
intuition
714Theorem mbrtowc_incomplete
∀ valid audit m w out src n state m′
mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 2 m′
n < 16 ∧ ∀i, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Explore proof 4 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec m : mem w : libc_payload × shutdown_state out src : ptr n : Z state : ptr m′ : mem, mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 2 m′ → hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0

intros valid audit m w out src n state m′ _ & Hcases Hprofile

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hcases :
2 ^ 64 − 2 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → ∃i : Z, 0 ≤ i < n ∧ m_bytesm ptr_addrsrc + i = 0 ∧ load_bytesm′ ptr_addrout 4 = 0 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∨ 0 < 2 ^ 64 − 2 ≤ n ∧ 2 ^ 64 − 2 < 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 2 → m_bytesm ptr_addrsrc + i ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesm′ ptr_addrlibc_errnofstw 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256 ∧ hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :
⊢
n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0

destruct Hcases as Hbad & _ | _ & Hbad & _ | Hbad & _ | _ & _ & _ & Hprofiled ; try lia

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hprofiled :
hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :
⊢
n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0

apply Hprofiled

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hprofiled :
hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :

exact Hprofile

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit m w out src n state m′ _ & Hcases Hprofile
destruct Hcases as Hbad & _ | _ & Hbad & _ | Hbad & _ | _ & _ & _ & Hprofiled ; try lia
apply Hprofiled
exact Hprofile
724Theorem mbrtowc_valid_after
∀ valid audit m w out src n state result m′
mbrtowc_resultvalid audit m w out src n state result m′
result ≠ 2 ^ 64 − 1
Explore proof 2 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec m : mem w : libc_payload × shutdown_state out src : ptr n : Z state : ptr result : Z m′ : mem, mbrtowc_resultvalid audit m w out src n state result m′ → result ≠ 2 ^ 64 − 1 → validlocale_codeclibc_localefstw mbstate_bytesm′ state

intros valid audit m w out src n state result m′ _ & Hcases Hnoterror

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hcases :
result = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → ∃i : Z, 0 ≤ i < n ∧ m_bytesm ptr_addrsrc + i = 0 ∧ load_bytesm′ ptr_addrout 4 = 0 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∨ 0 < result ≤ n ∧ result < 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < result → m_bytesm ptr_addrsrc + i ≠ 0 ∨ result = 2 ^ 64 − 1 ∧ load_bytesm′ ptr_addrlibc_errnofstw 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256 ∧ hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0 ∨ result = 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hnoterror :
result ≠ 2 ^ 64 − 1

destruct Hcases as _ & Hvalid & _ | _ & _ & Hvalid & _ | Herror & _ | _ & Hvalid & _ ; congruence

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit m w out src n state result m′ _ & Hcases Hnoterror
destruct Hcases as _ & Hvalid & _ | _ & _ & Hvalid & _ | Herror & _ | _ & Hvalid & _ ; congruence

Only the independently identified stateless C converter gets this error rule. It preserves admitted state, not necessarily zero state.

736Theorem mbrtowc_c_error
∀ valid audit m w out src n state m′
mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′
mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256
Explore proof 3 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec m : mem w : libc_payload × shutdown_state out src : ptr n : Z state : ptr m′ : mem, mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′ → auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256

intros valid audit m w out src n state m′ _ & Hcases Hc

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hcases :
2 ^ 64 − 1 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → ∃i : Z, 0 ≤ i < n ∧ m_bytesm ptr_addrsrc + i = 0 ∧ load_bytesm′ ptr_addrout 4 = 0 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∨ 0 < 2 ^ 64 − 1 ≤ n ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesm ptr_addrsrc + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesm′ ptr_addrlibc_errnofstw 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256 ∧ hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hc :
⊢
mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256

destruct Hcases as Hbad & _ | _ & Hbad & _ | _ & _ & _ & Herror & _ | Hbad & _ ; try lia

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Herror :
auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256
Hc :
⊢
mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256

exact HerrorHc

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit m w out src n state m′ _ & Hcases Hc
destruct Hcases as Hbad & _ | _ & Hbad & _ | _ & _ & _ & Herror & _ | Hbad & _ ; try lia
exact HerrorHc

The selected C/UTF-8 initial-state error boundary used by gnulib's one-byte fallback. No promise is made about a pending UTF-8 state.

749Theorem mbrtowc_initial_error
∀ valid audit m w out src n state m′
mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′
load_bytesm ptr_addrstate 4 = 0
validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0
Explore proof 3 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec m : mem w : libc_payload × shutdown_state out src : ptr n : Z state : ptr m′ : mem, mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′ → hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0

intros valid audit m w out src n state m′ _ & Hcases Hprofile Hinitial Hvalid

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hcases :
2 ^ 64 − 1 = 0 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → ∃i : Z, 0 ≤ i < n ∧ m_bytesm ptr_addrsrc + i = 0 ∧ load_bytesm′ ptr_addrout 4 = 0 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∨ 0 < 2 ^ 64 − 1 ≤ n ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ hello_codec_profileaudit w → 0 < load_bytesm′ ptr_addrout 4 < 2 ^ 32 ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesm ptr_addrsrc + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesm′ ptr_addrlibc_errnofstw 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ auditlocale_codeclibc_localefstw = SomeCodecC → mbstate_bytesm′ state = mbstate_bytesm state ∧ 128 ≤ m_bytesm ptr_addrsrc < 256 ∧ hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ ∀a : Z, span_containsspan_ptr ≔ out; span_size ≔ 4 a → m_bytesm′ a = m_bytesm a ∧ hello_codec_profileaudit w → n < 16 ∧ ∀i : Z, 0 ≤ i < n → m_bytesm ptr_addrsrc + i ≠ 0
Hprofile :
Hinitial :
load_bytesm ptr_addrstate 4 = 0
Hvalid :
⊢
validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0

destruct Hcases as Hbad & _ | _ & Hbad & _ | _ & _ & _ & _ & Herror | Hbad & _ ; try lia

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Herror :
hello_codec_profileaudit w → load_bytesm ptr_addrstate 4 = 0 → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0
Hprofile :
Hinitial :
load_bytesm ptr_addrstate 4 = 0
Hvalid :
⊢
validlocale_codeclibc_localefstw mbstate_bytesm′ state ∧ load_bytesm′ ptr_addrstate 4 = 0 ∧ m_bytesm ptr_addrsrc ≠ 0

exact HerrorHprofile Hinitial Hvalid

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit m w out src n state m′ _ & Hcases Hprofile Hinitial Hvalid
destruct Hcases as Hbad & _ | _ & Hbad & _ | _ & _ & _ & _ & Herror | Hbad & _ ; try lia
exact HerrorHprofile Hinitial Hvalid
761Theorem mbrtowc_valid_after_c
∀ valid audit m w out src n state result m′
mbrtowc_resultvalid audit m w out src n state result m′
Explore proof 6 tactics

Initial goal

⊢
∀valid : term → listZ → Prop audit : term → optionaudited_codec m : mem w : libc_payload × shutdown_state out src : ptr n : Z state : ptr result : Z m′ : mem, mbrtowc_resultvalid audit m w out src n state result m′ → auditlocale_codeclibc_localefstw = SomeCodecC → validlocale_codeclibc_localefstw mbstate_bytesm state → validlocale_codeclibc_localefstw mbstate_bytesm′ state

intros valid audit m w out src n state result m′ Hresult Hc Hvalid

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
Hc :
Hvalid :

destruct Z.eq_decresult 2 ^ 64 − 1 as [ ->| Hnoterror ]

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′
Hc :
Hvalid :
focused goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
Hc :
Hvalid :
Hnoterror :
result ≠ 2 ^ 64 − 1

–destruct mbrtowc_c_error_ _ _ _ _ _ _ _ _ Hresult Hc as Hstate _

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′
Hc :
Hvalid :
Hstate :
mbstate_bytesm′ state = mbstate_bytesm state
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
Hc :
Hvalid :
Hnoterror :
result ≠ 2 ^ 64 − 1

rewrite Hstate

2 open

valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state 2 ^ 64 − 1 m′
Hc :
Hvalid :
Hstate :
mbstate_bytesm′ state = mbstate_bytesm state
deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
Hc :
Hvalid :
Hnoterror :
result ≠ 2 ^ 64 − 1

exact Hvalid

deferred goal
valid :
term → listZ → Prop
audit :
term → optionaudited_codec
m :
out, src :
n :
Z
state :
result :
Z
m′ :
Hresult :
mbrtowc_resultvalid audit m w out src n state result m′
Hc :
Hvalid :
Hnoterror :
result ≠ 2 ^ 64 − 1

–eapply mbrtowc_valid_after ; eauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros valid audit m w out src n state result m′ Hresult Hc Hvalid
destruct Z.eq_decresult 2 ^ 64 − 1 as [ ->| Hnoterror ]
–destruct mbrtowc_c_error_ _ _ _ _ _ _ _ _ Hresult Hc as Hstate _
rewrite Hstate
exact Hvalid
–eapply mbrtowc_valid_after ; eauto

Logical fixtures, not a native representation or decoder. Separate objects prevent a symmetric/overlapping footprint from hiding errors.

776Definition conversion_mem: mem ≔
λ a  ⇒
a =? 1024
→
65
a =? 4096
→
67
a =? 3076
→
83
else
0
mkRegion1024 1056 GlobalData Live; mkRegion2048 2056 Stack Live; mkRegion3072 3080 Stack Live; mkRegion4096 4104 GlobalData Live; mkRegion5120 5128 Heap Live
λ_ ⇒ CNone
783Definition conversion_world: libc_world ≔
mkLibcPayloadmkLocaleWorld0 λ_ ⇒ mkPtr4096 Ro4096 λ_ ⇒ 67 TInt0 [ ] [ ] [ ] mkStdioWorldtrue [ ] mkPtr5120 Obj5120 mkLibcStreamsmkLibcFilemkPtr0 CNone 0 [ ] [ ] [ ] mkLibcFilemkPtr0 CNone 0 [ ] [ ] [ ] false stdout_initial mkGetoptWorldmkPtr0 CNone mkPtr0 CNone mkPtr0 CNone mkPtr0 CNone mkPtr5120 Obj5120 mkPtr0 CNone 1 1 0 0 [ ] [ ] [ ], mkShutdownHandlers 0 [ ] [ ] stdout_initial
792Definition conversion_args: listarg ≔
794Definition conversion_wordsn : Z : listword ≔
WPtrmkPtr2048 Obj2048; WPtrmkPtr1024 Ro1024; WIntn; WPtrmkPtr3072 Obj3072

The abstract fixture admits initial states with residual bytes and one explicitly represented pending state. No count-bit validity rule is being asserted for native arbitrary-codec states.

801Definition conversion_valid_ : term bytes : listZ : Prop ≔
Forallλb ⇒ 0 ≤ b < 256 bytes ∧ lengthbytes = 8%nat ∧ firstn4 bytes = repeat0 4 ∨ bytes = 1; 0; 0; 0; 226; 0; 0; 0
805Definition conversion_audit_ : term : optionaudited_codec ≔
SomeCodecC
806Definition conversion_spec ≔
mbrtowc_contractconversion_valid conversion_audit λ_ _ ⇒ True λ_ _ _ align size ⇒ align = 16 ∧ size = 32
808Module InterpLibc ≔ Libc InterpRuntime
810Lemma conversion_pre
Proof 72 steps Qed
intros n Hn
split
–split ; exact I |
split
+split ; exact I |
split ; constructor |
split
∗intros category _
vm_compute
repeat split ; congruence
∗split ; constructor |
split ; constructor |
intros category _
exists 4096
split ; right ; reflexivity | reflexivity
+split ; constructor |
split
∗split ; discriminate |
split ; | reflexivity
split ; simpl ; lia |
exists 5120, mkRegion5120 5128 Heap Live
repeat split ; reflexivity
∗split ; apply stdout_initial_wf |
split ; constructor |
split ; simpl ; lia | exact I
–split ; intros codec ; vm_compute ; split ; repeat constructor ; congruence | auto |
split ; intros codec bytes Hbytes _ ; exact Hbytes |
exists mkPtr2048 Obj2048, mkPtr1024 Ro1024, n, mkPtr3072 Obj3072
split ; reflexivity |
split ; discriminate |
split ; discriminate |
split ; discriminate |
split
+split ; lia |
split
∗exists 1024, mkRegion1024 1056 GlobalData Live
repeat split ; auto
∗split
--change Someif 1024 + n ≤? 1056 then ok else RTrapOutOfBounds = Someok
rewrite proj2Z.leb_le1024 + n 1056 ltac:lia
reflexivity
--intros i Hi
repeat match goal with|- context [?a =? ?b]⇒destruct a =? bend;lia
+split
∗split ; simpl ; lia |
exists 2048, mkRegion2048 2056 Stack Live
repeat split ; reflexivity
∗split ; reflexivity |
split
--split ; simpl ; lia |
exists 3072, mkRegion3072 3080 Stack Live
repeat split ; reflexivity
--split
++split ; lia |
split
**exists 3072, mkRegion3072 3080 Stack Live
repeat split ; auto
**split ; reflexivity |
intros i Hi
repeat match goal with|- context [?a =? ?b]⇒destruct a =? bend;lia
++split ; reflexivity |
split ; vm_compute ; split ; repeat constructor ; congruence | auto |
split ; left ; change 1024 + n ≤ 2048 ; lia |
split ; left ; change 1024 + n ≤ 3072 ; lia |
split ; left ; vm_compute ; congruence |
split
**intros p size Heq | Heq | Heq | ; injection Heq as ← ← ; split ; right ; change 1024 + n ≤ 5120 ; lia | intros root Hfalse ; contradiction | right ; vm_compute ; congruence | intros root Hfalse ; contradiction | right ; vm_compute ; congruence | intros root Hfalse ; contradiction
**split ; intros base Hfalse ; contradiction |
split ; intros root Hfalse ; contradiction |
intros p [ <-| [ <-| [ <-| [ <-| [ ] ] ] ] ] base [ Hcap | Hcap ] ; inversion Hcap ; subst ; split ; intros Hbad | source & Hin & Hbad | source & a & Hin & _ & _ & _ & Hbad | b & & _ ; try discriminate ; try change _ = CNone in Hbad ; discriminate ; unfold locale_sources in Hin ; cbn [ locale_reads locale_roots conversion_world libc_locale fst app ] in Hin ; rewrite app_nil_r in Hin ; apply in_map_iff in Hin as category & ← & _ ; discriminate
Explore proof 2 tactics

Initial goal

exists CodecC

split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
exists CodecC
split ; reflexivity

Zero count and real request/refusal are both public invocations.

Explore proof 5 tactics

Initial goal

apply InterpLibc.mbrtowc_zero

2 open

focused goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt0; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world

–split ; left ; reflexivity |

2 open

⊢
∃out src n state : value, conversion_args = ArgP out; ArgP src; ArgL n; ArgP state
deferred goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt0; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world

eexists ; eexists ; eexists ; eexists ; reflexivity

deferred goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt0; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world

–apply conversion_pre

⊢
0 ≤ 0 ≤ 32

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
–split ; left ; reflexivity |
eexists ; eexists ; eexists ; eexists ; reflexivity
lia
Explore proof 27 tactics

Initial goal

eapply InterpLibc.E.invoke_resource with born := [ ]

5 open

focused goal
focused goal
focused goal
focused goal

–split ; left ; reflexivity |

5 open

⊢
∃out src n state : value, conversion_args = ArgP out; ArgP src; ArgL n; ArgP state
deferred goal
deferred goal
deferred goal
deferred goal

eexists ; eexists ; eexists ; eexists ; reflexivity

4 open

deferred goal
deferred goal
deferred goal
deferred goal

–apply conversion_pre

4 open

⊢
0 ≤ 1 ≤ 32
deferred goal
deferred goal
deferred goal

lia

3 open

deferred goal
deferred goal
deferred goal

–split ; constructor |

3 open

deferred goal
deferred goal

split ; reflexivity |

3 open

deferred goal
deferred goal

split ; exact proj1conversion_pre1 ltac:lia |

3 open

deferred goal
deferred goal

split ; apply locale_unchanged_refl |

3 open

deferred goal
deferred goal

split

4 open

focused goal
deferred goal
deferred goal

+eapply locale_delegates_refl

5 open

deferred goal
deferred goal
deferred goal
shelved goal
⊢
mem → locale_world → Prop

exact proj1proj2proj1conversion_pre1 ltac:lia

3 open

deferred goal
deferred goal
deferred goal

+split ; reflexivity |

3 open

deferred goal
deferred goal

split ; reflexivity |

3 open

deferred goal
deferred goal

split ; reflexivity |

3 open

deferred goal
deferred goal

split ; reflexivity |

3 open

deferred goal
deferred goal

intros ; reflexivity

2 open

deferred goal
deferred goal

–eapply InterpLibc.E.failure_oom with align := 16 size := 32

4 open

focused goal
⊢
0 ≤ 32 ≤ max_allocation_size
focused goal
deferred goal

+eexists ; eexists ; eexists ; eexists

8 open

⊢
conversion_words1 = WPtr?out; WPtr?src; WInt?n; WPtr?state ∧ ?n ≠ 0 ∧ 16 = 16 ∧ 32 = 32
deferred goal
⊢
0 ≤ 32 ≤ max_allocation_size
deferred goal
deferred goal
shelved goal
⊢
shelved goal
⊢
shelved goal
⊢
Z
shelved goal
⊢

split ; reflexivity |

4 open

⊢
1 ≠ 0 ∧ 16 = 16 ∧ 32 = 32
deferred goal
⊢
0 ≤ 32 ≤ max_allocation_size
deferred goal
deferred goal

split ; discriminate |

4 open

⊢
16 = 16 ∧ 32 = 32
deferred goal
⊢
0 ≤ 32 ≤ max_allocation_size
deferred goal
deferred goal

auto

3 open

deferred goal
⊢
0 ≤ 32 ≤ max_allocation_size
deferred goal
deferred goal

+unfold max_allocation_size

3 open

⊢
0 ≤ 32 ≤ 2 ^ 48 − 1
deferred goal
deferred goal

lia

2 open

deferred goal
deferred goal

+reflexivity

deferred goal

–left

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
eapply InterpLibc.E.invoke_resource with born := [ ]
–split ; left ; reflexivity |
eexists ; eexists ; eexists ; eexists ; reflexivity
lia
–split ; constructor |
split ; reflexivity |
split ; exact proj1conversion_pre1 ltac:lia |
split ; apply locale_unchanged_refl |
split
exact proj1proj2proj1conversion_pre1 ltac:lia
+split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
intros ; reflexivity
–eapply InterpLibc.E.failure_oom with align := 16 size := 32
+eexists ; eexists ; eexists ; eexists
split ; reflexivity |
split ; discriminate |
auto
+reflexivity
–left
reflexivity

Scalar endpoints may change errno even on success. The residual value bytes are independent of the initial-state count.

902Definition conversion_memorywide state error : mem ≔
store_bytesstore_bytesstore_bytesconversion_mem 2048 4 wide 3072 8 state 5120 4 error
Proof 76 steps Qed
intros wide state error
split
+intros a Ha
left
exists mkSpanmkPtr2048 Obj2048 4
split
∗split ; | exact Ha
split ; lia |
exists 2048, mkRegion2048 2056 Stack Live
repeat split ; reflexivity
∗intros a Ha
left
exists mkSpanmkPtr3072 Obj3072 8
split
--split ; | exact Ha
split ; lia |
exists 3072, mkRegion3072 3080 Stack Live
repeat split ; reflexivity
∗eapply InterpLibc.E.effects_local ; apply local_store_bytes | constructor
intros a Ha
left
exists mkSpanmkPtr5120 Obj5120 4
split
--split ; | exact Ha
split ; change 0 ≤ 4 ; lia |
exists 5120, mkRegion5120 5128 Heap Live
repeat split ; reflexivity
–split ; reflexivity |
split
+split ; exact I |
split
∗split ; exact I |
split ; constructor |
split
--intros category _
vm_compute
repeat split ; congruence
--split ; constructor |
split ; constructor |
intros category _
exists 4096
split ; right ; reflexivity | reflexivity
∗split ; constructor |
split
--split ; discriminate |
split ; | reflexivity
split ; change 0 ≤ 4 ; lia |
exists 5120, mkRegion5120 5128 Heap Live
repeat split ; reflexivity
--split ; apply stdout_initial_wf |
split ; constructor |
split ; simpl ; lia | exact I
+split ; apply locale_unchanged_refl |
split
∗split ; intros root Hfalse ; contradiction |
split
--intros category Hcat
exact Hcat
--split ; intros source Hfalse ; contradiction | intros base Hfalse ; contradiction
∗split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
intros ; reflexivity
947Example conversion_positive_call: let m′ ≔ conversion_memory65 83 × 2 ^ 32 7 in InterpLibc.E.invokeconversion_spec CVoid conversion_args conversion_words1 InterpRuntime.start conversion_mem conversion_world [ ] CallReturnWInt1 InterpRuntime.start m′ conversion_world ∧ mbstate_bytesm′ mkPtr3072 Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesm′ 5120 4 = 7
Explore proof 22 tactics

Initial goal

split

2 open

focused goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

–eapply InterpLibc.mbrtowc_completed with born := [ ]

6 open

focused goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world
focused goal
⊢
1 ≠ 0
focused goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 InterpRuntime.start conversion_mem conversion_world [ ] [ ] InterpRuntime.start conversion_memory65 83 × 2 ^ 32 7 conversion_world
focused goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

+split ; left ; reflexivity |

6 open

⊢
∃out src n state : value, conversion_args = ArgP out; ArgP src; ArgL n; ArgP state
deferred goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world
deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 InterpRuntime.start conversion_mem conversion_world [ ] [ ] InterpRuntime.start conversion_memory65 83 × 2 ^ 32 7 conversion_world
deferred goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

eexists ; eexists ; eexists ; eexists ; reflexivity

5 open

deferred goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world
deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 InterpRuntime.start conversion_mem conversion_world [ ] [ ] InterpRuntime.start conversion_memory65 83 × 2 ^ 32 7 conversion_world
deferred goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

+apply conversion_pre

5 open

⊢
0 ≤ 1 ≤ 32
deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 InterpRuntime.start conversion_mem conversion_world [ ] [ ] InterpRuntime.start conversion_memory65 83 × 2 ^ 32 7 conversion_world
deferred goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

lia

4 open

deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 InterpRuntime.start conversion_mem conversion_world [ ] [ ] InterpRuntime.start conversion_memory65 83 × 2 ^ 32 7 conversion_world
deferred goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

+discriminate

3 open

deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 InterpRuntime.start conversion_mem conversion_world [ ] [ ] InterpRuntime.start conversion_memory65 83 × 2 ^ 32 7 conversion_world
deferred goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

+apply conversion_scalar_prefix

2 open

deferred goal
⊢
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

+split ; lia |

2 open

⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory65 83 × 2 ^ 32 7 a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory65 83 × 2 ^ 32 7 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

right

2 open

⊢
0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory65 83 × 2 ^ 32 7 a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory65 83 × 2 ^ 32 7 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

left

2 open

⊢
0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

split ; lia |

2 open

⊢
1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

split ; lia |

2 open

⊢
conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

split ; vm_compute ; split ; repeat constructor ; congruence | auto |

2 open

⊢
hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

intros _

2 open

⊢
0 < load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

split ; vm_compute ; auto |

2 open

⊢
load_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

split ; reflexivity |

2 open

⊢
∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

intros i Hi

2 open

i :
Z
Hi :
0 ≤ i < 1
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

assert i = 0 by lia

2 open

i :
Z
Hi :
0 ≤ i < 1
H :
i = 0
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

subst

2 open

Hi :
0 ≤ 0 < 1
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + 0 ≠ 0
deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

discriminate

deferred goal
⊢
mbstate_bytesconversion_memory65 83 × 2 ^ 32 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = 0; 0; 0; 0; 83; 0; 0; 0 ∧ load_bytesconversion_memory65 83 × 2 ^ 32 7 5120 4 = 7

–split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–eapply InterpLibc.mbrtowc_completed with born := [ ]
+split ; left ; reflexivity |
eexists ; eexists ; eexists ; eexists ; reflexivity
lia
+discriminate
+split ; lia |
right
left
split ; lia |
split ; lia |
split ; vm_compute ; split ; repeat constructor ; congruence | auto |
intros _
split ; vm_compute ; auto |
split ; reflexivity |
intros i Hi
assert i = 0 by lia
subst
discriminate
–split ; reflexivity

Scalar output/state/errno roots never confer permission to retain caller capabilities in aux. The public invocation rejects this even though the state bytes themselves are writable.

971Example conversion_caller_aux_rejected: ∀c, c ≠ CNone → ∀s s′ trace ending, ¬InterpLibc.E.invokeconversion_spec CVoid conversion_args conversion_words1 s conversion_mem conversion_world trace ending s′ store_auxconversion_mem 3072 c conversion_world
Explore proof 11 tactics

Initial goal

intros c Hcap s s′ trace ending Hcall

destruct InterpLibc.E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & _ & _ & _ & _ & _ & _ & _ & _ & _ & Hframe

specialize Hframe3072

assert in_objectconversion_mem 3072 as Hin

2 open

focused goal

{exists 3072, mkRegion3072 3080 Stack Live

2 open

deferred goal

split ; reflexivity |

2 open

deferred goal

simpl ; lia

deferred goal

assert ¬write_authority[ ] [ ] conversion_mem 3072 as Hout

2 open

focused goal

{intros root & & _ | base & reg & & _

deferred goal

apply Hcap

exact HframeHin Hout

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros c Hcap s s′ trace ending Hcall
destruct InterpLibc.E.invoke_prefix_ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as born & _ & _ & _ & _ & _ & _ & _ & _ & _ & Hframe
specialize Hframe3072
assert in_objectconversion_mem 3072 as Hin
{exists 3072, mkRegion3072 3080 Stack Live
split ; reflexivity |
simpl ; lia
assert ¬write_authority[ ] [ ] conversion_mem 3072 as Hout
{intros root & & _ | base & reg & & _
apply Hcap
exact HframeHin Hout

Profiled incomplete calls preserve valid continuation, not initial state. An unprofiled EILSEQ may still leave invalid state.

989Example conversion_incomplete_and_error: mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 2 conversion_memory0 226 × 2 ^ 32 + 1 9 ∧ ∀audit, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 1 conversion_memory0 255 84
Explore proof 33 tactics

Initial goal

⊢
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 2 conversion_memory0 226 × 2 ^ 32 + 1 9 ∧ ∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

split

2 open

⊢
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 2 conversion_memory0 226 × 2 ^ 32 + 1 9
focused goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

–split ; lia |

2 open

⊢
2 ^ 64 − 2 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 2 ^ 64 − 2 ≤ 1 ∧ 2 ^ 64 − 2 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 2 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

right

2 open

⊢
0 < 2 ^ 64 − 2 ≤ 1 ∧ 2 ^ 64 − 2 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 2 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

right

2 open

⊢
2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

right

2 open

⊢
2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

split ; reflexivity |

2 open

⊢
conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

split ; vm_compute ; split ; repeat constructor ; congruence | auto |

2 open

⊢
∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

split

3 open

⊢
∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a
focused goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

+intros a Ha

3 open

a :
Z
Ha :
span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a
⊢
m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a
deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

change 2048 ≤ a < 2052 in Ha

3 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a
deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

assert a = 2048 ∨ a = 2049 ∨ a = 2050 ∨ a = 2051 by lia

3 open

a :
Z
Ha :
2048 ≤ a < 2052
H :
a = 2048 ∨ a = 2049 ∨ a = 2050 ∨ a = 2051
⊢
m_bytesconversion_memory0 226 × 2 ^ 32 + 1 9 a = m_bytesconversion_mem a
deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

destruct H as → | → | → | → ; reflexivity

2 open

deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

+intros _

2 open

⊢
1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

split ; lia |

2 open

⊢
∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

intros i Hi

2 open

i :
Z
Hi :
0 ≤ i < 1
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

assert i = 0 by lia

2 open

i :
Z
Hi :
0 ≤ i < 1
H :
i = 0
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

subst

2 open

Hi :
0 ≤ 0 < 1
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + 0 ≠ 0
deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

discriminate

deferred goal
⊢
∀audit : term → optionaudited_codec, auditTInt0 ≠ SomeCodecC → ¬hello_codec_profileaudit conversion_world → mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

–intros audit Hnotc Hnotprofile

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
⊢
mbrtowc_resultconversion_valid audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 255 84

split ; lia |

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
⊢
2 ^ 64 − 1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileaudit conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 2 ^ 64 − 1 ≤ 1 ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileaudit conversion_world → 0 < load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 255 84 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a ∧ auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileaudit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a ∧ hello_codec_profileaudit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

right

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
⊢
0 < 2 ^ 64 − 1 ≤ 1 ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileaudit conversion_world → 0 < load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 255 84 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a ∧ auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileaudit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a ∧ hello_codec_profileaudit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

right

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
⊢
2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 255 84 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a ∧ auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileaudit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 255 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 255 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a ∧ hello_codec_profileaudit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

left

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC

split ; reflexivity |

split ; reflexivity |

split

2 open

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
⊢
∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 255 84 a = m_bytesconversion_mem a
focused goal

+intros a Ha

2 open

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
a :
Z
Ha :
span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a
deferred goal

change 2048 ≤ a < 2052 in Ha

2 open

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
a :
Z
Ha :
2048 ≤ a < 2052
deferred goal

assert a = 2048 ∨ a = 2049 ∨ a = 2050 ∨ a = 2051 by lia

2 open

audit :
term → optionaudited_codec
Hnotc :
auditTInt0 ≠ SomeCodecC
a :
Z
Ha :
2048 ≤ a < 2052
H :
a = 2048 ∨ a = 2049 ∨ a = 2050 ∨ a = 2051
deferred goal

destruct H as → | → | → | → ; reflexivity

deferred goal

+split ; intros Hc ; contradiction |

intros Hprofile

contradiction

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–split ; lia |
right
right
right
split ; reflexivity |
split ; vm_compute ; split ; repeat constructor ; congruence | auto |
split
+intros a Ha
change 2048 ≤ a < 2052 in Ha
assert a = 2048 ∨ a = 2049 ∨ a = 2050 ∨ a = 2051 by lia
destruct H as → | → | → | → ; reflexivity
+intros _
split ; lia |
intros i Hi
assert i = 0 by lia
subst
discriminate
–intros audit Hnotc Hnotprofile
split ; lia |
right
right
left
split ; reflexivity |
split ; reflexivity |
split
+intros a Ha
change 2048 ≤ a < 2052 in Ha
assert a = 2048 ∨ a = 2049 ∨ a = 2050 ∨ a = 2051 by lia
destruct H as → | → | → | → ; reflexivity
+split ; intros Hc ; contradiction |
intros Hprofile
contradiction

A mathematical memory write is not automatically a byte. Neither normal nor incomplete validity may admit this damaged state.

1017Example conversion_bad_state_byte_rejected: ∀byte result, byte < 0 ∨ 256 ≤ byte → result ≠ 2 ^ 64 − 1 → ¬mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 result mkMemλa ⇒ if a =? 3076 then byte else m_bytesconversion_mem a m_regionsconversion_mem m_auxconversion_mem
Explore proof 8 tactics

Initial goal

⊢
∀byte result : Z, byte < 0 ∨ 256 ≤ byte → result ≠ 2 ^ 64 − 1 → ¬mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem

intros byte result Hbad Hnoterror Hresult

byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
⊢
False

pose proof mbrtowc_valid_after_ _ _ _ _ _ _ _ _ _ Hresult Hnoterror as Hvalid

byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
⊢
False

assert mbstate_valid_bytesconversion_valid as Hlaw

2 open

byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
focused goal
byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
⊢
False

{intros codec bytes Hbytes _

2 open

byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
codec :
bytes :
listZ
Hbytes :
Forallλb : Z ⇒ 0 ≤ b < 256 bytes
⊢
Forallλb : Z ⇒ 0 ≤ b < 256 bytes
deferred goal
byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
⊢
False

exact Hbytes

deferred goal
byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
⊢
False

pose proof mbstate_byte_range_ _ _ _ Hlaw Hvalid 4 ltac:lia as Hrange

byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
Hrange :
0 ≤ m_bytesm_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 + 4 < 256
⊢
False

change 0 ≤ byte < 256 in Hrange

byte, result :
Z
Hbad :
byte < 0 ∨ 256 ≤ byte
Hnoterror :
result ≠ 2 ^ 64 − 1
Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 result m_bytes ≔ λa : Z ⇒ if a =? 3076 then byte else m_bytesconversion_mem a; m_regions ≔ m_regionsconversion_mem; m_aux ≔ m_auxconversion_mem
Hrange :
0 ≤ byte < 256
⊢
False

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros byte result Hbad Hnoterror Hresult
pose proof mbrtowc_valid_after_ _ _ _ _ _ _ _ _ _ Hresult Hnoterror as Hvalid
{intros codec bytes Hbytes _
exact Hbytes
pose proof mbstate_byte_range_ _ _ _ Hlaw Hvalid 4 ltac:lia as Hrange
change 0 ≤ byte < 256 in Hrange
lia

C error and subsequent reuse retain a nonzero residual state byte; they do not silently reinitialize the state.

1034Definition conversion_c_error_mem ≔
1035Definition conversion_c_error_end ≔
Explore proof 21 tactics

Initial goal

split ; lia |

⊢
2 ^ 64 − 1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 2 ^ 64 − 1 ≤ 1 ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_c_error_end ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

right

⊢
0 < 2 ^ 64 − 1 ≤ 1 ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_c_error_end ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

right

⊢
2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_c_error_end ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

left

split ; reflexivity |

split ; reflexivity |

split

2 open

focused goal

–intros a Ha

2 open

deferred goal

change 2048 ≤ a < 2052 in Ha

2 open

deferred goal

unfold conversion_c_error_end , store_bytes

2 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
m_bytesm_bytes ≔ λb : Z ⇒ if 5120 ≤? b && b <? 5120 + 4 then byte_of84 b − 5120 else m_bytesconversion_c_error_mem b; m_regions ≔ m_regionsconversion_c_error_mem; m_aux ≔ m_auxconversion_c_error_mem a = m_bytesconversion_c_error_mem a
deferred goal

cbn [ m_bytes ]

2 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
5120 ≤? a && a <? 5120 + 4
→
byte_of84 a − 5120
=
deferred goal

rewrite proj2Z.leb_gt5120 a ltac:lia

2 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
false && a <? 5120 + 4
→
byte_of84 a − 5120
=
deferred goal

reflexivity

deferred goal

–split

2 open

focused goal

+intros _

2 open

deferred goal

split ; reflexivity |

2 open

⊢
128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256
deferred goal

vm_compute

2 open

deferred goal

repeat split ; congruence

deferred goal

+intros _ _ Hvalid

split ; exact Hvalid |

split ; reflexivity | discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; lia |
right
right
left
split ; reflexivity |
split ; reflexivity |
split
–intros a Ha
change 2048 ≤ a < 2052 in Ha
cbn [ m_bytes ]
rewrite proj2Z.leb_gt5120 a ltac:lia
reflexivity
–split
+intros _
split ; reflexivity |
vm_compute
repeat split ; congruence
+intros _ _ Hvalid
split ; exact Hvalid |
split ; reflexivity | discriminate
Explore proof 4 tactics

Initial goal

split ; | reflexivity

eapply mbrtowc_valid_after_c ; exact conversion_c_error_result | reflexivity |

vm_compute

⊢
Forall
λ x : Z  ⇒
match x with
=
→
False
∧
match x with
0 | 255 | 191 | 127 | 223 | 159 | 95 | 63 | 239 | 175 | 111 | 207 | 143 | 79 | 47 | 31 | 247 | 183 | 119 | 215 | 151 | 87 | 55 | 231 | 167 | 103 | 199 | 135 | 71 | 39 | 23 | 15 | 251 | 187 | 123 | 219 | 155 | 91 | 59 | 235 | 171 | 107 | 203 | 139 | 75 | 43 | 27 | 243 | 179 | 115 | 211 | 147 | 83 | 51 | 227 | 163 | 99 | 195 | 131 | 67 | 35 | 19 | 11 | 7 | 253 | 189 | 125 | 221 | 157 | 93 | 61 | 237 | 173 | 109 | 205 | 141 | 77 | 45 | 29 | 245 | 181 | 117 | 213 | 149 | 85 | 53 | 229 | 165 | 101 | 197 | 133 | 69 | 37 | 21 | 13 | 249 | 185 | 121 | 217 | 153 | 89 | 57 | 233 | 169 | 105 | 201 | 137 | 73 | 41 | 25 | 241 | 177 | 113 | 209 | 145 | 81 | 49 | 225 | 161 | 97 | 193 | 129 | 65 | 33 | 17 | 9 | 5 | 3 | 254 | 190 | 126 | 222 | 158 | 94 | 62 | 238 | 174 | 110 | 206 | 142 | 78 | 46 | 30 | 246 | 182 | 118 | 214 | 150 | 86 | 54 | 230 | 166 | 102 | 198 | 134 | 70 | 38 | 22 | 14 | 250 | 186 | 122 | 218 | 154 | 90 | 58 | 234 | 170 | 106 | 202 | 138 | 74 | 42 | 26 | 242 | 178 | 114 | 210 | 146 | 82 | 50 | 226 | 162 | 98 | 194 | 130 | 66 | 34 | 18 | 10 | 6 | 252 | 188 | 124 | 220 | 156 | 92 | 60 | 236 | 172 | 108 | 204 | 140 | 76 | 44 | 28 | 244 | 180 | 116 | 212 | 148 | 84 | 52 | 228 | 164 | 100 | 196 | 132 | 68 | 36 | 20 | 12 | 248 | 184 | 120 | 216 | 152 | 88 | 56 | 232 | 168 | 104 | 200 | 136 | 72 | 40 | 24 | 240 | 176 | 112 | 208 | 144 | 80 | 48 | 224 | 160 | 96 | 192 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Z.neg_
⇒
=
0; 0; 0; 0; 83; 0; 0; 0
∧
8%nat = 8%nat ∧ 0; 0; 0; 0 = 0; 0; 0; 0 ∨ 0; 0; 0; 0; 83; 0; 0; 0 = 1; 0; 0; 0; 226; 0; 0; 0

split ; repeat constructor ; congruence | auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; | reflexivity
eapply mbrtowc_valid_after_c ; exact conversion_c_error_result | reflexivity |
vm_compute
split ; repeat constructor ; congruence | auto
1062Example conversion_c_error_ascii_rejected: ¬mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 1 conversion_memory0 83 × 2 ^ 32 84
Explore proof 4 tactics

Initial goal

⊢
¬mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 83 × 2 ^ 32 84

intros Hresult

Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 83 × 2 ^ 32 84
⊢
False

destruct mbrtowc_c_error_ _ _ _ _ _ _ _ _ Hresult eq_refl as _ Hbyte

Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 83 × 2 ^ 32 84
Hbyte :
128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256
⊢
False

change 128 ≤ 65 < 256 in Hbyte

Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 83 × 2 ^ 32 84
Hbyte :
128 ≤ 65 < 256
⊢
False

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hresult
destruct mbrtowc_c_error_ _ _ _ _ _ _ _ _ Hresult eq_refl as _ Hbyte
change 128 ≤ 65 < 256 in Hbyte
lia
1072Example conversion_c_error_changed_state_rejected: ¬mbrtowc_resultconversion_valid conversion_audit conversion_c_error_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 1 conversion_memory0 84 × 2 ^ 32 84
Explore proof 3 tactics

Initial goal

⊢
¬mbrtowc_resultconversion_valid conversion_audit conversion_c_error_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 84 × 2 ^ 32 84

intros Hresult

Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_c_error_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 84 × 2 ^ 32 84
⊢
False

destruct mbrtowc_c_error_ _ _ _ _ _ _ _ _ Hresult eq_refl as Hstate _

Hresult :
mbrtowc_resultconversion_valid conversion_audit conversion_c_error_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 84 × 2 ^ 32 84
Hstate :
mbstate_bytesconversion_memory0 84 × 2 ^ 32 84 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072
⊢
False

discriminate Hstate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hresult
destruct mbrtowc_c_error_ _ _ _ _ _ _ _ _ Hresult eq_refl as Hstate _
discriminate Hstate

UTF-8 initial-count EILSEQ is reusable even with residual bytes; this fixture tests the error relation, not native locale readiness.

1091Example conversion_utf8_initial_error: mbrtowc_resultconversion_valid λ_ ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 1 conversion_c_error_end
Explore proof 17 tactics

Initial goal

⊢

split ; lia |

⊢
2 ^ 64 − 1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 2 ^ 64 − 1 ≤ 1 ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → 0 < load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_c_error_end ptr_addrlibc_errnofstconversion_utf8_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ SomeCodecCUtf8 = SomeCodecC → mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → load_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

right

⊢
0 < 2 ^ 64 − 1 ≤ 1 ∧ 2 ^ 64 − 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → 0 < load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_c_error_end ptr_addrlibc_errnofstconversion_utf8_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ SomeCodecCUtf8 = SomeCodecC → mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → load_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

right

⊢
2 ^ 64 − 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_c_error_end ptr_addrlibc_errnofstconversion_utf8_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ SomeCodecCUtf8 = SomeCodecC → mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → load_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_c_error_end ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_utf8_world mbstate_bytesconversion_c_error_end ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_c_error_end a = m_bytesconversion_c_error_mem a ∧ hello_codec_profileλ_ : term ⇒ SomeCodecCUtf8 conversion_utf8_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_c_error_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

left

split ; reflexivity |

split ; reflexivity |

split

2 open

focused goal

–intros a Ha

2 open

deferred goal

change 2048 ≤ a < 2052 in Ha

2 open

deferred goal

unfold conversion_c_error_end , store_bytes

2 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
m_bytesm_bytes ≔ λb : Z ⇒ if 5120 ≤? b && b <? 5120 + 4 then byte_of84 b − 5120 else m_bytesconversion_c_error_mem b; m_regions ≔ m_regionsconversion_c_error_mem; m_aux ≔ m_auxconversion_c_error_mem a = m_bytesconversion_c_error_mem a
deferred goal

cbn [ m_bytes ]

2 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
5120 ≤? a && a <? 5120 + 4
→
byte_of84 a − 5120
=
deferred goal

rewrite proj2Z.leb_gt5120 a ltac:lia

2 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
false && a <? 5120 + 4
→
byte_of84 a − 5120
=
deferred goal

reflexivity

deferred goal

–split ; discriminate |

intros _ _ Hvalid

split ; exact Hvalid |

split ; reflexivity | discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; lia |
right
right
left
split ; reflexivity |
split ; reflexivity |
split
–intros a Ha
change 2048 ≤ a < 2052 in Ha
cbn [ m_bytes ]
rewrite proj2Z.leb_gt5120 a ltac:lia
reflexivity
–split ; discriminate |
intros _ _ Hvalid
split ; exact Hvalid |
split ; reflexivity | discriminate
1106Example conversion_utf8_initial_error_changed_count_rejected: ¬mbrtowc_resultconversion_valid λ_ ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Explore proof 8 tactics

Initial goal

⊢
¬mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84

intros Hresult

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
⊢
False

destruct mbrtowc_initial_error_ _ _ _ _ _ _ _ _ Hresult as _ & Hcount & _

4 open

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
focused goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
focused goal
focused goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Hcount :
load_bytesconversion_memory0 226 × 2 ^ 32 + 1 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
⊢
False

–exists CodecCUtf8

4 open

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
deferred goal
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Hcount :
load_bytesconversion_memory0 226 × 2 ^ 32 + 1 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
⊢
False

split ; reflexivity

3 open

deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
deferred goal
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Hcount :
load_bytesconversion_memory0 226 × 2 ^ 32 + 1 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
⊢
False

–reflexivity

2 open

deferred goal
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Hcount :
load_bytesconversion_memory0 226 × 2 ^ 32 + 1 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
⊢
False

–vm_compute

2 open

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
⊢
Forall
λ x : Z  ⇒
match x with
=
→
False
∧
match x with
0 | 255 | 191 | 127 | 223 | 159 | 95 | 63 | 239 | 175 | 111 | 207 | 143 | 79 | 47 | 31 | 247 | 183 | 119 | 215 | 151 | 87 | 55 | 231 | 167 | 103 | 199 | 135 | 71 | 39 | 23 | 15 | 251 | 187 | 123 | 219 | 155 | 91 | 59 | 235 | 171 | 107 | 203 | 139 | 75 | 43 | 27 | 243 | 179 | 115 | 211 | 147 | 83 | 51 | 227 | 163 | 99 | 195 | 131 | 67 | 35 | 19 | 11 | 7 | 253 | 189 | 125 | 221 | 157 | 93 | 61 | 237 | 173 | 109 | 205 | 141 | 77 | 45 | 29 | 245 | 181 | 117 | 213 | 149 | 85 | 53 | 229 | 165 | 101 | 197 | 133 | 69 | 37 | 21 | 13 | 249 | 185 | 121 | 217 | 153 | 89 | 57 | 233 | 169 | 105 | 201 | 137 | 73 | 41 | 25 | 241 | 177 | 113 | 209 | 145 | 81 | 49 | 225 | 161 | 97 | 193 | 129 | 65 | 33 | 17 | 9 | 5 | 3 | 254 | 190 | 126 | 222 | 158 | 94 | 62 | 238 | 174 | 110 | 206 | 142 | 78 | 46 | 30 | 246 | 182 | 118 | 214 | 150 | 86 | 54 | 230 | 166 | 102 | 198 | 134 | 70 | 38 | 22 | 14 | 250 | 186 | 122 | 218 | 154 | 90 | 58 | 234 | 170 | 106 | 202 | 138 | 74 | 42 | 26 | 242 | 178 | 114 | 210 | 146 | 82 | 50 | 226 | 162 | 98 | 194 | 130 | 66 | 34 | 18 | 10 | 6 | 252 | 188 | 124 | 220 | 156 | 92 | 60 | 236 | 172 | 108 | 204 | 140 | 76 | 44 | 28 | 244 | 180 | 116 | 212 | 148 | 84 | 52 | 228 | 164 | 100 | 196 | 132 | 68 | 36 | 20 | 12 | 248 | 184 | 120 | 216 | 152 | 88 | 56 | 232 | 168 | 104 | 200 | 136 | 72 | 40 | 24 | 240 | 176 | 112 | 208 | 144 | 80 | 48 | 224 | 160 | 96 | 192 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Z.neg_
⇒
=
0; 0; 0; 0; 83; 0; 0; 0
∧
8%nat = 8%nat ∧ 0; 0; 0; 0 = 0; 0; 0; 0 ∨ 0; 0; 0; 0; 83; 0; 0; 0 = 1; 0; 0; 0; 226; 0; 0; 0
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Hcount :
load_bytesconversion_memory0 226 × 2 ^ 32 + 1 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
⊢
False

split ; repeat constructor ; congruence | auto

deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 conversion_c_error_mem conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_memory0 226 × 2 ^ 32 + 1 84
Hcount :
load_bytesconversion_memory0 226 × 2 ^ 32 + 1 84 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
⊢
False

–discriminate Hcount

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hresult
destruct mbrtowc_initial_error_ _ _ _ _ _ _ _ _ Hresult as _ & Hcount & _
–exists CodecCUtf8
split ; reflexivity
–reflexivity
–vm_compute
split ; repeat constructor ; congruence | auto
–discriminate Hcount
1121Example conversion_utf8_initial_error_nul_rejected: ¬mbrtowc_resultconversion_valid λ_ ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 2 ^ 64 − 1 conversion_c_error_end
Explore proof 9 tactics

Initial goal

⊢
¬mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end

intros Hresult

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
⊢
False

destruct mbrtowc_initial_error_ _ _ _ _ _ _ _ _ Hresult as _ & _ & Hbyte

4 open

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
focused goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
⊢
focused goal
focused goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢
False

–exists CodecCUtf8

4 open

deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
⊢
deferred goal
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢
False

split ; reflexivity

3 open

deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
⊢
deferred goal
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢
False

–reflexivity

2 open

deferred goal
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢
False

–vm_compute

2 open

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
⊢
Forall
λ x : Z  ⇒
match x with
=
→
False
∧
match x with
0 | 255 | 191 | 127 | 223 | 159 | 95 | 63 | 239 | 175 | 111 | 207 | 143 | 79 | 47 | 31 | 247 | 183 | 119 | 215 | 151 | 87 | 55 | 231 | 167 | 103 | 199 | 135 | 71 | 39 | 23 | 15 | 251 | 187 | 123 | 219 | 155 | 91 | 59 | 235 | 171 | 107 | 203 | 139 | 75 | 43 | 27 | 243 | 179 | 115 | 211 | 147 | 83 | 51 | 227 | 163 | 99 | 195 | 131 | 67 | 35 | 19 | 11 | 7 | 253 | 189 | 125 | 221 | 157 | 93 | 61 | 237 | 173 | 109 | 205 | 141 | 77 | 45 | 29 | 245 | 181 | 117 | 213 | 149 | 85 | 53 | 229 | 165 | 101 | 197 | 133 | 69 | 37 | 21 | 13 | 249 | 185 | 121 | 217 | 153 | 89 | 57 | 233 | 169 | 105 | 201 | 137 | 73 | 41 | 25 | 241 | 177 | 113 | 209 | 145 | 81 | 49 | 225 | 161 | 97 | 193 | 129 | 65 | 33 | 17 | 9 | 5 | 3 | 254 | 190 | 126 | 222 | 158 | 94 | 62 | 238 | 174 | 110 | 206 | 142 | 78 | 46 | 30 | 246 | 182 | 118 | 214 | 150 | 86 | 54 | 230 | 166 | 102 | 198 | 134 | 70 | 38 | 22 | 14 | 250 | 186 | 122 | 218 | 154 | 90 | 58 | 234 | 170 | 106 | 202 | 138 | 74 | 42 | 26 | 242 | 178 | 114 | 210 | 146 | 82 | 50 | 226 | 162 | 98 | 194 | 130 | 66 | 34 | 18 | 10 | 6 | 252 | 188 | 124 | 220 | 156 | 92 | 60 | 236 | 172 | 108 | 204 | 140 | 76 | 44 | 28 | 244 | 180 | 116 | 212 | 148 | 84 | 52 | 228 | 164 | 100 | 196 | 132 | 68 | 36 | 20 | 12 | 248 | 184 | 120 | 216 | 152 | 88 | 56 | 232 | 168 | 104 | 200 | 136 | 72 | 40 | 24 | 240 | 176 | 112 | 208 | 144 | 80 | 48 | 224 | 160 | 96 | 192 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Z.neg_
⇒
=
0; 0; 0; 0; 83; 0; 0; 0
∧
8%nat = 8%nat ∧ 0; 0; 0; 0 = 0; 0; 0; 0 ∨ 0; 0; 0; 0; 83; 0; 0; 0 = 1; 0; 0; 0; 226; 0; 0; 0
deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢
False

split ; repeat constructor ; congruence | auto

deferred goal
Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢
False

–apply Hbyte

Hresult :
mbrtowc_resultconversion_valid λ_ : term ⇒ SomeCodecCUtf8 store_bytesconversion_mem 1024 1 0 conversion_utf8_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 2 ^ 64 − 1 conversion_c_error_end
Hbyte :
m_bytesstore_bytesconversion_mem 1024 1 0 ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0
⊢

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hresult
destruct mbrtowc_initial_error_ _ _ _ _ _ _ _ _ Hresult as _ & _ & Hbyte
–exists CodecCUtf8
split ; reflexivity
–reflexivity
–vm_compute
split ; repeat constructor ; congruence | auto
–apply Hbyte
reflexivity

The profiled output interpretations are not generic decoder laws.

1137Example conversion_unprofiled_outputs: mbrtowc_resultconversion_valid λ_ ⇒ None conversion_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 0 conversion_memory937 0 7 ∧ mbrtowc_resultconversion_valid λ_ ⇒ None conversion_mem conversion_world mkPtr2048 Obj2048 mkPtr1024 Ro1024 1 mkPtr3072 Obj3072 1 conversion_memory0 0 7
Explore proof 13 tactics

Initial goal

⊢
mbrtowc_resultconversion_valid λ_ : term ⇒ None conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 0 conversion_memory937 0 7 ∧ mbrtowc_resultconversion_valid λ_ : term ⇒ None conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 1 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 1 conversion_memory0 0 7

split ; split ; lia |

2 open

⊢
0 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 0 ≤ 1 ∧ 0 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 0 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 0 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory937 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory937 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 0 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory937 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
focused goal
⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

–left

2 open

⊢
0 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
deferred goal
⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

split ; reflexivity |

2 open

⊢
conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory937 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
deferred goal
⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

split ; vm_compute ; split ; repeat constructor ; congruence | auto |

2 open

⊢
hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
deferred goal
⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

intros kind & Hbad & _

2 open

Hbad :
None = Somekind
⊢
∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory937 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0
deferred goal
⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

discriminate

deferred goal
⊢
1 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

–right

⊢
0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 1 = 2 ^ 64 − 1 ∧ load_bytesconversion_memory0 0 7 ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ None = SomeCodecC → mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 1 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_memory0 0 7 a = m_bytesconversion_mem a ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

left

⊢
0 < 1 ≤ 1 ∧ 1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

split ; lia |

⊢
1 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

split ; lia |

⊢
conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_memory0 0 7 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

split ; vm_compute ; split ; repeat constructor ; congruence | auto |

⊢
hello_codec_profileλ_ : term ⇒ None conversion_world → 0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

intros kind & Hbad & _

Hbad :
None = Somekind
⊢
0 < load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_memory0 0 7 ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0

discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; split ; lia |
–left
split ; reflexivity |
split ; vm_compute ; split ; repeat constructor ; congruence | auto |
intros kind & Hbad & _
discriminate
–right
left
split ; lia |
split ; lia |
split ; vm_compute ; split ; repeat constructor ; congruence | auto |
intros kind & Hbad & _
discriminate
Explore proof 13 tactics

Initial goal

intros result Hresult Hcall

destruct InterpLibc.mbrtowc_returned_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as returned & Heq & Hpost

result :
Z
Hresult :
result = 0 ∨ result = 1
returned :
Z
Heq :
WIntresult = WIntreturned
Hpost :
1 =? 0
→
returned = 2 ^ 64 − 2
⊢
False

injection Heq as ←

cbn in Hpost

destruct Hresult as → | →

2 open

focused goal

–destruct Hpost as _ & Hret & _ & Hprofile | Hbad & _ | Hbad & _ | Hbad & _ ; try lia

2 open

deferred goal

destruct Hprofileconversion_profile as i & Hi & Hbyte & _

2 open

deferred goal

assert i = 0 by lia

2 open

deferred goal

subst

2 open

deferred goal

discriminate Hbyte

deferred goal

–destruct mbrtowc_positive_ _ _ _ _ _ _ _ _ _ Hpost conversion_profile ltac:lia as _ & Hwide & _

change 0 < 0 < 2 ^ 32 in Hwide

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros result Hresult Hcall
destruct InterpLibc.mbrtowc_returned_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as returned & Heq & Hpost
injection Heq as ←
cbn in Hpost
destruct Hresult as → | →
–destruct Hpost as _ & Hret & _ & Hprofile | Hbad & _ | Hbad & _ | Hbad & _ ; try lia
destruct Hprofileconversion_profile as i & Hi & Hbyte & _
assert i = 0 by lia
subst
discriminate Hbyte
–destruct mbrtowc_positive_ _ _ _ _ _ _ _ _ _ Hpost conversion_profile ltac:lia as _ & Hwide & _
change 0 < 0 < 2 ^ 32 in Hwide
lia
1171Example conversion_incomplete_rejected: ∀n, n = 2 ∨ n = 16 → ∀s m′ w′, ¬InterpLibc.E.invokeconversion_spec CVoid conversion_args conversion_wordsn s conversion_mem conversion_world [ ] CallReturnWInt2 ^ 64 − 2 s m′ w′
Explore proof 8 tactics

Initial goal

⊢
∀n : Z, n = 2 ∨ n = 16 → ∀s : InterpRuntime.state m′ : mem w′ : libc_world, ¬InterpLibc.E.invokeconversion_spec CVoid conversion_args conversion_wordsn s conversion_mem conversion_world [ ] CallReturnWInt2 ^ 64 − 2 s m′ w′

intros n Hn s m′ w′ Hcall

destruct InterpLibc.mbrtowc_returned_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as returned & Heq & Hpost

n :
Z
Hn :
n = 2 ∨ n = 16
m′ :
returned :
Z
Heq :
WInt2 ^ 64 − 2 = WIntreturned
Hpost :
n =? 0
→
returned = 2 ^ 64 − 2
else
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 n ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 returned m′
⊢
False

injection Heq as ←

n :
Z
Hn :
n = 2 ∨ n = 16
m′ :
Hpost :
n =? 0
→
18446744073709551614 = 2 ^ 64 − 2
else
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 n ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
⊢
False

destruct Hn as → | → ; cbn in Hpost ; destruct mbrtowc_incomplete_ _ _ _ _ _ _ _ _ Hpost conversion_profile as Hbound Hbytes

2 open

m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 2 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
2 < 16
Hbytes :
∀i : Z, 0 ≤ i < 2 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
⊢
False
focused goal
m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 16 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
16 < 16
Hbytes :
∀i : Z, 0 ≤ i < 16 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
⊢
False

–specialize Hbytes1 ltac:lia

2 open

m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 2 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
2 < 16
Hbytes :
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + 1 ≠ 0
⊢
False
deferred goal
m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 16 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
16 < 16
Hbytes :
∀i : Z, 0 ≤ i < 16 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
⊢
False

apply Hbytes

2 open

m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 2 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
2 < 16
Hbytes :
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + 1 ≠ 0
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + 1 = 0
deferred goal
m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 16 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
16 < 16
Hbytes :
∀i : Z, 0 ≤ i < 16 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
⊢
False

reflexivity

deferred goal
m′ :
Hpost :
mbrtowc_resultconversion_valid conversion_audit conversion_mem conversion_world ptr_addr ≔ 2048; ptr_cap ≔ Obj2048 ptr_addr ≔ 1024; ptr_cap ≔ Ro1024 16 ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 18446744073709551614 m′
Hbound :
16 < 16
Hbytes :
∀i : Z, 0 ≤ i < 16 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
⊢
False

–lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros n Hn s m′ w′ Hcall
destruct InterpLibc.mbrtowc_returned_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Hcall as returned & Heq & Hpost
injection Heq as ←
destruct Hn as → | → ; cbn in Hpost ; destruct mbrtowc_incomplete_ _ _ _ _ _ _ _ _ Hpost conversion_profile as Hbound Hbytes
–specialize Hbytes1 ltac:lia
apply Hbytes
reflexivity
–lia

Equal-width scalar classes do not substitute for the selected ABI.

1186Example conversion_bad_abi: ¬mbrtowc_abiCVoid ArgP Const0; ArgP Const1; ArgW Const2; ArgP Const3
Explore proof 2 tactics

Initial goal

intros _ & out & src & n & state & Hbad

out, src, n, state :
Hbad :
ArgP Const0; ArgP Const1; ArgW Const2; ArgP Const3 = ArgP out; ArgP src; ArgL n; ArgP state
⊢
False

discriminate Hbad

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros _ & out & src & n & state & Hbad
discriminate Hbad

A temporary private allocation may receive a private capability and then be freed. Its historical aux entry need not be erased: the frame protects entry objects, not nonexistent caller ownership at 8192. This is a logical effects witness, not evidence of native decoding.

1194Definition conversion_cached: mem ≔
Proof 52 steps Qed
eapply InterpLibc.E.effects_alloc with align := 16 size := 32 base := 8192
–eexists ; eexists ; eexists ; eexists
split ; reflexivity |
split ; discriminate |
auto
lia
–reflexivity
apply local_store_pointer_ _ _ _ _ 8192 mkPtr4096 Ro4096
∗intros a Ha
right
exists 8192, mkRegion8192 8224 Heap Live
split ; simpl ; auto |
split ; reflexivity |
repeat split ; try reflexivity ; simpl in * ; lia
∗right
left
split ; | reflexivity
simpl
simpl
auto
+eapply InterpLibc.E.effects_local ; | constructor
split
∗intros base reg Hreg
change if 8192 =? base then SomemkRegion8192 8224 Heap Live else object_regionbase m_regionsconversion_mem = Somereg in Hreg
change ∃reg′, if 8192 =? base then SomemkRegion8192 8192 Heap Freed else object_regionbase m_regionsconversion_mem = Somereg′
destruct 8192 =? base ; eexists ; reflexivity | eauto
∗split
--intros base reg Hreg
change if 8192 =? base then SomemkRegion8192 8192 Heap Freed else object_regionbase m_regionsconversion_mem = Somereg in Hreg
change ∃old, if 8192 =? base then SomemkRegion8192 8224 Heap Live else object_regionbase m_regionsconversion_mem = Someold ∧ reg = old ∨ Inbase [ ] ++ 8192 ∧ r_kindold = Heap ∧ r_lifeold = Live ∧ reg = mkRegionbase base Heap Freed
destruct 8192 =? base eqn: Hbase
++apply Z.eqb_eq in Hbase
subst base
injection Hreg as ←
exists mkRegion8192 8224 Heap Live
split ; reflexivity |
right
repeat split ; simpl ; auto
++exists reg
auto
--split
++intros a _
split ; reflexivity
++intros a
left
reflexivity
Explore proof 46 tactics

Initial goal

split

2 open

focused goal

–exact conversion_cleanup_effects

deferred goal

–split ; reflexivity |

split

2 open

focused goal

+split ; exact I |

2 open

deferred goal

split

3 open

focused goal
deferred goal

∗split ; exact I |

3 open

deferred goal
deferred goal

split ; constructor |

3 open

deferred goal
deferred goal

split

4 open

focused goal
deferred goal
deferred goal

--intros category _

4 open

deferred goal
deferred goal
deferred goal

vm_compute

4 open

category :
Z
⊢
4096 = 0 → False ∧ Someok = Someok ∧ Datatypes.Lt = Datatypes.Lt ∧ Datatypes.Lt = Datatypes.Lt ∧ 67 = 67 ∧ 0 = 0
deferred goal
deferred goal
deferred goal

repeat split ; congruence

3 open

deferred goal
deferred goal
deferred goal

--split ; constructor |

3 open

deferred goal
deferred goal

split ; constructor |

3 open

deferred goal
deferred goal

intros category _

3 open

category :
Z
⊢
∃base : Z, ptr_caplocale_namelibc_localefstconversion_world category = Objbase ∨ ptr_caplocale_namelibc_localefstconversion_world category = Robase ∧ base mod 8 = 0
deferred goal
deferred goal

exists 4096

3 open

category :
Z
⊢
ptr_caplocale_namelibc_localefstconversion_world category = Obj4096 ∨ ptr_caplocale_namelibc_localefstconversion_world category = Ro4096 ∧ 4096 mod 8 = 0
deferred goal
deferred goal

split ; right ; reflexivity | reflexivity

2 open

deferred goal
deferred goal

∗split ; constructor |

2 open

deferred goal

split

3 open

focused goal
deferred goal

--split ; discriminate |

3 open

deferred goal
deferred goal

split ; | reflexivity

3 open

deferred goal
deferred goal

split ; change 0 ≤ 4 ; lia |

3 open

deferred goal
deferred goal

exists 5120, mkRegion5120 5128 Heap Live

3 open

deferred goal
deferred goal

repeat split ; reflexivity

2 open

deferred goal
deferred goal

--split ; apply stdout_initial_wf |

2 open

deferred goal

split ; constructor |

2 open

deferred goal

split ; simpl ; lia | exact I

deferred goal

+split ; apply locale_unchanged_refl |

split

2 open

focused goal

∗split ; intros root Hfalse ; contradiction |

2 open

deferred goal

split

3 open

focused goal
deferred goal

--intros category Hcat

3 open

deferred goal
deferred goal

apply locale_name_retained

3 open

category :
Z
Hcat :
⊢
deferred goal
deferred goal

exact Hcat

2 open

deferred goal
deferred goal

--split ; intros source Hfalse ; contradiction | intros base Hfalse ; contradiction

deferred goal

∗split ; reflexivity |

split ; reflexivity |

split ; reflexivity |

split ; reflexivity |

intros a base & reg & Hreg & Hrange _

a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg

assert a < 5128 as Hbound

2 open

a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg
⊢
a < 5128
focused goal
a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg
Hbound :
a < 5128

{cbn [ conversion_mem m_regions object_region r_base ] in Hreg

2 open

a, base :
Z
reg :
Hreg :
1024 =? base
→
Somer_base ≔ 1024; r_end ≔ 1056; r_kind ≔ GlobalData; r_life ≔ Live
2048 =? base
→
Somer_base ≔ 2048; r_end ≔ 2056; r_kind ≔ Stack; r_life ≔ Live
3072 =? base
→
Somer_base ≔ 3072; r_end ≔ 3080; r_kind ≔ Stack; r_life ≔ Live
4096 =? base
→
Somer_base ≔ 4096; r_end ≔ 4104; r_kind ≔ GlobalData; r_life ≔ Live
5120 =? base
→
Somer_base ≔ 5120; r_end ≔ 5128; r_kind ≔ Heap; r_life ≔ Live
else
None
=
Somereg
Hrange :
base ≤ a < r_endreg
⊢
a < 5128
deferred goal
a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg
Hbound :
a < 5128

repeat match type of Hreg withcontext [?x =? base]⇒destruct x =? base eqn: Hbase ; apply Z.eqb_eq in Hbase ; subst base ; injection Hreg as ← ; cbn in Hrange ; lia | clear Hbaseend;discriminate Hreg

deferred goal
a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg
Hbound :
a < 5128

change if a =? 8192 then Ro4096 else CNone = CNone

a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg
Hbound :
a < 5128
⊢
a =? 8192
→
Ro4096
else
=

rewrite proj2Z.eqb_neqa 8192 ltac:lia

a, base :
Z
reg :
Hrange :
base ≤ a < r_endreg
Hbound :
a < 5128
⊢

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–split ; reflexivity |
split
+split ; exact I |
split
∗split ; exact I |
split ; constructor |
split
--intros category _
vm_compute
repeat split ; congruence
--split ; constructor |
split ; constructor |
intros category _
exists 4096
split ; right ; reflexivity | reflexivity
∗split ; constructor |
split
--split ; discriminate |
split ; | reflexivity
split ; change 0 ≤ 4 ; lia |
exists 5120, mkRegion5120 5128 Heap Live
repeat split ; reflexivity
--split ; apply stdout_initial_wf |
split ; constructor |
split ; simpl ; lia | exact I
+split ; apply locale_unchanged_refl |
split
∗split ; intros root Hfalse ; contradiction |
split
--intros category Hcat
exact Hcat
--split ; intros source Hfalse ; contradiction | intros base Hfalse ; contradiction
∗split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
split ; reflexivity |
intros a base & reg & Hreg & Hrange _
assert a < 5128 as Hbound
repeat match type of Hreg withcontext [?x =? base]⇒destruct x =? base eqn: Hbase ; apply Z.eqb_eq in Hbase ; subst base ; injection Hreg as ← ; cbn in Hrange ; lia | clear Hbaseend;discriminate Hreg
change if a =? 8192 then Ro4096 else CNone = CNone
rewrite proj2Z.eqb_neqa 8192 ltac:lia
reflexivity
Explore proof 27 tactics

Initial goal

split

2 open

focused goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

–eapply InterpLibc.mbrtowc_completed with born := 8192

6 open

focused goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world
focused goal
⊢
1 ≠ 0
focused goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 8192 conversion_mem conversion_world 8192 [ ] 8240 conversion_cleaned conversion_world
focused goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

+split ; left ; reflexivity |

6 open

⊢
∃out src n state : value, conversion_args = ArgP out; ArgP src; ArgL n; ArgP state
deferred goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world
deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 8192 conversion_mem conversion_world 8192 [ ] 8240 conversion_cleaned conversion_world
deferred goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

eexists ; eexists ; eexists ; eexists ; reflexivity

5 open

deferred goal
⊢
mbrtowc_preconversion_valid λ_ : mem _ : libc_world ⇒ True WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 conversion_mem conversion_world
deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 8192 conversion_mem conversion_world 8192 [ ] 8240 conversion_cleaned conversion_world
deferred goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

+apply conversion_pre

5 open

⊢
0 ≤ 1 ≤ 32
deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 8192 conversion_mem conversion_world 8192 [ ] 8240 conversion_cleaned conversion_world
deferred goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

lia

4 open

deferred goal
⊢
1 ≠ 0
deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 8192 conversion_mem conversion_world 8192 [ ] 8240 conversion_cleaned conversion_world
deferred goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

+discriminate

3 open

deferred goal
⊢
InterpLibc.E.prefixmbrtowc_contractconversion_valid conversion_audit λ_ : mem _ : libc_world ⇒ True λ_ : listword _ : mem _ : libc_world align size : Z ⇒ align = 16 ∧ size = 32 WPtrptr_addr ≔ 2048; ptr_cap ≔ Obj2048; WPtrptr_addr ≔ 1024; ptr_cap ≔ Ro1024; WInt1; WPtrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 8192 conversion_mem conversion_world 8192 [ ] 8240 conversion_cleaned conversion_world
deferred goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

+exact conversion_cleanup_prefix

2 open

deferred goal
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

+split ; lia |

2 open

⊢
2 ^ 64 − 2 = 0 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → ∃i : Z, 0 ≤ i < 1 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i = 0 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 = 0 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∨ 0 < 2 ^ 64 − 2 ≤ 1 ∧ 2 ^ 64 − 2 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_cleaned ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 2 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesconversion_cleaned ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

right

2 open

⊢
0 < 2 ^ 64 − 2 ≤ 1 ∧ 2 ^ 64 − 2 < 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ hello_codec_profileconversion_audit conversion_world → 0 < load_bytesconversion_cleaned ptr_addrptr_addr ≔ 2048; ptr_cap ≔ Obj2048 4 < 2 ^ 32 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ ∀i : Z, 0 ≤ i < 2 ^ 64 − 2 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesconversion_cleaned ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

right

2 open

⊢
2 ^ 64 − 2 = 2 ^ 64 − 1 ∧ load_bytesconversion_cleaned ptr_addrlibc_errnofstconversion_world 4 = 84 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ conversion_auditlocale_codeclibc_localefstconversion_world = SomeCodecC → mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 = mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ 128 ≤ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 < 256 ∧ hello_codec_profileconversion_audit conversion_world → load_bytesconversion_mem ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_mem ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 → conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ load_bytesconversion_cleaned ptr_addrptr_addr ≔ 3072; ptr_cap ≔ Obj3072 4 = 0 ∧ m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 ≠ 0 ∨ 2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

right

2 open

⊢
2 ^ 64 − 2 = 2 ^ 64 − 2 ∧ conversion_validlocale_codeclibc_localefstconversion_world mbstate_bytesconversion_cleaned ptr_addr ≔ 3072; ptr_cap ≔ Obj3072 ∧ ∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

split ; reflexivity |

2 open

deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

split ; vm_compute ; split ; repeat constructor ; congruence | auto |

2 open

⊢
∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a ∧ hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

split

3 open

⊢
∀a : Z, span_containsspan_ptr ≔ ptr_addr ≔ 2048; ptr_cap ≔ Obj2048; span_size ≔ 4 a → m_bytesconversion_cleaned a = m_bytesconversion_mem a
focused goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

∗intros a Ha

3 open

deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

change 2048 ≤ a < 2052 in Ha

3 open

a :
Z
Ha :
2048 ≤ a < 2052
deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

change if 8192 ≤? a && a <? 8200 then byte_of4096 a − 8192 else m_bytesconversion_mem a = m_bytesconversion_mem a

3 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
8192 ≤? a && a <? 8200
→
byte_of4096 a − 8192
=
deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

rewrite proj2Z.leb_gt8192 a ltac:lia

3 open

a :
Z
Ha :
2048 ≤ a < 2052
⊢
false && a <? 8200
→
byte_of4096 a − 8192
=
deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

reflexivity

2 open

deferred goal
⊢
hello_codec_profileconversion_audit conversion_world → 1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

∗intros _

2 open

⊢
1 < 16 ∧ ∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

split ; lia |

2 open

⊢
∀i : Z, 0 ≤ i < 1 → m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

intros i Hi

2 open

i :
Z
Hi :
0 ≤ i < 1
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

assert i = 0 by lia

2 open

i :
Z
Hi :
0 ≤ i < 1
H :
i = 0
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + i ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

subst

2 open

Hi :
0 ≤ 0 < 1
⊢
m_bytesconversion_mem ptr_addrptr_addr ≔ 1024; ptr_cap ≔ Ro1024 + 0 ≠ 0
deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

discriminate

deferred goal
⊢
object_region8192 m_regionsconversion_cleaned = Somer_base ≔ 8192; r_end ≔ 8192; r_kind ≔ Heap; r_life ≔ Freed ∧ m_auxconversion_cleaned 8192 = Ro4096

–split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split
–eapply InterpLibc.mbrtowc_completed with born := 8192
+split ; left ; reflexivity |
eexists ; eexists ; eexists ; eexists ; reflexivity
lia
+discriminate
+split ; lia |
right
right
right
split ; reflexivity |
split ; vm_compute ; split ; repeat constructor ; congruence | auto |
split
∗intros a Ha
change 2048 ≤ a < 2052 in Ha
change if 8192 ≤? a && a <? 8200 then byte_of4096 a − 8192 else m_bytesconversion_mem a = m_bytesconversion_mem a
rewrite proj2Z.leb_gt8192 a ltac:lia
reflexivity
∗intros _
split ; lia |
intros i Hi
assert i = 0 by lia
subst
discriminate
–split ; reflexivity

Projection/envelope controls only: the placeholder public cells are not admitted getopt state, and True is not native initialization.

1306Module LibcGetoptChecks

Vary only the parser component of an existing libc fixture.

Changing optarg/optind does not force any unrelated world change.

Explore proof 1 tactics

Initial goal

⊢
libc_getopt_stableworldptr_addr ≔ 0; ptr_cap ≔ CNone 1 worldptr_addr ≔ 1025; ptr_cap ≔ Ro1024 2 ∧ getopt_optarglibc_getopt_viewworldptr_addr ≔ 1025; ptr_cap ≔ Ro1024 2 = ptr_addr ≔ 1025; ptr_cap ≔ Ro1024 ∧ getopt_optindlibc_getopt_viewworldptr_addr ≔ 0; ptr_cap ≔ CNone 1 = 1 ∧ getopt_optindlibc_getopt_viewworldptr_addr ≔ 1025; ptr_cap ≔ Ro1024 2 = 2

repeat split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
repeat split ; reflexivity

Endpoint envelope predicates can coexist without equating their native parameters. This is not an invocation or adequacy witness.

1326Example completed_inflight_overlap: libc_getopt_repλ_ _ ⇒ True conversion_mem conversion_world ∧ libc_getopt_inflightλ_ _ ⇒ True conversion_mem conversion_world
Explore proof 1 tactics

Initial goal

split ; split ; try reflexivity ; exact proj1conversion_pre1 ltac:lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; split ; try reflexivity ; exact proj1conversion_pre1 ltac:lia

A running envelope cannot manufacture completed initialization.

1334Example running_not_initialized: libc_getopt_inflightλ_ _ ⇒ True conversion_mem conversion_world ∧ ¬libc_getopt_repλ_ _ ⇒ False conversion_mem conversion_world
Explore proof 3 tactics

Initial goal

split ; exact proj2completed_inflight_overlap |

intros Hfalse _ _

Hfalse :
False
⊢
False

exact Hfalse

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; exact proj2completed_inflight_overlap |
intros Hfalse _ _
exact Hfalse