Marc,

I got a sigsegv. I suspect it's because some FFI got a failed malloc() maybe, that the Scheme code then not handled as it should.

Or it could be some FFI-related heap corruption (basically all Scheme code is safe so shouldn't cause any of that).

Gambit in itself is 100% malloc-failure-safe right, so there is not one single instance when Gambit code actually would 

Also maybe it could be how I pass values between C and Scheme, that something is broken somewhere there - what did the introduction of the ___return()  macro really resolve??


I just wanted to ask you to have a quick look at the GDB output below, to give your thought on what would be more and less plausible sources of this error.


Finally, in an environment where you want to maximize reliability, would there be some way to add extra heap corruption checks??

As to be able to understand where the corruption actually happened - i mean what we get here is just a code pointer into the Gambit VM code, it's completely un-instructive.

You know like that GCC patch that pads the stack with extra bytes and then checks, StackGuard or whatever it's called.

I guess in the case of my crash here below, the actual problem is that someone overwrote the stack frame right?


Thanks!!


(gdb) thread apply all bt

Thread 1 (process 16563):
#0  0x00000c4a6fb10905 in ___H__20___kernel (_(short *)=0xc4a707222a0 <___gstate>) at _kernel.c:4358
Backtrace stopped: Cannot access memory at address 0x7f7ffffd1028

that line is:


   /* setup internal return continuation frame */

   ra = ___ps->temp1;

   ___RETI_GET_CFS(ra,fs)           <- this one!

   ___ADJFP(___ROUND_TO_MULT(fs,___FRAME_ALIGN)-fs)

   ___PUSH_REGS /* push all GVM registers (live or not) */
   ___PUSH(ra)  /* push return address */

and then additionally:

(gdb) info locals
descr = 13524638833968
fs = <optimized out>
ra = 13524639556321
___r4 = <optimized out>
___r1 = 0
___hlbltbl = {0x0, 0x40fbe4, 0x40fcdf, 0x4172d2, 0x40fd2a, 0x41248a, 0x40fdcc, 0x40fe13, 0x40fe2e, 0x41eb0c, 0x40feb9, 0x40ff2a, 0x40ff73, 0x40ff9b, 0x40ffba, 0x40ffd9, 0x40fff8,
  0x410017, 0x410036, 0x410055, 0x4101b3, 0x4105af, 0x4105db, 0x41066f, 0x410678, 0x4106ca, 0x41073e, 0x0, 0x41075a, 0x4107f1, 0x4108ef, 0x410adc, 0x410b7d, 0x410c85, 0x410d98, 0x410ec3,
  0x41123c, 0x4116a0, 0x411cb1, 0x411d9e, 0x411e5c, 0x4120dc, 0x0, 0x41214e, 0x412211, 0x0, 0x412269, 0x0, 0x4122e0, 0x0, 0x412357, 0x0, 0x412425, 0x0, 0x4124b9, 0x0, 0x412542, 0x415d4e,
  0x0, 0x4125f7, 0x0, 0x4126a2, 0x412716, 0x4127cd, 0x0, 0x412802, 0x4128bf, 0x0, 0x4128c4, 0x0, 0x41296f, 0x4129d7, 0x412a8e, 0x0, 0x412ac3, 0x412b80, 0x0, 0x412b85, 0x0, 0x412c30,
  0x412d09, 0x0, 0x412d30, 0x412e09, 0x0, 0x412e30, 0x412f09, 0x0, 0x412f30, 0x413009, 0x0, 0x413030, 0x0, 0x4130a0, 0x0, 0x4130fc, 0x0, 0x413192, 0x41328a, 0x4132d3, 0x0, 0x41330c,
  0x4133c9, 0x0, 0x4133ce, 0x0, 0x413479, 0x413552, 0x0, 0x413579, 0x413652, 0x0, 0x413679, 0x0, 0x4136d5, 0x4137bb, 0x413804, 0x0, 0x413839, 0x4138f6, 0x0, 0x4138fb, 0x0, 0x4139a6,
  0x413a7f, 0x0, 0x413aa6, 0x413b7f, 0x0, 0x413ba6, 0x0, 0x413c02, 0x413ce8, 0x413d31, 0x0, 0x413d66, 0x413e23, 0x0, 0x413e28, 0x0, 0x413ed3, 0x413fac, 0x0, 0x413fd3, 0x4140ac, 0x0,
  0x4140d3, 0x0, 0x41412f, 0x414215, 0x41425e, 0x0, 0x414293, 0x414350, 0x0, 0x414355, 0x0, 0x414400, 0x4144d9, 0x0, 0x414500, 0x4145d9, 0x0, 0x414600, 0x4146d9, 0x0, 0x414700, 0x4147d9,
  0x0, 0x414800, 0x41490b, 0x414954, 0x0, 0x41498d, 0x414a4a, 0x0, 0x414a4f, 0x0, 0x414afa, 0x414bd3, 0x0, 0x414bfa, 0x414cd3, 0x0, 0x414cfa, 0x414dd3, 0x0, 0x414dfa, 0x414ed3, 0x0,
  0x414efa, 0x414fe9, 0x415032, 0x0, 0x415067, 0x415124, 0x0, 0x415129, 0x0, 0x4151d4...}
_(char *) = <optimized out>
___temp = <optimized out>
___hp = <error reading variable ___hp (Cannot access memory at address 0x7f7ffffcefa0)>
_(float,  *) = 0xc4d48ab94c0
_(long double, ) = <error reading variable _(long double, ) (Cannot access memory at address 0x7f7ffffcef68)>
___r2 = 13524703568041
___start = <optimized out>
___r3 = <error reading variable ___r3 (Cannot access memory at address 0x7f7ffffcef60)>
(gdb) info args
_(short *) = 0xc4a707222a0 <___gstate>