OberonCore
https://forum.oberoncore.ru/

Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар
https://forum.oberoncore.ru/viewtopic.php?f=27&t=1320
Страница 8 из 8

Автор:  Vlad [ Вторник, 03 Февраль, 2009 01:26 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Сергей Губанов писал(а):
1) Не учтён случай когда искомый элемент находится в позиции begin = end.
2) Программа выдаёт неправильный ответ если искомый элемент находится в позиции end.


[begin, end)

Автор:  Vlad [ Вторник, 03 Февраль, 2009 02:24 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Илья Ермаков писал(а):
А вот себе б я не доверял, если бы написал такой цикл. Разбираться, когда он из какого места изволит выпрыгнуть - брр. (там и без break, кстати, достаточно и одного условия begin < end).


Откуда он выпрыгнет и по какому условию - четко обозначено. Простым условием, а не трехэтажным.

Илья Ермаков писал(а):
Я лично знаю, что процесс линейного поиска - это процесс стягивания границ отрезка, таким образом, что держим внутри искомый элемент или его потенциальное место (значит - это и есть инвариант цикла. Если я проговорил это свойство вслух - значит, я знаю инвариант,


И что вам тогда не нравится? "begin != end" как раз и отражает процесс стягивания. Пока стягиваем - проверяем, не нашли ли то, что искали.

P.S. Будь моя воля (не C++) я бы вообще через рекурсию все это написал. Было бы еще понятнее и никаких циклов.

Автор:  Vlad [ Вторник, 03 Февраль, 2009 02:37 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Владимир Лось писал(а):
Помните я носился с библиотекой libao, потом перестал?


Что за библиотека?

Владимир Лось писал(а):
Таки примерно из-за такой ошибки, тока зеркально отражённой из другого места. Просто потому, что система поддержки времени исполнения на Си++ и современные ОС про сборку мусора и объекты ничего не знают, за то они знают про "потоки" вне контекста каких-либо объектов... А лочить всё на уровне ОСи, на время инициализации локальных указателей, системе, для которой собсна и создавалась libao было ОЧЕНЬ накладно...


А можно по-подробнее? Что за проблема с инициализацией локальных указателей и почему надо что-то лочить?

Автор:  Wlad [ Вторник, 03 Февраль, 2009 10:33 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Vlad писал(а):
А можно по-подробнее? Что за проблема с инициализацией локальных указателей и почему надо что-то лочить?

Потому, что между выделением фрейма стека для вызываемой функции и заполнением в нём всех локальных, для этой функции, указателей нулями может проснуться сборщик мусора...

У меня же проблема была прямо противоположная: объект может быть уничтожен (в системе поддержки времени исполнения Си++), а ссылка на него (через цепочку контекстов вызванных функций из активности этого объекта) ещё "жива". То есть, менеджер памяти Си++ (условно говоря!) уже считает все поля, занимавшееся экземпляром свободными, а в системе поддержки многопотоковости мне ещё нужно обращаться к полям этого объекта... Это только один из случаев... Там ещё интересней есть казусы.
Без поддержки сборки мусора в ОСи это никак не разгребсти. На boost или ACE "решения" прошу не указывать. Там - не то, что мне надо. Я хотел полностью влить синтаксис АО в Си++. Не получилось. В смысле синтаксис-то я обеспечил, но семантика "поплыла". Да что там поплыла? - на Си++ просто НЕЛЬЗЯ АО-подобные активные объекты получить. Только - обрезки и обёртки а ля указанные библиотеки.

ЗЫ ... И, без переделки языка, не получится ни у кого.

Автор:  Сергей Губанов [ Вторник, 03 Февраль, 2009 11:00 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Vlad писал(а):
Код:
ASSERT(bool(first) == bool(last));
last = last->next;

1) В этих местах не компилируется.
2) Как освобождается память?
3) Почему first и last имеют тип обычного указателя Item*, а не ненулевого ref<Item>? Это же идёт против идеологии ненулевых ссылок?

Автор:  Борис Рюмшин [ Вторник, 03 Февраль, 2009 12:05 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Владимир Лось писал(а):
ЗЫ ... И, без переделки языка, не получится ни у кого.

Однозначно.

Автор:  Vlad [ Вторник, 03 Февраль, 2009 16:46 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Владимир Лось писал(а):
Vlad писал(а):
А можно по-подробнее? Что за проблема с инициализацией локальных указателей и почему надо что-то лочить?

Потому, что между выделением фрейма стека для вызываемой функции и заполнением в нём всех локальных, для этой функции, указателей нулями может проснуться сборщик мусора...


Я не понимаю какое отношение это имеет к C++, пусть даже и с прикрученным к нему GC? Ну лежит в стэке мусор, самое худшее что может случиться - какой-нибудь объект "случайно" останется живым. В BB с его консервативным GC можно то же самое наблюдать.

Владимир Лось писал(а):
У меня же проблема была прямо противоположная: объект может быть уничтожен (в системе поддержки времени исполнения Си++), а ссылка на него (через цепочку контекстов вызванных функций из активности этого объекта) ещё "жива".


Не понял. Как GC умудряется прибить объект, если ссылка на него (через цепочку контекстов или как угодно) еще жива?

Владимир Лось писал(а):
То есть, менеджер памяти Си++ (условно говоря!) уже считает все поля, занимавшееся экземпляром свободными, а в системе поддержки многопотоковости мне ещё нужно обращаться к полям этого объекта...


В такой формулировке - это очень странное желание обращаться к полям удаленного объекта.

Владимир Лось писал(а):
На boost или ACE "решения" прошу не указывать. Там - не то, что мне надо. Я хотел полностью влить синтаксис АО в Си++. Не получилось. В смысле синтаксис-то я обеспечил, но семантика "поплыла". Да что там поплыла? - на Си++ просто НЕЛЬЗЯ АО-подобные активные объекты получить. Только - обрезки и обёртки а ля указанные библиотеки.


Ну и зачем вам копия синтаксиса AO? Суть концепций AO замечательно выражается на C++. Да, форма будет немного другая, зато родная для C++. Глядишь и с GC тогда не будет проблем (хотя лично я бы очень сильно подумал, прежде чем прикручивать к C++ GC).

Автор:  Vlad [ Вторник, 03 Февраль, 2009 17:00 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Сергей Губанов писал(а):
Vlad писал(а):
ASSERT(bool(first) == bool(last));


ASSERT - не стандартный макрос. Замените на assert.

Сергей Губанов писал(а):
last = last->next;


Добавьте в ref<T> "operator T* () const {return p;}".

Сергей Губанов писал(а):
2) Как освобождается память?


Это имеет какое-то отношение к контролю инициализации ненулевых ссылок? :) GC освобождает. Или деструктор статического объекта модуля чистит все от first до last.

Сергей Губанов писал(а):
3) Почему first и last имеют тип обычного указателя Item*, а не ненулевого ref<Item>? Это же идёт против идеологии ненулевых ссылок?


Вы вообще читали про что я писал? На "псевдоязыке" эти указатели помечены как OPTIONAL. Они могут быть нулевыми по сути задачи (список пуст). Если в данном примере отказаться от глобальных переменных и от понятия пустого списка - можно избавится и от обычных указателей.

Автор:  Info21 [ Вторник, 03 Февраль, 2009 19:14 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Кстати, а почему бы тогда посредством записи-VAR-параметра не общаться. Тут с гарантией ненулевая ссылка.

Автор:  Илья Ермаков [ Вторник, 03 Февраль, 2009 21:04 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Да, и гарантии есть что она не уйдёт "налево" (не запомнят, т.к. взять адрес нельзя).
Была у меня ситуация, где именно этот инвариант сильно помог. Вводил понятие описателя объекта (просто RECORD без всего) - и его разыменование возможно только с указанием процедуры, в которую он закидывается по VAR. Правда, это нужно было на уровне до сборщика мусора.

Автор:  TAU [ Воскресенье, 01 Март, 2009 02:57 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Владимир Лось писал(а):
выдающуюся систему управления DeepSpace One (не смотря на все грандиозные заделы и результаты) с Лиспа на Си++ перевели просто по причине неудовлетворения РТ-требованиям

Ой, как интересно! А ссылку можно?
Спасибо.

Автор:  TAU [ Воскресенье, 01 Март, 2009 03:05 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

Владимир Лось писал(а):
Это я в сотне байт управление заслонками движка по совокупности нескольких параметров делаю. Но системы уровня RAX — это совсем другое дело. Там на порядки параметров и состояний больше и пермалывающих это всё исполняемых сущностей

Не преувеличивайте, Владимир :wink:

Автор:  Wlad [ Понедельник, 02 Март, 2009 13:48 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

TAU писал(а):
Владимир Лось писал(а):
Это я в сотне байт управление заслонками движка по совокупности нескольких параметров делаю. Но системы уровня RAX — это совсем другое дело. Там на порядки параметров и состояний больше и пермалывающих это всё исполняемых сущностей

Не преувеличивайте, Владимир :wink:

Делалось здесь: http://www.avionika.com/oao_aviakontrol/about/

Автор:  Wlad [ Понедельник, 02 Март, 2009 13:50 ]
Заголовок сообщения:  Re: Хоар: "Нулевые ссылки -- ошибка стоимостью в миллиард доллар

TAU писал(а):
Ой, как интересно! А ссылку можно? Спасибо.

http://www.flownet.com/gat/jpl-lisp.html
ЗЫ это я ссылку дал, как обзор, а личное письмо от него никак не могу отыскать... :(

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