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