Repository navigation
swagger generate spec panics with "invalid memory address or nil pointer dereference" on Go 1.24.6 #3225
Copy link
Copy link
Labels
Description
I am experiencing a crash when running swagger generate spec on my project. It consistently panics with a nil pointer dereference, and I cannot upgrade Swagger at the moment.
[root@vralabs1121 peerserver]# swagger generate spec -w . -o /tmp/peerserver.json
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xafacbe]
goroutine 165 [running]:
go/types.(*Checker).handleBailout(0xc0006a4000, 0xc000a3fc90)
/usr/lib/golang/src/go/types/check.go:434 +0x88
panic({0xc98820?, 0x1603700?})
/usr/lib/golang/src/runtime/panic.go:792 +0x132
go/types.(*StdSizes).Sizeof(0x0, {0xedd9c8, 0x160e840})
/usr/lib/golang/src/go/types/sizes.go:229 +0x31e
go/types.(*Config).sizeof(...)
/usr/lib/golang/src/go/types/sizes.go:334
go/types.representableConst.func1(...)
/usr/lib/golang/src/go/types/const.go:77
go/types.representableConst({0xee1e70, 0xf03418}, 0xc0006a4000, 0x160e840, 0xc000a3ef80)
/usr/lib/golang/src/go/types/const.go:107 +0x387
go/types.(*Checker).representation(0xc0006a4000, 0xc00039bb00, 0x160e840)
/usr/lib/golang/src/go/types/const.go:257 +0x5f
go/types.(*Checker).representable(0xc0006a4000, 0xc00039bb00, 0x160e840)
/usr/lib/golang/src/go/types/const.go:240 +0x26
go/types.(*Checker).shift(0xc0006a4000, 0xc00039ba80, 0xc00039bb00, {0xee0b80, 0xc00089d650}, 0x14)
/usr/lib/golang/src/go/types/expr.go:627 +0x1eb
go/types.(*Checker).binary(0xc0006a4000, 0xc00039ba80, {0xee0b80, 0xc00089d650}, {0xee07c0, 0xc000a282a0}, {0xee07c0, 0xc000a282c0}, 0x14, 0x3882)
/usr/lib/golang/src/go/types/expr.go:769 +0x150
go/types.(*Checker).exprInternal(0xc0006a4000, 0x0, 0xc00039ba80, {0xee0b80, 0xc00089d650}, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/expr.go:1130 +0x6be
go/types.(*Checker).rawExpr(0xc0006a4000, 0x0, 0xc00039ba80, {0xee0b80?, 0xc00089d650?}, {0x0?, 0x0?}, 0x0)
/usr/lib/golang/src/go/types/expr.go:952 +0x18c
go/types.(*Checker).expr(0xc0006a4000, 0xc0006da670?, 0xc00039ba80, {0xee0b80?, 0xc00089d650?})
/usr/lib/golang/src/go/types/expr.go:1227 +0x30
go/types.(*Checker).binary(0xc0006a4000, 0xc00039ba80, {0xee0b80, 0xc00089d680}, {0xee0b80, 0xc00089d650}, {0xee07c0, 0xc000a282e0}, 0xd, 0x3886)
/usr/lib/golang/src/go/types/expr.go:756 +0xa5
go/types.(*Checker).exprInternal(0xc0006a4000, 0x0, 0xc00039ba80, {0xee0b80, 0xc00089d680}, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/expr.go:1130 +0x6be
go/types.(*Checker).rawExpr(0xc0006a4000, 0x0, 0xc00039ba80, {0xee0b80?, 0xc00089d680?}, {0x0?, 0x0?}, 0x0)
/usr/lib/golang/src/go/types/expr.go:952 +0x18c
go/types.(*Checker).expr(0xc0006a4000, 0xc000a7b800?, 0xc00039ba80, {0xee0b80?, 0xc00089d680?})
/usr/lib/golang/src/go/types/expr.go:1227 +0x30
go/types.(*Checker).constDecl(0xc0006a4000, 0xc000a7b860, {0x0, 0x0}, {0xee0b80, 0xc00089d680}, 0x0)
/usr/lib/golang/src/go/types/decl.go:473 +0x2b8
go/types.(*Checker).objDecl(0xc0006a4000, {0xee92f8, 0xc000a7b860}, 0x0)
/usr/lib/golang/src/go/types/decl.go:184 +0x98c
go/types.(*Checker).packageObjects(0xc0006a4000)
/usr/lib/golang/src/go/types/resolver.go:690 +0x471
go/types.(*Checker).checkFiles(0xc0006a4000, {0xc000424010?, 0xabbb05?, 0xd4eba0?})
/usr/lib/golang/src/go/types/check.go:489 +0x2a6
go/types.(*Checker).Files(0xc00017c1c0?, {0xc000424010?, 0xc000a16120?, 0x4?})
/usr/lib/golang/src/go/types/check.go:452 +0x75
golang.org/x/tools/go/packages.(*loader).loadPackage(0xc00017c1c0, 0xc0006f7640)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:955 +0x70f
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1()
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:793 +0x1a9
sync.(*Once).doSlow(0x0?, 0x0?)
/usr/lib/golang/src/sync/once.go:78 +0xab
sync.(*Once).Do(...)
/usr/lib/golang/src/sync/once.go:69
golang.org/x/tools/go/packages.(*loader).loadRecursive(0x0?, 0x0?)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:781 +0x3b
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1.1(0x0?)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:788 +0x26
created by golang.org/x/tools/go/packages.(*loader).loadRecursive.func1 in goroutine 139
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:787 +0x94
[root@vralabs1121 peerserver]#
[root@vralabs1121 peerserver]# go version
go version go1.24.6 (Red Hat 1.24.6-1.module+el8.10.0+23407+428597c7) linux/amd64
[root@vralabs1121 peerserver]# swagger version
version: v0.27.0
commit: (unknown, mod sum: "h1:K7+nkBuf4oS1jTBrdvWqYFpqD69V5CN8HamZzCDDhAI=")
[root@vralabs1121 peerserver]#
Reactions are currently unavailable
Activity
fredbi commentedon Aug 30, 2025
Could you please add the code you are trying to scan, or at least a minimal repro case? Thanks
ShivaliBandi commentedon Sep 5, 2025
[root@vralabs1121 peer]# make docs
mkdir -p /workspace/thunder/services/peer/build_dir/docs
&& export SWAGGER_GENERATE_EXTENSION=false
&& swagger generate spec -c flex/services/common/src/error -c ./api/src/peerserver -w ./api/src/peerserver/ -o /workspace/thunder/services/peer/build_dir/docs/peerserver-restapis.json
&& cp ./README.md /
&& cp /workspace/thunder/services/peer/build_dir/docs/peerserver-restapis.json /swagger/
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xafacbe]
goroutine 21 [running]:
go/types.(*Checker).handleBailout(0xc0001963c0, 0xc0007ffc90)
/usr/lib/golang/src/go/types/check.go:434 +0x88
panic({0xc98820?, 0x1603700?})
/usr/lib/golang/src/runtime/panic.go:792 +0x132
go/types.(*StdSizes).Sizeof(0x0, {0xedd9c8, 0x160e7a0})
/usr/lib/golang/src/go/types/sizes.go:229 +0x31e
go/types.(*Config).sizeof(...)
/usr/lib/golang/src/go/types/sizes.go:334
go/types.representableConst.func1(...)
/usr/lib/golang/src/go/types/const.go:77
go/types.representableConst({0xee1e70, 0xf033e0}, 0xc0001963c0, 0x160e7a0, 0xc0007fe910)
/usr/lib/golang/src/go/types/const.go:93 +0x1e9
go/types.(*Checker).representation(0xc0001963c0, 0xc000692900, 0x160e7a0)
/usr/lib/golang/src/go/types/const.go:257 +0x5f
go/types.(*Checker).implicitTypeAndValue(0xc0001963c0, 0xc000692900, {0xedd9c8, 0x160e7a0})
/usr/lib/golang/src/go/types/expr.go:374 +0x6d9
go/types.(*Checker).convertUntyped(0xc0001963c0, 0xc000692900, {0xedd9c8, 0x160e7a0})
/usr/lib/golang/src/go/types/const.go:290 +0x3f
go/types.(*Checker).matchTypes(0xc0001963c0, 0xc000692480, 0xc000692900)
/usr/lib/golang/src/go/types/expr.go:899 +0x315
go/types.(*Checker).binary(0xc0001963c0, 0xc000692480, {0xee0b80, 0xc00088e7b0}, {0xee10c0, 0xc00089f080}, {0xee07c0, 0xc000891660}, 0x27, 0x12f5)
/usr/lib/golang/src/go/types/expr.go:773 +0x166
go/types.(*Checker).exprInternal(0xc0001963c0, 0x0, 0xc000692480, {0xee0b80, 0xc00088e7b0}, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/expr.go:1130 +0x6be
go/types.(*Checker).rawExpr(0xc0001963c0, 0x0, 0xc000692480, {0xee0b80?, 0xc00088e7b0?}, {0x0?, 0x0?}, 0x0)
/usr/lib/golang/src/go/types/expr.go:952 +0x18c
go/types.(*Checker).expr(0xc0001963c0, 0x4e8899e3f709d93d?, 0xc000692480, {0xee0b80?, 0xc00088e7b0?})
/usr/lib/golang/src/go/types/expr.go:1227 +0x30
go/types.(*Checker).binary(0xc0001963c0, 0xc000692440, {0xee0b80, 0xc00088e7e0}, {0xee0b80, 0xc00088e780}, {0xee0b80, 0xc00088e7b0}, 0x22, 0x12e4)
/usr/lib/golang/src/go/types/expr.go:757 +0xcc
go/types.(*Checker).exprInternal(0xc0001963c0, 0x0, 0xc000692440, {0xee0b80, 0xc00088e7e0}, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/expr.go:1130 +0x6be
go/types.(*Checker).rawExpr(0xc0001963c0, 0x0, 0xc000692440, {0xee0b80?, 0xc00088e7e0?}, {0x0?, 0x0?}, 0x0)
/usr/lib/golang/src/go/types/expr.go:952 +0x18c
go/types.(*Checker).expr(0xc0001963c0, 0x160e780?, 0xc000692440, {0xee0b80?, 0xc00088e7e0?})
/usr/lib/golang/src/go/types/expr.go:1227 +0x30
go/types.(*Checker).initVars(0xc0001963c0, {0xc0007f0508, 0x1, 0xc0008913a0?}, {0xc000882440, 0xedd900?, 0xedd900?}, {0xee0df0, 0xc000891680})
/usr/lib/golang/src/go/types/assignments.go:412 +0x608
go/types.(*Checker).stmt(0xc0001963c0, 0x0, {0xee0df0, 0xc000891680})
/usr/lib/golang/src/go/types/stmt.go:575 +0x685
go/types.(*Checker).stmtList(0xc0001963c0, 0x0, {0xc000882450?, 0x1?, 0xc0001963c0?})
/usr/lib/golang/src/go/types/stmt.go:123 +0x85
go/types.(*Checker).funcBody(0xc0001963c0, 0xee0670?, {0xc0008802b0?, 0xc000891360?}, 0xc000692380, 0xc00088e810, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/stmt.go:43 +0x311
go/types.(*Checker).funcDecl.func1()
/usr/lib/golang/src/go/types/decl.go:868 +0x3a
go/types.(*Checker).processDelayed(0xc0001963c0, 0x0)
/usr/lib/golang/src/go/types/check.go:550 +0x1e4
go/types.(*Checker).checkFiles(0xc0001963c0, {0xc000066af0?, 0xabbb05?, 0xd4eba0?})
/usr/lib/golang/src/go/types/check.go:492 +0x336
go/types.(*Checker).Files(0xc000000000?, {0xc000066af0?, 0xc0009b4060?, 0x5?})
/usr/lib/golang/src/go/types/check.go:452 +0x75
golang.org/x/tools/go/packages.(*loader).loadPackage(0xc000000000, 0xc0006d67e0)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:955 +0x70f
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1()
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:793 +0x1a9
sync.(*Once).doSlow(0x0?, 0x0?)
/usr/lib/golang/src/sync/once.go:78 +0xab
sync.(*Once).Do(...)
/usr/lib/golang/src/sync/once.go:69
golang.org/x/tools/go/packages.(*loader).loadRecursive(0x0?, 0x0?)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:781 +0x3b
golang.org/x/tools/go/packages.(*loader).refine.func2(0x0?)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:722 +0x26
created by golang.org/x/tools/go/packages.(*loader).refine in goroutine 1
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:721 +0xbb9
make: *** [Makefile:101: docs] Error 2
ShivaliBandi commentedon Sep 5, 2025
Thank you for the reply and for offering to help.
Unfortunately, due to company policy, I am unable to share our internal source code.
However, after extensive debugging, I have found that the issue occurs when I run the make docs command, which internally executes the following:
swagger generate spec -c flex/services/common/src/error -c ./api/src/peerserver -w ./api/src/peerserver/ -o /workspace/thunder/services/peer/build_dir/docs/peerserver-restapis.json
The tool consistently crashes with a panic: runtime error: invalid memory address or nil pointer dereference. The stack trace always points to the go/types.representableConst and go/types.constDecl functions.
Based on this, I believe the bug is triggered by a specific type of constant declaration in one of the files being scanned, possibly one using iota with a non-zero starting value.
Could you please provide some guidance on how I might be able to get more verbose output from the swagger command, or a way to pinpoint the exact file and line number of the code it's failing on? This would help me create a minimal, non-confidential reproduction case to share with you.
fredbi commentedon Sep 5, 2025
There is a fresh version pushed on master (with a docker image). Could you please try with that one?
ShivaliBandi commentedon Sep 5, 2025
actually, we cannot upgrade the Swagger version due to existing dependencies. We need to continue using the specific version currently in our project.
fredbi commentedon Sep 7, 2025
You may try running with export DEBUG=1 so go-swagger will be more verbose
ShivaliBandi commentedon Sep 8, 2025
[root@vralabs1121 peer]# export DEBUG=1
[root@vralabs1121 peer]# make docs
mkdir -p /workspace/thunder/services/peer/build_dir/docs
&& export SWAGGER_GENERATE_EXTENSION=false
&& swagger generate spec -c flex/services/common/src/error -c ./api/src/peerserver -w ./api/src/peerserver/ -o /workspace/thunder/services/peer/build_dir/docs/peerserver-restapis.json
&& cp ./README.md /
&& cp /workspace/thunder/services/peer/build_dir/docs/peerserver-restapis.json /swagger/
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xafacbe]
goroutine 399 [running]:
go/types.(*Checker).handleBailout(0xc000964000, 0xc0006b9c90)
/usr/lib/golang/src/go/types/check.go:434 +0x88
panic({0xc98820?, 0x1603700?})
/usr/lib/golang/src/runtime/panic.go:792 +0x132
go/types.(*StdSizes).Sizeof(0x0, {0xedd9c8, 0x160e7a0})
/usr/lib/golang/src/go/types/sizes.go:229 +0x31e
go/types.(*Config).sizeof(...)
/usr/lib/golang/src/go/types/sizes.go:334
go/types.representableConst.func1(...)
/usr/lib/golang/src/go/types/const.go:77
go/types.representableConst({0xee1e70, 0xf033e0}, 0xc000964000, 0x160e7a0, 0xc0006b8d30)
/usr/lib/golang/src/go/types/const.go:93 +0x1e9
go/types.(*Checker).representation(0xc000964000, 0xc0005f8f00, 0x160e7a0)
/usr/lib/golang/src/go/types/const.go:257 +0x5f
go/types.(*Checker).implicitTypeAndValue(0xc000964000, 0xc0005f8f00, {0xedd9c8, 0x160e7a0})
/usr/lib/golang/src/go/types/expr.go:374 +0x6d9
go/types.(*Checker).convertUntyped(0xc000964000, 0xc0005f8f00, {0xedd9c8, 0x160e7a0})
/usr/lib/golang/src/go/types/const.go:290 +0x3f
go/types.(*Checker).matchTypes(0xc000964000, 0xc0005f8ec0, 0xc0005f8f00)
/usr/lib/golang/src/go/types/expr.go:899 +0x315
go/types.(*Checker).binary(0xc000964000, 0xc0005f8ec0, {0xee0b80, 0xc000915a10}, {0xee0670, 0xc00057de60}, {0xee07c0, 0xc00057de80}, 0x28, 0x965b)
/usr/lib/golang/src/go/types/expr.go:773 +0x166
go/types.(*Checker).exprInternal(0xc000964000, 0x0, 0xc0005f8ec0, {0xee0b80, 0xc000915a10}, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/expr.go:1130 +0x6be
go/types.(*Checker).rawExpr(0xc000964000, 0x0, 0xc0005f8ec0, {0xee0b80?, 0xc000915a10?}, {0x0?, 0x0?}, 0x0)
/usr/lib/golang/src/go/types/expr.go:952 +0x18c
go/types.(*Checker).expr(0xc000964000, 0xede928?, 0xc0005f8ec0, {0xee0b80?, 0xc000915a10?})
/usr/lib/golang/src/go/types/expr.go:1227 +0x30
go/types.(*Checker).stmt(0xc000964000, 0x0, {0xee0eb0, 0xc00044f980})
/usr/lib/golang/src/go/types/stmt.go:621 +0x2a5
go/types.(*Checker).stmtList(0xc000964000, 0x0, {0xc00095c060?, 0x0?, 0x0?})
/usr/lib/golang/src/go/types/stmt.go:123 +0x85
go/types.(*Checker).funcBody(0xc000964000, 0xee0670?, {0xc0009007a8?, 0x4?}, 0xc0005f8a80, 0xc000915aa0, {0x0?, 0x0?})
/usr/lib/golang/src/go/types/stmt.go:43 +0x311
go/types.(*Checker).funcDecl.func1()
/usr/lib/golang/src/go/types/decl.go:868 +0x3a
go/types.(*Checker).processDelayed(0xc000964000, 0x0)
/usr/lib/golang/src/go/types/check.go:550 +0x1e4
go/types.(*Checker).checkFiles(0xc000964000, {0xc000066230?, 0xabbb05?, 0xd4eba0?})
/usr/lib/golang/src/go/types/check.go:492 +0x336
go/types.(*Checker).Files(0xc0005fa0e0?, {0xc000066230?, 0xc000136f00?, 0x4?})
/usr/lib/golang/src/go/types/check.go:452 +0x75
golang.org/x/tools/go/packages.(*loader).loadPackage(0xc0005fa0e0, 0xc000634e00)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:955 +0x70f
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1()
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:793 +0x1a9
sync.(*Once).doSlow(0x0?, 0x0?)
/usr/lib/golang/src/sync/once.go:78 +0xab
sync.(*Once).Do(...)
/usr/lib/golang/src/sync/once.go:69
golang.org/x/tools/go/packages.(*loader).loadRecursive(0x0?, 0x0?)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:781 +0x3b
golang.org/x/tools/go/packages.(*loader).loadRecursive.func1.1(0x0?)
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:788 +0x26
created by golang.org/x/tools/go/packages.(*loader).loadRecursive.func1 in goroutine 55
/root/go/pkg/mod/golang.org/x/tools@v0.1.0/go/packages/packages.go:787 +0x94
make: *** [Makefile:101: docs] Error 2
[root@vralabs1121 peer]#
ShivaliBandi commentedon Sep 15, 2025
@fredbi is there anything else i can try and is therer any update on this its a high priority task we need to finish this as soon as possible so can you please look into it
ShivaliBandi commentedon Sep 22, 2025
@fredbi is there anything you can help with ?
fredbi commentedon Sep 22, 2025
i am cutting a release at the end of this week.
It comes with an improved handling of go1.24, type aliases and less causes to panic.
I would advise to give it a try on your use case.
Other than that, it is just impossible to help debug your issue with the very scarce information provided:
So we have nowhere to start an investigation. For now at least.
ShivaliBandi commentedon Sep 23, 2025
@fredbi I’ve already shared the Go and Swagger versions in the ticket earlier, but just reiterating here for clarity. I was able to reproduce the issue, though I cannot share company code. Please let me know if you need any additional logs or other details from my side to help resolve this.
For reference:
$ go version
go version go1.24.6 (Red Hat 1.24.6-1.module+el8.10.0+23407+428597c7) linux/amd64
$ swagger version
version: v0.27.0
commit: (unknown, mod sum: "h1:K7+nkBuf4oS1jTBrdvWqYFpqD69V5CN8HamZzCDDhAI=")
fredbi commentedon Oct 10, 2025
release v0.33.1 should support go 1.24. You may try it out.
5 remaining items
fredbi commentedon Nov 5, 2025
That being said, the provided stack trace clearly indicates a bug that causes a panic (although I am not able to reproduce the panic I can see where it happens). Fixing it.
ShivaliBandi commentedon Nov 6, 2025
@fredbi Actually, while pasting the code here, the indentation got messed up. I verified it on my side, and the indentation is the same as you mentioned in the code above.
Could you please let me know the earliest possible timeline for when this fix can be provided?
codescan: fixed panic cases when parsing YAML blocks
codescan: fixed panic cases when parsing YAML blocks (#3256)
fredbi commentedon Nov 7, 2025
@ShivaliBandi a tentative fix has been merged to master. It sure fixes the panic you reported, but I am really not sure that it solved your problem. Could you please confirm if your issue is fixed with current master?
ShivaliBandi commentedon Nov 27, 2025
Can you please specify the specific version
ShivaliBandi commentedon Nov 27, 2025
i used v0.33.1 still getting error:
swagger validate demo.go
// swagger:operation POST /v1/example-endpoint addExampleConfig
// ---
// summary: Adds a new configuration entry
// description: |-
// Creates and validates a new configuration request.
// security:
// - AuthToken: []
// consumes:
// - application/json
// tags:
// - Example|Configuration
// responses:
// 201:
// $ref: "#/responses/createdResponse"
// 400:
// $ref: "#/responses/badRequestResponse"
// 412:
// $ref: "#/responses/preconditionFailedResponse"
// 500:
// $ref: "#/responses/internalServerErrorResponse"
fredbi commentedon Dec 1, 2025
please try on current master (you may build from source or pull a docker image)
ShivaliBandi commentedon Jan 5, 2026
i tried still its not working please let me know once there is new update
fix(codescan): add nil check in isTextMarshaler to prevent panic
fix(codescan): add nil check in isTextMarshaler to prevent panic