nilaway icon indicating copy to clipboard operation
nilaway copied to clipboard

False positive when a deep read uses an expression

Open cgetzen opened this issue 1 year ago • 1 comments

func false_positive() {
	outer := make(map[string]map[string]int)
	inner := []string{"a"}

	if _, ok := outer[inner[0]]; !ok {
		outer[inner[0]] = map[string]int{}
	}

	outer[inner[0]]["value"] = 1
}
// error: Potential nil panic detected. Observed nil flow from source to dereference point:
//        - deep read from local variable `outer` lacking guarding; written to at an index


// When the expression is assigned to a variable, it succeeds
func true_negative() {
	outer := make(map[string]map[string]int)
	inner := []string{"a"}
	x := inner[0]

	if _, ok := outer[x]; !ok {
		outer[x] = map[string]int{}
	}

	outer[x]["value"] = 1
}

cgetzen avatar Jun 12 '24 00:06 cgetzen

I'm hesitant to create another issue, as I think the root cause may be similar:

func false_positive() error {
	var slice []int
	sliceLen := len(slice)

	for idx := 0; idx < sliceLen; idx += 1 {
		_ = slice[0:idx]
	}
	return nil
}
// error: Potential nil panic detected. Observed nil flow from source to dereference point:
//        -  unassigned variable `slice` sliced into


func true_negative() error {
	var slice []int

	for idx := 0; idx < len(slice); idx += 1 {
		_ = slice[0:idx]
	}
	return nil
}

cgetzen avatar Jun 12 '24 20:06 cgetzen