Nim icon indicating copy to clipboard operation
Nim copied to clipboard

Crash on marking destroy hook as .error

Open bptato opened this issue 5 months ago • 0 comments

Nim Version

Nim Compiler Version 2.2.4 [Linux: amd64] Compiled at 2025-06-14 Copyright (c) 2006-2025 by Andreas Rumpf

git hash: 7701b3c7e6f6c640a89cc445b40f466834ab4fcf active boot switches:

Description

This crashes the compiler:

type X = object

proc `=destroy`(x: X) {.error.} =
  discard

proc main() =
  var x = X()

main()

Current Output

Traceback (most recent call last)
/src/Nim/compiler/nim.nim(169) nim
/src/Nim/compiler/nim.nim(124) handleCmdLine
/src/Nim/compiler/main.nim(324) mainCommand
/src/Nim/compiler/main.nim(290) compileToBackend
/src/Nim/compiler/main.nim(153) commandCompileToC
/src/Nim/compiler/pipelines.nim(320) compilePipelineProject
/src/Nim/compiler/pipelines.nim(239) compilePipelineModule
/src/Nim/compiler/pipelines.nim(184) processPipelineModule
/src/Nim/compiler/pipelines.nim(25) processPipeline
/src/Nim/compiler/cgen.nim(2436) genTopLevelStmt
/src/Nim/compiler/cgen.nim(1265) genProcBody
/src/Nim/compiler/ccgstmts.nim(1951) genStmts
/src/Nim/compiler/ccgexprs.nim(3580) expr
/src/Nim/compiler/ccgexprs.nim(3236) genStmtList
/src/Nim/compiler/ccgstmts.nim(1951) genStmts
/src/Nim/compiler/ccgexprs.nim(3542) expr
/src/Nim/compiler/ccgcalls.nim genCall
/src/Nim/compiler/ccgcalls.nim(893) genAsgnCall
/src/Nim/compiler/ccgcalls.nim(475) genPrefixCall
/src/Nim/compiler/cgen.nim(804) initLocExpr
/src/Nim/compiler/ccgexprs.nim(3461) expr
/src/Nim/compiler/cgen.nim(1542) genProc
/src/Nim/compiler/cgen.nim(1516) genProcNoForward
/src/Nim/compiler/cgen.nim(1287) genProcAux
/src/Nim/compiler/injectdestructors.nim(1322) injectDestructorCalls
/src/Nim/compiler/injectdestructors.nim(955) p
/src/Nim/compiler/injectdestructors.nim(572) pVarTopLevel
/src/Nim/compiler/injectdestructors.nim(256) genDestroy
/src/Nim/compiler/injectdestructors.nim(251) genOp
/src/Nim/compiler/injectdestructors.nim(218) checkForErrorPragma
SIGSEGV: Illegal storage access. (Attempt to read from nil?)

Expected Output

Complain because =destroy must be injected?

Known Workarounds

No response

Additional Information

My aim was to statically leak check uses of an object defined by an external C library, by marking its importc'd free method as taking sink X, and disabling its =copy & =destroy hooks. (Said free method takes an additional context parameter, so calling it in the destructor would either involve bundling the context with every single object or storing it in TLS - neither is ideal in my case.)

bptato avatar Jun 14 '25 19:06 bptato