C is a what you ask is what you get language with lots of rope to hang yourself and very little safety nets. Take for example this implementation of strcpy from Apple, but they all look very much alike:
char *strcpy(char *s1, const char *s2)
{
char *s = s1;
while ((*s++ = *s2++) != 0)
;
return (s1);
}
As C doesn't know the concept of exceptions, all error signalling has to be done via the return value of the function and sometimes via the global variable errno, which of course somewhat limits the expressivity of errors.
So, if you want to keep in line with what the standard library does, very little safety needs to be provided.