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)
Ответ на: комментарий от ugoday

Это ерунда: что quote, что backquote - все перед скобочками. А эта хрень в расте больше похоже на unquote и unquote-splicing - вот от этого точно сознание потерять можно, прийдя с си/питона/паскаля/бейсика.

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

Это ерунда: что quote, что backquote - все перед скобочками

CL-USER> (defvar x)
X
CL-USER> (set 'x 'татышо?!)
ТАТЫШО?!
CL-USER> x
ТАТЫШО?!
CL-USER> 

А эта хрень в расте больше похоже на unquote и unquote-splicing

Согласен, но пугать желторотых сишников ` , и ,@ будет непедагогично. Дайте им время одиночную кавычку переварить.

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

А, ну да, квоту можно перед символом, куда без этого. Я вспомнил, когда уже отправил, а исправить низя.

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

Я б обобщил: читаемо, если уметь читать. С какого перепугу вообще неизвестный язык должен быть читаем теми, кто его не знает? Давайте ещё испанский ругать за то, что там буквы ненашенские.

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

… и вопросы перевёрнутые.

Раст тут стоит особняком. Всё-таки время жизни - уникальная для него концепция, в других языках не встречающаяся. Тяжело понимать то, с чем не знаком. Другие языки в этом смысле ближе друг к другу. Разве что хаскель какой выделяется.

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

Если за пределы семейства Алгола не выходить, то да. А так — полно разных языков со своими уникальными фишками. (зачем вообще новый ЯП зачинать, если у него не будет своей особенной особенности?).

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

Да нет, у Вас просто ненависть к языку.

И к священникам! :)

А у тебя - преждевременно ярлыкораздавание

Где это у меня ненависть к языку? У меня вопросы к громкоорунам, которые на деле не дюжат соответствовать своим же кромким заявления. То есть вопросы у меня не к языку, а к позиционированию, к людям

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

Кто-то заявлял, что в компиляторе руста гарантированно нет ошибок?

Не знаю, вы мне скажите, это же я вопрос задал, вот уже один форумчанин говорит что было

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

А в дырявых сях когда ошибки при работе с памятью пофиксят?

А дырвые си никогда из себя праведника и не корчили

И вообще, при чем тут си?

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

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

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

Ну так-то, не сильно хуже плюсовой шаблонной лапши

По-моему хуже плюсовой шаблонной лапши нет ничего

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

Читаемо, если знать, что это означает.

Тебя комментировать - только портить

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

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

замыкания без коллекционирования отходов тот ещё мандала_медитации_процесс

упоминание обьектов как реакция на замыкания симптом вашего нелёгкого пути в профессии

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

да нифига

посмотри на Эйлер от Вирта - вот там вот реально - а раст со своим боровом и намерено крипо-синтаксисам(в подрожании насишным языкам) так семечки

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

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

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

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

Потому как надеяться, что в большой и сложной программе гарантированно полностью отсутствуют все ошибки — это нужно быть очень упоротым уверенным человеком

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

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

Если в каком-нибудь фри паскале такое найдут, никто и не скажет ничего, а почему так?

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

Ну вот все разумные люди именно так эти гарантии и восприняли - грош им цена на деле.

Чепуха же. Есть два совершенно разных утверждения: «язык Х исключает определённый класс ошибок» и «компилятор х корректно преобразует код Х в исполняемый файл». Не нужно их путать.

Фанаты раста натурально задрали рассказывать какой он безопасный,

Чай, говорят, помогает если с мятой или ромашкой заварить.

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

Есть два совершенно разных утверждения: «язык Х исключает определённый класс ошибок» и «компилятор х корректно преобразует код Х в исполняемый файл». Не нужно их путать.

Согласен, но IRL раст не отделим от своего компилятора

Поправь, если я не правильно понял, сабж - это исключительно ошибка компилятора? Язык такого не позволяет по идее?

Фанаты раста натурально задрали рассказывать какой он безопасный,

Чай, говорят, помогает если с мятой или ромашкой заварить

Да я-то спокойный, а ты прекрасно понимаешь о чем я

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

язык Х исключает определённый класс ошибок

Нет такого языка.

Есть компилятор с typechecker’ом. Typecheker может проверить «правильность» использования элементов языка. Как напишешь его, так и будет проверять. Например, можно написать как в обсуждаемой теме.

Можно вообще выключить этот typecheker. Можно использовать внешний, и прогонять перед компиляцией. Например, можно проверить «правильность» python-программы внешним linter’ом.

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

Ну так если компилятор проверит, что все инты - это не стринги, то очевидно, что исключается класс ошибок «вместо инта передали в функцию стринг», вполне возможные в питоне или жаваскрипте.

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

Обычно никаких проблем с замыканиями нет, там стандартные правила бороучекера работают, из-за чего кстати их относительно сложно использовать в расте. Скорее какой-то костыль в трейте drop был, который до сих пор не снесли. Этот трейт реализован прям в компиляторе и там есть какое-то количество магии.

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

это исключительно ошибка компилятора?

Именно. Причём не первая, да и не последняя. Тут единственный примечательный ньюанс, что долго скрывалась, хотя и воспроизводится довольно просто. Т.е. реально весь посыл новости В КОМПЬЮТЕРНОЙ ПРОГРАММЕ ОБНАРУЖИЛИ ОШИБКУ!!!!!1!!!.

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

Реализуем трейт Drop для дженерик типа Q с параметрами T, F, где тип F должен удовлетворять трейту FnMut(ссылка на T). Единственная функция трейта Drop, drop, вызывает второй член кортежа Q с параметром первым членом этого же кортежа, взятым как ссылка и проверенным ассертом с паникой.

Всё, я вызвал, прощай цивилизация.

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

Нет такого языка.

facepalm.jpg

Как напишешь его, так и будет проверять.

Вот, казалось бы, простая мысль «язык программирования и его компилятор — не одно и то же». Но нет же, надо объяснять, да ещё и с первого раза не доходит.

Можно вообще выключить этот typecheker.

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

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

Проверяет компилятор, а не язык. То что у языка rust единственный компилятор, не делает этот компилятор языком.

Проверяет правильность единственная реализация typechecker’а.

С определенными подсказками (именование, спец коментарии, прагмы и тп) можно написать linter-typechecker с похожими гарантиями для си.

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

С определенными подсказками (именование, спец коментарии, прагмы и тп) можно написать linter-typechecker с похожими гарантиями для си.

Пишите. Если результат будет читаемее растовского, люди вам спасибо скажут (всё равно всё обосрут, конечно же).

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

язык программирования и его компилятор — не одно и то же

Вот именно. Про rust как язык пишут «научные» статьи. А единственная реализация такая, как в обсуждаемой теме.

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

А единственная реализация такая, как в обсуждаемой теме.

В КОМПЬЮТЕРНОЙ ПРОГРАММЕ ОБНАРУЖИЛИ ОШИБКУ!!!!!1!!!. Как так-то? Как людям в глаза смотреть?

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

Нет, именно к языку. У Вас язык виноват в том, что ошибки содержит.

Касаемо говорунов понимаю и даже поддерживаю. Но к языку это мало относится.

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

В единственной реализации не могут реализовать «громкие обещания» языка. Но пишут «научные» статьи. Лженаука. Язык оторванный от реальности.

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

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

Нет, замыкания это указатели для богатых. И базовый строительный блок в языке.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous
Как же верить теперь мне людям?
Отдалась я ему при Луне.
А он взял мои девичьи груди
И узлом завязал на спине.
ugoday ★★★★★
()
Ответ на: комментарий от neumond

Скорее какой-то костыль в трейте drop был, который до сих пор не снесли. Этот трейт реализован прям в компиляторе и там есть какое-то количество магии.

Интересное предположение. Очень может быть.

Проверил: да, если заменить на обычный метод, то не компилится.

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

Да не, не такое. Я в своей жизни только слабые ссылки помню и то, как развлекуха скорее. Самому этим рулить точно не надо. В питоне, например, говорят не о времени жизни, а об области видимости. Что там в сях, не знаю, но как я понимаю, самому следить, чтобы ссылка не повисла.

И да, у раста уникальная концепция - единого хозяина. От которого всё и растёт.

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

Ну так, а какие варианты? Вот у тебя есть тип переменной и его время жизни. Получаем три варианта: T, T'a, 'a. Если взять, ну допустим двоеточие: T, T:a, :a. последний будет странно смотреться. Скобочки ещё хуже. Так что из всех вариантов самый оптимальный.

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

Юникодом же, как в Raku. Диакритический знак •́ доступен как typo+a в типографской раскладке.

T, T á, á

Если отдельными символами, то typo+V = ◊, typo+m = •.

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

T á,

Не воспринимается, как единое значение.

Ну и не очень удобно писать такое. Хотя это и не сказать, чтобы супер важно было.

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

вы как это писать будете?

В emacs. Если ваш текстовый редактор чего-то не умеет, выкидывайте его нафиг.

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

Проверяет компилятор, а не язык. То что у языка rust единственный компилятор, не делает этот компилятор языком.

А какие тогда вопросы к другим языкам? Любимая всеми «дырявая сишечка» получается тоже не виновата, gcc проглядел? Ведь можно же просто дописать ещё кучу проверок?

Давай на секунду гиперболизируем для ясности: представим что про раст пишут кучи статей и везде пропагандируется что он капец какой гарантированный от утечек и всяких юс афте фри, а его, раста единственный компилятор вообще никаких проверок не делает и по факту сегфолт на сегфолте, как это будет восприниматься?

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

Без подсказок нельзя, потому что язык Си не позволяет выражать определённые вещи. С подсказками это уже не Си

Можно пример ситуации которую даже Теоритически-то нельзя отловить на этапе компиляции и которая приведёт к ошибке по памяти?

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

Нет, именно к языку. У Вас язык виноват в том, что ошибки содержит.

Ну что на такое можно ответить? Видимо, тебе виднее, чем мне что мне нравится, что нет и что я вообще имею в виду…

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