Skip to content

go/reflect: Incorrect behavior on arm64 when using MakeFunc / Call #52788

@znkr

Description

@znkr

What version of Go are you using (go version)?

go version devel go1.19-c4311a4 Mon May 9 12:32:48 2022 +0000 linux/amd64

Does this issue reproduce with the latest release?

Yes (using gotip)

What operating system and processor architecture are you using (go env)?

QEMU AARCH64 emulation (this bug does not reproduce on x86)

What did you do?

% GOARCH=arm64 gotip build main.go
% qemu-aarch64 main

With main.go

package main

import (
	"fmt"
	"reflect"
)

func f(next func() bool) {
	for b := next(); b; b = next() {
		fmt.Printf("next() returned %v\n", b)
	}
}

func main() {
	next := reflect.MakeFunc(reflect.TypeOf((func() bool)(nil)), func(_ []reflect.Value) []reflect.Value {
		return []reflect.Value{reflect.ValueOf(false)}
	})
	reflect.ValueOf(f).Call([]reflect.Value{next})
}

What did you expect to see?

Empty output

What did you see instead?

unexpected fault address 0x2000051c760
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0x2000051c760 pc=0x91518]

goroutine 1 [running]:
runtime.throw({0xb675b?, 0x56f54?})
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/panic.go:1028 +0x40 fp=0x400005f500 sp=0x400005f4d0 pc=0x40c40
runtime.sigpanic()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/signal_unix.go:830 +0x1a0 fp=0x400005f530 sp=0x400005f500 pc=0x55a10
fmt.(*pp).printArg(0x400010a680, {0xa65a0?, 0x2000051c760}, 0x76)
        /usr/local/google/home/floriank/sdk/gotip/src/fmt/print.go:661 +0x508 fp=0x400005f5e0 sp=0x400005f540 pc=0x91518
fmt.(*pp).doPrintf(0x400010a680, {0xb8d75, 0x13}, {0x400005f788?, 0x1, 0x1})
        /usr/local/google/home/floriank/sdk/gotip/src/fmt/print.go:1026 +0x210 fp=0x400005f6e0 sp=0x400005f5e0 pc=0x93f60
fmt.Fprintf({0xd77d8, 0x400000e018}, {0xb8d75, 0x13}, {0x400005f788, 0x1, 0x1})
        /usr/local/google/home/floriank/sdk/gotip/src/fmt/print.go:204 +0x54 fp=0x400005f740 sp=0x400005f6e0 pc=0x8e7a4
fmt.Printf(...)
        /usr/local/google/home/floriank/sdk/gotip/src/fmt/print.go:213
main.f(0x400007a240)
        /usr/local/google/home/floriank/bug/main.go:10 +0x80 fp=0x400005f7a0 sp=0x400005f740 pc=0x94e00
runtime.call16(0x400007a270, 0xbf058, 0x0, 0x0, 0x0, 0x8, 0x400005fce0)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/asm_arm64.s:461 +0x78 fp=0x400005f7c0 sp=0x400005f7a0 pc=0x6a488
runtime.reflectcall(0xa6860?, 0x400007a240?, 0x1?, 0xb8a18?, 0x0?, 0x12?, 0xa6860?)
        :1 +0x34 fp=0x400005f800 sp=0x400005f7c0 pc=0x6de14
reflect.Value.call({0xa6b20?, 0xbf058?, 0x1?}, {0xb6601, 0x4}, {0x4000104f50, 0x1, 0x1?})
        /usr/local/google/home/floriank/sdk/gotip/src/reflect/value.go:585 +0x61c fp=0x400005fe70 sp=0x400005f800 pc=0x819cc
reflect.Value.Call({0xa6b20?, 0xbf058?, 0xbf060?}, {0x4000104f50?, 0x0?, 0x0?})
        /usr/local/google/home/floriank/sdk/gotip/src/reflect/value.go:368 +0x90 fp=0x400005fef0 sp=0x400005fe70 pc=0x81300
main.main()
        /usr/local/google/home/floriank/bug/main.go:18 +0x148 fp=0x400005ff70 sp=0x400005fef0 pc=0x950d8
runtime.main()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:250 +0x254 fp=0x400005ffd0 sp=0x400005ff70 pc=0x43234
runtime.goexit()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/asm_arm64.s:1155 +0x4 fp=0x400005ffd0 sp=0x400005ffd0 pc=0x6c4a4

goroutine 2 [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:363 +0xe4 fp=0x400004efa0 sp=0x400004ef80 pc=0x43604
runtime.goparkunlock(...)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:369
runtime.forcegchelper()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:302 +0xb4 fp=0x400004efd0 sp=0x400004efa0 pc=0x43494
runtime.goexit()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/asm_arm64.s:1155 +0x4 fp=0x400004efd0 sp=0x400004efd0 pc=0x6c4a4
created by runtime.init.6
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:290 +0x24

goroutine 3 [GC sweep wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:363 +0xe4 fp=0x400004f770 sp=0x400004f750 pc=0x43604
runtime.goparkunlock(...)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:369
runtime.bgsweep(0x0?)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgcsweep.go:278 +0xa4 fp=0x400004f7b0 sp=0x400004f770 pc=0x309e4
runtime.gcenable.func1()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgc.go:178 +0x28 fp=0x400004f7d0 sp=0x400004f7b0 pc=0x25408
runtime.goexit()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/asm_arm64.s:1155 +0x4 fp=0x400004f7d0 sp=0x400004f7d0 pc=0x6c4a4
created by runtime.gcenable
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgc.go:178 +0x70

goroutine 4 [GC scavenge wait]:
runtime.gopark(0x4000074000?, 0xd71a8?, 0x1?, 0x0?, 0x0?)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:363 +0xe4 fp=0x400004ff50 sp=0x400004ff30 pc=0x43604
runtime.goparkunlock(...)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:369
runtime.(*scavengerState).park(0x158600)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgcscavenge.go:389 +0x5c fp=0x400004ff80 sp=0x400004ff50 pc=0x2ea0c
runtime.bgscavenge(0x0?)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgcscavenge.go:617 +0x44 fp=0x400004ffb0 sp=0x400004ff80 pc=0x2ef74
runtime.gcenable.func2()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgc.go:179 +0x28 fp=0x400004ffd0 sp=0x400004ffb0 pc=0x253a8
runtime.goexit()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/asm_arm64.s:1155 +0x4 fp=0x400004ffd0 sp=0x400004ffd0 pc=0x6c4a4
created by runtime.gcenable
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mgc.go:179 +0xb4

goroutine 5 [finalizer wait]:
runtime.gopark(0x60000000000000?, 0x0?, 0x8?, 0x21?, 0x2000000000?)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:363 +0xe4 fp=0x400004e580 sp=0x400004e560 pc=0x43604
runtime.goparkunlock(...)
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/proc.go:369
runtime.runfinq()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mfinal.go:180 +0x128 fp=0x400004e7d0 sp=0x400004e580 pc=0x24628
runtime.goexit()
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/asm_arm64.s:1155 +0x4 fp=0x400004e7d0 sp=0x400004e7d0 pc=0x6c4a4
created by runtime.createfing
        /usr/local/google/home/floriank/sdk/gotip/src/runtime/mfinal.go:157 +0x94

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.arch-arm64

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions