сугубый программизм: мелкомягкие пакости
Oct. 14th, 2007 06:57 pmОбработка исключений под Windows - это что-то особенное.
"всяк знает", что стоит случиться исключению, как начнут вызываться его зарегистрированные обработчики, но, похоже, мало кто озаботился, что будет, если исключение случится в обработчике. Или же, что будет, если сам обработчик уже выгружен.
В XP тут вообще конь не валялся - стоит выгрузить код обработчка, так в ответ на исключение по вызову оного, вся карусель по исполнению обработчиков (уже нового) исключения заверчивается заново. И снова. И снова. Результат - переполнение стека.
В Win 2003 тут понаворотили стра-ашных "защит" - перед вызовом обработчика, проверяют, присутствует ли его код. Или что-то вроде того, я не вдавался. Кажется, правда, что и на XP проверяют, но эта проверка почему-то ничего не ловит. Опять же не вдавался. Короче говоря, в 2003 переполнения стека в этом сценарии не будет. Не будет. В этом сценарии. Зато они умеют, прямо там, выяснив, что обработчик исключения уже выгружен, немедленно корректно закрешить аппликацию. Вызвав (из под ntdll.dll) UnhandledExceptionFilter и всё на него навешенное.
И тут опять вдруг окажется, что если какой из фильтров, навешанных на UnhandledExceptionFilter в памяти ненароком не присутствует, то... обработчик исключений снова пойдетна... искать, где же кончается стек. И очень быстро этот конец обнаружит.
"всяк знает", что стоит случиться исключению, как начнут вызываться его зарегистрированные обработчики, но, похоже, мало кто озаботился, что будет, если исключение случится в обработчике. Или же, что будет, если сам обработчик уже выгружен.
В XP тут вообще конь не валялся - стоит выгрузить код обработчка, так в ответ на исключение по вызову оного, вся карусель по исполнению обработчиков (уже нового) исключения заверчивается заново. И снова. И снова. Результат - переполнение стека.
В Win 2003 тут понаворотили стра-ашных "защит" - перед вызовом обработчика, проверяют, присутствует ли его код. Или что-то вроде того, я не вдавался. Кажется, правда, что и на XP проверяют, но эта проверка почему-то ничего не ловит. Опять же не вдавался. Короче говоря, в 2003 переполнения стека в этом сценарии не будет. Не будет. В этом сценарии. Зато они умеют, прямо там, выяснив, что обработчик исключения уже выгружен, немедленно корректно закрешить аппликацию. Вызвав (из под ntdll.dll) UnhandledExceptionFilter и всё на него навешенное.
И тут опять вдруг окажется, что если какой из фильтров, навешанных на UnhandledExceptionFilter в памяти ненароком не присутствует, то... обработчик исключений снова пойдет