Безопасно ли для обработчика ошибок X создавать исключения?

Безопасно ли делать что-то подобное?

int foo(Display*, XErrorEvent*) {
  throw 0;
}
XSetErrorHandler(foo);

У меня не будет проблем?


person Pubby    schedule 25.04.2012    source источник
comment
Не зная Xlib, я бы ожидал, что исключения C++ и ошибки Xlib будут в значительной степени ортогональны. Так что это должно быть безопасно, при условии, что вы поймаете исключение и убедитесь, что ресурсы правильно очищены.   -  person Stefan Majewsky    schedule 25.04.2012
comment
Абсолютно не безопасно. Вы не можете генерировать исключения C++ через код C.   -  person n. 1.8e9-where's-my-share m.    schedule 25.04.2012
comment
@н.м. Опубликовать ответ? Почему нет?   -  person Pubby    schedule 25.04.2012


Ответы (1)


Обработчик ошибок X11 — это обратный вызов, предоставляемый пользователем и вызываемый Xlib. Любое исключение, сгенерированное обработчиком ошибок, будет распространяться через код Xlib до пользовательского кода, вызывающего Xlib (обычно это XNextEvent или подобные).

               foo() <C++>
                 |
       [error is detected by Xlib] <C>
                 |
          [some more Xlib code] <C>
                 |
            [some Xlib code] <C>
                 |
             XNextEvent()  <C>                 
                 |
               main() <C++>

Поскольку Xlib написана не на C++, среда выполнения C++ не обязательно знает, как выполнить раскрутку стека кода Xlib. Даже если ему по счастливой случайности удастся выполнить раскрутку правильно, такие ресурсы, как память, выделенная Xlib до вызова обработчика ошибок, могут быть потеряны. В C нет автоматических деструкторов!

person n. 1.8e9-where's-my-share m.    schedule 25.04.2012