modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/nilcheck.go (about)

     1  // errorcheck -0 -N -d=nil
     2  
     3  // Copyright 2013 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test that nil checks are inserted.
     8  // Optimization is disabled, so redundant checks are not removed.
     9  
    10  package p
    11  
    12  type Struct struct {
    13  	X int
    14  	Y float64
    15  }
    16  
    17  type BigStruct struct {
    18  	X int
    19  	Y float64
    20  	A [1 << 20]int
    21  	Z string
    22  }
    23  
    24  type Empty struct {
    25  }
    26  
    27  type Empty1 struct {
    28  	Empty
    29  }
    30  
    31  var (
    32  	intp       *int
    33  	arrayp     *[10]int
    34  	array0p    *[0]int
    35  	bigarrayp  *[1 << 26]int
    36  	structp    *Struct
    37  	bigstructp *BigStruct
    38  	emptyp     *Empty
    39  	empty1p    *Empty1
    40  )
    41  
    42  func f1() {
    43  	_ = *intp    // ERROR "nil check"
    44  	_ = *arrayp  // ERROR "nil check"
    45  	_ = *array0p // ERROR "nil check"
    46  	_ = *array0p // ERROR "nil check"
    47  	_ = *intp    // ERROR "nil check"
    48  	_ = *arrayp  // ERROR "nil check"
    49  	_ = *structp // ERROR "nil check"
    50  	_ = *emptyp  // ERROR "nil check"
    51  	_ = *arrayp  // ERROR "nil check"
    52  }
    53  
    54  func f2() {
    55  	var (
    56  		intp       *int
    57  		arrayp     *[10]int
    58  		array0p    *[0]int
    59  		bigarrayp  *[1 << 20]int
    60  		structp    *Struct
    61  		bigstructp *BigStruct
    62  		emptyp     *Empty
    63  		empty1p    *Empty1
    64  	)
    65  
    66  	_ = *intp       // ERROR "nil check"
    67  	_ = *arrayp     // ERROR "nil check"
    68  	_ = *array0p    // ERROR "nil check"
    69  	_ = *array0p    // ERROR "nil check"
    70  	_ = *intp       // ERROR "nil check"
    71  	_ = *arrayp     // ERROR "nil check"
    72  	_ = *structp    // ERROR "nil check"
    73  	_ = *emptyp     // ERROR "nil check"
    74  	_ = *arrayp     // ERROR "nil check"
    75  	_ = *bigarrayp  // ERROR "nil check"
    76  	_ = *bigstructp // ERROR "nil check"
    77  	_ = *empty1p    // ERROR "nil check"
    78  }
    79  
    80  func fx10k() *[10000]int
    81  
    82  var b bool
    83  
    84  func f3(x *[10000]int) {
    85  	// Using a huge type and huge offsets so the compiler
    86  	// does not expect the memory hardware to fault.
    87  	_ = x[9999] // ERROR "nil check"
    88  
    89  	for {
    90  		if x[9999] != 0 { // ERROR "nil check"
    91  			break
    92  		}
    93  	}
    94  
    95  	x = fx10k()
    96  	_ = x[9999] // ERROR "nil check"
    97  	if b {
    98  		_ = x[9999] // ERROR "nil check"
    99  	} else {
   100  		_ = x[9999] // ERROR "nil check"
   101  	}
   102  	_ = x[9999] // ERROR "nil check"
   103  
   104  	x = fx10k()
   105  	if b {
   106  		_ = x[9999] // ERROR "nil check"
   107  	} else {
   108  		_ = x[9999] // ERROR "nil check"
   109  	}
   110  	_ = x[9999] // ERROR "nil check"
   111  
   112  	fx10k()
   113  	// This one is a bit redundant, if we figured out that
   114  	// x wasn't going to change across the function call.
   115  	// But it's a little complex to do and in practice doesn't
   116  	// matter enough.
   117  	_ = x[9999] // ERROR "nil check"
   118  }
   119  
   120  func f3a() {
   121  	x := fx10k()
   122  	y := fx10k()
   123  	z := fx10k()
   124  	_ = &x[9] // ERROR "nil check"
   125  	y = z
   126  	_ = &x[9] // ERROR "nil check"
   127  	x = y
   128  	_ = &x[9] // ERROR "nil check"
   129  }
   130  
   131  func f3b() {
   132  	x := fx10k()
   133  	y := fx10k()
   134  	_ = &x[9] // ERROR "nil check"
   135  	y = x
   136  	_ = &x[9] // ERROR "nil check"
   137  	x = y
   138  	_ = &x[9] // ERROR "nil check"
   139  }
   140  
   141  func fx10() *[10]int
   142  
   143  func f4(x *[10]int) {
   144  	// Most of these have no checks because a real memory reference follows,
   145  	// and the offset is small enough that if x is nil, the address will still be
   146  	// in the first unmapped page of memory.
   147  
   148  	_ = x[9] // ERROR "nil check"
   149  
   150  	for {
   151  		if x[9] != 0 { // ERROR "nil check"
   152  			break
   153  		}
   154  	}
   155  
   156  	x = fx10()
   157  	_ = x[9] // ERROR "nil check"
   158  	if b {
   159  		_ = x[9] // ERROR "nil check"
   160  	} else {
   161  		_ = x[9] // ERROR "nil check"
   162  	}
   163  	_ = x[9] // ERROR "nil check"
   164  
   165  	x = fx10()
   166  	if b {
   167  		_ = x[9] // ERROR "nil check"
   168  	} else {
   169  		_ = &x[9] // ERROR "nil check"
   170  	}
   171  	_ = x[9] // ERROR "nil check"
   172  
   173  	fx10()
   174  	_ = x[9] // ERROR "nil check"
   175  
   176  	x = fx10()
   177  	y := fx10()
   178  	_ = &x[9] // ERROR "nil check"
   179  	y = x
   180  	_ = &x[9] // ERROR "nil check"
   181  	x = y
   182  	_ = &x[9] // ERROR "nil check"
   183  }
   184  
   185  func f5(m map[string]struct{}) bool {
   186  	// Existence-only map lookups should not generate a nil check
   187  	_, ok := m[""]
   188  	return ok
   189  }