1. A method for analyzing a program, comprising: obtaining the program; obtaining a query for a points-to analysis for the program; obtaining the points-to analysis for the program, the points-to analysis comprising a plurality of points-to tuples, each points-to tuple comprising a variable and an allocation site for an object; obtaining a result of the query, the result comprising a subset of the plurality of points-to tuples; extracting, from the program, by a data-flow trace engine, a data-flow trace specification comprising a plurality of flow tuples, each flow tuple comprising a source variable defined in a first method and a sink variable defined in a second method, wherein the sink variable is assigned a value of the source variable during execution of the program; generating, by the data-flow engine and using the data-flow trace specification, a data-flow trace graph; adding, by the data-flow trace engine, in a recursive manner until a termination condition is triggered, a trace edge to the data-flow trace graph for each points-to tuple of a list of points-to tuples, wherein the list of points-to tuples is initialized to the result of the query, wherein the respective points-to tuple corresponds to a first flow tuple of the plurality of flow tuples, and wherein the respective points-to tuple and the first flow tuple are used to form a first points-to tuple that is added to the list of points-to tuples; and generating, by the data-flow trace engine, a report about the result of the query based on the data-flow trace graph.