1. A 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; and symbolically executing the instrumented intermediate representation.