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

cmd/compile: compiler crash with -m -h #31638

Closed
bradfitz opened this issue Apr 23, 2019 · 2 comments
Closed

cmd/compile: compiler crash with -m -h #31638

bradfitz opened this issue Apr 23, 2019 · 2 comments

Comments

@bradfitz
Copy link
Contributor

Just hit this compiler crash....

bradfitz@go:~/go/src/unicode/utf8$ go version
go version devel +8515d9cf65 Tue Apr 23 17:58:12 2019 +0000 linux/amd64

bradfitz@go:~/go/src/unicode/utf8$ git di
diff --git a/src/unicode/utf8/utf8.go b/src/unicode/utf8/utf8.go
index db845ab2f2..b2b5308311 100644
--- a/src/unicode/utf8/utf8.go
+++ b/src/unicode/utf8/utf8.go
@@ -147,10 +147,19 @@ func FullRuneInString(s string) bool {
 // out of range, or is not the shortest possible UTF-8 encoding for the
 // value. No other validation is performed.
 func DecodeRune(p []byte) (r rune, size int) {
-       n := len(p)
-       if n < 1 {
-               return RuneError, 0
+       if len(p) != 0 {
+               r = rune(p[0])
+               if r < 127 {
+                       size = 1
+                       return
+               }
        }
+       return decodeRuneSlow(&p)
+}
+
+func decodeRuneSlow(pp *[]byte) (r rune, size int) {
+       p := *pp
+       n := len(p)
        p0 := p[0]
        x := first[p0]
        if x >= as {

bradfitz@go:~/go/src/unicode/utf8$ go tool compile -m -h utf8.go
utf8.go:102:6: can inline FullRune
utf8.go:122:6: can inline FullRuneInString
utf8.go:454:6: can inline RuneStart
utf8.go:272:15: inlining call to RuneStart
utf8.go:312:15: inlining call to RuneStart
utf8.go:328:6: can inline RuneLen
utf8.go:522:6: can inline ValidRune
utf8.go:102:15: FullRune p does not escape
utf8.go:122:23: FullRuneInString s does not escape
utf8.go:160:21: decodeRuneSlow pp does not escape
utf8.go:149:17: DecodeRune p does not escape
utf8.go:206:25: DecodeRuneInString s does not escape
utf8.go:254:21: DecodeLastRune p does not escape
utf8.go:294:29: DecodeLastRuneInString s does not escape
utf8.go:348:17: EncodeRune p does not escape
utf8.go:380:16: RuneCount p does not escape
utf8.go:417:24: RuneCountInString s does not escape
utf8.go:457:12: Valid p does not escape
utf8.go:489:18: ValidString s does not escape
utf8.go:107:12: index bounds check elided
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xc855cb]

goroutine 1 [running]:
cmd/compile/internal/gc.hcrash()
        /home/bradfitz/go/src/cmd/compile/internal/gc/subr.go:99 +0x4b
cmd/compile/internal/gc.Warn(0xde8c59, 0x19, 0x0, 0x0, 0x0)
        /home/bradfitz/go/src/cmd/compile/internal/gc/subr.go:164 +0x64
cmd/compile/internal/gc.walkexpr(0xc00039cd00, 0xc0003355b0, 0xc00039a500)
        /home/bradfitz/go/src/cmd/compile/internal/gc/walk.go:1050 +0x6a35
cmd/compile/internal/gc.walkexpr(0xc00039cb80, 0xc0003355b0, 0x0)
        /home/bradfitz/go/src/cmd/compile/internal/gc/walk.go:642 +0x18f9
cmd/compile/internal/gc.walkstmt(0xc00039cb80, 0xc00039cd80)
        /home/bradfitz/go/src/cmd/compile/internal/gc/walk.go:159 +0xd94
cmd/compile/internal/gc.walkstmtlist(0xc00044e800, 0xa, 0x10)
        /home/bradfitz/go/src/cmd/compile/internal/gc/walk.go:79 +0x46
cmd/compile/internal/gc.walk(0xc0002d0160)
        /home/bradfitz/go/src/cmd/compile/internal/gc/walk.go:63 +0x3da
cmd/compile/internal/gc.compile(0xc0002d0160)
        /home/bradfitz/go/src/cmd/compile/internal/gc/pgen.go:235 +0x6b
cmd/compile/internal/gc.funccompile(0xc0002d0160)
        /home/bradfitz/go/src/cmd/compile/internal/gc/pgen.go:221 +0xc1
cmd/compile/internal/gc.Main(0xdfe308)
        /home/bradfitz/go/src/cmd/compile/internal/gc/main.go:668 +0x307a
main.main()
        /home/bradfitz/go/src/cmd/compile/main.go:51 +0xac

/cc @josharian @mdempsky @griesemer

@randall77
Copy link
Contributor

For some reason the Warn function intentionally crashes the program if -h is given (unlike the Warnl function). Probably only errors should do that.

It looks like it has been that way since at least 2015.

@gopherbot
Copy link

Change https://golang.org/cl/173443 mentions this issue: cmd/compile: don't call hcrash in Warn

@golang golang locked and limited conversation to collaborators Apr 22, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants