Wykrywanie błędów oprogramowania jest jednym z najtrudniejszych problemów w zapewnianiu jakości u producentów oprogramowania. Błędy w oprogramowaniu mogą być wykryte przed lub po jego wydaniu. Istnieją jednak ograniczone zasoby do wykrywania i korygowania błędów [1]. Błędy zasadniczo dzielą się na dwie ogólne kategorie: błędy składniowe i błędy semantyczne. Ponieważ istnieje tak wiele potężnych, zautomatyzowanych narzędzi do wykrywania błędów składni, jest bardzo mało prawdopodobne, że błędy takie zostaną wykryte przed wydaniem programu. Błędy semantyczne to takie, które powstają w wyniku problemów innych niż błędy składniowe i materialne błędy ludzkie i są zazwyczaj spowodowane przez niespójności w różnych częściach kodu, czasami bardzo nieuchwytne. W takich przypadkach takie błędy nie mogą być łatwo wykryte podczas przeglądu kodu. Nie jest to prawdą w przypadku błędów semantycznych, ponieważ wiele czynników może przyczynić się do wystąpienia takich błędów