Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Corrupted function argument of type list<list<string>>

Abierto
#348 5 comentarios 0 reacciones 1 asignado Ver en GitHub

@ydnar ya está trabajando en esto.

Desde el 16/5/2025.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

Description
echo "`wit-bindgen-go version` | `tinygo version` | `wasmtime --version` | `uname -m`"
wit-bindgen-go version v0.6.2 | tinygo version 0.37.0 darwin/arm64 (using go version go1.24.3 and LLVM version 19.1.2) | wasmtime 32.0.0 (d3054950c 2025-04-21) | arm64

A function argument of type list<list<string>> is corrupted when passed between two components created using wit-bindgen-go.

The components, host and guest, target the WIT worlds defined below:

world guest {
  ... wasi imports ...
  
  export foo: func(name: list<list<string>>);
}
world host {
  ... wasi imports...

  import foo: func(name: list<list<string>>);

  export wasi:cli/[email protected];
}

Below is the implementation of run in host:

func main() {
        string0 := ...long string literal...
        string1 := ...long string literal...

        name0 := cm.ToList([]string{string0})        
        name1 := cm.ToList([]string{string1})

	name := cm.ToList([]cm.List[string]{name0, name1})

	println("Host:")

	el0 := name.Slice()[0]
	println("name[0]: len =", el0.Len(), "ptr =", el0.Data())

	el1 := name.Slice()[1]
	println("name[1]: len =", el1.Len(), "ptr =", el1.Data())

	Host.Foo(name)
}

And the implementation of foo in guest:

Guest.Exports.Foo = func(name cm.List[cm.List[string]]) {
	println("Guest:")

	el0 := name.Slice()[0]
	println("name[0]: len =", el0.Len(), "ptr =", el0.Data())

	el1 := name.Slice()[1]
	println("name[1]: len =", el1.Len(), "ptr =", el1.Data())
}

Component Model bindings are generated using wit-bindgen-go v0.6.2. The components are compiled with TinyGo and executed with Wasmtime.

Steps to reproduce

Here is a zipped directory that reproduces the bug: test-case.zip

  1. Unzip test-case.zip
  2. cd go-list-list-string
  3. Build and run with ./verify.sh
Expected behavior

The following message should be written to standard output:

Host:
name[0]: len = 0x00000001 ptr = ...
name[1]: len = 0x00000001 ptr = ...
Guest:
name[0]: len = 0x00000001 ptr = ...
name[1]: len = 0x00000001 ptr = ...

Specifically, the lengths printed by each component should be the same.

Actual behavior

The length of name[0] printed by guest is incorrect.

I get the following output:

Host:
name[0]: len = 0x00000001 ptr = 0x0004f570
name[1]: len = 0x00000001 ptr = 0x0004f590
Guest:
name[0]: len = 0xc22490c3 ptr = 0x0d87c35d
name[1]: len = 0x00000001 ptr = 0x00027560

Notes:

  • The string literals were reduced as much as possible in an earlier version of the test case, but can likely be further reduced in the attached test case.
  • The buggy behavior disappears if -gc leaking is passed to TinyGo.
Additional context

The Go programs are derived from a test case produced by a differential testing framework for WIT binding generators. The WIT definitions are derived from a test case produced by wit-smith.

Lenguaje dominante
Go
Estrellas
148
Forks
20
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de bytecodealliance/go-modules

Todos los issues de bytecodealliance/go-modules

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.