| // Copyright 2016 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. |
| |
| package a |
| |
| import ( |
| "context" |
| "log" |
| "os" |
| "testing" |
| "time" |
| ) |
| |
| var bg = context.Background() |
| |
| // Check the three functions and assignment forms (var, :=, =) we look for. |
| // (Do these early: line numbers are fragile.) |
| func _() { |
| var _, cancel = context.WithCancel(bg) // want `the cancel function is not used on all paths \(possible context leak\)` |
| if false { |
| _ = cancel |
| } |
| } // want "this return statement may be reached without using the cancel var defined on line 20" |
| |
| func _() { |
| _, cancel2 := context.WithDeadline(bg, time.Time{}) // want "the cancel2 function is not used..." |
| if false { |
| _ = cancel2 |
| } |
| } // want "may be reached without using the cancel2 var defined on line 27" |
| |
| func _() { |
| var cancel3 func() |
| _, cancel3 = context.WithTimeout(bg, 0) // want "function is not used..." |
| if false { |
| _ = cancel3 |
| } |
| } // want "this return statement may be reached without using the cancel3 var defined on line 35" |
| |
| func _() { |
| ctx, _ := context.WithCancel(bg) // want "the cancel function returned by context.WithCancel should be called, not discarded, to avoid a context leak" |
| ctx, _ = context.WithTimeout(bg, 0) // want "the cancel function returned by context.WithTimeout should be called, not discarded, to avoid a context leak" |
| ctx, _ = context.WithDeadline(bg, time.Time{}) // want "the cancel function returned by context.WithDeadline should be called, not discarded, to avoid a context leak" |
| _ = ctx |
| } |
| |
| func _() { |
| _, cancel := context.WithCancel(bg) |
| defer cancel() // ok |
| } |
| |
| func _() { |
| _, cancel := context.WithCancel(bg) // want "not used on all paths" |
| if condition { |
| cancel() |
| } |
| return // want "this return statement may be reached without using the cancel var" |
| } |
| |
| func _() { |
| _, cancel := context.WithCancel(bg) |
| if condition { |
| cancel() |
| } else { |
| // ok: infinite loop |
| for { |
| print(0) |
| } |
| } |
| } |
| |
| func _() { |
| _, cancel := context.WithCancel(bg) // want "not used on all paths" |
| if condition { |
| cancel() |
| } else { |
| for i := 0; i < 10; i++ { |
| print(0) |
| } |
| } |
| } // want "this return statement may be reached without using the cancel var" |
| |
| func _() { |
| _, cancel := context.WithCancel(bg) |
| // ok: used on all paths |
| switch someInt { |
| case 0: |
| new(testing.T).FailNow() |
| case 1: |
| log.Fatal() |
| case 2: |
| cancel() |
| case 3: |
| print("hi") |
| fallthrough |
| default: |
| os.Exit(1) |
| } |
| } |
| |
| func _() { |
| _, cancel := context.WithCancel(bg) // want "not used on all paths" |
| switch someInt { |
| case 0: |
| new(testing.T).FailNow() |
| case 1: |
| log.Fatal() |
| case 2: |
| cancel() |
| case 3: |
| print("hi") // falls through to implicit return |
| default: |
| os.Exit(1) |
| } |
| } // want "this return statement may be reached without using the cancel var" |
| |
| func _(ch chan int) { |
| _, cancel := context.WithCancel(bg) // want "not used on all paths" |
| select { |
| case <-ch: |
| new(testing.T).FailNow() |
| case ch <- 2: |
| print("hi") // falls through to implicit return |
| case ch <- 1: |
| cancel() |
| default: |
| os.Exit(1) |
| } |
| } // want "this return statement may be reached without using the cancel var" |
| |
| func _(ch chan int) { |
| _, cancel := context.WithCancel(bg) |
| // A blocking select must execute one of its cases. |
| select { |
| case <-ch: |
| panic(0) |
| } |
| if false { |
| _ = cancel |
| } |
| } |
| |
| func _() { |
| go func() { |
| ctx, cancel := context.WithCancel(bg) // want "not used on all paths" |
| if false { |
| _ = cancel |
| } |
| print(ctx) |
| }() // want "may be reached without using the cancel var" |
| } |
| |
| var condition bool |
| var someInt int |
| |
| // Regression test for Go issue 16143. |
| func _() { |
| var x struct{ f func() } |
| x.f() |
| } |
| |
| // Regression test for Go issue 16230. |
| func _() (ctx context.Context, cancel func()) { |
| ctx, cancel = context.WithCancel(bg) |
| return // a naked return counts as a load of the named result values |
| } |
| |
| // Same as above, but for literal function. |
| var _ = func() (ctx context.Context, cancel func()) { |
| ctx, cancel = context.WithCancel(bg) |
| return |
| } |
| |
| // Test for Go issue 31856. |
| func _() { |
| var cancel func() |
| |
| func() { |
| _, cancel = context.WithCancel(bg) |
| }() |
| |
| cancel() |
| } |
| |
| var cancel1 func() |
| |
| // Same as above, but for package-level cancel variable. |
| func _() { |
| // We assume that other uses of cancel1 exist. |
| _, cancel1 = context.WithCancel(bg) |
| } |