1. A method for detecting defects in a computer program, comprising: obtaining, by a processor, a plurality of source code and a potential defect definition; identifying, based on the potential defect definition, a plurality of program objects associated with a potential defect in the plurality of source code; extracting an executable program slice having the potential defect from the plurality of source code; generating, by a processor, an abstracted model of the program slice by: modeling, using data abstraction, the plurality of program objects as a plurality of data-abstracted variables that represent a reduced set of possible states of the plurality of program objects, identifying, within the program slice, a first plurality of control statements comprising a first plurality of predicates necessary for evaluating the first plurality of control statements, modeling, using predicate abstraction, the plurality of predicates as a plurality of predicate-abstracted Boolean variables that represent a reduced set of possible states of the first plurality of control statements, identifying, within the program slice, a plurality of statements modifying the plurality of data-abstracted variables and the plurality of predicate-abstracted Boolean variables, creating, based on the plurality of data-abstracted variables and the plurality of predicate-abstracted Boolean variables, a state of a finite state machine (FSM) model of the program slice for each of the plurality of statements, and creating, based on a plurality of execution paths of the program slice, a transition of the FSM connecting each state of the FSM to at least one other state of the FSM; and identifying an error state of the FSM indicating an occurrence of the potential defect within the program slice.