V8031. Using the call of the 'len' function as an index will result in an off-by-one error.
Анализатор обнаружил потенциальный выход за границу массива из-за использования результата функции 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 можно убрать.