OberonCore
https://forum.oberoncore.ru/

Как испортить память, не используя SYSTEM
https://forum.oberoncore.ru/viewtopic.php?f=2&t=709
Страница 1 из 3

Автор:  Trurl [ Понедельник, 29 Октябрь, 2007 12:41 ]
Заголовок сообщения:  Как испортить память, не используя SYSTEM

Код:
VAR p:POINTER TO ARRAY OF INTEGER;
PROCEDURE Bad(VAR a:INTEGER);
BEGIN
  p:=NIL;
  ...здесь срабатывает сборщик мусора, и вызывается NEW для чего-то ещё.
  a:=10;
END Bad.

BEGIN
  NEW(p,100);
  ...
  Bad(p[10])
END

Автор:  Сергей Губанов [ Понедельник, 29 Октябрь, 2007 13:50 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Не получается воспроизвести.

Автор:  Info21 [ Понедельник, 29 Октябрь, 2007 13:58 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
...


Блеск!

Надо понимать, трюк невозможен извне, т.е. если указатель недоступен на присваивание?

Автор:  Trurl [ Понедельник, 29 Октябрь, 2007 17:13 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

info21 писал(а):
Надо понимать, трюк невозможен извне, т.е. если указатель недоступен на присваивание?

Конечно. Да его и изнутри не так-то легко использовать.

Сергей Губанов писал(а):
Не получается воспроизвести.

Чтобы было заметно, небходимо "счастливое" совпадение.

Автор:  Vlad [ Понедельник, 29 Октябрь, 2007 20:40 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Нефиговая бага... Для агрегированных записей оно тоже актуально?

Автор:  Trurl [ Понедельник, 29 Октябрь, 2007 20:51 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Это не бага... ;)

Автор:  AVC [ Понедельник, 29 Октябрь, 2007 21:30 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
Это не бага... ;)


Думается, зависит от реализации сборщика мусора.
Ему имеет смысл быть немножко "консервативнее" и проверять ссылочные (VAR) переменные на принадлежность к куче. Области памяти, в которые они попадают, должны помечаться как используемые.
Вроде бы, тогда проблем быть не должно. :?:

Автор:  Wlad [ Понедельник, 29 Октябрь, 2007 22:08 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
Код:
 ...

Что-то у меня тихое подозрение, что это из "былого и пережитого"... :wink:
И как себя система вела?

Автор:  AVC [ Понедельник, 29 Октябрь, 2007 22:43 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Владимир Лось писал(а):
Trurl писал(а):
Код:
 ...

Что-то у меня тихое подозрение, что это из "былого и пережитого"... :wink:
И как себя система вела?


Подозреваю, что "бага" пока сугубо теоретическая. :)

Автор:  Vlad [ Вторник, 30 Октябрь, 2007 02:45 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
Это не бага... ;)


А что это, если не бага рантайма?

Автор:  Trurl [ Вторник, 30 Октябрь, 2007 09:30 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Vlad писал(а):
А что это, если не бага рантайма?

Это фича рантайма. :-)

AVC писал(а):
Подозреваю, что "бага" пока сугубо теоретическая. :)

Ага, я же не дурак - такие процедуры писать.

AVC писал(а):
Думается, зависит от реализации сборщика мусора.
Ему имеет смысл быть немножко "консервативнее" и проверять ссылочные (VAR) переменные на принадлежность к куче.

В начале Kernel есть констатнта, регулирующая степень консервативности.
Код:
CONST strictStackSweep = TRUE;

Если поставить FALSE, всё, напоминающее адрес в куче, будет рассматриваться как адрес в куче.

Автор:  Vlad [ Вторник, 30 Октябрь, 2007 10:22 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
Vlad писал(а):
А что это, если не бага рантайма?

Это фича рантайма. :-)


Эта "фича" ставит крест на хваленой "герметичность системы типов" в ББ. Т.е. "герметичность" начинает зависеть от программиста, который клятвенно обещает не брать ссылок на элементы массивов или записей. Причем пообещать-то он может, а вот проконтроллировать - уже нет, потому что ссылочность/не ссылочность зависит от автора процедуры (который однажды может поменять ее сигнатуру).

Trurl писал(а):
В начале Kernel есть констатнта, регулирующая степень консервативности.
Код:
CONST strictStackSweep = TRUE;

Если поставить FALSE, всё, напоминающее адрес в куче, будет рассматриваться как адрес в куче.


А что при этом с производительностью GC становится (который в ББ и так не блещет)?

Автор:  Info21 [ Вторник, 30 Октябрь, 2007 12:34 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Vlad писал(а):
... ставит крест на хваленой "герметичность системы типов" в ББ.
Цитата:
Оберон что, стал опасней, чем Ц?

Цитата:
А что при этом с производительностью GC становится (который в ББ и так не блещет)?

Еще как блещет. Только в реальных задачах, а не в дурацких тестах.

Автор:  AVC [ Вторник, 30 Октябрь, 2007 13:10 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
Если поставить FALSE, всё, напоминающее адрес в куче, будет рассматриваться как адрес в куче.


Интересно, почему там стоит TRUE... :?:

Автор:  Vlad [ Вторник, 30 Октябрь, 2007 18:44 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

info21 писал(а):
Оберон что, стал опасней, чем Ц?


С обероном все хорошо. А вот конкретная реализация (в лице ББ) с конкретно этой "фичей" подвержена опасным эффектам, типичным для C. Но главная опасность в том, что такого никто не ожидает от оберон системы.

info21 писал(а):
Цитата:
А что при этом с производительностью GC становится (который в ББ и так не блещет)?

Еще как блещет. Только в реальных задачах, а не в дурацких тестах.


Понятно, значит доказать вы опять не можете.

Автор:  Info21 [ Среда, 31 Октябрь, 2007 09:14 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Vlad писал(а):
info21 писал(а):
Vlad писал(а):
А что при этом с производительностью GC становится (который в ББ и так не блещет)?

Еще как блещет. Только в реальных задачах, а не в дурацких тестах.

Понятно, значит доказать вы опять не можете.

Понятно, что Вы не понимаете проблематику понятия "доказательство".[/quote]

Автор:  AVC [ Среда, 31 Октябрь, 2007 10:22 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

AVC писал(а):
Trurl писал(а):
Если поставить FALSE, всё, напоминающее адрес в куче, будет рассматриваться как адрес в куче.


Интересно, почему там стоит TRUE... :?:


Кстати, до конца непонятно, а есть ли на самом деле "бага"?
Я вчера сделал несколько попыток, но заставить таким способом ББ ошибиться не смог.

Автор:  AVC [ Среда, 31 Октябрь, 2007 10:29 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

AVC писал(а):
Я вчера сделал несколько попыток, но заставить таким способом ББ ошибиться не смог.


Я там немного подправил текст: ввел цикл, обернул массив в запись, для нее ввел финализатор, и т.д.
Возможно, я был недостаточно изобретателен.
Кому-нибудь удалось на практике воспроизвести сконструированную Трурлем ошибку?

Автор:  Trurl [ Среда, 31 Октябрь, 2007 17:00 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Понял почему не получается. Теперь не могу понять, как у меня получилось.
При передаче a[k] по ссылке, компилятор размещает адрес a в дополнительной локальной переменной.

Автор:  AVC [ Среда, 31 Октябрь, 2007 18:54 ]
Заголовок сообщения:  Re: Как испортить память, не используя SYSTEM

Trurl писал(а):
Понял почему не получается. Теперь не могу понять, как у меня получилось.
При передаче a[k] по ссылке, компилятор размещает адрес a в дополнительной локальной переменной.

Теперь понятно.
1) Оборачиваем массив в запись.
2) Перед ним добавляем несколько переменных.
3) передаем (как прежде) по ссылке элемент массива.
Т.о. ошибку мне удалось воспроизвести ошибку.
Так что "бага" теперь "доказана".

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/