← All reports

WebAssembly wide-arithmetic proposal enabled by default

Component: JSC WebAssembly | ba4ffde

JSC는 WebAssembly를 여러 tier에 걸쳐 컴파일합니다. LLInt interpreter, BBQ baseline JIT, 그리고 B3/Air 기반의 OMG optimizing JIT가 여기에 해당합니다. 이때 각 tier는 모든 opcode의 semantics와 register allocation을 독립적으로 구현합니다. 이번 commit으로 WebAssembly "wide arithmetic" proposal이 기본 활성화되었습니다. 그동안 flag 뒤에 막혀 있던 128-bit pair 정수 opcode(add128/sub128/mul_wide 및 carry/widening 변형)가 켜졌고, WPT conformance suite도 함께 import되었습니다.

실험 단계에 있던 128-bit pair opcode decoding과 multi-tier JIT codegen이 이제 모든 웹사이트의 untrusted content에서 기본적으로 도달 가능한 상태입니다. Wide arithmetic은 두 개의 register 또는 stack slot에 걸친 i64 값 쌍을 다룹니다. 문제는 carry 전파와 overflow semantics를 모든 tier가 동일하게 구현해야 한다는 점입니다.

공격자가 Wasm을 완전히 제어할 수 있는 만큼, carry/overflow 처리나 register pair allocation의 correctness 버그는 곧바로 miscompilation이나 memory-safety 문제로 이어집니다. Narrow: 각 tier의 add128/sub128/mul_wide codegen을 살펴보고, carry를 담는 register가 tier마다 달라지지 않는지 확인할 필요가 있습니다. Wider: 두 slot에 걸친 값 쌍을 다루는 opcode는 모두 같은 부류에 속합니다. 따라서 LLInt/BBQ/OMG 전반의 i64 pair 처리를 점검하고, OSR 경계에서 일관성이 유지되는지 확인해야 합니다. Widest: 판별 신호는 tier마다 operand 개수가 달라지는 신규 opcode입니다. 두 half를 pair 단위가 아니라 각각 독립적으로 allocate하는 opcode도 마찬가지입니다.