Unexpected invalid memory address or dereferencing of a zero point pointer

I get a runtime error for an invalid memory address.

panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x4e0f24] goroutine 1192592 [running]: panic(0x793540, 0xc420010040) #011/usr/local/go/src/runtime/panic.go:500 +0x1a1 foobar/sd.(*Channel).Attributes(0x0, 0xc420110101, 0xc42278f9b0, 0x9) #011/home/app/go/src/foobar/sd/channel.go:36 +0x54 

channel.go is as follows:

 35 func (m *Channel) Attributes() (*ChannelAttrs, error) { 36 redisHash := "sd:channels:" + m.hash 37 38 rc := m.ctx.RedisPool.Get() 39 values, err := redis.Values(rc.Do("HGETALL", redisHash)) 40 rc.Close() 41 if err != nil { 42 return nil, err 43 } 44 attrs := ChannelAttrs{} 45 redis.ScanStruct(values, &attrs) 46 return &attrs, nil 47 } 

How is it possible that line 36 causes this? Is it possible that m will be zero? If so, how?

Note: a hash is defined as a string.

+6
source share
1 answer

This means that Attributes is called with receiver m as nil .

In principle, methods can be called with nil receivers (and this can even be useful if they check for nil ) - see here - but this particular Attributes() method is not intended to be called with a nil receiver, since m dereferenced without a nil check. This (the method called with the nil m receiver) is what happens in your code code.

See a simplified example here .

Code below:

 package main import ( "fmt" ) type Channel struct { hash string } func (m *Channel) Attributes() { r := "x" + m.hash fmt.Println(r) } func main() { var c *Channel c.Attributes() } 

The output of which:

 panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x20131] goroutine 1 [running]: panic(0x102360, 0x1040a038) /usr/local/go/src/runtime/panic.go:500 +0x720 main.(*Channel).Attributes(0x0, 0x104000f0) /tmp/sandbox285779060/main.go:12 +0x131 main.main() /tmp/sandbox285779060/main.go:18 +0x20 
+12
source

Source: https://habr.com/ru/post/1011618/


All Articles