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 писал(а): Код: ... Что-то у меня тихое подозрение, что это из "былого и пережитого"... И как себя система вела? |
Автор: | AVC [ Понедельник, 29 Октябрь, 2007 22:43 ] |
Заголовок сообщения: | Re: Как испортить память, не используя SYSTEM |
Владимир Лось писал(а): Trurl писал(а): Код: ... Что-то у меня тихое подозрение, что это из "былого и пережитого"... И как себя система вела? Подозреваю, что "бага" пока сугубо теоретическая. |
Автор: | 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/ |