Zig Software Foundation опубликовала в devlog материал Робби Лаймана о Pointer Stability for ArrayLists. Он объясняет перенос механизма защиты стабильности указателей в std.ArrayList и показывает, как тот помогает обнаруживать нарушения безопасности памяти.

Разработчик вызывает lockPointers() при первом сохранении указателя или среза на элементы ArrayList, а unlockPointers() — когда ссылки больше не нужны. После блокировки нарушение предположения о стабильности указателей вызывает panic со stack trace, который указывает место проблемы.

Блокировка учитывает не только перераспределение backing memory. После lockPointers() методы orderedRemove() и pop() тоже вызывают assertion, поскольку упорядоченный ArrayList может перемещать элементы без выделения памяти.

Проверка утверждений:

  • Zig Software Foundation опубликовала в своём devlog материал типа release от Робби Лаймана о Pointer Stability for ArrayLists: запись объясняет перенос механизма защиты стабильности указателей в std.ArrayList и показывает, как он помогает обнаружить нарушение безопасности памяти. (подтверждено первоисточником: доказательство; «August 27, 2026 Pointer Stability for ArrayLists Author: Robbie Lyman Pointer Stability Locks were added to std ’s Hash Map containers in 2024 . A pull request initially opened by Leo Emar-Kar in 2025 now brings this technique for ensuring memory safety to std.ArrayList .»)
  • Механизм Pointer Stability Locks ранее появился в контейнерах Hash Map стандартной библиотеки Zig в 2024 году, а открытый Лео Эмар-Каром в 2025 году pull request перенёс его в std.ArrayList. (подтверждено первоисточником: доказательство; «Pointer Stability Locks were added to std ’s Hash Map containers in 2024 . A pull request initially opened by Leo Emar-Kar in 2025 now brings this technique for ensuring memory safety to std.ArrayList .»)
  • Разработчику предлагается вызвать lockPointers() при первом сохранении указателя или среза на элементы ArrayList и unlockPointers(), когда эти ссылки больше не нужны. (подтверждено первоисточником: доказательство; «To make use of this in your code, add a call to lockPointers() when you first store a pointer to an element or a slice of elements backed by the ArrayList , and call unlockPointers() when those pointers are no longer needed.»)
  • Показанная в разборе ошибка возникает, когда сохранённые в одном ArrayList срезы зависят от расположения backing storage другого ArrayList, которое может измениться при росте сверх текущей ёмкости. (подтверждено первоисточником: доказательство; «The problem is that elements of Context.lines.items depend on the location of Context.history.items , but this location may change if Context.history needs to grow beyond its current capacity.»)
  • Без блокировки указателей тест из материала обнаруживает порчу ссылки лишь как несовпадение ожидаемой строки «I’m first!» с полученной «UUUUUUUUUU», причём проявление ошибки зависит от выбранного аллокатора. (подтверждено первоисточником: доказательство; «Not great, right? This does tell us that we have a bug, but depending on your comfort debugging memory issues (and your choice of allocator, which will change how the bug manifests!), you might be lost for quite a while before you spot the fix.»)
  • После добавления lockPointers() нарушение предположения о стабильности указателей приводит к panic со stack trace, указывающим на место проблемы, что облегчает диагностику возможной ошибки безопасности памяти. (подтверждено первоисточником: доказательство; «We get a panic with a stack trace that shows us where our assumption about pointer stability was violated!»)
  • Блокировка учитывает не только перераспределение backing memory: orderedRemove() и pop() тоже вызывают assertion после lockPointers(), поскольку упорядоченный ArrayList может перемещать элементы даже без выделения памяти. (подтверждено первоисточником: доказательство; «For this reason, although orderedRemove() and pop() never allocate, they will trigger the same assertion above after a call to lockPointers() .»)

Первоисточники:

оценка 68.5 · тип release · ревизия 1 · истории st-1cve3kh