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