[Paper Review] JSAI: Designing a Sound, Configurable, and Efficient Static Analyzer for JavaScript
JSAI is a sound, configurable, and efficient abstract interpreter for JavaScript that combines multiple static analysis techniques—type inference, pointer analysis, string and integer analysis, and control-flow analysis—using novel abstract domains. Its key contribution is modular configurability of context-, path-, and heap-sensitivity via a simple API, enabling rapid experimentation with diverse analysis sensitivities without modifying core logic, while maintaining formal soundness with respect to a concrete JavaScript semantics.
We describe JSAI, an abstract interpreter for JavaScript. JSAI uses novel abstract domains to compute a reduced product of type inference, pointer analysis, string analysis, integer and boolean constant propagation, and control-flow analysis. In addition, JSAI allows for analysis control-flow sensitivity (i.e., context-, path-, and heap-sensitivity) to be modularly configured without requiring any changes to the analysis implementation. JSAI is designed to be provably sound with respect to a specific concrete semantics for JavaScript, which has been extensively tested against existing production-quality JavaScript implementations. We provide a comprehensive evaluation of JSAI's performance and precision using an extensive benchmark suite. This benchmark suite includes real-world JavaScript applications, machine-generated JavaScript code via Emscripten, and browser addons. We use JSAI's configurability to evaluate a large number of analysis sensitivities (some well-known, some novel) and observe some surprising results. We believe that JSAI's configurability and its formal specifications position it as a useful research platform to experiment on novel sensitivities, abstract domains, and client analyses for JavaScript.
Motivation & Objective
- To design a static analyzer for full JavaScript that is provably sound with respect to a concrete semantics, addressing the lack of formal soundness in existing tools.
- To enable modular, runtime configurability of control-flow sensitivity (context-, path-, and heap-sensitivity) without changing the core analysis implementation.
- To provide a flexible research platform for experimenting with novel abstract domains and sensitivities in JavaScript analysis.
- To evaluate the precision and performance trade-offs of various sensitivity configurations across diverse JavaScript workloads, including real-world apps, Emscripten-generated code, and browser addons.
- To position JSAI as a competitive alternative to existing tools like TAJS, with comparable precision and performance, while offering stronger formal guarantees and configurability.
Proposed method
- JSAI uses abstract interpretation to formally relate its abstract semantics to a concrete JavaScript semantics, ensuring soundness.
- It computes a reduced product of multiple abstract domains, including type, pointer, string, integer, boolean, and control-flow analysis domains.
- Sensitivity configurations (e.g., k-CFA, object sensitivity, property simulation) are implemented via a plug-in API, allowing independent configuration without modifying the core analysis.
- The string and number abstract domains are designed as pluggable components, enabling easy substitution with new experimental domains.
- The analysis is implemented as an executable semantics, closely mirroring its formal specification, enhancing correctness and maintainability.
- JSAI supports full JavaScript (ECMA-3, sans eval) and includes extensions like Typed Arrays, with formal semantics designed specifically for abstract interpretation.
Experimental results
Research questions
- RQ1What is the impact of different control-flow sensitivity configurations (e.g., context-, path-, heap-sensitivity) on the precision and performance of JavaScript static analysis?
- RQ2Can a modular, pluggable architecture for sensitivity and abstract domains enable practical experimentation with novel analysis techniques in real-world JavaScript?
- RQ3How does JSAI’s precision and performance compare to state-of-the-art tools like TAJS, especially given TAJS’s known soundness bugs and incomplete API support?
- RQ4Does increased sensitivity always improve precision, or are there diminishing returns or domain-specific variations?
- RQ5Can a formally-specified, sound static analyzer for full JavaScript be both efficient and practical for real-world applications?
Key findings
- JSAI’s configurability allows for the implementation of over a dozen sensitivities with only 5–20 lines of code each, demonstrating high modularity and extensibility.
- More context sensitivity improves precision in most cases; for example, 5.4-stack sensitivity reduced false positives by an order of magnitude compared to context-insensitive analysis on the linq_enumerable benchmark.
- Performance varies significantly across benchmarks: JSAI’s analysis time is 0.3× to 1.8× that of TAJS on comparable workloads, indicating competitive efficiency.
- JSAI reports up to 104 more type errors than TAJS, but most of these are RangeErrors due to TAJS’s known soundness bugs; excluding those, JSAI reports at most 20 more errors.
- No single sensitivity configuration dominates across all benchmarks—precision gains vary by application domain, suggesting that optimal sensitivity is context-dependent.
- The addon domain shows minimal variance in precision, indicating that performance may be a better optimization target than precision in such short-call-sequence domains.
Better researchstarts right now
From reading papers to final review, dramatically reduce your research time.
No credit card · Free plan available
This review was created by AI and reviewed by human editors.