[Pkg-scicomp-devel] Bug#494031: Signal handlers not working?
Ondrej Certik
ondrej at certik.cz
Tue Aug 26 22:03:51 UTC 2008
Hi Jurij!
On Tue, Aug 26, 2008 at 10:50 PM, Jurij Smakov <jurij at wooyd.org> wrote:
> Hi,
>
> I dug a little bit into the code and it seems that the problem is
> caused by this macro defined in Utilities/hdf5/H5detect.c:
>
> #if defined(H5_HAVE_LONGJMP) && defined(H5_HAVE_SIGNAL)
> #define ALIGNMENT(TYPE,INFO) { \
> char *volatile _buf=NULL; \
> volatile TYPE _val=1; \
> volatile TYPE _val2; \
> volatile size_t _ano=0; \
> void (*_handler)(int) = signal(SIGBUS, sigbus_handler); \
> void (*_handler2)(int) = signal(SIGSEGV, sigsegv_handler); \
> \
> _buf = (char*)malloc(sizeof(TYPE)+align_g[NELMTS(align_g)-1]); \
> if (setjmp(jbuf_g)) _ano++; \
> if (_ano<NELMTS(align_g)) { \
> *((TYPE*)(_buf+align_g[_ano])) = _val; /*possible SIGBUS or SEGSEGV*/ \
> _val2 = *((TYPE*)(_buf+align_g[_ano])); /*possible SIGBUS or SEGSEGV*/ \
> [...]
>
> It tries to set the signal handlers for SIGBUS and SIGSEGV and then
> try various casts in an attempt to detect the alignment requirements.
> So, SIGBUS/SIGSEGV appears to be intentional, except that they are
> supposed to be caught by signal handlers, and not terminate the build.
> The signal(2) man page includes the following information:
>
> The only portable use of signal() is to set a signal's disposition to SIG_DFL or
> SIG_IGN. The semantics when using signal() to establish a signal handler vary
> across systems (and POSIX.1 explicitly permits this variation); do not use it
> for this purpose.
>
> Current theory is that setting signal handlers via signal() does not
> work in Debian for some reason. I'll try to rewrite this code using
> sigaction interface to see if it helps.
This is awesome, thanks for the work you are doing!
Let us know how it went.
Ondrej
More information about the Pkg-scicomp-devel
mailing list