OberonCore
https://forum.oberoncore.ru/

B29: Несогласоглас-ть Locator.This/Directory.This в Files
https://forum.oberoncore.ru/viewtopic.php?f=116&t=1083
Страница 1 из 1

Автор:  Иван Горячев [ Среда, 29 Март, 2006 09:52 ]
Заголовок сообщения:  B29: Несогласоглас-ть Locator.This/Directory.This в Files

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

Автор:  Сергей Губанов [ Среда, 29 Март, 2006 10:44 ]
Заголовок сообщения:  Re: Странности в коде с Files.Locator

Ivor писал(а):
И как это понимать?


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

Автор:  Илья Ермаков [ Среда, 29 Март, 2006 10:58 ]
Заголовок сообщения: 

Files.Directory.This

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

Автор:  Иван Горячев [ Четверг, 30 Март, 2006 00:20 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Files.Directory.This

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


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

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

Автор:  Иван Горячев [ Среда, 16 Июль, 2008 22:11 ]
Заголовок сообщения:  Баг: Files.Locator.This нарушает спецификацию

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

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

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

Автор:  Борис Рюмшин [ Среда, 16 Июль, 2008 22:24 ]
Заголовок сообщения:  Re: Злобный баг

Хорошо бы в Цюрих отписать... вопрос только будут ли они этим заниматься теперь...

Автор:  Info21 [ Четверг, 17 Июль, 2008 06:41 ]
Заголовок сообщения:  Re: Злобный баг

Иван Горячев писал(а):
Нашёл в ББ злобный баг.

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

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

Автор:  Иван Горячев [ Четверг, 17 Июль, 2008 07:50 ]
Заголовок сообщения:  Re: Злобный баг

Баг, баг. В Windows народ на такие "ляпы" ругается со страшной силой, когда в MSDN пишут одно, а практика показывает другое. И называют это багами.

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

Автор:  Info21 [ Четверг, 17 Июль, 2008 12:22 ]
Заголовок сообщения:  Re: Злобный баг

Иван Горячев писал(а):
Баг, баг.


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

Автор:  Борис Рюмшин [ Четверг, 17 Июль, 2008 12:25 ]
Заголовок сообщения:  Re: Злобный баг

Info21 писал(а):
Иван Горячев писал(а):
Баг, баг.


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

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

Автор:  Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 16:09 ]
Заголовок сообщения:  Re: Злобный баг

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) Как такая ситуация возникла. Это ошибка документации? Или может статься так, что в "предшественнике ББ" была как раз эта "неправильная" спецификация, которую Оминки на ходу решили поменять, а код переработать не успели.

Автор:  Info21 [ Пятница, 24 Сентябрь, 2010 17:14 ]
Заголовок сообщения:  Re: Злобный баг

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

Автор:  Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 18:18 ]
Заголовок сообщения:  Re: Баг: Files.Locator.This нарушает спецификацию

А это?
Код:
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);

Автор:  Info21 [ Пятница, 24 Сентябрь, 2010 19:00 ]
Заголовок сообщения:  Re: Баг: Files.Locator.This нарушает спецификацию

Евгений Темиргалеев писал(а):
А это?
Это -- часть какого-то DEFINITION.

Автор:  Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 19:12 ]
Заголовок сообщения:  Re: Баг: Files.Locator.This нарушает спецификацию

Эти процедуры (не из Obx) тоже используют неправильную спецификацию. Просто не стал копировать код.

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

Автор:  Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 19:22 ]
Заголовок сообщения:  Re: Баг: Files.Locator.This нарушает спецификацию

Для проверки гипотезы, что таков мог быть "старый" интерфейс, поглядеть бы доки или исходники Oberon V4. Кто-нибудь может подсказать где?

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

Автор:  Евгений Темиргалеев [ Пятница, 24 Сентябрь, 2010 19:59 ]
Заголовок сообщения:  Re: Баг: Files.Locator.This нарушает спецификацию

Всё время забываю, что можно в интернете поискать... http://sourceforge.net/projects/oberon/ ... z/download

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

Автор:  Евгений Темиргалеев [ Пятница, 18 Октябрь, 2019 14:44 ]
Заголовок сообщения:  Re: B29: Несогласоглас-ть Locator.This/Directory.This в File

Не было отмечено, что вопрос закрыт 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 ]
Заголовок сообщения:  Re: B29: Несогласоглас-ть Locator.This/Directory.This в File

Кстати, в сборке Цетра/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 ]
Заголовок сообщения:  Re: B29: Несогласоглас-ть Locator.This/Directory.This в File

Вот спасибо за напоминание. Сразу ошибку нашел в модуле HostRegistry для Linux. На английский сайт тоже закинул

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

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