/.../ I actually found a memory leak in my JSON2 code when testing on pike 7.7 because string_to_utf8 potentially throws now (I think that was not there in pike 7.6). /.../
It could throw earlier too, just not quite so often since it didn't check for strict utf8 compliance.
In general, one must always assume that any pike callable function might throw (they do argument checks, if nothing else). For lower level functions it's a mix; if unsure, one should either check it out in the source or assume they might throw too.
If we get around cleaning up the C-level interface, we should clearly mark if a function might throw or not. I'd actually like that it'd be coded into the name with a "t_" prefix or something.