A lot of this is undefined, but it arguably helps to understand the practical reasons for such observations - it can help in troubleshooting and even performance and spatial design.
So, in a practical sense, if the function fails to return a value, it's basically failing to set the register or memory where that value will be expected by the caller; it appears to return whatever garbage used to be there. If the return type is int, you've just got yourself a garbage value, but for strings you have a garbage value that's meant to point (directly or indirectly) to the heap memory used by the string to store the textual value and possibly some reference counter or other management data. Later in the program, the calling code will try to deallocate that heap memory by deleting the pointer. Deleting a pointer with a garbage value's quite likely to crash your program.