1. A processor-implemented method of analyzing a software program, the method comprising: compiling a software program into an intermediate representation; finding an instruction in the intermediate representation that matches a pattern in a check pattern; generating an instrumented intermediate representation in which the instruction is modified according to an action specified in the check pattern by replacing the instruction in the intermediate representation with a replacement instruction included in the check pattern, the replacement instruction including a call to an error report; and symbolically executing the instrumented intermediate representation.