v1.11.0
Headline: the shadow-stack bound is now surfaced in the component's WIT result
AND falsified against real execution (FEAT-021 slice-2). v1.10 computed the
bound in the native crate; v1.11 exposes it through the shipped //:scry
component and adds a live kill-criterion: a self-measuring fixture's true
runtime __stack_pointer peak is cross-checked ≤ the reported bound.
Added — FEAT-021 slice-2b (live kill-criterion)
- Runtime peak vs. reported bound (
scry-host-tests):fixture-16-stack- measuredself-measures its peak — each function recordsmin(min_sp, sp)
(viaselect) into an exported global after lowering the__stack_pointer.
run_concrete_peak_stackruns it in core wasmtime and reads
sp_init − min_sp;fixture_16_runtime_peak_within_boundasserts the
component'smax-stack-bytes(decoded from the composed component) is≥that
measured peak (here48 ≥ 48). This makes the FEAT-021 kill-criterion live:
an analyzer that under-counts a real run fails CI. - Native oracle
feat021_measured_chain_bound(the analyzer reportsbytes(48)
on the two-mutable-global fixture, resolving SP to global 0). Fixture-16 added
to the live scry-mcdc corpus (multi-SP-candidateresolve_sp_globalpath).
Added — FEAT-021 slice-2a (shadow-stack bound surfaced in WIT)
stack-usageis now part of the analyzer's WIT result (scry.wit): a
stack-boundvariant (bytes(u64)/unbounded/unknown), a
function-stackrecord (per-function frame + subtree max), and a
stack-usagerecord (sp-global,functions,max-stack-bytes) added to
analysis-result. The component wrapper converts the coreStackUsageto
the WIT shape. Additive (no existing field changed); the dynamic-Valhost
decoders match fields by name, so prior consumers are unaffected.- Host oracle through the composed component (
scry-host-tests):
fixture_12_stack_bound_via_componentanalyzes the chain fixture via the
shipped//:scrycomponent and assertsmax-stack-bytes = bytes(56);
fixture-13→unbounded,fixture-14→unknown. This proves the bound
flows end-to-end through the real artifact, not just the native crate.
Falsification statement
What v1.11 claims: scry's reported max-stack-bytes (read from the shipped
component's WIT result) is ≥ the true peak shadow-stack usage of a real
execution. Falsifier: fixture-16-stack-measured records its actual runtime
__stack_pointer peak; if the component's reported bound is ever < that
measured peak, CI fails (the analyzer under-counted a real run). Does not
claim the bound is tight, nor anything for recursion / dynamic frames / host
stack (reported unbounded / unknown / out of scope as before). No
version-number behaviour change beyond surfacing the existing bound in WIT;
SCRY_VERSION → 1.11.0.