v0.33.1 — call_indirect bounds+type guards, i64 globals (#642/#643)
Two gale-filed silent miscompiles fixed same-day.
Fixed
- call_indirect emitted no bounds-check and no type-check (#642, PR #646, both ISAs). OOB/wrong-typed indices performed an uncontrolled indirect branch — the differential's decoy function actually got called on ≤v0.33.0. Now: runtime bounds guard (
CMP idx, #table_size; BLO; UDF— sound immediate: table.grow/set loud-skip so the table is provably fixed-size) + compile-time closed-world type verification (structural signature equality over every slot; anything unverifiable → loud decline). New CI oracle job. - i64 global.set/get truncated to 32 bits (#643, PR #645). Width-aware slot layout (i32-only modules bit-identical by construction), pair lowering on the direct path, honest decline routing elsewhere, i32-after-i64 layout-shift canary in the differential. RV32 already sound.
Platform binaries attach ~10 min after the tag.
🤖 Generated with Claude Code