OberonCore
https://forum.oberoncore.ru/

Проверка ОДЗ в компиляторе
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6763
Страница 1 из 1

Автор:  adimetrius [ Пятница, 07 Май, 2021 19:41 ]
Заголовок сообщения:  Проверка ОДЗ в компиляторе

Коллеги, взгляните: в модуле 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)))


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

Автор:  Comdiv [ Пятница, 07 Май, 2021 20:42 ]
Заголовок сообщения:  Re: Проверка ОДЗ в компиляторе

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

Автор:  Oleg N. Cher [ Пятница, 07 Май, 2021 20:43 ]
Заголовок сообщения:  Re: Проверка ОДЗ в компиляторе

Согласен с ComDiv. Ручное прибавление значения, дополнительная проверка условия просто несколько снизят производительность. Хотя некритично, понимаю. Процы у нас мощные.

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

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

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

Код:
MODULE DevCPM;

  VAR outObj: Files.Writer;

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


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

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

Почему затруднительно? Ломается совместимость?
Ну и 1-байтный char - это, по сути, немного иной взгляд на byte и необходимость двух функций - это плата за статическую типизацию в простом виде.

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