Исправлены ошибки памяти при раздвоении общего владения

11.07.2026

В функции, раздваивающей общее владение при попытке изменить значение, исправлено несколько ошибок: утечка памяти, обращение к освобождённой памяти и неверное поведение при исчерпании памяти.

Что делает эта функция

Значение под счётчиком ссылок может быть изменено на месте — если ссылка единственная. Если ссылок несколько, счётчик увеличивается и получается независимая копия, а прежний владелец перестаёт быть единственным.

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

Что было сломано

Ошибки возникали на пути с собственным аллокатором. При освобождении старого значения код вызывал освобождение указателя даже в случаях, когда обходить его не нужно, — с системным аллокатором это прощалось, с произвольным приводило к утечке.

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

Третья касалась поведения при нехватке памяти: разворачивание ситуации выполнялось в неправильном порядке, и состояние оказывалось хуже, чем до неё.

Почему это не проявлялось раньше

Все три ошибки требуют собственного аллокатора. Со стандартным их не видно: утечка памяти внутри аллокатора неотличима от обычного её отсутствия, а порядок действий при нехватке памяти определяется аллокатором.

То есть чем аккуратнее реализация аллокатора, тем дальше от стандартного режима и тем меньше шансов заметить проблему.

Оригинал

fix multiple logic bugs in Arc::make_mut

Упоминаний: 1 · Просмотров: 3