This is the implementation of our OOPLSA'20 paper "Learning Graph-based Heuristics for Pointer Analysis without Handcrafting Application-Specific Features". It aims to reproduce the Table 1, 2, 3, 4 and 6.
We implemented Graphick on top Doop. Specifically, We used Graphick to generate context sensitivity heuristic on the artifact of Scaler which is a baseline graph-based context-sensitivity heuristic developed on Doop (Ctx_Sensitivity folder). We also used Graphick to generate heap abstraction heuristic on the artifact of Mahjong which is a baseline heap abstraction heuristic (Heap_Abstraction folder).
- A 64-bit Ubuntu system
- A Java 8 distribution
- A Python 2.x interpreter
Please set your JAVA_HOME
environment variable to point to your Java installation directory.
Running Doop Framework requires Datalog engine that computes new facts from initial facts and inference rules given by Doop framework. Please execute the following command in your terminal to make sure your system has one of them.
$ bloxbatch -help
If you need to install Datalog engine, please visit this page. The page provides a deb package of an academic version of LogicBlox v3 engine. (We recommend .deb
package installation)
Verifying installation is very easy. You can check the installation by running the following command:
Ctx_Sensitivity$ ./run.py graphick luindex
You will see the results as follows:
Running graph_ci pointer analysis for luindex ...
...
Pointer analysis START
analysis timne: 23.49
Pointer analysis FINISH
...
logid graph heuristic ...
elapsed timne: 14.46s
...
Running 2obj-Graphick pointer analysis for luindex ...
...
Pointer analysis START
analysis time: 34.94s
Pointer analysis FINISH
...
#may-fail casts 297
#poly calls 682
#call edge 29,045
The results say that
- The program to be analyzed is luindex
- This analysis first run context-insensitive analysis to produce a garph to use Graphick and then do the main analysis 2obj-Graphick
- The pre-analysis took 23.49 seconds
- The main analysis took 34.94 seconds
- The results for each client (may-fail casts, poly v-calls, call-graph-edges)
Following the instruction below reproduces Table 1, 2, 3, 4, and 6. The command for running pointer analysis is as follows:
./run.py <analysis> <pgm>
If your current directory is "Ctx_Sensitivity", can be one of the following analyses:
graphick, scaler, zipper, data, 2objh, insens, s2objh, graphick_sobj.
The above command will reproduce Table 1, 2, or 6. If you are in "Heap_Abstraciton", can be:
graphick, mahjong, alloc_based, type_based.
can be a program in our evaluation:
luindex, lusearch, antlr, pmd, fop, chart, bloat, pmdm, eclipse, xalan, JPC, checkstyle, findbugs, soot, jython, briss, jedit
For example, if you want to analyze antlr with Graphick, type:
$./run.py graphick antlr
We've archived a ready-to-run version of our implementation in zenodo(Link).