Nick,I think the above line should have been
Thank you for the suggestions. I think I have made my 'get' functions safe now.
However, the external C library still behaves unstably on the data I pass it from perl. It will sometimes core dump with SEGV, sometimes give unexpected output. _____________________________________________________________________
The 1st thing to notice is that return from hv_fetch can be NULL if field
does not exist in the hash. So SvOK(*sv) will core dump, also you go on to de-ref the thing even if your test said SV was not okay.
So you want something like this - you can provide "safe" values for not-there and undef cases - I have used NULL and "" as examples.
SV **svp = hv_fetch(...)
if (*svp) {
if (svp) {
The point of the check is to ensure that you don't de-ref svp (i.e. don't use *svp) if svp is NULL.
This could explain your continued core dumps.
Steve
if (SvOK(*svp)) {
/* defined value of some kind (but may not be a string, but SvPV will
force that for us). In perl5.6+ you may need to consider case of string being in UTF-8
*/ return SvPV_nolen(*svp);
}
else
{
/* undef value */
return "";
}
}
else {
/* No such member */
return NULL;
}