Skip to content

Commit

Permalink
Merge pull request #24 from sanposhiho/fix/wrong-report--reassign-ins…
Browse files Browse the repository at this point in the history
…ide-an-infinite-loop-and-not-use-after-exiting-loop

false-positive: reassign inside an infinite loop and not use after exiting loop
  • Loading branch information
sanposhiho committed Mar 4, 2021
2 parents 1413d2f + 86f5e05 commit e18aa2d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
25 changes: 24 additions & 1 deletion testdata/src/a/a.go
Expand Up @@ -109,7 +109,7 @@ func mugen() {
var i int
var hoge int
for {
hoge = 5 // want "reassigned, but never used afterwards"
hoge = 5 // want "wasted assignment"
// break
}

Expand All @@ -130,3 +130,26 @@ func noMugen() {
println(hoge)
return
}

func reassignInsideLoop() {
bar := func(b []byte) ([]byte, error) { return b, nil }
var err error
var rest []byte
for {
rest, err = bar(rest)
if err == nil {
break
}
}
return
}

func reassignInsideLoop2() {
var x int = 0
var y int = 1
for i := 1; i < 3; i++ {
x += y
y *= 2 * i
}
println(x)
}
10 changes: 5 additions & 5 deletions wastedassign.go
Expand Up @@ -163,20 +163,20 @@ func (wr wastedReason) String() string {
}
}

func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap map[int]bool) wastedReason {
func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap map[int]int) wastedReason {
var wastedReasons []wastedReason
var wastedReasonsCurrentBls []wastedReason

if haveCheckedMap == nil {
haveCheckedMap = map[int]bool{}
haveCheckedMap = map[int]int{}
}

for _, bl := range bls {
if haveCheckedMap[bl.Index] {
if haveCheckedMap[bl.Index] == 2 {
continue
}

haveCheckedMap[bl.Index] = true
haveCheckedMap[bl.Index]++
breakFlag := false
for _, ist := range bl.Instrs {
if breakFlag {
Expand All @@ -201,7 +201,7 @@ func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, hav
var buf [10]*ssa.Value
for _, op := range ist.Operands(buf[:0]) {
if *op == *currentOp {
// 連続storeではなかった
// It wasn't a continuous store.
return notWasted
}
}
Expand Down

0 comments on commit e18aa2d

Please sign in to comment.