OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 22 Сентябрь, 2021 01:17

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Проверка ОДЗ в компиляторе
СообщениеДобавлено: Пятница, 07 Май, 2021 19:41 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 501
Коллеги, взгляните: в модуле DevCPE
Код:
   PROCEDURE OutRefName* (IN name: ARRAY OF SHORTCHAR);
   BEGIN
      DevCPM.ObjW(0FCX); DevCPM.ObjWNum(pc); OutName(name)
   END OutRefName;


И вот как реализовано DevCPM.ObjW:
Код:
   PROCEDURE ObjW* (ch: SHORTCHAR);
   BEGIN
      outObj.WriteByte(SHORT(ORD(ch)))
   END ObjW;


Т.е. если это компилировать с включенной проверкой диапазонов (ОДЗ), то сразу же налетаешь на авост.

Предлагаю это и другие подобные места в DevCPM исправить, например:
Код:
i := ORD(ch); IF i > MAX(BYTE) THEN DEC(i, 256) END; outObj.WriteByte(SHORT(SHORT(i)))

или как Comdiv предлагал:
Код:
outObj.WriteByte(SHORT(SHORT((ORD(ch) - (ORD(ch) DIV 80H * 100H)))


Почему это нужно, кмк: потому что нигде нет даже просто устных указаний, с какими опциями следует компилировать компилятор. И тем более нет формального способа где-то внутри модуля или снаружи указать, на какие опции он рассчитан. А это значит - уязвимости. В моем примере, к счастью, все сразу падает; а ведь могло упасть по прилету на Марс, например )).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка ОДЗ в компиляторе
СообщениеДобавлено: Пятница, 07 Май, 2021 20:42 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1314
Откуда: Киев
adimetrius писал(а):
или как Comdiv предлагал:
Код:
outObj.WriteByte(SHORT(SHORT((ORD(ch) - (ORD(ch) DIV 80H * 100H)))
Нет, в данном случае я бы предложил не жадничать и добавить связанную подпрограмму WriteChar, чтобы избавиться от необходимости писать какие-либо преобразования в использующем коде и, таким образом, от провоцирования дополнительных ошибок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка ОДЗ в компиляторе
СообщениеДобавлено: Пятница, 07 Май, 2021 20:43 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 461
Откуда: Украина, Днепропетровская обл.
Согласен с ComDiv. Ручное прибавление значения, дополнительная проверка условия просто несколько снизят производительность. Хотя некритично, понимаю. Процы у нас мощные.

Именно в данном случае лучше наверно будет вот так:
Код:
   PROCEDURE ObjW* (ch: SHORTCHAR);
   BEGIN
      outObj.WriteByte(SYSTEM.VAL(BYTE, ch))
   END ObjW;

В защиту этого варианта добавлю, что кастить SHORTCHAR в BYTE через SYSTEM.VAL абсолютно безопасно, т.к. они одного размера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка ОДЗ в компиляторе
СообщениеДобавлено: Суббота, 08 Май, 2021 02:20 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 501
Код:
MODULE DevCPM;

  VAR outObj: Files.Writer;

  PROCEDURE ObjW* (ch: SHORTCHAR);
  BEGIN
    outObj.WriteByte(...)
  END ObjW;


Затруднительно в данном случае добавлять процедуру к Files.Writer. Кмк, файлы и байты - одного поля ягоды: низкоуровневые системные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проверка ОДЗ в компиляторе
СообщениеДобавлено: Суббота, 08 Май, 2021 20:51 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1314
Откуда: Киев
Почему затруднительно? Ломается совместимость?
Ну и 1-байтный char - это, по сути, немного иной взгляд на byte и необходимость двух функций - это плата за статическую типизацию в простом виде.


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

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


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

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


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

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