Zero-length stream copies within one component instance trap for non-numeric payloads

Aperta
#753 1 commento 1 reazione 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 4 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Ambito
compilers

Direzione di ricerca

Start with the linked canonical ABI definition and compare its non-numeric payload trap condition with the zero-length stream read in the WAST example. Reproduce the case with Wasmtime and determine whether the implementation or the specification needs an update; done means the behavior and expected test result are resolved.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

This test:

;; With a write pending on a `stream<string>`, a zero-length read from the
;; same component instance copies nothing and returns COMPLETED(0).
(component
  (core module $libc
    (memory (export "memory") 1)
    (func (export "realloc") (param i32 i32 i32 i32) (result i32) unreachable))
  (core instance $libc (instantiate $libc))
  (type $stream (stream string))
  (core func $stream.new (canon stream.new $stream))
  (core func $stream.read (canon stream.read $stream async
    (memory (core memory $libc "memory")) (realloc (core func $libc "realloc"))))
  (core func $stream.write (canon stream.write $stream async
    (memory (core memory $libc "memory"))))
  (core module $m
    (import "" "stream.new" (func $stream.new (result i64)))
    (import "" "stream.read" (func $stream.read (param i32 i32 i32) (result i32)))
    (import "" "stream.write" (func $stream.write (param i32 i32 i32) (result i32)))
    (func (export "run") (result i32)
      (local $pair i64)
      (local.set $pair (call $stream.new))
      (if (i32.ne (i32.const -1) ;; BLOCKED
            (call $stream.write
              (i32.wrap_i64 (i64.shr_u (local.get $pair) (i64.const 32)))
              (i32.const 0) (i32.const 1)))
        (then unreachable))
      (call $stream.read (i32.wrap_i64 (local.get $pair)) (i32.const 0) (i32.const 0)))
  )
  (core instance $i (instantiate $m (with "" (instance
    (export "stream.new" (func $stream.new))
    (export "stream.read" (func $stream.read))
    (export "stream.write" (func $stream.write))))))
  (func (export "run") async (result u32) (canon lift (core func $i "run")))
)


(assert_return (invoke "run") (u32.const 0)) ;; COMPLETED(0)

fails in Wasmtime with:

$ wasmtime wast foo.wast
Error: failed to run script file 'foo.wast'

Caused by:
    0: failed directive on foo.wast:39
    1: error while executing at wasm backtrace:
    0:    0x282 - wasm-function[3]
                    at foo.wast:29:8
    2: cannot read from and write to intra-component future/stream with non-numeric payload

but the spec indicates that this test should pass right now as the trap is gated on non-zero-length buffers.

I wanted to flag this as a possible update to the specification (similar to https://github.com/WebAssembly/component-model/issues/750 perhaps) where subjectively I'd expect this to unconditionally fail regardless of the lengths in play, but I may also be showing my biases from #750 too.

Lingua principale
WebAssembly
Stelle
1.4k
Fork
132
Merge medio
4g 14h
PR unite (30g)
12

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di WebAssembly/component-model

Tutte le issue di WebAssembly/component-model

Issue simili

Altre issue su Compilers

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.