Что такое временная и пространственная безопасность памяти?

— 2024-12-15 Yoshua Wuyts Источник

Прекрасные люди из Google, работающие над безопасностью, недавно пишут о «временной (памяти) безопасности» (temporal memory safety) и «пространственной (памяти) безопасности» (spatial memory safety). Когда я впервые увидел эти термины, мне потребовалась минутка, чтобы понять, что они означают, поскольку поиск в интернете не дал мгновенных ответов. Поэтому я подумал, что, возможно, будет полезно записать это для других:

  • Пространственная безопасность памяти (spatial memory safety): описывает нарушения, такие как выход за границы. Например, у вас есть вектор из 10 элементов. Попытка чтения из места в памяти несуществующего 11-го элемента — это неопределённое поведение. Можно думать об этом как о нарушениях, связанных с областями памяти (пространство).
  • Временная безопасность памяти (temporal memory safety): описывает нарушения, такие как использование после освобождения (use-after-free). Например, у вас есть тип, который уже был деинициализирован («уничтожен» в Rust). Попытка затем прочитать любое из его полей — это неопределённое поведение. Можно думать об этом как о нарушениях, связанных с порядком операций с памятью (время).

Моя единственная претензия к этим терминам в том, что я иногда видел, как люди опускают квалификатор «памяти». Я думаю, это одна из причин, по которой эти термины могут сбивать с толку: существует множество других свойств безопасности¹, связанных с расположением или порядком, которые можно моделировать и которые не имеют ничего общего с безопасностью памяти. Беглый просмотр записей о Временной логике (Temporal Logic) или TLA+ должен прояснить это².

Моя просьба заключается в том, чтобы при обсуждении пространственной безопасности памяти и временной безопасности памяти ссылаться на них полностью. Не пытайтесь сокращать их, опуская квалификатор «памяти». Потому что при обсуждении формально смоделированных свойств определённо стоит быть конкретным в отношении того, что именно вы пытаетесь гарантировать.

Примечания