вторник, 1 июня 2010 г.

DCLP - Вселенское Зло #2

Забавно, как все-таки иногда все поворачивается...
Недавно я писал про пойманное использование этого антипаттерна, но только что выяснилось, что я несколько погорячился с диагностикой...

Не знаю, чего уж тут больше - настырности или везения, но один из наших разработчиков получил такую же ошибку (в списке исправленных она еще не значится).

Он добросовестно начал копаться, в итоге выяснилось, что создаваемый через new объект где-то в одном из своих подобъектов при создании вызывает AccessViolation, а на нашу беду в цепочке обработчиков верхнего уровня встречается catch(...).

Как-то исторически сложилось, что обработка исключений SEH в обработчиках исключений C++ у нас активна (/EHa), поэтому catch(...) благополучно "маскирует" сбойную ситуацию, при этом сырой указатель на объект, который должен бы возвращаться "singleton'ом", остается ненулевым :-(

После этого при следующем обращении происходит вызов уже разрушенного недоконструированного объекта с понятными последствиями, поскольку вызов делается уже совершенно из другого места :-(

Происходит он уже мнооого позже исходной ситуации, поэтому концов было не найти...

Вывод - не нужно торопиться с диагностикой, даже если все кажется более чем ясным :-)

Комментариев нет: