OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 18 Май, 2024 07:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: Суббота, 10 Январь, 2009 15:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2450
Откуда: Россия, Томск
bohdant писал(а):
Цитата:
При выделении памяти под структуру, содержащую указатели, гарантируется, что все указатели будут = NIL.
А где это написано? Просто интересно.
BlackBox - Help - Language Reference - 6.4 Pointer Types: "All fields or elements of a newly allocated record or array are cleared, which implies that all embedded pointers and procedure variables are initialized to NIL."

XDS Help - "GENPTRINIT": "If the option is set ON, the compiler generates code for initialization of all local pointers, including variables, record fields and array elements. Values of all non-pointer record fields and array elements are undefined.
The option is ON by default."

См. также "The Oakwood Guidelines for Oberon-2 Compiler Developers" - "5.8 Initialisation of Pointers". Я уверен, что как XDS, так и BlackBox этим требованиям соответствуют.

В сообщении о языке "The Programming Language Oberon-2" есть приложение "D5. Run Time Data Structures", где описана возможная реализация дескриптора типа. Там явно перечислены поля записи, содержащие указатели, так что эта информация может быть доступна в процедуре NEW и без полной очистки памяти.

Без инициализации указателей о какой надёжности можно вести речь?


Последний раз редактировалось Александр Ильин Суббота, 10 Январь, 2009 15:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Январь, 2009 15:09 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Александр Ильин писал(а):
Language Reference - 6.4 Pointer Types: "All fields or elements of a newly allocated record or array are cleared, which implies that all embedded pointers and procedure variables are initialized to NIL."

Вот теперь все стало на свои места, действительно есть не соответсвие заявленным особенностям.
Наверное нужно глянуть исходники Менеджера памяти - действительно ли реализован п. 6.4.? Или может там ошибочка закралась?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 10 Январь, 2009 21:35 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В ББ все динамически создаваемые структуры данных забиваются нулями. Используется функция Kernel.Erase, написанная в маш. кодах.

Для структур на стеке компилятор в заголовке процедуры генерирует команды, которые зануляют указатели, но аккуратно "обпрыгивают" всё остальное.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Июнь, 2009 23:38 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Trurl писал(а):
Сергей Губанов писал(а):
Принципиально то, что переменная a объявлена внутри процедуры. Когда она глобальная вроде всё нормально.

Точно.

Попробовал воспроизвести это в gpcp: не получилось:-(

Код:
MODULE Crash;
   IMPORT Sys := "[mscorlib]System", CPmain, Console;
   VAR i: INTEGER;   
   PROCEDURE Do*;
      VAR p, q: POINTER TO ARRAY 10 OF CHAR;
      PROCEDURE Foo (VAR x: CHAR);
      BEGIN
          p := NIL;
          Sys.GC.Collect();
          NEW(q); q^ := 'abcdefgh';
          x := '!';
      END Foo;
   BEGIN
      Sys.GC.Collect();
      NEW(p);
      Foo(p[2]);
      Console.WriteString(q); Console.WriteLn
   END Do;
BEGIN
   Do;
END Crash.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Июль, 2009 02:36 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
А в A2, между прочим, память портится также и в случае глобальных переменных:

Код:
MODULE Crash;
IMPORT Log := KernelLog, Modules, Heaps;
VAR p, q: POINTER TO ARRAY 10 OF CHAR;
      PROCEDURE Foo (VAR x: CHAR);
      BEGIN
         p := NIL;
         Heaps.CollectGarbage(Modules.root);
         NEW(q); q^ := 'abcdefgh';
         x := '!';
      END Foo;
PROCEDURE Do*;
   BEGIN
      Heaps.CollectGarbage(Modules.root);
      NEW(p);
      Foo(p[2]);
      Log.String(q^); Log.Ln;
   END Do;
END Crash.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB