Skip to content

no-defer-in-loop

Default severity: warning

Configuration: severity and path excludes

Reports defer statements nested inside for or range loops. Deferred calls run when the surrounding function returns, not when the current iteration ends, so resources can accumulate for the entire loop.

for _, filename := range filenames {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
}
for _, filename := range filenames {
if err := processFile(filename); err != nil {
return err
}
}
func processFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
return consume(file)
}

A defer inside a function literal declared within the loop is not reported: that defer belongs to the nested function and runs when that invocation ends.

//strider:ignore no-defer-in-loop
for range smallFixedSet {
defer releaseAtFunctionExit()
}