Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Channel send on "binary" channel panics or errors (at compile-time) #1635

Open
theclapp opened this issue May 20, 2024 · 0 comments
Open

Channel send on "binary" channel panics or errors (at compile-time) #1635

theclapp opened this issue May 20, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@theclapp
Copy link
Contributor

theclapp commented May 20, 2024

The following test case in interp/interp_eval_test.go triggers an unexpected result

func TestChannelSend(t *testing.T) {
	ch := make(chan string, 1)
	var i *interp.Interpreter

	setup := func() {
		i = interp.New(interp.Options{})
		i.Use(interp.Exports{
			"pkg/pkg": {
				"Ch": reflect.ValueOf(&ch).Elem(),
			},
		})
		i.ImportUsed()
	}

	t.Run("send in closure", func(t *testing.T) {
		setup()
		var err error
		require.NotPanics(t, func() {
			_, err = i.Eval(`package main
import . "pkg"
func main() {
	f := func() {
		Ch <- "foo"
	}
	_ = f
}`)
		})
		require.NoError(t, err)
	})

	t.Run("send by itself", func(t *testing.T) {
		setup()
		var err error
		require.NotPanics(t, func() {
			_, err = i.Eval(`package main
import . "pkg"
func main() {
	Ch <- "foo"
}`)
		})
		require.NoError(t, err)
		require.Equal(t, 1, len(ch))
		st := <-ch
		assert.Equal(t, "foo", st)
	})
}

Expected result

All tests pass without panicking

Got

"send in closure" panics at compile-time (of the Eval), "send by itself" errors in Eval.

% go test ./interp -run TestChannelSend
--- FAIL: TestChannelSend (0.00s)
    --- FAIL: TestChannelSend/send_in_closure (0.00s)
        interp_eval_test.go:2184:
                Error Trace:    /src/github.com/traefik/yaegi/interp/interp_eval_test.go:2184
                Error:          func (assert.PanicTestFunc)(0x1122f640) should not panic
                                        Panic value:    4:7: CFG post-order panic: runtime error: invalid memory address or nil pointer dereference
                                        Panic stack:    goroutine 7 [running]:
                                runtime/debug.Stack()
                                        /usr/local/go/src/runtime/debug/stack.go:24 +0x5e
                                github.com/stretchr/testify/assert.didPanic.func1()
                                        /pkg/mod/github.com/stretchr/[email protected]/assert/assertions.go:1196 +0x6b
                                panic({0x1158bb40?, 0xc000012b70?})
                                        /usr/local/go/src/runtime/panic.go:770 +0x132
                                github.com/traefik/yaegi/interp.(*Interpreter).cfg.func2.1()
                                        /src/github.com/traefik/yaegi/interp/cfg.go:611 +0x74
                                panic({0x114cf0e0?, 0x11b3c2d0?})
                                        /usr/local/go/src/runtime/panic.go:770 +0x132
                                github.com/traefik/yaegi/interp.(*itype).refType(0x0?, 0x11b696c8?)
                                        /src/github.com/traefik/yaegi/interp/type.go:2065 +0x7a
                                github.com/traefik/yaegi/interp.(*itype).TypeOf(...)
                                        /src/github.com/traefik/yaegi/interp/type.go:2223
                                github.com/traefik/yaegi/interp.genDestValue(0x0, 0xc00029ca00)
                                        /src/github.com/traefik/yaegi/interp/value.go:157 +0x25
                                github.com/traefik/yaegi/interp.send(0xc00029c780)
                                        /src/github.com/traefik/yaegi/interp/run.go:3687 +0xae
                                github.com/traefik/yaegi/interp.setExec.func1(0xc00029c780)
                                        /src/github.com/traefik/yaegi/interp/cfg.go:2874 +0x202
                                github.com/traefik/yaegi/interp.setExec(0xc00029c780)
                                        /src/github.com/traefik/yaegi/interp/cfg.go:2877 +0xf2
                                github.com/traefik/yaegi/interp.genRun.func1(0xc00029c280)
                                        /src/github.com/traefik/yaegi/interp/cfg.go:2381 +0x90
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc00029c280, 0xc00029b1f8, 0x0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:282 +0x2e
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc000293e00, 0xc00029b1f8, 0x0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:286 +0x6b
                                github.com/traefik/yaegi/interp.genRun(0xc000293e00)
                                        /src/github.com/traefik/yaegi/interp/cfg.go:2372 +0xc5
                                github.com/traefik/yaegi/interp.(*Interpreter).cfg.func2(0xc000293e00)
                                        /src/github.com/traefik/yaegi/interp/cfg.go:1553 +0x2ba7
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc000293e00, 0xc00029bc18, 0xc00029bbc0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:289 +0x9e
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc000293b80, 0xc00029bc18, 0xc00029bbc0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:286 +0x6b
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc000293a40, 0xc00029bc18, 0xc00029bbc0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:286 +0x6b
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc0002932c0, 0xc00029bc18, 0xc00029bbc0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:286 +0x6b
                                github.com/traefik/yaegi/interp.(*node).Walk(0xc000292b40, 0xc00029bc18, 0xc00029bbc0)
                                        /src/github.com/traefik/yaegi/interp/interp.go:286 +0x6b
                                github.com/traefik/yaegi/interp.(*Interpreter).cfg(0xc0000fad88, 0xc000292b40, 0xc0000f6480, {0xc000258208, 0x4}, {0xc000258208, 0x4})
                                        /src/github.com/traefik/yaegi/interp/cfg.go:69 +0x29a
                                github.com/traefik/yaegi/interp.(*Interpreter).CompileAST(0xc0000fad88, {0x115c6ef0?, 0xc0001cb4a0?})
                                        /src/github.com/traefik/yaegi/interp/program.go:97 +0x14d
                                github.com/traefik/yaegi/interp.(*Interpreter).compileSrc(0xc0000fad88, {0x1127f268?, 0xc00008ed98?}, {0x0?, 0x1093a6a0?}, 0xf?)
                                        /src/github.com/traefik/yaegi/interp/program.go:64 +0xaa
                                github.com/traefik/yaegi/interp.(*Interpreter).eval(0xc0000fad88, {0x1127f268?, 0xc00008ede0?}, {0x0?, 0xc0000cba00?},0x38?)
                                        /src/github.com/traefik/yaegi/interp/interp.go:554 +0x25
                                github.com/traefik/yaegi/interp.(*Interpreter).Eval(...)
                                        /src/github.com/traefik/yaegi/interp/interp.go:496
                                github.com/traefik/yaegi/interp_test.TestChannelSend.func2.1()
                                        /src/github.com/traefik/yaegi/interp/interp_eval_test.go:2185 +0x39
                                github.com/stretchr/testify/assert.didPanic(0x11b417a0?)
                                        /pkg/mod/github.com/stretchr/[email protected]/assert/assertions.go:1201 +0x82
                                github.com/stretchr/testify/assert.NotPanics({0x115c3ab8, 0xc0000cba00}, 0xc000012a38, {0x0, 0x0, 0x0})
                                        /pkg/mod/github.com/stretchr/[email protected]/assert/assertions.go:1272 +0x7e
                                github.com/stretchr/testify/require.NotPanics({0x115c7710, 0xc0000cba00}, 0xc000012a38, {0x0, 0x0, 0x0})
                                        /pkg/mod/github.com/stretchr/[email protected]/require/require.go:1605 +0xa6
                                github.com/traefik/yaegi/interp_test.TestChannelSend.func2(0xc0000cba00)
                                        /src/github.com/traefik/yaegi/interp/interp_eval_test.go:2184 +0xa7
                                testing.tRunner(0xc0000cba00, 0xc0000129d8)
                                        /usr/local/go/src/testing/testing.go:1689 +0xfb
                                created by testing.(*T).Run in goroutine 6
                                        /usr/local/go/src/testing/testing.go:1742 +0x390
                Test:           TestChannelSend/send_in_closure
    --- FAIL: TestChannelSend/send_by_itself (0.00s)
        interp_eval_test.go:2207:
                Error Trace:    /src/github.com/traefik/yaegi/interp/interp_eval_test.go:2207
                Error:          Received unexpected error:
                                runtime error: invalid memory address or nil pointer dereference
                Test:           TestChannelSend/send_by_itself
FAIL
FAIL    github.com/traefik/yaegi/interp 0.378s
FAIL

Yaegi Version

381e045

Additional Notes

No response

@ldez ldez added the bug Something isn't working label May 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants