1. A method comprising: (i) providing access to the results of a static analysis of a software program the static analysis results comprising data flow information, the static analysis including a set of reaching defintion identifiers associated with a use, the set of reaching definition identifiers including a first reaching definition that cannot reach the use at runtime; (ii) forming data-flow tracking instructions in order to track data flow within the software; (iii) forming checking instructions in order to check the tracked data flow against the static analysis results and thereby identify potential flaws in the software program, the checking instructions using a first memory area associated with a second memory area associated with the software program, a plurality of memory addresses of the second memory area being associated with a plurality of memory addresses of the first memory area, the plurality of memory addresses of the first memory area storing instruction indicators indicating an instruction that most recently wrote to a corresponding address in the second plurality of memory addresses; (iv) establishing a guard page between the first and second memory areas, each memory address of the plurality of memory addresses of the first memory area being computable by bit shifting the corresponding address in the second plurality of memory addresses by a first constant, multiplying the result by a second constant, and adding a third constant; and (v) adding the data-flow tracking instructions and the checking instructions to the software.