Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08
Анализатор обнаружил потенциальный выход за границу массива из-за использования результата функции len в качестве индекса. Подобная ошибка приведёт к панике программы.
Рассмотрим пример такого кода:
func End(basicLits []*BasicLit) token.Pos {
return basicLits[len(basicLits)].End()
}
В коде хотят получить позицию последнего элемента слайса basicLits. Однако для слайса длины n допустимые индексы находятся в диапазоне от 0 до n - 1, поэтому обращение к basicLits[len(basicLits)] всегда приведёт к панике программы.
Исправленный код:
func End(basicLits []*BasicLit) token.Pos {
if length := len(basicLits); length > 0 {
return basicLits[length - 1].End()
}
return token.NoPos
}
Если у функции есть предусловие, что она работает со слайсами ненулевой длины, то проверку length > 0 можно убрать.
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти). |
Диагностическое правило классифицируется как:
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: