mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-20 18:06:53 +00:00
Disallow nil dereference at compile time (#16032)
* bring back the semfold of nil * remove space * fix test * proc type can't be dereferenced * disallow nil dereference at compile time * changelog
This commit is contained in:
@@ -51,7 +51,7 @@
|
||||
|
||||
- The `cstring` doesn't support `[]=` operator in JS backend.
|
||||
|
||||
|
||||
- nil dereference is not allowed at compile time. `cast[ptr int](nil)[]` is rejected at compile time.
|
||||
|
||||
## Compiler changes
|
||||
|
||||
|
||||
@@ -1440,6 +1440,11 @@ proc buildOverloadedSubscripts(n: PNode, ident: PIdent): PNode =
|
||||
proc semDeref(c: PContext, n: PNode): PNode =
|
||||
checkSonsLen(n, 1, c.config)
|
||||
n[0] = semExprWithType(c, n[0])
|
||||
let a = getConstExpr(c.module, n[0], c.idgen, c.graph)
|
||||
if a != nil:
|
||||
if a.kind == nkNilLit:
|
||||
localError(c.config, n.info, "nil dereference is not allowed")
|
||||
n[0] = a
|
||||
result = n
|
||||
var t = skipTypes(n[0].typ, {tyGenericInst, tyVar, tyLent, tyAlias, tySink, tyOwned})
|
||||
case t.kind
|
||||
|
||||
@@ -671,6 +671,10 @@ proc getConstExpr(m: PSym, n: PNode; idgen: IdGenerator; g: ModuleGraph): PNode
|
||||
var a = getConstExpr(m, n[1], idgen, g)
|
||||
if a == nil: return
|
||||
result = foldConv(n, a, g, check=true)
|
||||
of nkDerefExpr, nkHiddenDeref:
|
||||
let a = getConstExpr(m, n[0], idgen, g)
|
||||
if a != nil and a.kind == nkNilLit:
|
||||
localError(g.config, n.info, "nil dereference is not allowed")
|
||||
of nkCast:
|
||||
var a = getConstExpr(m, n[1], idgen, g)
|
||||
if a == nil: return
|
||||
|
||||
@@ -33,7 +33,8 @@ reject: discard cast[ptr](a)
|
||||
# bug #15623
|
||||
block:
|
||||
if false:
|
||||
echo cast[ptr int](nil)[]
|
||||
let x = cast[ptr int](nil)
|
||||
echo x[]
|
||||
|
||||
block:
|
||||
if false:
|
||||
|
||||
Reference in New Issue
Block a user