2016-10-23 3 views
6

잘못된 메모리 주소에 대한 런타임 오류가 발생합니다.예기치 않은 잘못된 메모리 주소 또는 nil 포인터 참조 취소

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은 다음과 같습니다

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 } 

어떻게이 선 (36)이 원인이되는 것이 가능하다? 어떻게 든 m을 0으로 설정할 수 있습니까? 그렇다면 어떻게?

참고 : 해시 이것은 Attributesnil 같은 수신기 m 호출되고 있음을 의미 문자열

+0

이를 호출하는 코드에서'm''nil'인가? – abligh

+0

잘 모르겠습니다. 프로덕션 코드에서는 거의 발생하지 않습니다. 나는 그것을 복제하는 방법을 찾지 못했습니다. m이 이동 중에는 0이 될 수도 있습니까? –

+0

누락되었습니다. [업데이트 됨] – patilnitin

답변

11

으로 정의된다. m가됨에 따라, 그러나 특정 방법 Attributes()nil 수신기 호출되도록 설계되지 않는다 - 원리 방법에서

nil 수신자로 호출 될 수있다 (그리고 그들 nil 확인한다면이도 유용 할 수있다) - here 참조 확인없이 nil 참조 해제되었습니다. 이 nil 수신기 (m)로 호출되는 메서드는 호출 코드에서 발생합니다.

간략한 예제 on the playground here을 참조하고 + m.hash을 주석 처리하면 모든 것이 올바르게 작동합니다 (here). 아래

코드 :이다

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() 
} 

출력있는 :

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 
+0

오, 알겠습니다. 오류가 Attributes 함수 행에 대한 것이기 때문에 혼란 스럽습니다. nil 객체에서 함수를 호출 할 수 있습니까? –

+1

문제는 "m.hash"에있는 * dereferencing * nil 포인터입니다. '+ m.hash'를 주석 처리하면 괜찮을 것입니다. https://play.golang.org/p/KSQ0cMxkmb를보십시오. (그렇습니다. 그렇지 않다면'nil' 객체로 함수를 호출하는 것이 좋습니다. 포인터 역 참조). – abligh

+0

고마워,이 모든 걸 명확하게 :) –

관련 문제