box::leak сложновато случайно вызвать.
Ну всякие сложные хитросплетения Arc-шек, думаю, самое частое.
Циклические ссылки
цикл Rc например
Видел несколько багрепортов об утечках в токио, и все они сводились к тому, что один кусок рантайма держал Arc на другой кусок рантайма и наоборот, и поэтому они текли.
+ аналогичные по сути проблемы, когда мы храним данные в массивах или еще каких контейнерах и работаем с ними через индексы-ключи
Это скорей use after free уже
почему? нам на самом деле могут уже перестать быть нужными какие-то значения и мы никогда за ними не полезем, но язык и типы нам в такой ситуации об этом никак не напомнят
Ну я как раз про это. Если ты используешь индексы как референсы, то ты можешь случайно сделать use after free и язык никак не сможет тебя спасти.
use after free не можешь, у тебя индекс упадёт паникой
Это если индекс теперь за границами контейнера.
хм. я бы сказал, что эта ситуация может и ликом быть, и uaf - в зависимости от твоих инвариантов в логике
индекс это не указатель, ты не можешь просто так из него значение получить
два вида утечек: 1. вектор в который пушатся данные но он никогда не удаляется/уменьшается 2. циклические ссылки первые даже в гц возможны, а вот второй - бич раста
Смотри, вот у нас вектор в десять элементов. У нас индекс на пятый элемент, а мы дропаем первый. Теперь индекс 5 индексирует не то что мы ожидали.
да, это неприятная логическая ошибка, но совсем не use after free
Это и есть use after free. Адрес в памяти в принципе ничем не отличается от индекса в массив.
Вернее, это является use after free конкретно в том случае если ты используешь вектор как арену.
У нас видимо разные определения use after free. Для меня это когда получают доступ к очищенной памяти (можно сказать что у значение на которое мы ссылаемся уже вызван drop) например: let v = vec![1]; let ptr = &v[0] as *const _; drop(v); unsafe { dbg!(*ptr) }; // use after free у тебя другое определение?
Что за выстрелы в колена? :)
Обсуждают сегодня