Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unexpected invalid memory address or nil pointer dereference

Tags:

go

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

like image 264
Rob Fox Avatar asked Oct 23 '16 08:10

Rob Fox


People also ask

What is invalid memory address or nil pointer dereference?

Cause of the error Basically, in golang this error arises when you have a nil pointer in your code, and you are trying to get the value that it points to. If x is nil, an attempt to evaluate *x will cause a run-time panic. If you compile this code, you may sometimes encounter this error because : In the code, http.

How do I dereference a pointer in Golang?

Pointers can be dereferenced by adding an asterisk * before a pointer.

What is invalid memory address?

Occurs when a read or write instruction references memory that is logically or physically invalid. If present, represents the location and associated call stack from which the memory block containing the offending address was allocated.

What is a pointer in go?

Pointers in Go programming language or Golang is a variable that is used to store the memory address of another variable. Pointers in Golang is also termed as the special variables. The variables are used to store some data at a particular memory address in the system.


1 Answers

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
like image 129
abligh Avatar answered Nov 10 '22 05:11

abligh