16
votes

I'm getting 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 looks like this:

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 the line 36 is causing this? Is it somehow possible for m to be nil? If so, how?

Note: hash is defined as string

1
Is m nil in the code that calls this?abligh
I don't know, this happens rarely in production code. I haven't found a way to replicate it. Is it even possible for m to be nil in go?Rob Fox
You have missed reffering m Updatedpatilnitin

1 Answers

18
votes

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

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

See a simplified example on the playground here, and note that commenting out + m.hash makes the whole thing work fine, as 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 is:

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