Häufig ist der Grund Nebenläufigkeit (s. "Heisenbug" von der heisenberg'schen Unschärferelation). Da viele Programme (und auch Programme in sich selbst) in mehreren, quasi-unabhängigen Strängen verlaufen, kann bei unsauberer Programmierung daraus viel merkwürdiges entstehen. Ein Beispiel dafür sind deadlocks (zwei Stränge warten gegenseitig auf ein Ergebnis und hängen). Weitere Probleme kommen aus race conditions, also einer schlechten Synchronisierung von Daten die hin- und her gereicht werden.
Ausserdem ist die "richtige" Behandlung von Fehlern gar nicht so einfach. Das heisst, z.B. kann ein Programm in einen inkonsistenten Zustand kommen, wenn bestimmte Interna die aufgetretenen Fehler nicht richtig weiterkommunizieren. Ein Fehler kann z.B. sein, dass man Daten von einer TCP Internet-Verbindung lesen möchte, dort aber noch keine/nicht genügend Daten vorhanden sind. Der Fehler wird zwar von einem Betriebssystem an die Software übergeben, diese ignoriert aber beispielsweise diesen "Spezialfall".