Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: Зачем тестировщику нужна безопасность? - 16.04

menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V8007. Calling the 'recover' function inside the anonymous function that is not deferred will not recover execution from panic.

03 Апр 2026

Анализатор обнаружил использование функции 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)
}