V8007. Calling the 'recover' function inside the anonymous function that is not deferred will not recover execution from panic.
Анализатор обнаружил использование функции recover в анонимной функции, которая сразу же будет вызвана. Таким образом, при возникновении паники невозможно восстановить исполнение горутины.
Рассмотрим синтетический пример:
func foo() {
func() {
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}()
q, r := bits.Div64(hi, lo, y)
....
}
После определения анонимной функции и её вызова происходит вызов функции bits.Div64. Эта функция может вызвать панику, если y окажется равной 0. Если паника дойдет до верха стека, то программа аварийно завершится.
Для восстановления после возникновения паники должна быть использована функция recover. Однако функция recover будет вызвана до возникновения потенциальной паники, потому что определена в анонимной функции, которая будет сразу же вызвана. Поэтому восстановления не произойдёт.
Можно исправить код, сделав вызов анонимной функции отложенным с помощью ключевого слова defer:
func foo() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}()
q, r := bits.Div64(hi, lo, y)
}