Исправлены ошибки памяти при раздвоении общего владения
11.07.2026В функции, раздваивающей общее владение при попытке изменить значение, исправлено несколько ошибок: утечка памяти, обращение к освобождённой памяти и неверное поведение при исчерпании памяти.
Что делает эта функция
Значение под счётчиком ссылок может быть изменено на месте — если ссылка единственная. Если ссылок несколько, счётчик увеличивается и получается независимая копия, а прежний владелец перестаёт быть единственным.
Это удобный способ менять большой объект без повторного выделения, когда обычно изменений мало. Именно поэтому функция оптимизируется особым образом: счётчик ссылок изменяется без атомарных операций, подразумевая, что вызывающий код уже обеспечил единственность.
Что было сломано
Ошибки возникали на пути с собственным аллокатором. При освобождении старого значения код вызывал освобождение указателя даже в случаях, когда обходить его не нужно, — с системным аллокатором это прощалось, с произвольным приводило к утечке.
Вторая ошибка — обращение к освобождённой памяти после того, как раскрутка стека была перехвачена. То есть программа, перехватывающая панику, могла получить значение, уже не принадлежащее никому.
Третья касалась поведения при нехватке памяти: разворачивание ситуации выполнялось в неправильном порядке, и состояние оказывалось хуже, чем до неё.
Почему это не проявлялось раньше
Все три ошибки требуют собственного аллокатора. Со стандартным их не видно: утечка памяти внутри аллокатора неотличима от обычного её отсутствия, а порядок действий при нехватке памяти определяется аллокатором.
То есть чем аккуратнее реализация аллокатора, тем дальше от стандартного режима и тем меньше шансов заметить проблему.
Оригинал
fix multiple logic bugs in Arc::make_mut
Упоминаний: 1 · Просмотров: 3