Files
codeql/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/testdata.go
Chris Smowton 3b927f3b6b CFG: fix lastNode relating to assignments with underscores on the LHS
For example, "x, _ := a, b" would produce an incorrect CSV that branched to the next statement after evaluating "b", skipping the assignment to 'x'. We already had test coverage for function returns, so I'm reasonably confident this only affects parallel assigns, not destructuring ones like "x, y := f()".
2020-11-03 12:00:54 +00:00

636 lines
5.4 KiB
Go

// adapted from https://raw.githubusercontent.com/gordonklaus/ineffassign/master/testdata/testdata.go
package p
var b bool
func deadStore() int {
return 0
}
func deadStore2() string {
return "abc"
}
func _() {
var x int
x = 0
_ = x
}
func _() {
var x int
x = 0
if b {
_ = x
}
}
func _() {
var x int
_ = x
x = deadStore() // BAD
}
func _() {
var x int
x = deadStore() // BAD
x = 0
_ = x
}
func _() {
x := 0
x = 0
_ = x
}
func _() {
x := int64(0)
x = 0
_ = x
}
func _() {
x := ""
x = "abc"
_ = x
}
func _() {
x := deadStore2() // BAD
x = "def"
_ = x
}
func _() {
x := deadStore() // BAD
x = 0
_ = x
}
func _() {
x := 0
x = x + 0
_ = x
}
func _() {
x := 0
x += 0
_ = x
}
func _() {
x := 0
x++
_ = x
}
func _() {
x := 0
if b {
x = 0
}
_ = x
}
func _() {
x := deadStore() // BAD
if b {
x = deadStore() // BAD
}
x = 0
_ = x
}
func _() {
x := deadStore() // BAD
for b {
x = deadStore() // BAD
}
x = 0
_ = x
}
func _() {
x := 0
if b {
x = 0
}
if b {
x = 0
}
_ = x
}
func _() {
x := deadStore() // BAD
if b {
x = deadStore() // BAD
x = deadStore() // BAD
}
if b {
x = deadStore() // BAD
}
x = 0
_ = x
}
func _() {
x := 0
if b {
x = deadStore() // BAD
x = 0
}
if b {
x = 0
}
_ = x
}
func _() {
x := 0
for {
_ = x
x = 0
}
}
func _() {
x := 0
for {
_ = x
x = deadStore() // BAD
x = 0
}
}
func _() {
x := 0
for {
x += deadStore() // BAD
x = 0
}
}
func _() {
x := 0
for {
x++ // BAD
x = 0
}
}
func _() {
x := 0
for {
x++
}
}
func _() {
x := 0
_ = &x
x = 0
}
func _() {
x := struct{ f int }{42}
_ = x.f
x = struct{ f int }{23}
}
func _() {
x := []int{2}
_ = &x[0]
x = []int{}
}
func _() {
x := []int{}
_ = x[:]
x = []int{}
}
func _() {
x := 0
func() {
_ = x
}()
x = 0
}
func _() {
x := 0
func() {
x++
}()
x = 0
}
func _() {
x := 0
func() {
x += 0
}()
x = 0
}
func _() {
x := 0
func() {
x = 0
}()
_ = x
}
func _() {
x := 0
_ = x
func() {
x = 0
}()
}
func _() (x int) {
x = 0
return
}
func _() (x int) {
x = deadStore() // BAD
x = 0
return
}
func _() (x int) {
x = deadStore() // BAD
return 0
}
func _() (x int) {
x = 0
return x
}
func _() (x int) {
x = 1
anyFunctionMightPanic()
return 2
}
func _(a []int, i int) (x int) {
x = 1
_ = a[i]
return 2
}
func _(a []string, i int, j int) (x int) {
x = 1
_ = a[i:j]
return 2
}
func _(a float32, b float32) (x int) {
x = 1
_ = a == b
return 2
}
func _(a float32, b float32) (x int) {
x = 1
_ = a / b
return 2
}
func _(a float32, b float32) (x int) {
x = 1
a /= b
return 2
}
func _(a int, b int) (x int) {
x = 1
_ = a % b
return 2
}
func _(a int, b int) (x int) {
x = 1
a %= b
return 2
}
func _(a struct{ b int }) (x int) {
x = 1
_ = a.b
return 2
}
func _(a *int) (x int) {
x = 1
_ = *a
return 2
}
func _(a interface{}) (x int) {
x = 1
_ = a.(int)
return 2
}
func _(a chan int, b int) (x int) {
x = 1
a <- b
return 2
}
func _() {
global = 0
}
var global int
func _() {
global = 0
global = 0
}
func _() {
var x int
if b {
x = 0
} else {
x = 0
}
_ = x
}
func _() {
var x int
switch b {
case true:
x = 0
case false:
x = 0
}
_ = x
}
func _() {
var x int
switch b {
case true:
_ = x
default:
x = deadStore() // BAD
fallthrough
case b:
}
}
func _() {
var x int
switch b {
default:
x = 0
fallthrough
case b:
_ = x
}
}
func _() {
var x int
switch interface{}(b).(type) {
case bool:
x = 0
case int:
x = 0
}
_ = x
}
func _() {
var x int
var ch chan int
select {
case ch <- 0:
x = 0
case <-ch:
x = 0
}
_ = x
}
func _() {
var x int
var ch chan int
select {
case ch <- 0:
x = deadStore() // BAD
case <-ch:
x = deadStore() // BAD
default:
_ = x
}
}
func _() {
x := deadStore() // BAD
var ch chan int
select {
case ch <- 0:
x = 0
case <-ch:
x = 0
default:
x = 0
}
_ = x
}
func _() {
x := 0
var ch chan int
select {
case ch <- 0:
x = 0
case <-ch:
x = 0
}
_ = x
}
func _() (x int) {
if b {
x = 0
return
}
x = 0
return
}
func _() {
var x int
if b {
x = 0
} else if x = 0; b {
}
_ = x
}
func _() {
var x int
if b {
x = deadStore() // BAD
}
if x = 0; b {
}
_ = x
}
func _() {
var x int
if b {
x = 0
} else if b {
x = 0
}
_ = x
}
func _() {
var x int
if b {
x = 0
} else {
x = 0
}
_ = x
}
func _() {
x := 0
for b {
_ = x
x = 0
}
x = 0
_ = x
}
func _() {
x := 0
for {
_ = x
x = 0
if b {
break
}
x = 0
}
_ = x
}
func _() {
x := 0
for x < 0 {
x = deadStore() // BAD
if b {
break
}
x = 0
}
}
func _() {
x := 0
for {
_ = x
x = 0
if b {
continue
}
x = 0
}
}
func _() {
var x int
for x = range []int{} {
_ = x
x = 0
if b {
continue
} else {
break
}
}
_ = x
}
func _() {
var x int
for {
if b {
x = deadStore() // BAD
break
}
_ = x
}
}
func _() {
var x int
loop:
for b {
_ = x
for b {
x = 0
break loop
}
x = 0
}
_ = x
}
func _() {
var x int
for range []int{} {
if b {
x = 0
continue
}
x = 0
}
_ = x
}
func _(v1, v2 int32) (int32, int32) {
if v1 > v2 {
v1, _ = v2, v1
}
return v1, v2
}
func _(v1, v2 int32) (int32, int32) {
if v1 > v2 {
_, v1 = v2, v1
}
return v1, v2
}
func _(v1, v2 int32) (int32, int32) {
if v1 > v2 {
v1, _ = v2, v1
}
v1, v2 = 0, 0
return v1, v2
}
func anyFunctionMightPanic()