...
Run Format

Source file test/nilcheck.go

Documentation: test

  // errorcheck -0 -N -d=nil
  
  // Copyright 2013 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  // Test that nil checks are inserted.
  // Optimization is disabled, so redundant checks are not removed.
  
  package p
  
  type Struct struct {
  	X int
  	Y float64
  }
  
  type BigStruct struct {
  	X int
  	Y float64
  	A [1 << 20]int
  	Z string
  }
  
  type Empty struct {
  }
  
  type Empty1 struct {
  	Empty
  }
  
  var (
  	intp       *int
  	arrayp     *[10]int
  	array0p    *[0]int
  	bigarrayp  *[1 << 26]int
  	structp    *Struct
  	bigstructp *BigStruct
  	emptyp     *Empty
  	empty1p    *Empty1
  )
  
  func f1() {
  	_ = *intp    // ERROR "nil check"
  	_ = *arrayp  // ERROR "nil check"
  	_ = *array0p // ERROR "nil check"
  	_ = *array0p // ERROR "nil check"
  	_ = *intp    // ERROR "nil check"
  	_ = *arrayp  // ERROR "nil check"
  	_ = *structp // ERROR "nil check"
  	_ = *emptyp  // ERROR "nil check"
  	_ = *arrayp  // ERROR "nil check"
  }
  
  func f2() {
  	var (
  		intp       *int
  		arrayp     *[10]int
  		array0p    *[0]int
  		bigarrayp  *[1 << 20]int
  		structp    *Struct
  		bigstructp *BigStruct
  		emptyp     *Empty
  		empty1p    *Empty1
  	)
  
  	_ = *intp       // ERROR "nil check"
  	_ = *arrayp     // ERROR "nil check"
  	_ = *array0p    // ERROR "nil check"
  	_ = *array0p    // ERROR "nil check"
  	_ = *intp       // ERROR "nil check"
  	_ = *arrayp     // ERROR "nil check"
  	_ = *structp    // ERROR "nil check"
  	_ = *emptyp     // ERROR "nil check"
  	_ = *arrayp     // ERROR "nil check"
  	_ = *bigarrayp  // ERROR "nil check"
  	_ = *bigstructp // ERROR "nil check"
  	_ = *empty1p    // ERROR "nil check"
  }
  
  func fx10k() *[10000]int
  
  var b bool
  
  func f3(x *[10000]int) {
  	// Using a huge type and huge offsets so the compiler
  	// does not expect the memory hardware to fault.
  	_ = x[9999] // ERROR "nil check"
  
  	for {
  		if x[9999] != 0 { // ERROR "nil check"
  			break
  		}
  	}
  
  	x = fx10k()
  	_ = x[9999] // ERROR "nil check"
  	if b {
  		_ = x[9999] // ERROR "nil check"
  	} else {
  		_ = x[9999] // ERROR "nil check"
  	}
  	_ = x[9999] // ERROR "nil check"
  
  	x = fx10k()
  	if b {
  		_ = x[9999] // ERROR "nil check"
  	} else {
  		_ = x[9999] // ERROR "nil check"
  	}
  	_ = x[9999] // ERROR "nil check"
  
  	fx10k()
  	// This one is a bit redundant, if we figured out that
  	// x wasn't going to change across the function call.
  	// But it's a little complex to do and in practice doesn't
  	// matter enough.
  	_ = x[9999] // ERROR "nil check"
  }
  
  func f3a() {
  	x := fx10k()
  	y := fx10k()
  	z := fx10k()
  	_ = &x[9] // ERROR "nil check"
  	y = z
  	_ = &x[9] // ERROR "nil check"
  	x = y
  	_ = &x[9] // ERROR "nil check"
  }
  
  func f3b() {
  	x := fx10k()
  	y := fx10k()
  	_ = &x[9] // ERROR "nil check"
  	y = x
  	_ = &x[9] // ERROR "nil check"
  	x = y
  	_ = &x[9] // ERROR "nil check"
  }
  
  func fx10() *[10]int
  
  func f4(x *[10]int) {
  	// Most of these have no checks because a real memory reference follows,
  	// and the offset is small enough that if x is nil, the address will still be
  	// in the first unmapped page of memory.
  
  	_ = x[9] // ERROR "nil check"
  
  	for {
  		if x[9] != 0 { // ERROR "nil check"
  			break
  		}
  	}
  
  	x = fx10()
  	_ = x[9] // ERROR "nil check"
  	if b {
  		_ = x[9] // ERROR "nil check"
  	} else {
  		_ = x[9] // ERROR "nil check"
  	}
  	_ = x[9] // ERROR "nil check"
  
  	x = fx10()
  	if b {
  		_ = x[9] // ERROR "nil check"
  	} else {
  		_ = &x[9] // ERROR "nil check"
  	}
  	_ = x[9] // ERROR "nil check"
  
  	fx10()
  	_ = x[9] // ERROR "nil check"
  
  	x = fx10()
  	y := fx10()
  	_ = &x[9] // ERROR "nil check"
  	y = x
  	_ = &x[9] // ERROR "nil check"
  	x = y
  	_ = &x[9] // ERROR "nil check"
  }
  
  func f5(m map[string]struct{}) bool {
  	// Existence-only map lookups should not generate a nil check
  	_, ok := m[""]
  	return ok
  }
  

View as plain text