LINUX.ORG.RU

В Rust borrow checker обнаружены ошибки, существовавшие 11 лет и позволяющие обращаться к освобождённой памяти

 , ,


1

7

Проблема заключается в том, что требования borrow checker к времени жизни структуры можно обойти с помощью присвоения ковариантных полей.

В качестве примера кода, демонстрирующего ошибку, приведён (ссылка на Rust playground; для запуска нужно нажать кнопку “Run”):

struct Q<T, F: FnMut(&T)>(Option<T>, F);

impl<T, F: FnMut(&T)> Drop for Q<T, F> {
    fn drop(&mut self) {
        self.1(self.0.as_ref().unwrap())
    }
}

fn main() {
    let mut out: Option<&'static _> = None;
    {
        let l = vec![vec![1]];
        let mut q = Q(None, |s| {
            out = Some(*s);
        });
        q.0 = Some(&l);
    }
    println!("{:?}", out);
}

Обнаружение unsoundness (ошибок, приводящих к нарушению гарантий компилятора) в borrow checker’е Rust — не самое необычное явление. Но эта ошибка примечательна тем, насколько простым может быть код, вызывающий её. Для других ошибок приходилось сильно изворачиваться, чтобы избежать проверок компилятора.

Ссылка на issue: https://github.com/rust-lang/rust/issues/164250

★★

Последнее исправление: shdown (всего исправлений: 2)
Ответ на: комментарий от anonymous

Сперва реализуете свой «математически» доказанный borrow checker. Потом говорите о возможностях языка

Зис

pihter ★★★★★
()
Ответ на: комментарий от ugoday

Знаешь Миша, а можно еще хер себе дверью специально прищемить и потом всем рассказывать про неправильные двери.

Воу-воу, а можно ещё в сях обращаться к памяти, после того как её освободил, хотя русским языком запрещено так делать и рассказывать всем про неправильные си

pihter ★★★★★
()
Ответ на: комментарий от ggrn

это нечитаемо.

Проблема укушенных сишечкой, у которых парсер ломается на апострофе.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от neumond

трейт Drop

Основная «фишка» аффинных типов, по сравнению с линейными типами.

А аффинные типы - это ядро языка.

Не могут реализовать. Уровень!

anonymous
()
Ответ на: комментарий от anonymous

good omens

Терри Пратчет

печально что бинарная взрывчатка когда благие намериния сочетаемы с «fake it tell make it» и успешным маркетингом fomo

qulinxao3 ★☆
()
Ответ на: комментарий от saahriktu

жаль что на фортране я умею писать даже на фортране - а уж на остальных языках сам Бг велел фортраном ограничиватся для полного интероппа

qulinxao3 ★☆
()
Ответ на: комментарий от saahriktu

Функции объявляются коротким ключевым словом как в Python’е, только вместо ключевого слова «def» здесь ключевое слово «fn»;

а вот в mojo тоже fn завезли к уже наличному питоновскому def - вот rust fn оно ближее к mojo fn или прям как в питон def

?

qulinxao3 ★☆
()

О! У хейтеров сегодня пэрэмога. В расте одну ошибку обнаружали за 11 лет.

yvv1 ★★
()
Ответ на: комментарий от pihter

Читать сишный код умеют ± все. А вот столь мощный импринтинг возник только у некоторых. Без понятия как это лечить, но со стороны смотреть забавно.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Чистые сишники и на других языках пишут как на Си. И тут выясняется, что при таком подходе просто получаются второсортные «сишные» программы, а вовсе не программы на целевом языке. Но главное: оказывается, что в языке много «лишних», «ненужных», (читаем: «непонятных для сишника») «запасных деталей».

anonymous
()

Отличные новости. Хороший язык стал ещё лучше.

vbr ★★★★★
()
Ответ на: комментарий от anonymous

Настоящий программист на фортране способен написать программу на фортране на любом языке. Ну, а объявить ненужным всё, что не понимаешь это уж сам Бог велел. Однако, как их недуг в подвиг определить я пока без понятия.

P.S. На других ругаются, а сами пишут вот-так. Читайте на здоровье, только к окулисту и психопатологоанатому запишитесь заранее.

ugoday ★★★★★
()
Ответ на: комментарий от qulinxao3

проблема в речекраканье предшествующих лет что раст гарантированно при не использование unsafe - не течёт памятью

Тут глупость полная написана. Как Rust может не течь памятью, если в нём есть безопасная функция std::mem::forget, вся задача которой - чтобы утекла память?

Rust это memory-safe язык. Утечка памяти не классифицируется, как проблема с безопасностью памяти.

Можно с очень большой натяжкой сказать, что в обычном коде утечек, скорее всего, не будет. Но гарантий конкретно про утечки никто не даёт.

А топикстартер просто принёс баги. Баги исправят и всё будет хорошо. Язык сложный, компилятор сложный, багов в нём было, есть и будет много, как в любом другом компиляторе сложного языка. Это не делает язык менее пригодным для использования.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от pihter

нет, только укушенных. нормальные люди могут разные языки читать, в том числе и сишечку, а тех кого сишечка покусала, те потеряли этот дар разумных людей.

WatchCat ★★★★★
()
Ответ на: комментарий от anonymous

Чистые сишники и на других языках пишут как на Си.

Тут есть заядлые лисперы, которые пишут на лиспе циклы как на паскале. Вопрос: зачем им лисп, зачем нужен такой лисп?

anonymous
()
Ответ на: комментарий от vbr

А топикстартер просто принёс баги. Баги исправят и всё будет хорошо.

Такие баги с базовыми элементами как аффинные типы либо исправляются в самом начале, либо потом только костылятся симптомы. Потому что язык вырос на костылях, завязан на эти костыли, просто как не уберечь эти костыли.

Тут уже написали, что трейт Drop - это хитрый костыль встроенный в сам компилятор. В общем прорисовывается на каких костылях основана база языка.

anonymous
()
Ответ на: комментарий от anonymous

просто как не уберечь эти костыли.

просто так не убрать эти костыли.

anonymous
()
Ответ на: комментарий от vbr

по ходу все(точнее существенное большинство) ставших массовыми языки программирования и парадигмы в первую очередь должны что-то «продать» менеджерам что бы состоятся как языки за которых будут бюджеты выделять среднии лпр

кобол - пиши по английски , техножрецы бомжуют

всё_ооп - иерархии делегаты и прочий управленческий(так знакомый эти рыбам в воде) быт

раст - СОБСТВвенность ака боров

повторюсь сама юридические вывереное расщепление волоса когда в языке с момента выкатывания ver1.0 утечка и безопастность перестали быть пустым пересичением - это реальная политическая зрелость стюардов языка

qulinxao3 ★☆
()
Ответ на: комментарий от anonymous

пишут на лиспе циклы как на паскале.

Потому что можем! А вот на паскале как на лиспе уже не получится. 2:1 в нашу пользу.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

Тут есть заядлые лисперы, которые пишут на лиспе циклы как на паскале. Вопрос: зачем им лисп, зачем нужен такой лисп?

Так это те самые сишники как раз. Меня передергивает, например, от чего-то типа

(defun my-super-function (a b)
  (setq x (+ a 2))
  (setq y (+ b 3))
  (setq z (* x y))
  (format t "Result: ~A" z)
  (return-from my-super-function z))

А люди искренне считают, что пишут на лиспе. Ну кто же им доктор, точно не я.

anonymous
()
Ответ на: комментарий от vbr

по поводу бага

зависит от того как

если исправлением определений - то успех раста продолжится

если выкатят реальную математически доказанную безопастную модель без реальных возможных утечек и использований_после_освобождения при соблюдении всех ранее взятых обязательств - ну на этом удобсто раста для гова закончится

qulinxao3 ★☆
()
Ответ на: комментарий от anonymous

Да что вы всё врёти! Никто на лисп так не пишет. Пишут так:

(declaim (ftype (function (fixnum fixnum) fixnum) the-true-super-function))
(defun the-true-super-function (a b)
  (declare (optimize (speed 3) (debug 0) (safety 0)))
  (let* ((x (the fixnum (+ a 2)))
	 (y (the fixnum (+ b 3)))
	 (z (the fixnum (* x y))))
    (declare (type fixnum x y z))
    (format t "Result: ~A" z)
    (return-from the-true-super-function z)))

Чётко, понятно, всё, как вы любите.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Никто на лисп так не пишет.

Да пишут, пишут. Сам видел, даже здесь на форуме. Причем как пример «выразительности лиспа». Ссылок не будет, т.к. такой кошмар не сохраняю (достаточно того, что я это видел и развидеть уже не получится), но и тут есть такие деятели.

anonymous
()
Ответ на: комментарий от qulinxao3

по ходу все(точнее существенное большинство) ставших массовыми языки программирования и парадигмы в первую очередь должны что-то «продать» менеджерам что бы состоятся как языки за которых будут бюджеты выделять среднии лпр

Ну естественно, а зачем массово переходить на язык без какого-то уникального преимущества? Я вот ругаю C, постоянно хочу сделать свой язык без минусов C (в моем понимании, конечно), но я же понимаю, что этим языком кроме меня никто пользоваться не будет, и даже я не буду, потому, что за C стоят миллионы человеколет индустриальной разработки, которые откинуть просто так нельзя.

vbr ★★★★★
()
Ответ на: комментарий от vbr

вот и получается вкусный кактус едим мы а критерии по которым какой кто кактус ест выбирают бакалавры оф артс в лучшем для нас случае

qulinxao3 ★☆
()
Ответ на: комментарий от nullb0t

Конкретно такой пример сделан в демонстративных целях, надо понимать.

Но вообще, люди иногда такое пишут - хоть стой, хоть падай. Нет времени писать нормально - пишут «побыстрому». Потом получите, распишитесь.

bbc69
()
Ответ на: комментарий от nullb0t

Скорее всего фаззером нашли. Если бы кто-то реально так писал, то баг бы раньше обнаружился.

unC0Rr ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария