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 обычно возвращают . |
Автор: | Илья Ермаков [ Среда, 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). ... |
Автор: | Евгений Темиргалеев [ Пятница, 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 складки автоматически раскрываются при компиляции. Может быть, Вы и по этому вопросу уже в курсе дела?
|
Автор: | Евгений Темиргалеев [ Пятница, 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/ |