

🔥🚲🚲🚲🚲🚲🚲🔥
🔥🚲💩💩💩💩🚲🔥
🔥🚲💩прод💩🚲🔥
🔥🚲💩💩💩💩🚲🔥
🔥🚲🚲🚲🚲🚲🚲🔥
🔥🔥🔥🔥🔥🔥🔥🔥
Size: a a a
SPANS
— глобальная переменная, вектор внутри RwLock
. Чуть позже напишу, в чём проблема, а пока попредлагайте свои вариантыSPANS
— глобальная переменная, вектор внутри RwLock
. Чуть позже напишу, в чём проблема, а пока попредлагайте свои вариантыimpl Drop for SpanGuard
, который убирает последний вставленный span. О чём при написании unsafe-кода всегда надо помнить — так это о том, что, вообще говоря, нет гарантии, что деструкторы будут вызваны, поэтому полагаться на них для обеспечения memory safety, нельзя. Так и тут: если SpanGuard
утекает (а для это достаточно просто вызвать на нём std::mem::forget
), то в глобальном векторе останется ссылка с насильно расширенным временем жизни. Если функция span
была вызвана с ссылкой на локальные данные, то после выхода из этой функции в SPANS
остаётся висячая ссылка, что прямо декларируется как undefined behaviour в Rust.