![]() |
C++Builder bug
Имеется следующий, довольно таки незамысловатый, код:
Код:
__tryи выводить друг за другом два диалоговых окна: первое с сообщением "Division by zero", второе с числом С0000094, которое соответствует коду STATUS_INTEGER_DIVIDE_BY_ZERO (как объявлено в файле winnt.h). Однако вместо этого первое окно почему-то выводится с сообщением "EDivByZero", а второе окно информирует, что поле ExceptionRecord в экземпляре класса исключения равно NULL. Аналогичный код на Delphi работает "на ура" и выдаёт как раз то, что от него ожидается: Код:
tryЧто это за глюк такой в компиляторе C++Builder'а :confused: p.s.: версии -- C++Builder 6.0 Build 10.161 (Update 1), Delphi 6.0 Build 6.163, Windows 2000 Pro SP4 |
blacklist поставь update 4, может там что подправили
|
ok, попробую... как скачаю, напишу что получилось.
p.s.: ну и здоровый этот update 4 -- без малого 24 метра. Где ж они там столько багов отыскали? :rolleyes: |
Скачал Update 4, установил и... ничего не изменилось :(
Народ, напишите pls, как у вас работает приведенный выше код для C++Builder'а. Может это только у меня такая проблема? |
В пятом билдере то же самое, что и у тебя
|
Мда... Невесело... Ведь такой глюк проявляется при попытке перехватить исключение любого класса производного от EExternal - то есть всех исключений, которые возбуждаются операционной системой. Вот ещё пример для EAccessViolation (который, само-собой, работает неправильно):
Код:
{p.s.: тех программеров, чьи светлые головы посетила идея использовать ExceptObject и ExceptAddr, спешу успокоить -- мою голову она посетила раньше. Что бы много не писать, скажу просто - НЕ работает (и ExceptAddr, и ExceptObject равно NULL). |
blacklist
Вот тебе работа с AccessViolation, остальное по аналогии: Код:
static int filter(EXCEPTION_POINTERS *xp) |
ЕЖ спасибо за помощь. Хоть через ж..у, зато работает на все сто. :cool:
Кстати, я локализировал место проблемы - это не в компиляторе глюк, а в RTL (конкретно в файле xx.cpp, функция getExceptionObject). Попробую перекомпилировать, если что получится напишу - может кому пригодится... |
Fix
Ну вот, как говорится - не прошло и полмесяца... Да, праздники - классная штука ;)
Сначала немного эмоций: :) 1) такое ощущение, что модуль 'xx.cpp' писали с закрытыми глазами и при том левой ногой - настолько он кривой. Особенно мне понравился комментарий к одному отключённому блоку кода: 'The following code does NOT work correctly ... So for now this code is disabled again, till we figure out a better way to do this'. Как говорится - до лучших времён ;) . Ну да ладно, оставим это на совести автора. 2) Судя по ответу zhsa , этот баг присутствует и в предыдущих версиях RTL. Мне вот что интересно, как это он умудрился продержатся шесть версий Builder'а, и ни разу не был замечен (по крайней мере, на программерских форумах я подобных тем не нашёл). Что никто ExceptionRecord никогда не пробовал использовать? Или это так много народу C++Builder юзает? Ну всё, хватит лирики. теперь о главном, собственно Fix: итак правим файл $(BCB)\Source\Rtl\Source\except\xx.cpp (Комментарий *** указывает на изменённую строку, а +++ -- на добавленною) Функция getExceptionObject Код:
static excDscPtr getExceptionObject(EXCEPTION_RECORD *P, unsigned long osEsp, unsigned long osERR, PCONTEXT ctx)Код:
void __cdecl __JumpToCatch__(void)Вот и всё, осталось только скопировать созданые в директории Source\Rtl\Lib файлы *.DLL и *.TDS в папку $(BCB)\Bin, а файлы *.LIB и *.OBJ в папку $(BCB)\Lib (попутно сохранив оригиналы - на всякий случай), запустить приведеный ранее пример и убедится что теперь всё работает правильно. Ну что ж, вроде бы нигде не ошибся :), но если с новым RTL что-то начнёт глючить - пишите. |
blacklist - молодца! :claps:
огромный тебе RESPECT :beer: |
| Часовой пояс GMT +4, время: 14:41. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.