1. A method comprising, by one or more computing devices: determining code-under-test to be evaluated, the code-under-test configured for execution on a computing device; symbolically executing the code-under-test; creating a plurality of test cases based on the symbolic execution and including a plurality of constraints; selectively conducting abstract interpretation on at least one of the constraints, the abstract interpretation including using a plurality of abstract interpretation models based on the constraints of the test case and over-approximating the constraints of the test case; selectively conducting Satisfiability Modulo Theory (“SMT”) solving on at least one of the constraints; and validating or invalidating the code-under-test based on at least the SMT solving and the abstract interpretation.