mirror of
https://github.com/go-delve/delve.git
synced 2025-11-04 06:32:16 +08:00
proc: return error when calling a non-ptr receiver method on a nil ptr (#4139)
During a call injection if the user tries to call a non-ptr receiver method on a nil ptr it should receive a nil pointer dereference error. Fixes #4136
This commit is contained in:
committed by
GitHub
parent
b1fcbdbb25
commit
d390fc62a2
@ -265,6 +265,8 @@ func main() {
|
|||||||
var ref strings.Builder
|
var ref strings.Builder
|
||||||
fmt.Fprintf(&ref, "blah")
|
fmt.Fprintf(&ref, "blah")
|
||||||
|
|
||||||
|
var nilptrtostruct *astruct
|
||||||
|
|
||||||
runtime.Breakpoint() // breakpoint here
|
runtime.Breakpoint() // breakpoint here
|
||||||
call1(one, two)
|
call1(one, two)
|
||||||
fn2clos(2)
|
fn2clos(2)
|
||||||
@ -272,5 +274,5 @@ func main() {
|
|||||||
d.Method()
|
d.Method()
|
||||||
d.Base.Method()
|
d.Base.Method()
|
||||||
x.CallMe()
|
x.CallMe()
|
||||||
fmt.Println(one, two, zero, call, call0, call2, callexit, callpanic, callbreak, callstacktrace, stringsJoin, intslice, stringslice, comma, a.VRcvr, a.PRcvr, pa, vable_a, vable_pa, pable_pa, fn2clos, fn2glob, fn2valmeth, fn2ptrmeth, fn2nil, ga, escapeArg, a2, square, intcallpanic, onetwothree, curriedAdd, getAStruct, getAStructPtr, getVRcvrableFromAStruct, getPRcvrableFromAStructPtr, getVRcvrableFromAStructPtr, pa2, noreturncall, str, d, x, x2.CallMe(5), longstrs, regabistacktest, regabistacktest2, issue2698.String(), issue3364.String(), regabistacktest3, rast3, floatsum, ref, mul2, mul2ptr, m)
|
fmt.Println(one, two, zero, call, call0, call2, callexit, callpanic, callbreak, callstacktrace, stringsJoin, intslice, stringslice, comma, a.VRcvr, a.PRcvr, pa, vable_a, vable_pa, pable_pa, fn2clos, fn2glob, fn2valmeth, fn2ptrmeth, fn2nil, ga, escapeArg, a2, square, intcallpanic, onetwothree, curriedAdd, getAStruct, getAStructPtr, getVRcvrableFromAStruct, getPRcvrableFromAStructPtr, getVRcvrableFromAStructPtr, pa2, noreturncall, str, d, x, x2.CallMe(5), longstrs, regabistacktest, regabistacktest2, issue2698.String(), issue3364.String(), regabistacktest3, rast3, floatsum, ref, mul2, mul2ptr, m, nilptrtostruct)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -540,6 +540,10 @@ func funcCallEvalFuncExpr(scope *EvalScope, stack *evalStack, fncall *functionCa
|
|||||||
if len(fnvar.Children) > 0 && argnum == (len(fncall.formalArgs)-1) {
|
if len(fnvar.Children) > 0 && argnum == (len(fncall.formalArgs)-1) {
|
||||||
argnum++
|
argnum++
|
||||||
fncall.receiver = &fnvar.Children[0]
|
fncall.receiver = &fnvar.Children[0]
|
||||||
|
_, isptr := fncall.receiver.DwarfType.(*godwarf.PtrType)
|
||||||
|
if fncall.receiver.Addr == 0 && !isptr {
|
||||||
|
return errors.New("nil pointer dereference")
|
||||||
|
}
|
||||||
fncall.receiver.Name = astutil.ExprToString(fncall.expr.Fun)
|
fncall.receiver.Name = astutil.ExprToString(fncall.expr.Fun)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1354,6 +1354,9 @@ func TestCallFunction(t *testing.T) {
|
|||||||
// Issue 3176
|
// Issue 3176
|
||||||
{`ref.String()[0]`, []string{`:byte:98`}, nil, 1},
|
{`ref.String()[0]`, []string{`:byte:98`}, nil, 1},
|
||||||
{`ref.String()[20]`, nil, errors.New("index out of bounds"), 1},
|
{`ref.String()[20]`, nil, errors.New("index out of bounds"), 1},
|
||||||
|
|
||||||
|
// Issue 4136
|
||||||
|
{`nilptrtostruct.VRcvr(0)`, []string{}, errors.New("nil pointer dereference"), 0},
|
||||||
}
|
}
|
||||||
|
|
||||||
var testcases112 = []testCaseCallFunction{
|
var testcases112 = []testCaseCallFunction{
|
||||||
|
|||||||
Reference in New Issue
Block a user