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

Вебинар: Практическая интеграция PVS-Studio и SourceCraft - 15.07

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

V8031. Using the call of the 'len' function as an index will result in an off-by-one error.

22 Июн 2026

Анализатор обнаружил потенциальный выход за границу массива из-за использования результата функции 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 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

Данная диагностика классифицируется как: