Search in sources :

Example 1 with Histogram

use of soot.jimple.spark.geom.utils.Histogram in project soot by Sable.

the class EvalResults method profileSparkBasicMetrics.

/**
 * Collecting basic statistical information for SPARK.
 */
public void profileSparkBasicMetrics() {
    int n_legal_var = 0;
    int[] limits = new int[] { 1, 5, 10, 25, 50, 75, 100 };
    evalRes.pts_size_bar_spark = new Histogram(limits);
    for (IVarAbstraction pn : ptsProvider.pointers) {
        // We don't consider exception pointers
        Node var = pn.getWrappedNode();
        if (ptsProvider.isExceptionPointer(var))
            continue;
        ++n_legal_var;
        int size = var.getP2Set().size();
        evalRes.pts_size_bar_spark.addNumber(size);
        evalRes.total_spark_pts += size;
        if (size > evalRes.max_pts_spark)
            evalRes.max_pts_spark = size;
    }
    evalRes.avg_spark_pts = (double) evalRes.total_spark_pts / n_legal_var;
}
Also used : Histogram(soot.jimple.spark.geom.utils.Histogram) IVarAbstraction(soot.jimple.spark.geom.geomPA.IVarAbstraction) LocalVarNode(soot.jimple.spark.pag.LocalVarNode) Node(soot.jimple.spark.pag.Node) VarNode(soot.jimple.spark.pag.VarNode) AllocNode(soot.jimple.spark.pag.AllocNode)

Example 2 with Histogram

use of soot.jimple.spark.geom.utils.Histogram in project soot by Sable.

the class EvalResults method checkCallGraph.

/**
 * Report the virtual callsites resolution result for the user's code.
 */
public void checkCallGraph() {
    int[] limits = new int[] { 1, 2, 4, 8 };
    evalRes.total_call_edges = new Histogram(limits);
    CallGraph cg = Scene.v().getCallGraph();
    for (Stmt callsite : ptsProvider.multiCallsites) {
        Iterator<Edge> edges = cg.edgesOutOf(callsite);
        if (!edges.hasNext())
            continue;
        evalRes.n_callsites++;
        // get an edge
        Edge anyEdge = edges.next();
        SootMethod src = anyEdge.src();
        if (!ptsProvider.isReachableMethod(src) || !ptsProvider.isValidMethod(src))
            continue;
        // get the base pointer
        CgEdge p = ptsProvider.getInternalEdgeFromSootEdge(anyEdge);
        LocalVarNode vn = (LocalVarNode) p.base_var;
        // test the call graph
        int edge_cnt = 1;
        while (edges.hasNext()) {
            ++edge_cnt;
            edges.next();
        }
        evalRes.n_geom_call_edges += edge_cnt;
        if (edge_cnt == 1)
            ++evalRes.n_geom_solved_all;
        // test app method
        if (!src.isJavaLibraryMethod()) {
            InvokeExpr ie = callsite.getInvokeExpr();
            if (edge_cnt == 1) {
                ++evalRes.n_geom_solved_app;
                if (ptsProvider.getOpts().verbose()) {
                    outputer.println();
                    outputer.println("<<<<<<<<<   Additional Solved Call   >>>>>>>>>>");
                    outputer.println(src.toString());
                    outputer.println(ie.toString());
                }
            } else {
                // We try to test if this callsite is solvable
                // under some contexts
                Histogram call_edges = new Histogram(limits);
                test_1cfa_call_graph(vn, src, ie.getMethod(), call_edges);
                evalRes.total_call_edges.merge(call_edges);
                call_edges = null;
            }
            evalRes.n_geom_user_edges += edge_cnt;
            evalRes.n_user_callsites++;
        }
    }
    ptsProvider.ps.println();
    ptsProvider.ps.println("--------> Virtual Callsites Evaluation <---------");
    ptsProvider.ps.printf("Total virtual callsites (app code): %d (%d)\n", evalRes.n_callsites, evalRes.n_user_callsites);
    ptsProvider.ps.printf("Total virtual call edges (app code): %d (%d)\n", evalRes.n_geom_call_edges, evalRes.n_geom_user_edges);
    ptsProvider.ps.printf("Virtual callsites additionally solved by geomPTA compared to SPARK (app code) = %d (%d)\n", evalRes.n_geom_solved_all, evalRes.n_geom_solved_app);
    evalRes.total_call_edges.printResult(ptsProvider.ps, "Testing of unsolved callsites on 1-CFA call graph: ");
    if (ptsProvider.getOpts().verbose())
        ptsProvider.outputNotEvaluatedMethods();
}
Also used : CgEdge(soot.jimple.spark.geom.dataRep.CgEdge) Histogram(soot.jimple.spark.geom.utils.Histogram) InvokeExpr(soot.jimple.InvokeExpr) CallGraph(soot.jimple.toolkits.callgraph.CallGraph) SootMethod(soot.SootMethod) Edge(soot.jimple.toolkits.callgraph.Edge) CgEdge(soot.jimple.spark.geom.dataRep.CgEdge) LocalVarNode(soot.jimple.spark.pag.LocalVarNode) Stmt(soot.jimple.Stmt) AssignStmt(soot.jimple.AssignStmt)

Example 3 with Histogram

use of soot.jimple.spark.geom.utils.Histogram in project soot by Sable.

the class EvalResults method profileGeomBasicMetrics.

/**
 * Summarize the geometric points-to analysis and report the basic metrics.
 */
public void profileGeomBasicMetrics(boolean testSpark) {
    int n_legal_var = 0, n_alloc_dot_fields = 0;
    int[] limits = new int[] { 1, 5, 10, 25, 50, 75, 100 };
    evalRes.pts_size_bar_geom = new Histogram(limits);
    if (testSpark) {
        evalRes.total_spark_pts = 0;
        evalRes.max_pts_spark = 0;
        evalRes.pts_size_bar_spark = new Histogram(limits);
    }
    // We first count the LOC
    for (SootMethod sm : ptsProvider.getAllReachableMethods()) {
        if (!sm.isConcrete())
            continue;
        if (!sm.hasActiveBody()) {
            sm.retrieveActiveBody();
        }
        evalRes.loc += sm.getActiveBody().getUnits().size();
    }
    for (IVarAbstraction pn : ptsProvider.pointers) {
        // points-to information is equivalent to SPARK
        if (!pn.hasPTResult())
            continue;
        pn = pn.getRepresentative();
        Node var = pn.getWrappedNode();
        if (ptsProvider.isExceptionPointer(var))
            continue;
        if (var instanceof AllocDotField) {
            ++n_alloc_dot_fields;
        }
        ++n_legal_var;
        // ...spark
        int size;
        if (testSpark) {
            size = var.getP2Set().size();
            evalRes.pts_size_bar_spark.addNumber(size);
            evalRes.total_spark_pts += size;
            if (size > evalRes.max_pts_spark)
                evalRes.max_pts_spark = size;
        }
        // ...geom
        size = pn.num_of_diff_objs();
        evalRes.pts_size_bar_geom.addNumber(size);
        evalRes.total_geom_ins_pts += size;
        if (size > evalRes.max_pts_geom)
            evalRes.max_pts_geom = size;
    }
    evalRes.avg_geom_ins_pts = (double) evalRes.total_geom_ins_pts / n_legal_var;
    if (testSpark)
        evalRes.avg_spark_pts = (double) evalRes.total_spark_pts / n_legal_var;
    outputer.println("");
    outputer.println("----------Statistical Result of geomPTA <Data Format: geomPTA (SPARK)>----------");
    outputer.printf("Lines of code (jimple): %.1fK\n", (double) evalRes.loc / 1000);
    outputer.printf("Reachable Methods: %d (%d)\n", ptsProvider.getNumberOfMethods(), ptsProvider.getNumberOfSparkMethods());
    outputer.printf("Reachable User Methods: %d (%d)\n", ptsProvider.n_reach_user_methods, ptsProvider.n_reach_spark_user_methods);
    outputer.println("#All Pointers: " + ptsProvider.getNumberOfPointers());
    outputer.println("#Core Pointers: " + n_legal_var + ", in which #AllocDot Fields: " + n_alloc_dot_fields);
    outputer.printf("Total/Average Projected Points-to Tuples [core pointers]: %d (%d) / %.3f (%.3f) \n", evalRes.total_geom_ins_pts, evalRes.total_spark_pts, evalRes.avg_geom_ins_pts, evalRes.avg_spark_pts);
    outputer.println("The largest points-to set size [core pointers]: " + evalRes.max_pts_geom + " (" + evalRes.max_pts_spark + ")");
    outputer.println();
    evalRes.pts_size_bar_geom.printResult(outputer, "Points-to Set Sizes Distribution [core pointers]:", evalRes.pts_size_bar_spark);
}
Also used : Histogram(soot.jimple.spark.geom.utils.Histogram) AllocDotField(soot.jimple.spark.pag.AllocDotField) IVarAbstraction(soot.jimple.spark.geom.geomPA.IVarAbstraction) LocalVarNode(soot.jimple.spark.pag.LocalVarNode) Node(soot.jimple.spark.pag.Node) VarNode(soot.jimple.spark.pag.VarNode) AllocNode(soot.jimple.spark.pag.AllocNode) SootMethod(soot.SootMethod)

Aggregations

Histogram (soot.jimple.spark.geom.utils.Histogram)3 LocalVarNode (soot.jimple.spark.pag.LocalVarNode)3 SootMethod (soot.SootMethod)2 IVarAbstraction (soot.jimple.spark.geom.geomPA.IVarAbstraction)2 AllocNode (soot.jimple.spark.pag.AllocNode)2 Node (soot.jimple.spark.pag.Node)2 VarNode (soot.jimple.spark.pag.VarNode)2 AssignStmt (soot.jimple.AssignStmt)1 InvokeExpr (soot.jimple.InvokeExpr)1 Stmt (soot.jimple.Stmt)1 CgEdge (soot.jimple.spark.geom.dataRep.CgEdge)1 AllocDotField (soot.jimple.spark.pag.AllocDotField)1 CallGraph (soot.jimple.toolkits.callgraph.CallGraph)1 Edge (soot.jimple.toolkits.callgraph.Edge)1