OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 11:01

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




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 20 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 29 Март, 2006 09:52 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Перенёс застарелую тему "Странности в коде с Files.Locator" из публичного раздела.
Вот штуку заметил. В документации к Files чёрным по белому написано, что Files.Directory.This не может вернуть NIL, а при ошибке возвращает result.res # 0.
В модулях же Блэкбокса после Files.dir.This стоят проверки на # NIL. И как это понимать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности в коде с Files.Locator
СообщениеДобавлено: Среда, 29 Март, 2006 10:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Ivor писал(а):
И как это понимать?


Э-э-э, ну, я тоже такие проверки ставил. Документацию лень читать, а интуитивно мерещится, что еже ли что не так, то вроде как NIL обычно возвращают :oops:.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 29 Март, 2006 10:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Files.Directory.This

- фишка тут в том, что ошибки-то быть не может в принципе. Локатор - это всего лишь описатель пути, эквивалент текстовой строки. При его создании никаких системных операций не выполняется. Можно успешно создать локатор на любой несуществующий путь и даже не имеющий смысла путь. Ошибка вылезет только при попытке дальнейшего использования такого локатора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 30 Март, 2006 00:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Илья Ермаков писал(а):
Files.Directory.This

- фишка тут в том, что ошибки-то быть не может в принципе. Локатор - это всего лишь описатель пути, эквивалент текстовой строки. При его создании никаких системных операций не выполняется. Можно успешно создать локатор на любой несуществующий путь и даже не имеющий смысла путь. Ошибка вылезет только при попытке дальнейшего использования такого локатора.


Несуществующий каталог - ошибка. А в коде перед его использованием проверяется # NIL.

Короче, пора заводить раздел "Подводные камни" (c) "Королевство Дельфи" ;)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 16 Июль, 2008 22:11 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Нашёл в ББ злобный баг. Точнее известен он давно, я на него только по-подробнее взглянул. Итак, Files.Locator.This:
по документации в случае ошибки должен возвращать NIL, а код ошибки кладётся в поле res родительского локатора. Реализация же в HostFiles всегда возвращает новый локатор, просто в случае ошибки кладёт её код в поле res возвращаемого локатора! При этом модули среды полагаются на документированное поведение, честно проверяя результат каждого вызова This на NIL. Я вообще удивлён, почему до сих пор ошибки не посыпались. Я ещё не проверял, везде ли разработчики следовали спецификации или уже начали "учитывать" этот баг.

На самом деле баг логический - в Files указано, что Locator.This в случае ошибки должен возвращать NIL, а Directory.This - возвращать локатор с кодом ошибки в res.

Не стал публиковать в открытом разделе дабы не смущать народ. А самому как-то грустно стало - как это вообще могло произойти? И сколько ещё сюрпризов заложено в системе? :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Среда, 16 Июль, 2008 22:24 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Хорошо бы в Цюрих отписать... вопрос только будут ли они этим заниматься теперь...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Четверг, 17 Июль, 2008 06:41 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Иван Горячев писал(а):
Нашёл в ББ злобный баг.

Это не злобный баг, а ляп, который -- практика доказала :-) -- почти никому не мешает.

Надо исправить, конечно. А вот народ пугать без достаточных оснований страшными гипотезами, прямо противоречащими 15-летнему опыту, думаю, не стоит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Четверг, 17 Июль, 2008 07:50 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Баг, баг. В Windows народ на такие "ляпы" ругается со страшной силой, когда в MSDN пишут одно, а практика показывает другое. И называют это багами.

И я не пугаю народ, просто занимать позицию "в Обероне багов нет - потому что это Оберон" тоже не стоит. Кстати, самым правильным исправлением данной ошибки была бы правка спецификации Files, дабы привести поведение Locator.This и Directory.This к единому знаменателю


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Четверг, 17 Июль, 2008 12:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Иван Горячев писал(а):
Баг, баг.


Я говорил про "злобный баг". Если он за 15 лет практически никому не помешал, то пугать народ неправильно. Серьезных последствий от него (как от безмолвного бага в каком-нибудь кодогенераторе) пока не было, исправляется тривиально, и, повторю, пугать народ неправильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Четверг, 17 Июль, 2008 12:25 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Info21 писал(а):
Иван Горячев писал(а):
Баг, баг.


Я говорил про "злобный баг". Если он за 15 лет практически никому не помешал, то пугать народ неправильно. Серьезных последствий от него (как от безмолвного бага в каком-нибудь кодогенераторе) пока не было, исправляется тривиально, и, повторю, пугать народ неправильно.

Да никто и не собирается народ пугать... Всё вышесказанное ДСП. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 16:09 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Info21 писал(а):
Если он за 15 лет практически никому не помешал...
Поглядите: эта процедура использует неправильную спецификацию (после loc.This результат провереяется не loc = NIL, а loc.res # 0).
Код:
   PROCEDURE ObxLinks.PathToLoc (IN path: ARRAY OF CHAR; OUT loc: Files.Locator);
      VAR i, j: INTEGER; ch: CHAR; name: ARRAY 256 OF CHAR;
   BEGIN
      loc := Files.dir.This("");
      IF path # "" THEN
         i := 0; j := 0;
         REPEAT
            ch := path[i]; INC(i);
            IF (ch = "/") OR (ch = 0X) THEN name[j] := 0X; j := 0; loc := loc.This(name)
            ELSE name[j] := ch; INC(j)
            END
         UNTIL (ch = 0X) OR (loc.res # 0)
      END
   END PathToLoc;
И вылезают вопросы:
1) Где ещё эта неправильная спецификация используется, раз за 15 лет никто не заметил.
2) Как такая ситуация возникла. Это ошибка документации? Или может статься так, что в "предшественнике ББ" была как раз эта "неправильная" спецификация, которую Оминки на ходу решили поменять, а код переработать не успели.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Злобный баг
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 17:14 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Info21 писал(а):
Если он за 15 лет практически никому не помешал...
Поглядите: эта процедура использует неправильную спецификацию (после loc.This результат провереяется не loc = NIL, а loc.res # 0). ...
Но это же Obx, а не Книга пяти колец.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 18:18 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
А это?
Код:
PROCEDURE StdApi.PathToSpec (VAR path: ARRAY OF CHAR; VAR loc: Files.Locator; VAR name: Files.Name);
PROCEDURE DevMsgSpy.PathToSpec (VAR path: ARRAY OF CHAR; VAR loc: Files.Locator; VAR name: Files.Name);
PROCEDURE DevRBrowser.PathToLoc (path: ARRAY OF CHAR; VAR loc: Files.Locator);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 19:00 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
А это?
Это -- часть какого-то DEFINITION.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 19:12 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Эти процедуры (не из Obx) тоже используют неправильную спецификацию. Просто не стал копировать код.

Вопрос "А это?" был как бы вслед за "Но это же Obx, а не Книга пяти колец."


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 19:22 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Для проверки гипотезы, что таков мог быть "старый" интерфейс, поглядеть бы доки или исходники Oberon V4. Кто-нибудь может подсказать где?

Припоминаю замечание тов. Trurl о складках viewtopic.php?p=2727#p2727 ...
Trurl писал(а):
В Oberon V4, от которого произошел BlackBox складки автоматически раскрываются при компиляции.
Может быть, Вы и по этому вопросу уже в курсе дела? :roll:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Сентябрь, 2010 19:59 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Всё время забываю, что можно в интернете поискать... http://sourceforge.net/projects/oberon/ ... z/download

Вопрос снимается: в Oberon V4 локаторов вообще нету...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 18 Октябрь, 2019 14:44 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Не было отмечено, что вопрос закрыт 20161029.

Несогласованность устранена переопределением Locator.This. Обоснование в тексте дельты B29.

Оригинальное определение:
Цитата:
PROCEDURE (l: Locator) This (IN path: ARRAY OF CHAR): Locator
NEW, ABSTRACT
This evaluates a relative path, starting from the location specified by l.

Post
result # NIL
l.res = 0 no error
result = NIL
l.res = 1 invalid name
l.res = 5 io error

Заменено на:
Цитата:
PROCEDURE (l: Locator) This (IN path: ARRAY OF CHAR): Locator
NEW, ABSTRACT
This evaluates a relative path, starting from the location specified by l.

Post
result # NIL
result.res = 0 legal locator
result.res # 0 illegal locator


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 18 Октябрь, 2019 15:04 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Кстати, в сборке Цетра/BBCP определение согласовано (постусловие result # NIL), но описание сделано более подробным -- подтянуты пояснения о путях в синтаксисе хост-платформы из определения Directory.This. А я бы, наоброт, их оттуда убрал. Совместимость это не ломает, а реализации file system (Files.Directory) и их локаторы, вообще говоря, не обязаны работать с путями в терминах хост-платформы.

Ниже для сравнения разница определений Locator.This в сборке OberonCore и сборке BBCP.

Определение в B29:
Цитата:
PROCEDURE (l: Locator) This (IN path: ARRAY OF CHAR): Locator
NEW, ABSTRACT
This evaluates a relative path, starting from the location specified by l.

Post
result # NIL
result.res = 0 legal locator
result.res # 0 illegal locator

Определение в BBCP:
Цитата:
PROCEDURE (l: Locator) This (IN path: ARRAY OF CHAR): Locator
NEW, ABSTRACT
This evaluates a relative or absolute path given in the host platform's syntax. A relative path is evaluated starting from the location specified by l. This does not check if the specified path exists.

Post
result # NIL
result.res = 0 no error
result.res = 1 invalid name
result.res = 5 io error


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 18 Октябрь, 2019 15:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Вот спасибо за напоминание. Сразу ошибку нашел в модуле HostRegistry для Linux. На английский сайт тоже закинул

Добавочка. Еще в ConsCompile и в Dialog.LoadStringTab


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 20 ] 

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


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

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


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

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