Software can be really weird, especially when working with an unmanaged language. Accessing an invalid pointer, for instance, can result in any of:
(a) instantaneous crash via SIGSEGV
(b) temporary corruption of some output via reading bogus data for transitory purposes or in a temporary buffer, which corrects itself later on
(c) long-term corruption of some output via reading/writing bogus data in a non-temporary location, which cannot correct itself
(d) crash many seconds, minutes, or even hours later via SIGSEGV after reading/writing bogus data to a long-term storage area
(e) apparently perfectly working application with no errors or crashes at all
Things like returning an error code from a function that isn't checked for, returning data in a valid but unexpected format, race conditions in the client application, and so on can all result in "crazy" errors and crashes that can appear to be the fault of some entirely different module or code than what is actually broken. That's software.