о гарантиях

Sep 12, 2019 11:13



fn helper<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T { v }

/// Turn any `&T` into a `&'static T`. May introduce undefined behavior.
pub fn make_static<'a, T>(input: &'a T) -> &'static T {
let f: fn(_, &'a T) -> &'static T = helper;
f(&&(), input)
}

(отсюдаНе ожидал, что так просто. Безо всякого unsafe берем и превращаем "одолженную" ( Read more... )

rust

Leave a comment

Comments 5

swizard September 12 2019, 20:20:45 UTC
ну нифига себе "так просто" :) это ж явно синтетический пример под конкретный баг чекера

Reply


kodt_rsdn October 7 2019, 13:43:34 UTC
А какого фига можно подменять признак ссылки в типе на static?
И какого фига для этого нужно использовать промежуточную функцию?
Можно для не знатоков раста рассказать?

И кстати, что это за колдунский тип первого аргумента хелпера?

Reply

thedeemon October 7 2019, 14:24:21 UTC
Я и сам не знаток. Как я понял, там как и в хаскеле есть тип unit - (), с единственным значением (). Раст позволяет описать ссылку на такое значение, и ссылку на ту ссылку, и для обеих ссылок заименовать лайфтайм, вот и получается &'a &'b (). Потом функцию, работающую с таким типом, мы присваиваем в переменную с чуть другим типом, тут должны сработать правила сабтайпинга между ограничениями лайфтаймов. И вот в этой части что-то недоделано, поэтому получается на выходе получить "вечный" лайфтайм static.

Подробности здесь:
https://github.com/rust-lang/rust/issues/25860

Reply

kodt_rsdn October 7 2019, 15:51:30 UTC
Дырка четырехлетней давности, и до сих пор не закрыта? Молодцы.

Это дефект компилятора - забыл наложить ограничение на шаблон функции, а должно было быть что-то типа

fn helper<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T
где 'a не может быть небезопаснее, чем 'b
{ v }

и дальше пошёл применять небезопасную функцию как попало?

Или это дефект стандарта, который не требует ни от компилятора неявно, ни от программиста явно накладывать такие ограничения?

Reply

kodt_rsdn October 7 2019, 16:29:35 UTC
Предположу, что это дефект языка вообще ( ... )

Reply


Leave a comment

Up