As long as the conventions are understood and consistent, then who cares if all strings have to be null terminated or if the strings returned as static, garbage collected or must be free'd?
That information has to be encoded somewhere. If your convention is that every char* parameter is a null-terminated C string that must be copied by the callee if it is expected to persist beyond the duration of the function call, then that's great (you'd better be really consistent about not using char* for arbitrary data though). Similarly, if every pointer that is returned needs freeing by the caller, then that's also fine, and you can machine-generate the wrappers on that assumption.
If you're going to create a metamodel with the primary goal of allowing wrappers from other languages, then you need to think about these things. EFL now has a metamodel intended for FFI, and it doesn't think about these things. Functions take char* arguments (and the metamodel describes their type solely as char*), which may be null-termianted C strings or blobs of data with the length encoded somewhere else. They may be held by the callee and freed later, or the caller may be responsible for freeing them. None of this information is encoded in anything machine readable.