* [Comm] Знатокам gcc (3.2, C++) @ 2002-10-28 13:50 Alexey Morozov 2002-10-28 14:04 ` Sergey Vlasov 0 siblings, 1 reply; 15+ messages in thread From: @ 2002-10-28 13:50 UTC (permalink / raw) ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-28 13:50 [Comm] Знатокам gcc (3.2, C++) Alexey Morozov @ 2002-10-28 14:04 ` Sergey Vlasov 2002-10-28 18:45 ` Alexey Morozov 2002-10-29 9:40 ` Valentin Nechayev 0 siblings, 2 replies; 15+ messages in thread From: Sergey Vlasov @ 2002-10-28 14:04 UTC (permalink / raw) To: community On Mon, Oct 28, 2002 at 19:50:52 +0600, Alexey Morozov wrote: > В задаче имеется: > 1. библиотека, написанная на C (libpopt) > 2. код на C++, ее использующий > > Постановка задачи: > > имеется C'шная функция, принимающая в качестве аргумента коллбэк и дергающая > его (при определенных условиях): > /* ------------------- test_lib.c ------------ */ > void some_func(void (*callback_func)(void)) > { > callback_func(); > } > /* ------------------ end of test_lib.c ---------- */ > > С++-ный код коллбэка и функции, инициирующей вызов some_func: > /* ------------------- test.cc --------------- */ > #include <iostream> > using namespace std; > struct A {}; > void callback_func(void) > { > throw A(); > } > > extern "C" { > void some_func(void (*callback)(void)); > } > int main(void) > { > try { > some_func(callback_func); > } catch (...) { > cerr << "An exception caught" << endl; > } > } > /* ----------------- end of test.cc --------------*/ > > Проблема: происходит аварийное завершение указанной программы (abort), > как если бы брошенный exception не соответствовал throw-спецификации. > > Вопрос: как бы это обойти, и таки поймать в main брошенный в коллбэке > эксепшн? > > Повторю, все происходит на gcc-3.2.1, менять библиотечную функцию по > условию задачи нельзя. Похоже, никак. Новый gcc производит разбор стека при поиске обработчика по записям таблицы, генерируемой при компиляции (по адресам возврата). Для кода на C эта таблица не генерируется, поэтому при обнаружении в цепочке вызовов адреса из такого участка кода происходит облом (как раз в виде вызова unexpected()). Варианты: 1) Избавиться в этом месте от exception вообще и работать старым дедовским способом - по кодам возврата. Если что-то бросается из глубины - ловить внутри callback-a, не допуская распространения в код на C. 2) info gcc рекомендует в подобных случаях компилировать код на C с опцией -fexceptions - тогда работает (но, разумеется, память, выделенная в C-коде, не освобождается - будет утечка). 3) Можно задействовать setjmp/longjmp - но тогда утечка будет уже в C++-частях. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-28 14:04 ` Sergey Vlasov @ 2002-10-28 18:45 ` Alexey Morozov 2002-10-28 18:10 ` Sergey Vlasov 2002-10-29 9:40 ` Valentin Nechayev 1 sibling, 1 reply; 15+ messages in thread From: Alexey Morozov @ 2002-10-28 18:45 UTC (permalink / raw) To: community On Mon, Oct 28, 2002 at 05:04:05PM +0300, Sergey Vlasov wrote: > Варианты: > > 1) Избавиться в этом месте от exception вообще и работать старым дедовским > способом - по кодам возврата. Если что-то бросается из глубины - ловить > внутри callback-a, не допуская распространения в код на C. > > 2) info gcc рекомендует в подобных случаях компилировать код на C с опцией > -fexceptions - тогда работает (но, разумеется, память, выделенная в > C-коде, не освобождается - будет утечка). > > 3) Можно задействовать setjmp/longjmp - но тогда утечка будет уже в > C++-частях. Эхе-хе, не повести печальнее... Но в любом случае, спасибо. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-28 18:45 ` Alexey Morozov @ 2002-10-28 18:10 ` Sergey Vlasov 2002-10-29 6:06 ` Alexey Morozov 0 siblings, 1 reply; 15+ messages in thread From: Sergey Vlasov @ 2002-10-28 18:10 UTC (permalink / raw) To: community On Tue, 29 Oct 2002 00:45:44 +0600 Alexey Morozov <morozov@novosoft.ru> wrote: > On Mon, Oct 28, 2002 at 05:04:05PM +0300, Sergey Vlasov wrote: > > Варианты: > > > > 1) Избавиться в этом месте от exception вообще и работать старым дедовским > > способом - по кодам возврата. Если что-то бросается из глубины - ловить > > внутри callback-a, не допуская распространения в код на C. > > > > 2) info gcc рекомендует в подобных случаях компилировать код на C с опцией > > -fexceptions - тогда работает (но, разумеется, память, выделенная в > > C-коде, не освобождается - будет утечка). > > > > 3) Можно задействовать setjmp/longjmp - но тогда утечка будет уже в > > C++-частях. > Эхе-хе, не повести печальнее... > Но в любом случае, спасибо. Кстати, те же самые проблемы будут даже с C++-библиотекой, но скомпилированной с -fno-exceptions (например, Qt - не знаю, как ее собирают сейчас, но раньше было именно так). ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-28 18:10 ` Sergey Vlasov @ 2002-10-29 6:06 ` Alexey Morozov 2002-10-29 9:07 ` [Comm] [JT] " W.Kondratev ` (2 more replies) 0 siblings, 3 replies; 15+ messages in thread From: Alexey Morozov @ 2002-10-29 6:06 UTC (permalink / raw) To: community On Mon, Oct 28, 2002 at 09:10:09PM +0300, Sergey Vlasov wrote: > > Эхе-хе, не повести печальнее... > > Но в любом случае, спасибо. > Кстати, те же самые проблемы будут даже с C++-библиотекой, но > скомпилированной с -fno-exceptions (например, Qt - не знаю, как ее > собирают сейчас, но раньше было именно так). Оп!... А по сопатке сборщикам за такую сборку? Собственно, возможность бросить эксепшн и поймать его где-нибудь ниже (централизованно) - это одно из немногочисленных заметных преимуществ C++ в сравнении с голимым C... ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] [JT] Знатокам gcc (3.2, C++) 2002-10-29 6:06 ` Alexey Morozov @ 2002-10-29 9:07 ` W.Kondratev 2002-10-29 9:12 ` Leonid Sysoletin 2002-10-29 12:37 ` [Comm] " Sergey Vlasov 2002-10-29 17:51 ` Alexey Voinov 2 siblings, 1 reply; 15+ messages in thread From: W.Kondratev @ 2002-10-29 9:07 UTC (permalink / raw) To: community > > >Собственно, возможность бросить эксепшн и поймать его где-нибудь ниже >(централизованно) - это одно из немногочисленных заметных преимуществ > ^^ >C++ в сравнении с голимым C... > > Подпишусь под каждым словом, кроме выделенных двух букв :) ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] [JT] Знатокам gcc (3.2, C++) 2002-10-29 9:07 ` [Comm] [JT] " W.Kondratev @ 2002-10-29 9:12 ` Leonid Sysoletin 2002-10-29 9:28 ` W.Kondratev 0 siblings, 1 reply; 15+ messages in thread From: Leonid Sysoletin @ 2002-10-29 9:12 UTC (permalink / raw) To: community Вторник, 29 Октябрь 2002 12:07, W.Kondratev написал: > >Собственно, возможность бросить эксепшн и поймать его где-нибудь ниже > >(централизованно) - это одно из немногочисленных заметных преимуществ > ^^ > >C++ в сравнении с голимым C... > Подпишусь под каждым словом, кроме выделенных двух букв :) Каких? "В" и пробела? -- Л. Сысолетин, webmaster@unicon-ms.ru [Team Ёжики-рулез!] [Team Котёнки на солярке] [Team Берегите букву "ё"!] Мать твою за ногу , доченька !!!... ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] [JT] Знатокам gcc (3.2, C++) 2002-10-29 9:12 ` Leonid Sysoletin @ 2002-10-29 9:28 ` W.Kondratev 0 siblings, 0 replies; 15+ messages in thread From: W.Kondratev @ 2002-10-29 9:28 UTC (permalink / raw) To: community > > >>>C++ в сравнении с голимым C... >>> >>> >>Подпишусь под каждым словом, кроме выделенных двух букв :) >> >> > >Каких? "В" и пробела? > > > > Простите за небрежность, имелось в виду убрать приставку из слова "немногочисленный". А в более широком смысле - хотел сказать, что бессмысленно сравнивать C и C++ - языки совершенно разного назначения. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-29 6:06 ` Alexey Morozov 2002-10-29 9:07 ` [Comm] [JT] " W.Kondratev @ 2002-10-29 12:37 ` Sergey Vlasov 2002-10-30 16:56 ` Alexey Morozov 2002-10-29 17:51 ` Alexey Voinov 2 siblings, 1 reply; 15+ messages in thread From: Sergey Vlasov @ 2002-10-29 12:37 UTC (permalink / raw) To: community On Tue, Oct 29, 2002 at 12:06:20 +0600, Alexey Morozov wrote: > On Mon, Oct 28, 2002 at 09:10:09PM +0300, Sergey Vlasov wrote: > > > Эхе-хе, не повести печальнее... > > > Но в любом случае, спасибо. > > Кстати, те же самые проблемы будут даже с C++-библиотекой, но > > скомпилированной с -fno-exceptions (например, Qt - не знаю, как ее > > собирают сейчас, но раньше было именно так). > Оп!... А по сопатке сборщикам за такую сборку? > Собственно, возможность бросить эксепшн и поймать его где-нибудь ниже > (централизованно) - это одно из немногочисленных заметных преимуществ > C++ в сравнении с голимым C... В случае с Qt это особого смысла не имеет, т.к. код Qt написан совершенно без учета исключений, поэтому динамически созданные объекты все равно не вычистятся. Вообще аккуратно написанные в этом отношении библиотеки встречаются довольно редко. Оно и понятно - требуется при каждом new использовать либо std::auto_ptr, либо еще что-то подобное, следить за порядком операций и т.п. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-29 12:37 ` [Comm] " Sergey Vlasov @ 2002-10-30 16:56 ` Alexey Morozov 0 siblings, 0 replies; 15+ messages in thread From: Alexey Morozov @ 2002-10-30 16:56 UTC (permalink / raw) To: community On Tue, Oct 29, 2002 at 03:37:45PM +0300, Sergey Vlasov wrote: > В случае с Qt это особого смысла не имеет, т.к. код Qt написан совершенно > без учета исключений, поэтому динамически созданные объекты все равно не > вычистятся. Вообще аккуратно написанные в этом отношении библиотеки > встречаются довольно редко. Оно и понятно - требуется при каждом new > использовать либо std::auto_ptr, либо еще что-то подобное, следить за > порядком операций и т.п. Понятно. Мне за такое кодирование башку оторвут. Или, что хуже, прострелят. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-29 6:06 ` Alexey Morozov 2002-10-29 9:07 ` [Comm] [JT] " W.Kondratev 2002-10-29 12:37 ` [Comm] " Sergey Vlasov @ 2002-10-29 17:51 ` Alexey Voinov 2002-10-29 18:08 ` Sergey Vlasov 2 siblings, 1 reply; 15+ messages in thread From: Alexey Voinov @ 2002-10-29 17:51 UTC (permalink / raw) To: community [-- Attachment #1: Type: text/plain, Size: 852 bytes --] Alexey Morozov wrote > > > Эхе-хе, не повести печальнее... > > > Но в любом случае, спасибо. > > Кстати, те же самые проблемы будут даже с C++-библиотекой, но > > скомпилированной с -fno-exceptions (например, Qt - не знаю, как ее > > собирают сейчас, но раньше было именно так). > Оп!... А по сопатке сборщикам за такую сборку? Нверное надо попросить ldv собирать glibc с -fexceptions. Хотя что-то мне говорит, что он на это если и пойдёт, то очень неохотно Сам недавно столкнулся с невозможностью поймать exception бросаемый из функции _init .so-файла при загрузке через dlopen. :( -- Best Regards! | Когда вам платят за работу, надо по крайней мере Alexey Voinov | делать вид, что вы работаете... | Б.Виан "Осень в Пекине" voins@voins.program.ru voins@online.ru vns@altlinux.ru [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-29 17:51 ` Alexey Voinov @ 2002-10-29 18:08 ` Sergey Vlasov 2002-10-29 21:07 ` Alexey Voinov 0 siblings, 1 reply; 15+ messages in thread From: Sergey Vlasov @ 2002-10-29 18:08 UTC (permalink / raw) To: community On Tue, 29 Oct 2002 20:51:39 +0300 Alexey Voinov <voins@voins.program.ru> wrote: > Alexey Morozov wrote > > > > Эхе-хе, не повести печальнее... > > > > Но в любом случае, спасибо. > > > Кстати, те же самые проблемы будут даже с C++-библиотекой, но > > > скомпилированной с -fno-exceptions (например, Qt - не знаю, как ее > > > собирают сейчас, но раньше было именно так). > > Оп!... А по сопатке сборщикам за такую сборку? > Нверное надо попросить ldv собирать glibc с -fexceptions. Хотя что-то мне > говорит, что он на это если и пойдёт, то очень неохотно Да уж. Кроме того, проблем будет немерено (например, что будет, если функция будет работать с pthread_mutex_lock или чем-то вроде этого?). > Сам недавно столкнулся с невозможностью поймать exception бросаемый из > функции _init .so-файла при загрузке через dlopen. :( Бррр. До такого изврата я бы даже не додумался. А зачем это надо - что, нормальную функцию инициализации написать не судьба? ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-29 18:08 ` Sergey Vlasov @ 2002-10-29 21:07 ` Alexey Voinov 0 siblings, 0 replies; 15+ messages in thread From: Alexey Voinov @ 2002-10-29 21:07 UTC (permalink / raw) To: community [-- Attachment #1: Type: text/plain, Size: 600 bytes --] Sergey Vlasov wrote > > Сам недавно столкнулся с невозможностью поймать exception бросаемый из > > функции _init .so-файла при загрузке через dlopen. :( > Бррр. До такого изврата я бы даже не додумался. А зачем это надо - что, > нормальную функцию инициализации написать не судьба? Да можно, конечно, но мы не ищем лёгких путей. :) -- Best Regards! | Когда вам платят за работу, надо по крайней мере Alexey Voinov | делать вид, что вы работаете... | Б.Виан "Осень в Пекине" voins@voins.program.ru voins@online.ru vns@altlinux.ru [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-28 14:04 ` Sergey Vlasov 2002-10-28 18:45 ` Alexey Morozov @ 2002-10-29 9:40 ` Valentin Nechayev 2002-10-29 12:51 ` Sergey Vlasov 1 sibling, 1 reply; 15+ messages in thread From: Valentin Nechayev @ 2002-10-29 9:40 UTC (permalink / raw) To: community Mon, Oct 28, 2002 at 17:04:05, vsu wrote about "Re: [Comm] Знатокам gcc (3.2, C++)": > Похоже, никак. Новый gcc производит разбор стека при поиске обработчика по > записям таблицы, генерируемой при компиляции (по адресам возврата). Для > кода на C эта таблица не генерируется, поэтому при обнаружении в цепочке > вызовов адреса из такого участка кода происходит облом (как раз в виде > вызова unexpected()). А чем gcc team аргументировала уход от предыдущего варианта sjlj-exceptions? /netch ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Comm] Знатокам gcc (3.2, C++) 2002-10-29 9:40 ` Valentin Nechayev @ 2002-10-29 12:51 ` Sergey Vlasov 0 siblings, 0 replies; 15+ messages in thread From: Sergey Vlasov @ 2002-10-29 12:51 UTC (permalink / raw) To: community On Tue, Oct 29, 2002 at 11:40:14 +0200, Valentin Nechayev wrote: > Mon, Oct 28, 2002 at 17:04:05, vsu wrote about "Re: [Comm] Знатокам gcc (3.2, C++)": > > > Похоже, никак. Новый gcc производит разбор стека при поиске обработчика по > > записям таблицы, генерируемой при компиляции (по адресам возврата). Для > > кода на C эта таблица не генерируется, поэтому при обнаружении в цепочке > > вызовов адреса из такого участка кода происходит облом (как раз в виде > > вызова unexpected()). > > А чем gcc team аргументировала уход от предыдущего варианта sjlj-exceptions? Тормознутостью. setjmp приходится выполнять всегда, вне зависимости от того, возникают ли исключения. При раскрутке стека по адресам возврата в основной код ничего лишнего не добавляется - дополнительный расход времени будет только при реальном использовании throw. ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2002-10-30 16:56 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2002-10-28 13:50 [Comm] Знатокам gcc (3.2, C++) Alexey Morozov 2002-10-28 14:04 ` Sergey Vlasov 2002-10-28 18:45 ` Alexey Morozov 2002-10-28 18:10 ` Sergey Vlasov 2002-10-29 6:06 ` Alexey Morozov 2002-10-29 9:07 ` [Comm] [JT] " W.Kondratev 2002-10-29 9:12 ` Leonid Sysoletin 2002-10-29 9:28 ` W.Kondratev 2002-10-29 12:37 ` [Comm] " Sergey Vlasov 2002-10-30 16:56 ` Alexey Morozov 2002-10-29 17:51 ` Alexey Voinov 2002-10-29 18:08 ` Sergey Vlasov 2002-10-29 21:07 ` Alexey Voinov 2002-10-29 9:40 ` Valentin Nechayev 2002-10-29 12:51 ` Sergey Vlasov
ALT Linux Community general discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 community community/ http://lore.altlinux.org/community \ mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com public-inbox-index community Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.community AGPL code for this site: git clone https://public-inbox.org/public-inbox.git