Проверяемые адреса при работе с SYSTEM

Добавлено свойство проверяемости при работе с низкоуровневыми адресами в процедурах из SYSTEM — ADR, BIT, GET, PUT, COPY.

Подход показывает возможность отказа от принципа «всё или ничего» в отношении безопасности указателей. В таком воплощении низкоуровневая адресация позволяет обойти типизацию в тех случаях, когда это может быть необходимо, но не предоставляет произвольный грубый доступ ко всей памяти, не позволяя также нарушить многие гарантии исходного языка, и помогая избежать ряда уязвимостей[0]. Правильный код, написанный под такое воплощение SYSTEM будет правилен и для бесконтрольного обращения к памяти. Обратное, естественно, верно не всегда.

Адрес, напрямую хранимый как 32-битный INTEGER, не предоставляет возможности осуществлять такие проверки, поэтому применяется косвенность. Сам адрес в старших разрядах хранит индекс от кольцевой таблицы, в которой сохранены обычные указатели и связанные с ними сведения, включая размер объекта. В младших разрядах хранится смещение от базового адреса, что позволяет проводить адресную арифметику так же, как в обычной бесконтрольной адресации, но в пределах объекта. Старые адреса по мере вызова SYSTEM.ADR приходят в негодность. Части диапазонов обеих частей адреса зарезервированы для вероятностного выявления выхода за пределы применимости. Адреса локальных объектов перед завершением процедуры помечаются как устаревшие. Параметры процедуры, ссылающиеся на глобальные объекты, всё равно считаются локальными.

Так как косвенность позволяет работать с указателями любой размерности, то теперь работа с псевдомодулем SYSTEM доступна не только для 32-битных указателей, но и для 64-битных и для более экзотичных, подобных 128-битным указателям Эльбруса в защищённом режиме.


[0] Пример на forum.oberoncore.ru возможного нарушения памяти при использовании SYSTEM из-за неточной проверки входных параметров.
[1] Более полный подход к обеспечению целостности памяти в Oberon — github/vostok-space/безопасно-по-памяти.md