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

Ouverte
#753 1 commentaire 1 réaction 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 4 jours

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
45/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Domaine
compilers

Piste de recherche

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.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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.

Langage dominant
WebAssembly
Étoiles
1.4k
Forks
132
Merge moyen
4 j 14 h
PR mergées (30 j)
12

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de WebAssembly/component-model

Toutes les issues de WebAssembly/component-model

Issues similaires

Plus d'issues Compilers

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.