Skip to content

Commit

Permalink
fix: ループ内に別のブロックがある際に特定の条件下でoverflowする問題を修正
Browse files Browse the repository at this point in the history
  • Loading branch information
sanposhiho committed Sep 19, 2020
1 parent e644437 commit 9411bed
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
17 changes: 16 additions & 1 deletion testdata/src/a/a.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,21 @@ func f(param int) int {
return ret
}

func checkLoopTest() int {
hoge := 12
noUse := 1111
println(noUse)

noUse = 1111 // want "reassigned, but never used afterwards"
for {
if hoge == 14 {
break
}
hoge = hoge + 1
}
return hoge
}

func r(param int) int {
println(param)
useOutOfIf := 1212121
Expand Down Expand Up @@ -71,7 +86,7 @@ func mugen() {
var i int
var hoge int
for {
hoge = 5 //want "wasted assignment"
hoge = 5 // want "reassigned, but never used afterwards"
// break
}

Expand Down
14 changes: 11 additions & 3 deletions wastedassign.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
var buf [10]*ssa.Value
for _, op := range ist.Operands(buf[:0]) {
if (*op) != nil && opInLocals(sf.Locals, op) {
if reason := isNextOperationToOpIsStore([]*ssa.BasicBlock{&blCopy}, op); reason != notWasted {
if reason := isNextOperationToOpIsStore([]*ssa.BasicBlock{&blCopy}, op, nil); reason != notWasted {
pass.Reportf(ist.Pos(), reason.String())
}
}
Expand Down Expand Up @@ -64,11 +64,19 @@ func (wr wastedReason) String() string {
}

// 次のblockまでみて、storeが連続であるかを調べる
func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value) wastedReason {
func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap *map[int]bool) wastedReason {
wastedReasons := []wastedReason{}
wastedReasonsCurrentBls := []wastedReason{}

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

for _, bl := range bls {
if (*haveCheckedMap)[bl.Index] == true {
continue
}
(*haveCheckedMap)[bl.Index] = true
breakFlag := false
for _, ist := range bl.Instrs {
if breakFlag {
Expand Down Expand Up @@ -99,7 +107,7 @@ func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value) was
}
}
if len(bl.Succs) != 0 && !breakFlag {
wastedReason := isNextOperationToOpIsStore(rmSameBlock(bl.Succs, bl), currentOp)
wastedReason := isNextOperationToOpIsStore(rmSameBlock(bl.Succs, bl), currentOp, haveCheckedMap)
if wastedReason == notWasted {
return notWasted
}
Expand Down

0 comments on commit 9411bed

Please sign in to comment.