OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 22:46

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 12 Июль, 2009 10:20 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Намедни ради интереса перекомпилировал Блэкбокс с опцией allchecks (включить все проверки).
Результат попытки запуска Блэкбокс после этого можно посмотреть на скриншоте.
Вложение:
ScreenShot_01.jpg
ScreenShot_01.jpg [ 30.14 КБ | Просмотров: 8092 ]

Сразу оговорюсь, что я работаю с эксклюзивной неофициальной сборкой Блэкбокс, которая получена из локализованной версии 1.5.
В связи с этим вопрос: может ли кто-нибудь повторить этот опыт с официальной сборкой Блэкбокс? И если результат будет аналогичным, то хотелось бы услышать какой-нибудь комментарий по этому поводу.
Если же ваш опыт будет успешным, то я буду знать, что у меня проблема с "out of range" из-за того, что я "влез", так сказать, в исходники :)

PS. Да, если опцию allchecks не включать,то всё работает хорошо и проблем не возникает.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Проверил сам, на версии 1.5.
К счастью, оказалось проблемы у меня. Так что остальные пользователи Блэкбокс могут быть спокойны.
Честно говоря, было бы странно, если бы было иначе. Среда достаточно зрелая, без малого 20 лет - это срок. Ну, а для меня впредь будет наука: если вносишь серьёзные изменения, то включай все проверки. По умолчанию опция allchecks отключена.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 12 Июль, 2009 11:36 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
igor писал(а):
Намедни ради интереса перекомпилировал Блэкбокс с опцией allchecks (включить все проверки).
А хорошая задача -- добиться тут нормальной работы.


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Дальше ещё интереснее. Стал искать багу, оказалось что проблема даже не в моей эксклюзивной сборке Блэкбокс, а в компиляторе командной строки, который я использую. Но работу над ним я ещё не закончил, так что обнаружил "фифект" очень вовремя. Жаль вот только, что обнаружил случайно. А должно быть закономерно. В пору поглубже поразмышлять о пользе доказательного программирования :)


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Продолжил поиск ошибки. К сожалению, мой предыдущий вывод о том, что виноват не Блэкбокс, а мой компилятор, оказался ошибочным.
Оставим пока в покое мою потенциально бажную эксклюзивную сборку Блэкбокс вместе с моим компилятором. Как я понимаю, они не вызывают прилива доверия у публики :)
Я проверил официальные версии v1.5 Eng и v1.6rc5 Eng, а также нашу русскую локализованную версию от 19.01.2008 r116. Во всех случаях трабла подтвердилась.

Для всех желающих предлагаю проделать следующий опыт:
1. Скопируйте содержимое рабочей папки Блэкбокс во временную директорию. Далее работать только в ней.
2. Запустите Блэкбокс. Откройте модуль DevCompiler и отредактируйте его. Найдите костанту defopt (опции компилятора по умолчанию) и добавьте в неё опцию allchecks. Сохраните изменения и перекомпилируйте модуль.
3. Выгрузите модуль DevCompiler. (Очень важный пункт. Первый раз я его не выполнил и в результате сделал неправильный вывод -- см. мои посты выше).
4. Перекомпилируйте все модули Блэкбокс при помощи команды DevCompiler.CompileThis. Закройте Блэкбокс.

Очевидно, что после этих манипуляций наш Блэкбокс будет выполнять проверку на переполнение и выход за диапазон (см. модуль DevCPC486). Конфуз однако состоит в том, что Блэкбокс эти проверки не проходит уже при запуске. Либо сами проверки выполняются некорректно.

Вывод, который я только что сделал, представляется мне не правдоподобным. Может я всё-таки что-то напутал. Прошу вывести на чистую воду. :)

PS: Смутные подозрения у меня вызывает реализация стандартных функций CHR и ORD. Более точно ничего сказать пока не могу, ошибку (предположительно! :) ) обнаружил только сегодня.


Вложения:
ScreenShot_02.JPG
ScreenShot_02.JPG [ 29.62 КБ | Просмотров: 8050 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 12 Июль, 2009 22:55 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
А! Сразу не понял. Тут речь, видимо, о переполнении целых. Дело сомнительное. В смысле сомнительно, нужно ли требовать проверки переполнений в ран-тайм. Хотя я склонен был бы закручивать все гайки, но тут может оказаться геморрой. Не знаю.


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

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Info21 писал(а):
Хотя я склонен был бы закручивать все гайки, но тут может оказаться геморрой.
Так и есть.
Код:
   | Char8:
         IF f = Int8 THEN Check(y, 0, 0)
При работе с символами как с байтами возникает переполнение. TextModels, например, тоже вылетает на WriteSChar.


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Info21 писал(а):
А! Сразу не понял. Тут речь, видимо, о переполнении целых. Дело сомнительное. В смысле сомнительно, нужно ли требовать проверки переполнений в ран-тайм. Хотя я склонен был бы закручивать все гайки, но тут может оказаться геморрой. Не знаю.

От приложений зависит. В некритических областях, не связанных с человеческими жизними это переполнение - пофигу.
Ну возникнет ошибка, ну исправят...
Правда, при расчете зарплаты - это тоже критично... :mrgreen:


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Всем спасибо за наводочки! Как станет посвободнее со временем буду посмотреть :)
Info21 писал(а):
В смысле сомнительно, нужно ли требовать проверки переполнений в ран-тайм.
Думаю, что имеет смысл включать эти проверки во время тестовых прогонов на заключительном этапе работы над проектом, перед выпуском программного продукта. Убедиться, что всё нормально, ну а Release делать уже без них.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Июль, 2009 16:28 
Модератор
Аватара пользователя

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

Не доделаная статья в вики касательно опций компиляции: http://oberoncore.ru/wiki/blackbox/%D1% ... 1%80%D0%B0


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Евгений Темиргалеев писал(а):
Можно отдельные особо критичные модули всегда компилировать с полными проверками.
... используя, например, функцию DevCompiler.CompileOpt(). :wink: Для включения всех проверок служит метасимвол "+".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 14 Июль, 2009 08:55 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Или, что более удобно, DevCompiler.CompileThis {Модуль[опции]}. Символы опций посмотреть в CompileOpt, там виднее всего... igor, раз Вы этим вопросом интересуетесь, не хотите принять участие в улучшении статьи в вики (см http://oberoncore.ru/wiki/about)?


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
igor писал(а):
... Блэкбокс эти проверки не проходит уже при запуске. Либо сами проверки выполняются некорректно.
Похоже, что мы имеем дело со вторым случаем. То есть ошибка относится к классу "Ложная тревога".

Попутно обнаружил ещё одну ошибочку, которую можно отнести к классу "Пропуск аварии", а это считается посерьёзнее. Глаза резанул следующий фрагмент кода в модуле DevCPC486:
Код:
                  ELSIF f = Char8 THEN Check(y, 0, 255); FreeHi(y)
                  ELSIF f = Char16 THEN Check(y, 0, 65536); FreeHi(y)
Понятно, что в одном из двух вызовов функции Check() верхняя граница диапазона указана неправильно. Для того чтобы выяснить в каком именно, находим нужную строчку в теле процедуры Check():
Код:
            DevCPL486.GenAssert(ccBE, ranTrap)
Как видим проверяется условие ccBE (меньше или равно), значит фактический параметр 255 указан правильно, а вместо 65536 следует писать 65535. Эта ошибка имеет два вхождения в указанном модуле.


Последний раз редактировалось igor Четверг, 16 Июль, 2009 14:50, всего редактировалось 1 раз.

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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Евгений Темиргалеев писал(а):
igor, раз Вы этим вопросом интересуетесь, не хотите принять участие в улучшении статьи в вики
Отписал в личку :wink:


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


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

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


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

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