Static JavaScript Call Graphs: A Comparative Study
<|reference_start|>Static JavaScript Call Graphs: A Comparative Study: The popularity and wide adoption of JavaScript both at the client and server side makes its code analysis more important than ever before. Most of the algorithms for vulnerability analysis, coding issue detection, or type inference rely on the call graph representation of the underlying program. Despite some obvious advantages of dynamic analysis, static algorithms should also be considered for call graph construction as they do not require extensive test beds for programs and their costly execution and tracing. In this paper, we systematically compare five widely adopted static algorithms - implemented by the npm call graph, IBM WALA, Google Closure Compiler, Approximate Call Graph, and Type Analyzer for JavaScript tools - for building JavaScript call graphs on 26 WebKit SunSpider benchmark programs and 6 real-world Node.js modules. We provide a performance analysis as well as a quantitative and qualitative evaluation of the results. We found that there was a relatively large intersection of the found call edges among the algorithms, which proved to be 100 precise. However, most of the tools found edges that were missed by all others. ACG had the highest precision followed immediately by TAJS, but ACG found significantly more call edges. As for the combination of tools, ACG and TAJS together covered 99% of the found true edges by all algorithms, while maintaining a precision as high as 98%. Only two of the tools were able to analyze up-to-date multi-file Node.js modules due to incomplete language features support. They agreed on almost 60% of the call edges, but each of them found valid edges that the other missed.<|reference_end|>
@article{antal2024static,
    title={Static JavaScript Call Graphs: A Comparative Study},
    author={G'abor Antal, P'eter HegedH{u}s, Zolt'an T'oth, Rudolf Ferenc,
  Tibor Gyim'othy},
    journal={arXiv preprint arXiv:2405.07206},
    year={2024},
    archivePrefix={arXiv},
    eprint={2405.07206},
    primaryClass={cs.SE}
}