Abstract 1 Introduction 2 Background 3 Motivation 4 Our Approach 5 Evaluation 6 Related Work 7 Conclusion and Future Work References

Field-Sensitive Over-Tainting Reduction in IFDS Taint Analysis via CFL-Reachability

Yujiang Gui ORCID University of New South Wales, Sydney, Australia    Yonggang Tao ORCID University of New South Wales, Sydney, Australia    Jingling Xue ORCID University of New South Wales, Sydney, Australia
Abstract

IFDS taint analysis is inherently context- and flow-sensitive, allowing precise encoding of field sensitivity in access-path generation. However, preserving this level of precision in practice is difficult, leading to over-tainting – marking more data facts as tainted than necessary. The root cause is the undecidability of solving two context-free language reachability (CFL-reachability) problems along the same dataflow path, which forces k-limiting as an over-approximation of field sensitivity. Consequently, spurious access paths are introduced, increasing analysis time, memory usage, and false positives, especially in large-scale applications.

To address this challenge, we present TnFix, a CFL-reachability-based technique for mitigating over-tainting in IFDS taint analysis. The key insight is that the field sequence of any candidate tainted access path can be checked by a deterministic finite automaton (DFA) that accepts feasible sequences of field accesses. TnFix builds these DFAs by first solving a lightweight field-sensitive CFL-reachability problem to construct a Field Points-to Graph (FPG) that integrates data flows from taint sources and library summaries, and then converting the FPG into per-object DFAs. During taint analysis, TnFix queries these DFAs to prune access paths whose field sequences are rejected, eliminating the spurious paths introduced by k-limiting and improving precision without sacrificing scalability.

In a comparative evaluation against FlowDroid on a set of 36 widely used Android apps for taint analysis, TnFix successfully analyzes 7 apps that FlowDroid cannot complete within a three-hour time budget. For the remaining 29 apps, it improves analysis speed by an average of 2.5× and reduces false positives by an average of 12.2%. TnFix thus establishes the first CFL-based optimization framework for reducing over-tainting in IFDS taint analysis, delivering substantial gains in both efficiency and precision for practical use.

Keywords and phrases:
Taint Analysis, CFL-Reachability, Access Path, Field Sensitivity, Pointer Analysis
Copyright and License:
[Uncaptioned image] © Yujiang Gui, Yonggang Tao, and Jingling Xue; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Theory of computation Program analysis
Acknowledgements:
We thank the anonymous reviewers for their constructive comments.
Funding:
Australian Research Council Grants DP240103194.
Supplementary Material:
Software  (ECOOP 2026 Artifact Evaluation approved artifact): https://doi.org/10.4230/DARTS.12.1.20
Editors:
Robbert Krebbers and Alexandra Silva

1 Introduction

Static taint analysis detects security vulnerabilities by tracing data flows from specified sources to sensitive sinks without executing the program. It is widely used to uncover issues such as data leaks in mobile apps [4, 21], SQL injections [23, 13], cross-site scripting [43], and memory leaks [44, 22], and has become central to software security and privacy analysis.

To achieve precise interprocedural context- and flow-sensitive reasoning, modern static taint analyses [4, 49] frequently build on the IFDS (Interprocedural Finite Distributive Subset) framework [34], which reduces dataflow analysis to a graph reachability problem over an exploded supergraph. A major strength of IFDS is its precise support for context sensitivity: valid dataflow paths are restricted to those whose sequences of call and return edges form words in a balanced-parentheses context-free language, ensuring that method returns correctly match their corresponding call sites.

Problem Statement: Reducing Over-Tainting in IFDS Taint Analysis.

While IFDS precisely models context sensitivity, sound analysis of heap-manipulating programs also requires field sensitivity to distinguish accesses to different fields of the same object. In principle, field sensitivity could be captured via a context-free language reachability (CFL-reachability) formulation that matches field stores with corresponding loads. However, performing reachability over the intersection of two context-free languages, one governing context sensitivity and the other governing field sensitivity, along the same dataflow path is undecidable [33].

To avoid this undecidability while remaining sound, state-of-the-art IFDS taint analyses, such as FlowDroid [4], approximate field sensitivity using field-count limiting (or k-limiting) on access paths [45]. This truncates access paths like v.f.g.h that exceed length k, merging distinct heap locations into spurious aliases. Although k-limiting guarantees termination and keeps the domain finite, it inevitably causes over-tainting: the analysis marks many more data facts as tainted than necessary. These spurious facts inflate the number of path edges processed by the IFDS solver, increasing analysis time, memory usage, and false positives.

This paper presents the first CFL-reachability-based approach for mitigating over-tainting in IFDS taint analysis, establishing a new direction for improving precision without sacrificing scalability.

Challenges.

The central difficulty in IFDS taint analysis is over-tainting, rooted in the imprecise treatment of field sensitivity. This problem surfaces through three tightly connected challenges: (C1) incorporating precise field sensitivity without invoking the undecidability of intersecting context- and field-sensitive CFLs [33]; (C2) ensuring soundness by capturing implicitly defined data flows from taint sources and library summaries in the field-sensitive model; and (C3) efficiently leveraging this enhanced field-sensitive information to identify and prune spurious access paths during taint propagation.

Prior Work.

Over-tainting is a long-standing challenge across many areas of program analysis. It is a major source of precision loss in static binary analysis (e.g., oo7 [47], SpecTaint [31]) and web application security (e.g., TChecker for PHP [26]). Even dynamic techniques, such as DTA++ [14] and Conflux [11], continue to face over-tainting issues.

In contrast, research on IFDS taint analysis for Android has largely concentrated on improving solver scalability and efficiency (Section 6), while treating the precision loss introduced by k-limiting as an inherent limitation. To the best of our knowledge, no prior work specifically aims to reduce over-tainting in IFDS taint analysis for Android apps.

This Work.

We mitigate over-tainting in IFDS taint analysis by recovering the precise field sensitivity typically lost due to k-limiting. Our key insight is that for any access path v.f1..fn, the sequence f1..fn must be a valid prefix of a word spelled out by paths in a Field Points-to Graph (FPG). The FPG captures global heap connectivity through field references and encodes, for each variable, the realizable field sequences that can reach a taint source. Access paths that do not conform to this field-sensitive graph structure are spurious and can be safely discarded.

Building on this insight, we address the three challenges as follows. For C1, we adopt a staged analysis framework that avoids the undecidable intersection of CFLs: we first solve -reachability to recover full field sensitivity in isolation, producing a global model of valid interactions among heap objects. This enables strict field constraints without requiring the IFDS solver to perform simultaneous CFL reasoning. For C2, we ensure soundness by incorporating implicit data flows – such as those from taint sources and library summaries – directly into the -reachability formulation, so that the FPG captures both explicit pointer assignments and all taint-relevant reachability. For C3, we transform the FPG, initially a nondeterministic finite automaton (NFA), into efficient per-object deterministic finite automata (DFAs). These field-sensitivity-aware DFAs are integrated into IFDS propagation and serve as lightweight recognizers: whenever the solver generates an access path, the corresponding DFAs are queried to immediately prune paths that violate the field-sensitive constraints.

To demonstrate the performance benefits of TnFix over FlowDroid [4] – a leading IFDS taint analysis framework for Android apps – we evaluate both tools on a set of 36 widely used Android apps from previous studies. With a 3-hour time budget and 256 GB of memory, TnFix successfully analyzes 7 apps that FlowDroid cannot complete within the time limit. For the remaining 29 apps, TnFix reduces the number of path edges by an average of 2.7×, yielding an average speedup of 2.5× and a reduction in memory usage by 2.5× compared to FlowDroid. In addition, TnFix improves precision by reducing false positives by an average of 12.2%.

In summary, this paper makes the following three major contributions:

  • We introduce a staged analysis framework that mitigates over-tainting in IFDS taint analysis through field-sensitive enhancement, significantly improving the scalability, efficiency, and precision of FlowDroid.

  • We propose a lightweight method for constructing field-sensitive relations that incorporates implicitly defined data flows from taint sources and integrates library summaries.

  • We conduct an extensive evaluation comparing the efficiency and precision of TnFix with FlowDroid, using both micro-benchmarks and real-world Android apps.

TnFix is the first CFL-based approach to optimizing IFDS taint analysis for Android apps, reducing over-tainting and improving its effectiveness in practical use.

2 Background

In this section, we provide the theoretical background needed for our staged analysis framework. Section 2.1 reviews the IFDS formulation that underlies modern taint analyses such as FlowDroid, focusing on its reduction to context-sensitive graph reachability. Section 2.2 introduces CFL-reachability, which we later employ to recover full field sensitivity. Together, these concepts establish the foundation for the field-sensitive reasoning and DFA-based access-path validation presented in Section 4.

2.1 The IFDS Framework

The IFDS framework [34] tackles a special type of dataflow problem known as the IFDS problem (interprocedural, finite, distributive, subset), of which an instance IP is defined as a quintuple IP=(G,D,F,M,), where G=(N,E) is the supergraph of the program, D is a finite set of data facts, F2D2D is a set of distributive dataflow functions, M:EF is a map from the supergraph edges to dataflow functions, and the meet operator varies as either union or intersection, depending on the problem modeled.

Algorithm 1 The IFDS algorithm [34] used in mainstream implementations [30].

The supergraph G is composed of multiple control flow graphs (CFGs), one for each method in the program. Each method m has its own CFG Gm, with a unique start node smN and an exit node emN. A callsite is denoted by a call node cN and a return node by rN. The remaining nodes, called normal nodes, represent statements and predicates as in typical flow graphs, including assign nodes for assignment statements. Edges in E are classified into four kinds: call edges (linking a call node to a start node), return edges (linking an exit node to a return node), call-to-return edges (linking a call node to a return node), and normal edges (linking normal nodes).

As shown in Algorithm 1, Reps et al. [34] reduce the IFDS problem to a graph reachability problem on an exploded supergraph G𝐼𝑃#=(N#,E#) derived from G, where N#=N×(D{0}) and E#={m,d1n,d2|mnE,f=M(m,n),d2f(d1)}. Note that fF is the dataflow function of the edge mnE, 0 represents a special fact that facilitates the generation of new facts at certain program points, and Sum summarizes the interprocedural dataflow facts obtained across the function boundaries (lines 11 and 16).

The graph-reachability problem is solved using an efficient tabulation algorithm implemented as a worklist. The analysis begins from the initial path edge smain,0smain,0 – with “main” denoting the program entry – and incrementally accumulates new path edges until a fixed point is reached. Each path edge sm,d1n,d2, where sm is the start node of method m, represents a feasible context-sensitive path in G𝐼𝑃# from smain,0n,d2. The IFDS algorithm shown in Algorithm 1 is the standard tabulation procedure used in mainstream implementations [30]; full details can be found in [34, Figure 3].

2.2 CFL-Reachability

CFL-reachability [32] is a foundational abstraction used in a wide range of program analyses, including pointer analysis, shape analysis, slicing, and information-flow reasoning. It is defined over an edge-labeled graph G=(V,E) together with a context-free grammar 𝔊=(N,Σ,P,S), where N is the set of non-terminals, Σ the terminals, P the productions, and S the start symbol. Each edge u𝛼vE is labeled with αΣ; its inverse vα¯u is also included, enabling bidirectional traversal and supporting analyses that require matching paired operations such as stores and loads [40].

A path in G forms a word by concatenating its edge labels. For any non-terminal XN, a path p from ps to pe witnesses the relation psXpe if its label sequence is derivable from X in 𝔊. The grammar thereby specifies the well-formed traversal patterns considered feasible by the analysis – for example, balanced sequences of field stores and loads or properly nested invocation contexts.

The all-pairs CFL-reachability problem computes, for every non-terminal XN, all node pairs (ps,pe) whose connecting paths satisfy this relation. Classical solutions rely on dynamic programming techniques [28] to enumerate all derivable relations specified by 𝔊. CFL-reachability therefore provides a unifying basis for expressing recursive, interprocedural, and field-sensitive relationships in static analysis.

3 Motivation

Over-tainting in IFDS taint analysis can significantly inflate the number of propagated access paths, degrade scalability, and introduce false leak reports. To make these issues concrete, we begin with a real-world example in Section 3.1 that illustrates how limited field sensitivity interacts with k-limiting to produce spurious taints. In Section 3.2, we examine how this over-tainting manifests in the classic IFDS taint analysis implemented by FlowDroid, affecting scalability, efficiency, and precision. Finally, in Section 3.3, we demonstrate how our staged analysis mitigates these problems by eliminating the spurious access paths responsible for over-tainting.

3.1 A Real-World Example

We illustrate the practical impact of over-tainting using a real-world example extracted from com.kanedias.vanilla.metadata, an open-source Android app from F-Droid [6] that retrieves music metadata. As shown in Figure 1a, the example involves three classes: FetchActivity, an Android UI activity (lines 5–12); Wrapper, which manages data loading from external sources (lines 23–37); and Extractor, an inner class of FetchActivity that mediates interactions between the activity and the wrapper (lines 13–22). Note that although Extractor is defined inside FetchActivity, it is shown separately in the figure for clarity.

The dummyMain() method simulates the lifecycle of the activity (lines 1–4). Within onCreate(), an Extractor instance is created and its extract() method is invoked (lines 10–11). Inside extract(), the FetchActivity object is referenced by x (line 17), and p is assigned the associated Wrapper instance via getWrapper() (line 18). Subsequent data loading on p calls loadCover() and loadMetadata() (lines 19–20).

The taint source appears in loadCover(), where sensitive data is read into is (line 28) and then stored into the field this.c (line 29). The sink is located in loadMetadata(), which reads the field this.f into file and logs its content (lines 33–36). Finally, at line 21, the field value p.f is transferred to x.m via getAudioFile().

Figure 1: Comparison of TnFix and FlowDroid in IFDS taint analysis. Gray nodes denote forward data facts; red nodes denote alias facts discovered by the backward pass. Both passes iterate through path-edge injections while managing data facts as access paths truncated to length 2 (under 2-limiting). Inactive data facts are prefixed with an underscore (‘_’) to preserve flow sensitivity. In (b), FlowDroid progresses from to , and then concurrently from through and from to ’. In (c), TnFix mitigates FlowDroid’s over-tainting by pruning the explorations at and ’ (marked with ✗), preventing the spurious path that leads to the false leak.

No data leak occurs in this program because the source and sink operate on distinct object fields. The sensitive data is written to field c of the Wrapper object (line 29), whereas the sink reads exclusively from field f of that same object (lines 34–36). Since c and f are different fields of the Wrapper instance allocated at line 6, the taint on p.c never flows into p.f. Consequently, msg at line 36, which is derived from p.f, remains untainted, ensuring that no leak occurs at line 36, the sole sink statement in this example.

Below, we explain how FlowDroid reports a false leak at this sink due to over-tainting, while TnFix effectively prevents it. We consider access paths under 2-limiting (k=2).

3.2 FlowDroid: The Classic IFDS Taint Analysis

FlowDroid [4], illustrated in Figure 1b, performs IFDS taint analysis [34] using concurrent forward and backward passes, each encoded as a reachability problem on its own exploded supergraph (Algorithm 1). In these graphs, gray nodes mark tainted access paths discovered by the forward pass, while red nodes represent aliases computed by the backward pass. The two passes interact by iteratively injecting path edges into one another (shown by ), allowing aliasing information to influence taint propagation and vice versa. Summary edges () capture entry-to-exit effects across method boundaries.

Flow sensitivity is preserved by temporarily deactivating a data fact (prefixed with an underscore ‘_’) when the backward pass identifies it as an alias of a tainted access path and injects it into the forward pass. Because such aliases arise at program points lexically earlier than where the taint was originally established, the injected fact is propagated forward but activated only at the point where that access path is actually tainted ( or ). This ensures that path edges are reintroduced only at flow-correct locations, maintaining the precision guarantees of the IFDS formulation.

In this example, the analysis begins in the forward pass at line 28 in loadCover(). The zero fact 0 initiates taint propagation, marking is as tainted. Using the library summary of readAllBytes() (described in Section 4.1), the taint then flows to this.c at line 29. This triggers the backward pass (shown by ) to trace aliases: starting from _this.c (), it identifies _p.c at line 18 via parameter passing, _x.w.c at line 17 based on the load at line 8, and subsequently _this.a.w at line 17 based on the load at that line ().

The critical precision loss occurs during the backward pass at line 17 (). Although _this.a.w.c is derived from _x.w.c, its final field c is truncated by 2-limiting (k=2). This truncation discards the specific field being accessed and causes the analysis to treat the entire Wrapper object referenced by w as tainted. The backward pass then propagates _this.a.w, revealing its alias _e.a.w at line 10 ().

During the subsequent forward pass at line 17 (), _this.a.w is recognized as tainted, which in turn marks _x.w and _p as tainted at lines 17 and 18. At line 21, x.m becomes tainted due to the load of field f from p (line 32), triggering another backward pass () that identifies its aliases: _e.a.m and _this.m in onCreate() (), as well as _this.a.m in extract() (). In parallel, file becomes tainted at line 35 after loadMetadata() is invoked at line 20, causing msg to be tainted at line 36 (’).

Ultimately, FlowDroid reports a false leak at line 36.

Due to k-limiting in access-path management, classic IFDS taint analyses like FlowDroid suffer from two major limitations:

  • Limited Field Sensitivity. As shown in Figure 1b, under k=2, the taint propagation path constructed by FlowDroid for the call p.loadMetadata() at line 20 is:

    is() _p.c()_x.w.c()_e.a.w()
    _x.w()_p()this.f(’)
    file(’)msg(’)

    When p is (incorrectly) tainted at line 20, this.f becomes tainted at line 34, leading FlowDroid to report a leak at line 36. Under k=3, however, the taint path becomes:

    is_p.c_x.w.c_e.a.w.c_x.w.c_p.c

    so this.f is never tainted, since fields c and f do not match. Thus, the leak warning produced under k=2 is a false positive, caused by truncating _this.a.w.c to _this.a.w at line 17 – an imprecision that over-taints this.f due to insufficient field sensitivity.

  • Limited Scalability, Efficiency, and Precision. Spurious access paths degrade scalability, efficiency, and precision. As shown in Figure 1b, the propagation of the spurious taint on this.f triggers unnecessary alias searches ( through ) and ultimately causes the false positive reported at line 36 (’).

3.3 TnFix: Our Solution for Reducing Over-Tainting

We present TnFix, a staged taint analysis framework designed to mitigate the over-tainting inherent in traditional IFDS-based tools such as FlowDroid. TnFix prunes spurious access paths using lightweight, field-sensitive enhancements that recover the precision lost under k-limiting. By eliminating these infeasible paths before they enter the IFDS propagation, TnFix substantially improves scalability, efficiency, and precision.

At the core of TnFix is a fully field-sensitive data structure called the field points-to graph (FPG), which can be viewed as a nondeterministic finite automaton (NFA). To enable efficient queries, TnFix constructs field-sensitivity-aware DFAs from the NFA. While the CFL-based construction from the program’s supergraph G [34] and its adaptation for taint analysis are detailed in Section 4, the basic idea is intuitive: each DFA encodes the valid field access sequences from a given object, filtering out access paths that violate field sensitivity.

(a) Field points-to graph (FPG).
(b) Mirrored NFA 𝒩fpg.
Figure 2: Modeling field sensitivity for the motivating example in Figure 1a. (a) The Field Points-to Graph (FPG) derived from Figure 1a, where each Oi denotes an object allocated at line i, and S28 is the source object at line 28. (b) The corresponding NFA 𝒩fpg, whose doubly-circled nodes form the accepting set 𝒜, representing the objects that can reach the taint source.

Figure 2 illustrates how TnFix models field sensitivity for our motivating example in Figure 1a. Figure 2(a) shows the FPG derived from the example, where each edge OifOj represents a possible field access Oi.f = Oj. We use O to denote an object allocated at line . For example, the edge O6cS28 captures the flow at line 29, where the taint source S28 (line 28) is written into field c of the Wrapper object O6 allocated at line 6. Other edges are derived analogously from field-access relations in Figure 1a. The edge O2mO25 arises from x.m = p.getAudioFile() at line 21: x may point to the FetchActivity object O2 allocated at line 2, and p.getAudioFile() returns the File object O25 allocated at line 25, which is then stored into x.m. Similarly, O2wO6 captures the initialization of field w in FetchActivity (line 6), where the Wrapper object O6 allocated at line 6 is stored into O2.w; and O10aO2 records the assignment this.a = y in the constructor of Extractor at line 15.

The corresponding NFA 𝒩fpg in Figure 2(b) mirrors the structure of the FPG, with all nodes serving as start states. Since S28 is the source object, all nodes that can reach it form the accepting set 𝒜={O10,O2,O6,S28}. For instance, O10 is accepting because it reaches S28 along the field sequence awc, whereas O25 is rejected because it has no path to the source.

(a) DFA 𝒟fpg(O10) accepting aw.
(b) DFA 𝒟fpg(O6) rejecting f.
Figure 3: Illustrating spurious access-path elimination via DFA recognition. (a) The DFA for O10 accepts the feasible field sequence aw that arises at step in Figure 1c. (b) The DFA for O6 rejects the spurious field sequence f attempted at steps and ’ in Figure 1c.

Finally, 𝒩fpg is transformed into per-object, field-sensitivity-aware DFAs (as detailed in Section 4.3), as illustrated in Figure 3. Figure 3(a) and Figure 3(b) present the resulting automata for O10 and O6, respectively. An object field access of the form O10.f1fk or O6.f1fk is considered valid only if its sequence of field accesses causes the corresponding DFA to reach an accepting state.

We now revisit the example in Figure 1a to illustrate how TnFix mitigates the over-tainting issue (Figure 1c). Recall that under k=2, FlowDroid reports a false leak at line 36 because it propagates taint along the following path analyzed from loadMetadata() (Figure 1b):

is() _p.c()_x.w.c()_e.a.w()
_x.w()_p()this.f()
file()msg().

TnFix blocks this false leak by consulting its field-sensitivity-aware DFAs, which validate whether an access path v.f1fk is feasible before propagation. At line 17, FlowDroid truncates this.a.w.c to this.a.w due to the access-path limit k=2 ( in Figure 1b). TnFix then checks this truncated path against its DFA family 𝒟fpg(this17)={𝒟fpg(O10)} (Section 4.4). As shown in Figure 3(a), 𝒟fpg(O10) accepts the field sequence aw, transitioning from {O10} to {O6}𝒜, so propagation is allowed.

At line 34, FlowDroid considers this.f potentially tainted (’ in Figure 1b). TnFix performs a second check using 𝒟fpg(this34)={𝒟fpg(O6)}. As shown in Figure 3(b), 𝒟fpg(O6) rejects this.f: it transitions from {O6} to {O25}, a non-accepting state, meaning S28 cannot taint this.f under field-sensitive semantics (Section 4.1). TnFix therefore discards this spurious access path, preventing the tainting of file and msg at lines 35–36 and suppressing the false leak reported at line 36 (as indicated by the ✗ symbols at ’ in Figure 1c).

TnFix also reduces unnecessary alias searches by pruning spurious flows. At in Figure 1b, FlowDroid taints x.m from p via getAudioFile(), but TnFix rejects this.f at line 32 using 𝒟fpg(this32)={𝒟fpg(O6)} (Figure 3(b)). As a result, x.m is not tainted at line 21 (marked with ✗ at in Figure 1c), eliminating all alias searches from through .

Below we highlight three key features of TnFix:

  • Staged Field-Sensitive Reasoning. TnFix uses a staged framework that decouples field-sensitive reasoning from IFDS propagation. By validating access paths against lightweight, field-sensitivity-aware DFAs, it filters out spuriously tainted access paths introduced by k-limiting in traditional IFDS taint analyses such as FlowDroid.

  • Enhanced Efficiency and Scalability. By eliminating spurious taints and pruning unnecessary data flows, TnFix significantly improves the efficiency and scalability of FlowDroid. This is illustrated by the pruned flows at and ’, marked with ✗ in Figure 1c.

  • Improved Precision. TnFix increases the precision of FlowDroid by removing infeasible flows, preventing the false leak at line 36 that FlowDroid would otherwise report (’ in Figure 1c).

Figure 4: Workflow of the TnFix framework. A field-sensitive reachable-relation solver constructs the FPG, which is converted into an access-path recognizer that filters infeasible access paths and guides the interaction between IFDS-based taint and alias analyses.

4 Our Approach

Figure 4 illustrates the staged analysis framework of TnFix. Our approach decouples the analysis into a field-sensitive reasoning stage and a taint-propagation stage. We first solve a CFL-reachability problem – augmented with explicit data flows and implicit flows from taint sources and library summaries (Section 4.1) – to construct a global Field Points-to Graph (FPG) (Section 4.2). The FPG is then converted into per-object, field-sensitivity-aware DFAs (Section 4.3), which serve as recognizers that filter out spuriously tainted access paths during IFDS propagation (Section 4.4). We analyze the soundness and precision of this design in Section 4.5 and discuss its complexity in Section 4.6.

4.1 Field-Sensitive Reachability Relations

Figure 5 presents the context-free grammar 𝔊 used to define , a CFL that models Java field accesses as a balanced-parentheses problem, adapted from [40]. Let denote the set of fields, with each f. The grammar includes four kinds of terminals: new (object allocation), assign (assignment), [f (field store), and ]f (field load).

The nonterminal flowsto captures how an object o flows into a variable v along a flowsto-path. Intuitively, an object created at a new instruction may flow into a variable through a sequence of direct assignments (assign) or through indirect assignments mediated by matched stores and loads (captured by balanced). Its inverse, flowsto¯, corresponds to the standard points-to relation: oflowstov iff vflowsto¯o.

Because balanced[fflowsto¯flowsto]f, the composition flowsto¯flowsto characterizes the standard alias relation: two variables x and y are aliases iff

xflowsto¯oflowstoyfor some object o
flowsto new|flowstoassign|flowstobalanced
balanced storef¯loadf
storef¯ [fflowsto¯
loadf flowsto]f
flowsto¯ new¯|assign¯flowsto¯|balanced¯flowsto¯
balanced¯ loadf¯storef
loadf¯ ]f¯flowsto¯
storef flowsto[f¯
Figure 5: Context-free grammar 𝔊 defining the field-sensitive language for balanced field accesses.

We transform the program’s supergraph G into a Pointer Assignment Graph (PAG) Gpag, labeling edges with field identifiers drawn from . In Gpag, nodes represent variables and objects in 𝒪, with 𝒮𝒪 marking source objects for taint analysis. Edges encode data flows induced by assignments (Table 1), object allocations via new, and source introduction via [New] and [Source]. Call and return edges are treated as direct assignments. Every edge uv in Gpag is paired with its inverse v¯u, enabling bidirectional traversal [40]. This bidirectionality is essential for capturing object flows governed by the balanced relation, which connects the flowsto relation to its inverse, the points-to relation flowsto¯.

Table 1: Rules for constructing Gpag from G, mapping program statements to their corresponding edges.
Kind Statement Edge
[New] x = new T() // o𝒪 onewx
[Assign] x = y yassignx
[Store] x.f = y y[fx
[Load] y = x.f x]fy
[Source] x = source() // s𝒮 snewx

To ensure soundness in constructing Gpag, we must represent all data flows that are implicitly defined as access paths in taint sources and library code using CFL-reachability.

Taint Sources.

Since x = source() taints x from source object S, any load from x via field accesses taints the targeted variable. To capture these implicit taints in Gpag, specifically for a load y=x.f¯, where f¯ denotes a sequence of field accesses f1..fk, if -reachability shows Sflowstox, we add a Sflowstoy summary edge to indicate that y is tainted.

Library Code.

FlowDroid leverages summaries from StubDroid [3] to avoid analyzing library code directly. These summaries specify how a function propagates taint through access paths involving arguments, the receiver, and the return value. For example, at a callsite r = x.foo(a, b), if foo() is summarized to taint this.f.* when param1.* is tainted, then x.f.* is inferred if a.h is tainted.

For a library summary rule x.f¯y.g¯𝐿𝑖𝑏𝑆𝑢𝑚, linking an input access path x.f¯ with an output y.g¯, we add a summary edge vflowstow, where v=x.f¯.=source() denotes a taint source, and w=y.g¯ is the corresponding output.

Algorithm 2 Finding field-sensitive relations by solving the all-pairs CFL-reachability problem.

In Algorithm 2, Reach() computes all field-sensitive points-to relations by solving an all-pairs -reachability problem over Gpag using dynamic programming [28]. To ensure soundness, we incorporate implicitly defined data flows – those arising from taint sources (lines 10–11) and library summaries (lines 12–13) – directly into the construction of Gpag. These additions introduce only new value-flow edges; they never modify or remove edges encoding field sensitivity, and therefore do not alter FlowDroid’s taint semantics or introduce false negatives.

FlowDroid already relies on field-sensitive propagation that is semantically captured by together with its source and summary rules. Algorithm 2 reuses these same rules when constructing Gpag, from which our per-object DFAs are derived. Consequently, every field sequence that FlowDroid can propagate under its precise (unbounded) semantics is accepted by our field-sensitivity-aware DFAs. Thus, TnFix remains semantically consistent with FlowDroid and preserves soundness while filtering only the spurious access paths introduced by k-limiting.

4.2 Field Points-to Graph

A Field Points-to Graph (FPG) summarizes the indirect data flows between abstract objects induced by field accesses. Each node oi𝒪 represents an abstract object, and a directed edge oi𝑓oj indicates that the field oi.f may point to oj.

We construct the FPG by aggregating the reachability results computed over Gpag (Algorithm 2), using the following inference rule:

oistorefvojflowstovAdd oi𝑓oj as an edge in the FPG

Intuitively, oistorefv states that the value in variable v is written into field f of object oi, while ojflowstov states that v may point to object oj. Combining these relations yields the field points-to edge oi𝑓oj.

4.3 Field-Sensitivity-Aware DFAs

As discussed in Section 3.3, the FPG can be viewed as a nondeterministic finite automaton (NFA) 𝒩fpg=(𝒬,,δ,,𝒜). The state space 𝒬={oo𝒪} corresponds to the FPG nodes, where 𝒪 contains all abstract objects and 𝒮𝒪 denotes the source objects in taint analysis. The alphabet consists of all field labels. The transition function δ:𝒬×𝒫(𝒬) mirrors the points-to edges: an FPG edge oi𝑓oj becomes a transition from oi to oj on input f. All objects serve as start states (=𝒬), reflecting that reachability may begin from any object. The accepting states 𝒜 comprise the source objects and all objects that can reach a source through the FPG.

Algorithm 3 Building per-object field-sensitivity-aware DFAs from 𝒩fpg using subset construction.

For the FPG (Figure 2(a)) derived from the motivating example in Figure 1a, the NFA (Figure 2(b)) is defined by 𝒬={O10,O2,O25,O6,S28}, ={a,m,w,f,c}, and a transition function δ that directly reflects the FPG edges. All objects in 𝒬 are start states, and the accepting set is 𝒜={O10,O2,O6,S28}.

To support efficient access-path recognition, we convert 𝒩fpg into a family of deterministic automata, one per object, denoted 𝒟fpg(o), using essentially the standard subset-construction algorithm (Algorithm 3). Rather than constructing each DFA independently, BuildDFAs() computes all per-object DFAs concurrently using a shared transition function δ. Line 13 introduces the helper map fields: 𝒪𝒫(), which associates each object o with the set of fields labeling its outgoing edges. This concurrent construction is substantially more efficient: our evaluation (Section 5) shows a geometric-mean speedup of 18.7× across 36 apps compared to building DFAs separately. As a result, TnFix’s field-sensitive reasoning stage remains lightweight and practical, enabling effective reduction of over-tainting in IFDS taint analysis.

Although subset construction can theoretically cause exponential state blowup, in practice the resulting DFA is often smaller than its NFA counterpart – one reason it is widely used in lexical analyzers. In our setting, no such blowup occurs: the number of objects |𝒪| remains modest, with a maximum of 9115 across our benchmark suites (Figure 8).

4.4 Access Path Recognizer

Algorithm 4 Recognizing spurious access paths.

To determine whether a candidate access path d2=v.f1..fk is spuriously tainted during IFDS taint propagation (line 22 of Algorithm 1), we consult the set of field-sensitivity-aware DFAs associated with v, defined as:

𝒟fpg(v)={𝒟fpg(o)oflowstov}

An access path v.f1..fk is considered valid if its field sequence f1..fk is accepted by at least one automaton in 𝒟fpg(v). Conversely, if all DFAs in the set reject the sequence, the access path is deemed spurious and is immediately discarded.

Algorithm 4 extends the standard IFDS propagation in Algorithm 1 by modifying Propagate(): line 23 is replaced with line 23a, which invokes Recognize(). This function returns true if d2=v.f1..fk is a valid access path, and false if it is spurious and should be ignored.

To maintain high performance, our implementation does not iterate over individual DFAs. Instead, Recognize() queries the shared transition function δ used by all field-sensitivity-aware DFAs constructed in Section 4.3, allowing the validity of an access-path prefix to be checked efficiently.

4.5 Soundness and Precision

We analyze TnFix’s soundness and precision by relating its field-sensitive CFL semantics to the standard CFL-reachability formulation of IFDS [34, 48]. The central goal is to show that (1) TnFix never removes any access path corresponding to a valid IFDS computation (soundness), and (2) under k-limiting, TnFix removes only those paths that FlowDroid introduces spuriously due to k-limiting (precision).

4.5.1 CFL Semantics of IFDS

We recall the CFL formulation of the IFDS algorithm [48]. Let G𝐼𝑃# be the exploded supergraph of an IFDS problem instance 𝐼𝑃, and let CallSite denote the set of callsites in G𝐼𝑃#. The context-sensitive language 𝒞 provides a precise characterization of valid interprocedural paths by enforcing properly matched call/return structure.

The alphabet of 𝒞 is:

Σ𝐼𝑃={e,n}iCallSite{(i,)i},

where

  • e labels all normal edges,

  • (i labels the outgoing call edge at callsite i,

  • )i labels the matching incoming return edge, and

  • n labels the start edge associated with the initial path edge added at line 3 of Algorithm 1 to initialize data fact propagation.

The grammar generating 𝒞 is:

valid nvalidevalidsum
valid valid(i
sum (ivalid)i

Executing Algorithm 1 involves solving the all-pairs 𝒞-reachability issue over G𝐼𝑃#. This CFL-based approach reflects the original IFDS methodology, capturing each case in Algorithm 1 through productions: (1) call statements (lines 8–14) use validvalid(i and validvalidsum|valide; (2) exit statements (lines 15–18) correspond to sum(ivalid)i for generating summary edges and validvalidsum for applying summary edges; and (3) normal statements (lines 19–21) use validvalide.

A path is an 𝒞-path exactly when calls and returns are properly matched, corresponding to the valid paths of the IFDS algorithm [34, Definition 2.3]. FlowDroid’s taint analysis computes all tainted access paths whose propagation corresponds to paths in the language:

𝒞=𝒞,

where encodes the field-store/field-load matching semantics described in Section 4.1.

4.5.2 FlowDroid’s Field Semantics Is Contained in 𝓛𝓕

The language captures the precise well-balanced semantics of Java field accesses: (1) matched field-store/field-load pairs, (2) flows induced by assignments and object allocation, and (3) implicit flows from taint sources and library summaries. These correspond exactly to the flow functions that FlowDroid applies when propagating taint through field stores, field loads, and source/sink summaries.

Crucially, is a superset abstraction of FlowDroid’s own field semantics: any field sequence that FlowDroid can propagate corresponds to a valid field-balanced derivation in . Although TnFix computes -reachability flow-insensitively, while FlowDroid applies the same rules flow-sensitively within IFDS, this difference only enlarges the set of derivable paths. It never removes any path that FlowDroid could generate.

Therefore, if an access path is valid under FlowDroid’s flow functions, its sequence of field accesses is necessarily accepted by . This containment guarantees that TnFix’s DFA-based recognizer cannot reject any truly valid FlowDroid access path; it only rejects sequences that FlowDroid introduces spuriously due to k-limiting.

Lemma 1.

Without k-limiting, TnFix and FlowDroid generate the same set of access paths.

Proof.

FlowDroid computes all access paths whose propagation corresponds to 𝒞=𝒞. TnFix performs no filtering in this setting: it checks field sequences only against , and FlowDroid never produces an access path that violates when k is unbounded. Thus every access path generated by FlowDroid is accepted by TnFix’s recognizer. Since TnFix acts only as an access-path filter and removes nothing in this case, both systems produce exactly the same set of access paths.

4.5.3 Effect of 𝒌-Limiting in FlowDroid

FlowDroid enforces k-limiting by truncating access paths syntactically. Truncation merges distinct heap locations, so a single abstract access path (e.g., a.f) may stand for multiple longer field sequences (e.g., a.f.g, a.f.h, …). Some of these sequences are vaild under the field-sensitive semantics of , while others are not. This coarse abstraction allows additional flows beyond what 𝒞 would admit and can introduce spurious taints. TnFix acts as an access-path filter that rejects precisely those extensions whose field sequences are rejected by the -based DFAs, thereby pruning the over-tainting introduced by k-limiting.

Lemma 2.

Under k-limiting, TnFix removes only spuriously tainted access paths introduced by FlowDroid.

Proof.

FlowDroid enforces k-limiting by truncating access paths syntactically. This truncation may merge distinct heap locations into the same shortened access path, producing field sequences that are no longer consistent with the precise field-balanced semantics captured by . Crucially, FlowDroid’s own field semantics is fully contained in : any field sequence that FlowDroid can propagate without k-limiting corresponds to a valid derivation in . Thus, if an access path is rejected by TnFix’s -based DFA recognizer, then its field sequence cannot be valid under FlowDroid’s precise (unbounded) semantics; it must arise solely due to over-approximation introduced by truncation.

During propagation (Algorithm 4), TnFix rejects exactly these -invalid access paths while preserving all paths that remain valid under FlowDroid’s unbounded semantics. Hence every path removed by TnFix is spurious by construction.

Theorem 3.

Under k-limiting, TnFix preserves FlowDroid’s soundness (detecting the same set of true leaks) while achieving equal or greater precision.

Proof.

Lemma 1 establishes that, without k-limiting, TnFix preserves every access path that is valid under FlowDroid’s precise field semantics. Lemma 2 further shows that, under k-limiting, TnFix removes only those additional access paths that arise solely from truncation and are invalid under FlowDroid’s unbounded field semantics. Since TnFix never removes a path that remains valid under FlowDroid’s unbounded field-sensitive semantics, it cannot suppress any real leak. By filtering only spurious truncation-induced access paths, TnFix may eliminate false positives introduced by k-limiting, yielding strictly greater precision while maintaining soundness.

4.6 Complexity Analysis

We assess the overhead introduced by TnFix when reducing FlowDroid’s over-tainting, separating the costs of the field-sensitive reasoning from those of the main IFDS analysis.

Field-sensitive reasoning.

Solving -reachability has time complexity O(Γ3N3) and space complexity O(N2), where Γ is the size of the normalized grammar for (a small constant) and N is the number of nodes in Gpag. In practice, N remains modest for most Android apps due to the use of library summaries. Once -reachability is computed, constructing the FPG requires O(R2N) time and O(|||𝒪|2) space, where R is the number of -reachable pairs. The subset construction used in Algorithm 3 has a worst-case cost of Θ(2|𝒪|), but |𝒪| is typically small in practice (Section 5.1), and no blowup was observed in our experiments.

Main IFDS analysis.

During IFDS propagation, Recognize() in Algorithm 4 checks whether an access path v.f1..fk is spurious in O(k|M|) time, where M=𝒟fpg(v) is the set of DFAs associated with v. Although incorporating this check introduces a small overhead in smaller apps, the cost is offset by the substantial scalability, efficiency, and precision gains achieved on larger apps (as evaluated in Section 5).

5 Evaluation

As the first approach designed to mitigate over-tainting in IFDS taint analysis for Android apps, TnFix is evaluated against FlowDroid in terms of scalability, efficiency, and precision, while also confirming soundness (Theorem 3) and implementation correctness. Our evaluation is guided by the following research questions:

  • RQ1. What is the overhead of TnFix’s field-sensitive reasoning stage in terms of time and memory?

  • RQ2. To what extent does TnFix improve precision, as measured by the reduction in false leak reports?

  • RQ3. To what extent does TnFix improve efficiency and scalability compared to FlowDroid?

  • RQ4. How does the effectiveness of TnFix vary across different k-limits?

Overall, the results demonstrate that TnFix effectively addresses the over-tainting introduced by k-limiting and can significantly strengthen FlowDroid, complementing recent advances in IFDS performance and optimization [10, 1, 9].

Implementation.

We implemented TnFix as an extension of FlowDroid (revision 0174ec4), adding approximately 2,000 lines of Java code to support the staged analysis. In the field-sensitive reasoning stage, TnFix utilizes Algorithm 2 to compute CFL-reachability. For the subsequent IFDS taint analysis, both FlowDroid and TnFix employ FastSolver. Additionally, TnFix integrates Algorithms 3 and 4 to eliminate spuriously tainted access paths, thus reducing over-tainting arising from k-limiting in traditional IFDS taint analysis.

Benchmarks.

Due to the absence of standardized benchmarks, we began with 40 apps used in a recent study on enhancing IFDS taint analysis by merging equivalent data flows [8], which itself draws from prior evaluations in [10] and [19]. After removing duplicates, resolving crashes, and updating versions, these authors supplemented the set with 7 large real-world apps from F-Droid [6] for comparison with FlowDroid. Four of these apps, however, were excluded because neither FlowDroid nor TnFix could complete analysis within a 3-hour time budget. This is attributable to scalability bottlenecks beyond the k-limiting-induced over-tainting targeted by TnFix, such as array and collection abstractions, conservative library modeling, and bidirectional IFDS propagation overhead. This leaves a final set of 36 apps for our evaluation.

Experimental Setting.

All experiments were conducted on Ubuntu 20.04.6 LTS with 8 CPU cores (16 threads) and 512 GB RAM. We configured both FlowDroid and TnFix with a 256 GB JVM heap (-Xmx), 3-hour timeout (-dt), maximum callback depth (-md), and enabled dex merging (--mergedexfiles). Remaining settings followed FlowDroid defaults, including source/sink definitions and access path length k=5, chosen for a balanced precision-efficiency tradeoff consistent with prior work [10, 1, 9, 8].

Table 2: Performance comparison between FlowDroid (FD) and TnFix. Apps are ordered by increasing FlowDroid analysis time and grouped into two categories: “3 Hours” (scalable) and “Unscalable”.
ID App Time (s) Memory (GB) #PathEdges (M) #Leaks
FD TnFix FD TnFix FD TnFix FD TnFix
1 com.ilm.sandwich 2 2 1.0× 0.7 0.5 1.3× 0.7 0.6 1.1× 9 8 11.1%
2 com.poupa.vinylmusicplayer 2 2 1.0× 0.9 0.6 1.6× 0.1 0.1 1.4× 4 4 0.0%
3 yeriomin.dumbphoneassistant 2 3 0.7× 0.8 0.4 1.8× 1.0 1.0 1.0× 2 2 0.0%
4 dk.jens.backup 4 5 0.8× 0.8 0.3 3.2× 0.4 0.4 1.0× 4 4 0.0%
5 com.kunzisoft.keepass.libre 6 7 0.9× 1.0 1.0 1.0× 2.7 2.4 1.1× 6 6 0.0%
6 org.csploit.android 6 8 0.8× 1.1 0.5 2.0× 0.2 0.2 1.0× 1 1 0.0%
7 com.icecondor.nest 16 5 3.2× 1.5 0.5 3.1× 4.8 1.2 4.0× 3 3 0.0%
8 com.app.Zensuren 17 17 1.0× 1.8 1.9 1.0× 7.9 7.2 1.1× 8 8 0.0%
9 org.materialos.icons 18 15 1.2× 2.0 1.4 1.5× 7.2 5.4 1.3× 5 5 0.0%
10 com.alfray.timeriffic 18 11 1.6× 3.3 1.6 2.1× 7.4 4.3 1.7× 15 14 6.7%
11 org.decsync.sparss.floss 25 6 4.2× 2.5 0.6 4.1× 6.1 1.2 5.3× 19 19 0.0%
12 secuso.privacyfriendlytodolist 42 43 1.0× 5.1 3.5 1.5× 17.3 16.6 1.0× 6 5 16.7%
13 de.schildbach.oeffi 44 16 2.8× 2.6 1.4 1.9× 8.4 3.2 2.6× 8 7 12.5%
14 com.dimowner.audiorecorder 50 51 1.0× 1.3 1.3 1.0× 3.6 3.6 1.0× 5 3 40.0%
15 com.github.axet.callrecorder 55 27 2.0× 6.5 4.2 1.5× 20.9 10.6 2.0× 13 10 23.1%
16 name.myigel.fahrplan.eh17 68 51 1.3× 2.1 1.9 1.1× 7.3 5.5 1.3× 4 4 0.0%
17 com.microsoft.office.word 103 29 3.6× 2.1 1.1 2.0× 2.5 0.7 3.7× 4 3 25.0%
18 me.austinhuang.caweather 223 213 1.0× 17.7 15.2 1.2× 93.4 85.7 1.1× 9 7 22.2%
19 com.vonglasow.michael.satstat 262 257 1.0× 19.6 19.6 1.0× 113.6 107.8 1.1× 9 9 0.0%
20 secuso.privacyfriendlyweather 333 235 1.4× 22.7 15.8 1.4× 104.5 74.2 1.4× 9 4 55.6%
21 org.fdroid.fdroid 469 390 1.2× 3.2 4.1 0.8× 7.3 6.2 1.2× 27 27 0.0%
22 org.totschnig.myexpenses 667 128 5.2× 45.1 10.7 4.2× 250.0 42.9 5.8× 14 11 21.4%
23 com.kanedias.vanilla.metadata 669 1 669.0× 45.1 0.2 292.6× 160.8 0.1 160.8× 3 1 66.7%
24 com.github.axet.bookreader 783 306 2.6× 53.2 21.7 2.5× 375.3 142.3 2.6× 2 2 0.0%
25 com.igisw.openmoneybox 827 840 1.0× 53.2 54.9 1.0× 332.2 332.2 1.0× 10 10 0.0%
26 de.deftk.openww.android 2172 66 32.9× 54.2 1.7 32.5× 258.1 1.6 158.1× 7 5 28.6%
27 org.lumicall.android 2687 2189 1.2× 42.3 37.0 1.1× 244.8 205.3 1.2× 7 7 0.0%
28 org.openpetfoodfacts.scanner 6491 4 1622.8× 195.5 0.6 354.9× 1276.3 0.1 1276.3× 4 3 25.0%
29 com.adobe.reader 7366 5626 1.3× 161.0 108.7 1.5× 757.3 531.6 1.4× 23 23 0.0%
30 com.fastaccess.github.libre >3h 13 - 1.6 - 0.5 - 1
31 com.activitymanager >3h 37 - 1.0 - 1.7 - 2
32 org.gateshipone.odyssey >3h 75 - 3.8 - 12.1 - 8
33 nya.miku.wishmaster >3h 212 - 13.2 - 50.3 - 6
34 emn8.mobilem8.nativeapp.bk >3h 329 - 4.0 - 12.2 - 32
35 bus.chio.wishmaster >3h 369 - 21.0 - 84.3 - 6
36 com.ichi2.anki >3h 715 - 11.3 - 49.6 - 24
Mean - 2.5× - 2.5× - 2.7× - 12.2%
Experimental Results.

Table 2 reports our findings across four metrics: analysis time (Columns 3–4), peak memory usage (Columns 5–6), path edges processed (Columns 7–8), and detected leaks (Columns 9–10). Column 4 includes TnFix’s field-sensitive reasoning time. Analysis time, memory usage, and path edge metrics are averaged over five runs. The final row presents geometric means for the first three metrics and the arithmetic mean for leak reduction percentages.

5.1 RQ1: TnFix’s Field-Sensitive Reasoning Costs

We evaluated the time and memory overhead of TnFix’s field-sensitive reasoning stage. Figure 6 shows the absolute and relative reasoning time for each app in Table 2. On average, field-sensitive reasoning accounts for 12.44% of the total analysis time. The most time-consuming case, org.fdroid.fdroid, took 18.1 seconds, only 4.6% of its total. The highest percentage occurred in org.openpetfoodfacts.scanner at 75.6%, with a reasoning time of 3.1 seconds. Among the four excluded apps due to scalability limits, the time from field-sensitive reasoning ranged from 2.7 seconds (de.k3b.android.androFotoFinder) to 82.4 seconds (fr.gouv.etalab.mastodon), averaging 24.1 seconds. Note that Table 2 includes the reasoning cost in total time, yet TnFix still achieves an average speedup of 2.5×, showing that the field-sensitive reasoning stage adds little overhead.

Refer to caption

Figure 6: Field-sensitive reasoning time (TnFix’s CFL-reachability stage) and its share of total analysis time for TnFix, plotted for each Android app in Table 2 by ordinal index.

Refer to caption

Figure 7: Memory consumption by TnFix’s field-sensitive reasoning stage.

Figure 7 reports memory usage during the field-sensitive reasoning stage for the apps in Table 2. The highest consumers are org.gateshipone.odyssey (1925  MB), org.fdroid.fdroid (1679  MB), and com.fastaccess.github.libre (1539  MB). Their peak memory footprint during the main analysis increases to 3871, 4198, and 1665  MB, respectively.

Overall, TnFix’s field-sensitive reasoning stage is substantially less memory-intensive. TnFix adopts an aggressive memory-management strategy that releases intermediate data structures as soon as they are no longer needed. For example, once DFA construction completes (Algorithm 3), TnFix discards Gpag, which is required only during the initial FPG construction.

Refer to caption

Figure 8: Number of objects |𝒪| in Gpag for each app during TnFix’s field-sensitive reasoning stage. These values bound the size of each per-object DFA, demonstrating that subset construction does not cause state blowup in practice.

Refer to caption

Figure 9: Percentage of edges added to Gpag for handling taint sources and library summaries, relative to the total for the apps listed in Table 2, organized by ordinal number.

Figure 8 reports the number of objects |𝒪| in Gpag for each app after solving the field-sensitive CFL-reachability problem (Algorithm 2). The average is 2619, and the maximum, 9115, occurs in com.adobe.reader. These results confirm that the number of per-object DFAs constructed by TnFix remains well within manageable bounds (Section 4.6).

Figure 9 then quantifies the proportion of edges added to Gpag to capture implicitly defined data flows derived from taint sources (#TaintSourceEdges/Total) and library summaries (#LibraryEdges/Total), as detailed in Section 4.1. The most edges added for taint sources, 62504, are in org.gateshipone.odyssey, which has 44 taint sources, while the peak for library summaries, 205510 edges, is at org.fdroid.fdroid, which has 7928 objects. Capturing these flows is crucial for TnFix’s soundness and effectiveness in reducing over-tainting in IFDS taint analysis.

5.2 RQ2: TnFix’s Precision Improvement

To empirically validate TnFix’s soundness and precision, complementing the guarantee in Theorem 3, we used two benchmark suites: (1) DroidBench [42], the standard suite for FlowDroid, and (2) TaintBench [27], a recent real-world Android malware benchmark. On DroidBench (119 apps), with the default source-sink setup, TnFix and FlowDroid produced identical results. For TaintBench (39 apps), we evaluated both suite-level and app-level source-sink configurations, excluding six apps that crashed FlowDroid. For the rest, both tools reported the same expected taint flows, confirming that TnFix preserves FlowDroid’s precision and recall. As expected, on these micro-benchmarks, TnFix matches FlowDroid’s precision.

In practical scenarios involving real-world apps listed in Table 2, TnFix demonstrated improved precision over FlowDroid by effectively eliminating false-positive warnings. Specifically, TnFix reduced false leak warnings in 13 out of 29 scalable-group apps. On average, TnFix decreased leak warnings by 12.2% across apps analyzable by both tools, achieving the most substantial reduction (5) in the app org.secuso.privacyfriendlyweather.

We manually inspected the removed leaks in the 13 apps where TnFix reports fewer leaks and confirmed that these removed warnings were false positives arising from field mismatches due to FlowDroid’s access-path truncation.

For instance, in org.openpetfoodfacts.scanner, a false positive reported by FlowDroid stems from a taint through the Android API queryIntentActivities(), propagated through eight field accesses. Due to k=5, FlowDroid truncates the access path at 5 fields, with the last being <bd: MainActivity a>. Subsequent loads lead to a false positive at the sink from <MainActivity: boolean G>. TnFix excludes this by verifying that <MainActivity: boolean G> is not field-sensitively reachable from any source. Similarly, TnFix corrects false positives in com.kanedias.vanilla.metadata. Inspired by these patterns, we designed the example in Figure 1 to motivate our approach, detailed in Section 3.

In industry settings, reducing false positives is crucial. TnFix’s pruning reduces analysis, allowing developers to focus on real issues instead of false alarms.

5.3 RQ3: TnFix’s Efficiency and Scalability Enhancement

Refer to caption

Figure 10: Comparing TnFix and FlowDroid by examining the correlation between the reduction in #PathEdges and the decreases in both analysis time and memory usage.

In Table 2, TnFix significantly outperforms FlowDroid by analyzing all 36 apps within a 3-hour time budget. For the 7 apps where FlowDroid timed out, TnFix completed analysis in 1750 seconds. Speed improvements for the other 29 apps varied from 0.7× (com.github.yeriomin.dumbphoneassistant) to 1622.8× (org.openpetfoodfacts.scanner), with an average of 2.5×. This variance indicates that smaller apps, which are already efficiently analyzed by FlowDroid, are less affected by over-tainting; in such cases, TnFix’s recognizer overhead may not be fully amortized by pruning, leading to marginal slowdowns. In contrast, larger apps often exhibit more severe over-tainting from spuriously generated access paths, where TnFix’s pruning substantially reduces propagation and analysis time.

Real-world Android apps often exhibit common patterns – such as mutual references between activities, recursive data structures, and inner-class cycles – that exacerbate over-tainting when k-limiting is applied. In such cases, spurious access paths can proliferate, inflating analysis overhead. Our experiments show that for these large apps, increasing k further offers little to no benefit in terms of precision and scalability (RQ4). TnFix effectively eliminates these spurious access paths using lightweight filtering, enabling faster analysis for large apps with the default k=5, a widely adopted setting for balancing precision and scalability [10, 1, 9, 8].

The scalability of TnFix primarily results from a significant reduction in the number of path edges processed. We observe strong positive correlations between this reduction and decreases in analysis time and memory usage. Figure 10 shows a correlation coefficient of 0.957 between FlowDroid’s #PathEdgeTnFix’s #PathEdge and FlowDroid’s Analysis TimeTnFix’s Analysis Time, and 0.835 between FlowDroid’s #PathEdgeTnFix’s #PathEdge and FlowDroid’s Memory UsageTnFix’s Memory Usage, computed using scipy’s pearsonr function in Python 3.

The considerable reduction in path edges is due to TnFix eliminating spuriously tainted access paths. Figure 11 shows the percentage reduction of access paths in TnFix compared to those processed by FlowDroid for each app listed in Table 2, averaging a reduction of 31.65%.

Refer to caption

Figure 11: Percentage reduction of access paths in TnFix versus FlowDroid for each scalable app.

Early pruning in IFDS is especially effective because the tabulation algorithm is path-edge driven (Algorithm 1). Once a spurious access path is placed on the worklist, it is propagated through normal, call, and return flow functions, generating cascades of derived path edges (lines 8–21). Even if a post-hoc filter were able to discard the resulting data facts, the solver would still incur the full cost of producing and processing all intermediate path edges. In contrast, TnFix performs recognition exactly at the point where an access path is about to be propagated (Algorithm 4), rejecting many spurious access paths before they ever enter the worklist. By preventing these access paths from triggering downstream propagation, TnFix avoids the explosion of path edges caused by k-limited over-tainting. This explains why comparatively modest reductions in access-path counts (Figure 11) yield disproportionately large reductions in path edges, analysis time, and memory usage (Figure 10).

To improve efficiency under k-limiting, FlowDroid uses a type-based heuristic to truncate recursive fields, enabling longer access paths but increasing false positives. Without it, over-tainting worsens due to strict k-field limits. TnFix still achieves a 2.5× speedup on 23 commonly analyzable apps, scales to 9 more, and reduces false positives by 17.4%. For compatibility, TnFix conservatively avoids pruning such over-approximated paths, preserving soundness and scalability.

5.4 RQ4: TnFix’s Effectiveness across Different 𝒌-Limits

To examine the sensitivity of TnFix to the access-path limit k, we evaluated TnFix and FlowDroid under k{1,3,5,7}, with results summarized in Table 3. FlowDroid uses k=5 by default because k-limiting exposes a precision–efficiency tradeoff: smaller limits (k<5) aggressively collapse access paths, increasing alias imprecision and false positives, whereas larger limits (k>5) preserve more field information but introduce more access-path facts, increasing runtime and memory consumption. TnFix remains effective across these settings by validating access paths semantically before propagation.

Table 3: Performance comparison between FlowDroid and TnFix under k{1,3,5,7} on the scalable apps from Table 2. “Speedup” denotes TnFix’s runtime improvement over FlowDroid, and “Reduction” reports the number and percentage of eliminated leaks. OoM and >3h indicate that both tools run out of memory or exceed the 3-hour limit, respectively. An entry >3h/t indicates that FlowDroid exceeds the 3-hour limit, while TnFix completes in t seconds.
ID k=1 k=3 k=5 k=7
Speedup Reduction Speedup Reduction Speedup Reduction Speedup Reduction
1 1.0× 0 (0.0%) 1.0× 1 (11.1%) 1.0× 1 (11.1%) 1.0× 2 (22.2%)
2 1.0× 0 (0.0%) 1.0× 0 (0.0%) 1.0× 0 (0.0%) 0.7× 0 (0.0%)
3 0.5× 2 (50.0%) 1.0× 0 (0.0%) 0.7× 0 (0.0%) 0.5× 0 (0.0%)
4 1.0× 2 (25.0%) 1.0× 0 (0.0%) 0.8× 0 (0.0%) 1.0× 0 (0.0%)
5 2.6× 3 (42.9%) 1.0× 2 (22.2%) 0.9× 0 (0.0%) 1.0× 1 (14.3%)
6 1.0× 1 (33.3%) 0.8× 0 (0.0%) 0.8× 0 (0.0%) 0.9× 0 (0.0%)
7 1.8× 2 (25.0%) 1.9× 2 (33.3%) 3.2× 0 (0.0%) 3.8× 0 (0.0%)
8 1.3× 0 (0.0%) 1.1× 0 (0.0%) 1.0× 0 (0.0%) 1.1× 0 (0.0%)
9 1.3× 0 (0.0%) 1.6× 0 (0.0%) 1.2× 0 (0.0%) 1.2× 0 (0.0%)
10 1.0× 1 (6.3%) 1.6× 1 (6.7%) 1.6× 1 (6.7%) 1.5× 1 (6.7%)
11 4.3× 0 (0.0%) 2.3× 0 (0.0%) 4.2× 0 (0.0%) 3.3× 0 (0.0%)
12 1.0× 2 (33.3%) 0.8× 1 (25.0%) 1.0× 1 (16.7%) 0.7× 0 (0.0%)
13 3.2× 1 (10.0%) 22.7× 1 (12.5%) 2.8× 1 (12.5%) 1.4× 1 (12.5%)
14 1.1× 4 (57.1%) 1.0× 2 (33.3%) 1.0× 2 (40.0%) 0.9× 1 (25.0%)
15 6.4× 2 (13.3%) 5.4× 3 (21.4%) 2.0× 3 (23.1%) 1.7× 1 (10.0%)
16 1.0× 0 (0.0%) 1.8× 0 (0.0%) 1.3× 0 (0.0%) 1.0× 0 (0.0%)
17 2.4× 3 (37.5%) 7.6× 2 (40.0%) 3.6× 1 (25.0%) 2.5× 1 (25.0%)
18 1.1× 3 (30.0%) 1.0× 2 (22.2%) 1.0× 2 (22.2%) 1.1× 3 (30.0%)
19 1.5× 2 (20.0%) 1.4× 1 (11.1%) 1.0× 0 (0.0%) 1.0× 0 (0.0%)
20 1.3× 6 (50.0%) 1.6× 7 (70.0%) 1.4× 5 (55.6%) 1.3× 1 (20.0%)
21 OoM - 1.2× 1 (3.6%) 1.2× 0 (0.0%) 1.0× 3 (11.5%)
22 2.8× 3 (18.8%) 13.3× 3 (21.4%) 5.2× 3 (21.4%) 2.4× 3 (25.0%)
23 4.0× 1 (50.0%) 653.0× 2 (66.7%) 669.0× 2 (66.7%) 761.0× 1 (50.0%)
24 3.0× 0 (0.0%) 3.0× 0 (0.0%) 2.6× 0 (0.0%) 2.7× 0 (0.0%)
25 OoM - 1.0× 0 (0.0%) 1.0× 0 (0.0%) 0.9× 0 (0.0%)
26 OoM - 814.2× 0 (0.0%) 32.9× 2 (28.6%) >3h -
27 1.2× 2 (18.2%) 1.3× 0 (0.0%) 1.2× 0 (0.0%) 1.7× 0 (0.0%)
28 175.8× 1 (25.0%) >3h/4 - 1622.8× 1 (25.0%) 102.8× 1 (25.0%)
29 2.5× 3 (13.6%) >3h/6745 - 1.3× 0 (0.0%) 1.1× 0 (0.0%)
Mean 1.9× 21.5% 2.8× 14.8% 2.5× 12.2% 1.7× 9.9%

The results in Table 3 are consistent with this tradeoff, and the speedup trend is not necessarily monotonic. At smaller k, aggressive truncation amplifies over-tainting, allowing TnFix to achieve larger precision gains by removing false positives, as shown by the 21.5% leak reduction at k=1. At larger k, FlowDroid preserves longer access paths but incurs higher propagation cost. By validating access paths semantically using field-sensitive CFL-reachability, TnFix mitigates both sources of overhead and achieves consistent average speedups across k.

Overall, these results highlight a fundamental distinction between the two designs. Increasing k in FlowDroid extends access paths only syntactically and still conflates distinct heap locations in recursive or deeply nested structures, allowing over-tainting to persist. In contrast, TnFix validates access paths semantically using field-sensitive CFL-reachability, independent of the chosen k. Since recursive structures prevent any finite k from eliminating over-tainting, TnFix systematically mitigates it for any fixed k, adding a new precision dimension orthogonal to the traditional choice of access-path limit in IFDS taint analysis.

6 Related Work

Static taint analysis for Android spans several research threads, including advances in the IFDS/IDE framework, Android-specific taint analyses, and analyses powered by CFL-reachability. We summarize the most relevant developments and highlight how TnFix differs from prior work.

6.1 The IFDS/IDE Framework

The IFDS framework [34] and its IDE extension [36] form the foundation of precise interprocedural dataflow analysis. Naeem et al. [30] later introduced dynamic exploded-supergraph construction, and these frameworks have since been integrated into major compiler infrastructures such as WALA [46], SootUp [16], and LLVM [17, 37].

To reduce the computational and memory overhead of IFDS/IDE analyses, prior work has proposed a range of optimizations. Reviser [2] supports incremental IDE analysis by selectively clearing and recomputing only information affected by code changes, thereby avoiding full recomputation while preserving equivalent results. SparseDroid [10] and Sparse IDE [15] employ sparse propagation, restricting computation to relevant program points along def-use chains. DiskDroid [19] reduces memory pressure through disk-assisted storage and recomputation, while DStream [48] adopts a streaming-based out-of-core model with fine-grained parallelism. MergeDroid [8] consolidates equivalent value flows to reduce redundant alias queries. CleanDroid [1] and Fpc [9] reclaim memory during fixpoint computation using method-level and data-fact-level garbage-collection policies, respectively.

A separate line of work investigates alternatives to standard access-path propagation. IFDS-APA [18] avoids k-limiting by grouping access paths by base variable and reconstructing full paths on demand. IFDS-APA targets Java rather than Android and its implementation is not fully available, which precludes a direct empirical comparison. While this design improves memory scalability, its precision and efficiency gains are modest because it does not eliminate spurious paths; it only stores them more compactly. IDEDroid [20] improves performance by propagating only base variables and generating access paths via a CFL formulation inside an IDE solver. Although this yields notable speedups and some precision improvement over FlowDroid, it still constructs access paths syntactically and does not prevent infeasible field sequences from flowing through the analysis.

TnFix differs fundamentally from these approaches. It is the first technique to directly mitigate over-tainting in IFDS taint analysis for Android apps by enforcing semantic field sensitivity: it constructs a global Field Points-to Graph (FPG) via field-sensitive CFL-reachability and compiles it into per-object deterministic finite automata that recognize exactly the realizable field sequences in the heap. These DFAs act as on-the-fly filters during IFDS propagation, eliminating spurious access paths before they enter the solver. No prior IFDS/IDE optimization – including IFDS-APA and IDEDroid – builds such per-object DFAs or uses automata-guided pruning to remove infeasible paths during propagation.

As shown in our evaluation, this semantic pruning is crucial: it substantially improves FlowDroid’s scalability, efficiency, and precision and enables successful analysis of apps that FlowDroid cannot complete within a three-hour budget.

6.2 Taint Analysis for Android

Numerous static taint-analysis tools have been proposed for Android, addressing challenges such as lifecycle modeling, callbacks, libraries, and inter-component communication. CHEX [25] detects component-hijacking vulnerabilities, such as permission leakage and intent spoofing, using customized system dependence graphs and reachability tests. Amandroid [49] computes flow- and context-sensitive points-to information for individual components and stitches component-level results to support inter-component and inter-app analysis. IccTA [21] focuses on inter-component communication by propagating context information across components to identify cross-component privacy leaks. FlowDroid [4] provides lifecycle-aware IFDS taint analysis for Android, achieving high precision through context-, flow-, field-, and object-sensitive reasoning. DroidSafe [7] improves soundness by modeling the Android runtime and resolving dynamic communication targets. DroidInfer [12] uses a context-sensitive information-flow type system based on CFL-reachability. Heapster [5] augments FlowDroid with runtime heap snapshots to improve precision and efficiency. Among these, FlowDroid remains the most widely adopted and serves as the baseline for evaluating TnFix.

6.3 CFL-Reachability

CFL-reachability originated in database theory [50] and has become foundational in program analysis [32], supporting pointer analysis [40, 51], shape analysis [32], slicing [35, 41], and information-flow analysis [4]. Recent work uses refined CFLs to enhance context sensitivity: Eagle [24] boosts k-object-sensitive pointer analysis using selective context sensitivity, while FlowCFL [29] reduces inverse edges via type-based annotations.

TnFix differs in focus: it applies CFL-reachability specifically to mitigate over-tainting in IFDS-based Android taint analysis by validating field-sensitive access paths.

For multiple CFL constraints, SPDS [38] intersects constraints using separate pushdown automata. This deferred pruning requires enumerating infeasible paths, increasing overhead and false positives. Boomerang [39] uses access graphs for field sensitivity, with recursion bounding to ensure termination; however, this merging of recursive structures can reduce precision. In contrast, TnFix uses per-object DFAs derived from a global FPG to prune infeasible paths during propagation, avoiding deferred intersection and arbitrary recursion bounds.

Finally, TnFix integrates Android-specific taint-flow semantics – such as sub-field tainting and StubDroid library summaries (Section 4.1 and Algorithm 2 lines 9–13) – directly into its CFL and DFA formulation. SPDS and Boomerang focus on Java pointer analysis and do not support Android taint analysis, precluding a direct empirical comparison in our setting.

7 Conclusion and Future Work

We presented TnFix, a staged analysis framework that mitigates the long-standing problem of over-tainting in IFDS taint analysis for Android apps. The core insight is that the field sequence of an access path can be validated by a deterministic automaton that recognizes exactly the field sequences realizable in the heap. TnFix operationalizes this insight by solving a field-sensitive CFL-reachability problem that incorporates both explicit data flows and implicit flows from taint sources and library summaries, constructing a global Field Points-to Graph (FPG), and compiling it into per-object, field-sensitivity-aware DFAs. These DFAs act as precise recognizers that prune spurious access paths during IFDS propagation, yielding significant improvements in precision, efficiency, and scalability.

Our evaluation across 36 real-world Android apps demonstrates that TnFix not only suppresses false positives caused by k-limiting but also enables FlowDroid to scale to apps it could not previously handle, all while maintaining soundness. To our knowledge, TnFix is the first CFL-based optimization that explicitly targets over-tainting in IFDS taint analysis and the first to leverage per-object DFA guidance for on-the-fly pruning of infeasible access paths. It therefore introduces a new, orthogonal precision dimension for IFDS-based analyses and provides a practical, generalizable technique for enhancing large-scale Android taint analysis.

Future work includes refining the field-sensitive reasoning to reduce conservativeness while preserving soundness, improving the expressiveness of the underlying CFL to better capture complex heap manipulation patterns, and exploring how TnFix’s DFA-guided pruning can be extended to other IFDS-based analyses, such as security queries beyond taint tracking or pointer analyses with richer object abstractions.

References

  • [1] Steven Arzt. Sustainable Solving: Reducing The Memory Footprint of IFDS-Based Data Flow Analyses Using Intelligent Garbage Collection. In 43rd IEEE/ACM International Conference on Software Engineering, ICSE 2021, Madrid, Spain, 22-30 May 2021, pages 1098–1110, New York, NY, USA, 2021. IEEE. doi:10.1109/ICSE43902.2021.00102.
  • [2] Steven Arzt and Eric Bodden. Reviser: efficiently updating IDE-/IFDS-based data-flow analyses in response to incremental program changes. In Pankaj Jalote, Lionel C. Briand, and André van der Hoek, editors, 36th International Conference on Software Engineering, ICSE ’14, Hyderabad, India - May 31 - June 07, 2014, ICSE ’14, pages 288–298, New York, NY, USA, May 2014. ACM. doi:10.1145/2568225.2568243.
  • [3] Steven Arzt and Eric Bodden. StubDroid: automatic inference of precise data-flow summaries for the android framework. In Laura K. Dillon, Willem Visser, and Laurie A. Williams, editors, Proceedings of the 38th International Conference on Software Engineering, ICSE 2016, Austin, TX, USA, May 14-22, 2016, pages 725–735. ACM, May 2016. ISSN: 1558-1225. doi:10.1145/2884781.2884816.
  • [4] Steven Arzt, Siegfried Rasthofer, Christian Fritz, Eric Bodden, Alexandre Bartel, Jacques Klein, Yves Le Traon, Damien Octeau, and Patrick D. McDaniel. FlowDroid: precise context, flow, field, object-sensitive and lifecycle-aware taint analysis for Android apps. In Michael F. P. O’Boyle and Keshav Pingali, editors, ACM SIGPLAN Conference on Programming Language Design and Implementation, PLDI ’14, Edinburgh, United Kingdom - June 09 - 11, 2014, pages 259–269. ACM, 2014. doi:10.1145/2594291.2594299.
  • [5] Manuel Benz, Erik Krogh Kristensen, Linghui Luo, Nataniel P. Borges, Eric Bodden, and Andreas Zeller. Heaps’n leaks: how heap snapshots improve Android taint analysis. In Gregg Rothermel and Doo-Hwan Bae, editors, ICSE ’20: 42nd International Conference on Software Engineering, Seoul, South Korea, 27 June - 19 July, 2020, ICSE ’20, pages 1061–1072, New York, NY, USA, 2020. ACM. doi:10.1145/3377811.3380438.
  • [6] F-Droid. F-Droid - Free and Open Source Android App Repository, 2023. URL: https://f-droid.org.
  • [7] Michael I. Gordon, Deokhwan Kim, Jeff H. Perkins, Limei Gilham, Nguyen Nguyen, and Martin C. Rinard. Information Flow Analysis of Android Applications in DroidSafe. In 22nd Annual Network and Distributed System Security Symposium, NDSS 2015, San Diego, California, USA, February 8-11, 2015, volume 15, page 110. The Internet Society, 2015. URL: https://www.ndss-symposium.org/ndss2015/information-flow-analysis-android-applications-droidsafe.
  • [8] Yujiang Gui, Dongjie He, and Jingling Xue. Merge-Replay: Efficient IFDS-Based Taint Analysis by Consolidating Equivalent Value Flows. In 38th IEEE/ACM International Conference on Automated Software Engineering, ASE 2023, Luxembourg, September 11-15, 2023, pages 319–331. IEEE, 2023. doi:10.1109/ASE56229.2023.00027.
  • [9] Dongjie He, Yujiang Gui, Yaoqing Gao, and Jingling Xue. Reducing the Memory Footprint of IFDS-Based Data-Flow Analyses using Fine-Grained Garbage Collection. In René Just and Gordon Fraser, editors, Proceedings of the 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis, ISSTA 2023, Seattle, WA, USA, July 17-21, 2023, pages 101–113, New York, NY, USA, 2023. ACM. doi:10.1145/3597926.3598041.
  • [10] Dongjie He, Haofeng Li, Lei Wang, Haining Meng, Hengjie Zheng, Jie Liu, Shuangwei Hu, Lian Li, and Jingling Xue. Performance-Boosting Sparsification of the IFDS Algorithm with Applications to Taint Analysis. In 34th IEEE/ACM International Conference on Automated Software Engineering, ASE 2019, San Diego, CA, USA, November 11-15, 2019, pages 267–279, New York, NY, USA, 2019. IEEE. doi:10.1109/ASE.2019.00034.
  • [11] Katherine Hough and Jonathan Bell. A Practical Approach for Dynamic Taint Tracking with Control-flow Relationships. ACM Trans. Softw. Eng. Methodol., 31(2):26:1–26:43, December 2022. doi:10.1145/3485464.
  • [12] Wei Huang, Yao Dong, Ana L. Milanova, and Julian Dolby. Scalable and precise taint analysis for Android. In Michal Young and Tao Xie, editors, Proceedings of the 2015 International Symposium on Software Testing and Analysis, ISSTA 2015, Baltimore, MD, USA, July 12-17, 2015, ISSTA 2015, pages 106–117, New York, NY, USA, July 2015. ACM. doi:10.1145/2771783.2771803.
  • [13] Nenad Jovanovic, Christopher Krügel, and Engin Kirda. Pixy: A Static Analysis Tool for Detecting Web Application Vulnerabilities (Short Paper). In 2006 IEEE Symposium on Security and Privacy (S&P 2006), 21-24 May 2006, Berkeley, California, USA, pages 258–263. IEEE Computer Society, 2006. doi:10.1109/SP.2006.29.
  • [14] Min Gyung Kang, Stephen McCamant, Pongsin Poosankam, and Dawn Song. DTA++: Dynamic Taint Analysis with Targeted Control-Flow Propagation. In Proceedings of the Network and Distributed System Security Symposium, NDSS 2011, San Diego, California, USA, 6th February - 9th February 2011. The Internet Society, 2011.
  • [15] Kadiray Karakaya and Eric Bodden. Symbol-Specific Sparsification of Interprocedural Distributive Environment Problems. In Proceedings of the 46th IEEE/ACM International Conference on Software Engineering, ICSE 2024, Lisbon, Portugal, April 14-20, 2024, ICSE ’24, pages 104:1–104:12, New York, NY, USA, 2024. ACM. doi:10.1145/3597503.3639092.
  • [16] Kadiray Karakaya, Stefan Schott, Jonas Klauke, Eric Bodden, Markus Schmidt, Linghui Luo, and Dongjie He. SootUp: A Redesign of the Soot Static Analysis Framework. In Bernd Finkbeiner and Laura Kovács, editors, Tools and Algorithms for the Construction and Analysis of Systems - 30th International Conference, TACAS 2024, Held as Part of the European Joint Conferences on Theory and Practice of Software, ETAPS 2024, Luxembourg City, Luxembourg, April 6-11, 2024, Proceedings, Part I, volume 14570 of Lecture Notes in Computer Science, pages 229–247, Cham, 2024. Springer. doi:10.1007/978-3-031-57246-3_13.
  • [17] Chris Lattner and Vikram S. Adve. LLVM: A compilation framework for lifelong program analysis & transformation. In 2nd IEEE / ACM International Symposium on Code Generation and Optimization (CGO 2004), 20-24 March 2004, San Jose, CA, USA, pages 75–88, New York, NY, USA, 2004. IEEE Computer Society. doi:10.1109/CGO.2004.1281665.
  • [18] Johannes Lerch, Johannes Späth, Eric Bodden, and Mira Mezini. Access-Path Abstraction: Scaling Field-Sensitive Data-Flow Analysis with Unbounded Access Paths (T). In Myra B. Cohen, Lars Grunske, and Michael Whalen, editors, 30th IEEE/ACM International Conference on Automated Software Engineering, ASE 2015, Lincoln, NE, USA, November 9-13, 2015, ASE ’15, pages 619–629. IEEE Computer Society, 2015. event-place: Lincoln, Nebraska. doi:10.1109/ASE.2015.9.
  • [19] Haofeng Li, Haining Meng, Hengjie Zheng, Liqing Cao, Jie Lu, Lian Li, and Lin Gao. Scaling Up the IFDS Algorithm with Efficient Disk-Assisted Computing. In Jae W. Lee, Mary Lou Soffa, and Ayal Zaks, editors, IEEE/ACM International Symposium on Code Generation and Optimization, CGO 2021, Seoul, South Korea, February 27 - March 3, 2021, pages 236–247, New York, NY, USA, 2021. IEEE. doi:10.1109/CGO51591.2021.9370311.
  • [20] Haofeng Li, Chenghang Shi, Jie Lu, Lian Li, and Jingling Xue. Boosting the Performance of Alias-Aware IFDS Analysis with CFL-Based Environment Transformers. Proc. ACM Program. Lang., 8(OOPSLA2):2633–2661, October 2024. doi:10.1145/3689804.
  • [21] Li Li, Alexandre Bartel, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon, Steven Arzt, Siegfried Rasthofer, Eric Bodden, Damien Octeau, and Patrick D. McDaniel. IccTA: Detecting Inter-Component Privacy Leaks in Android Apps. In Antonia Bertolino, Gerardo Canfora, and Sebastian G. Elbaum, editors, 37th IEEE/ACM International Conference on Software Engineering, ICSE 2015, Florence, Italy, May 16-24, 2015, Volume 1, ICSE ’15, pages 280–291. IEEE Computer Society, 2015. doi:10.1109/ICSE.2015.48.
  • [22] Zhuohua Li, Jincheng Wang, Mingshen Sun, and John C. S. Lui. Detecting Cross-language Memory Management Issues in Rust. In Vijayalakshmi Atluri, Roberto Di Pietro, Christian Damsgaard Jensen, and Weizhi Meng, editors, Computer Security - ESORICS 2022 - 27th European Symposium on Research in Computer Security, Copenhagen, Denmark, September 26-30, 2022, Proceedings, Part III, volume 13556 of Lecture Notes in Computer Science, pages 680–700. Springer, 2022. doi:10.1007/978-3-031-17143-7_33.
  • [23] V. Benjamin Livshits and Monica S. Lam. Finding Security Vulnerabilities in Java Applications with Static Analysis. In Patrick D. McDaniel, editor, Proceedings of the 14th USENIX Security Symposium, Baltimore, MD, USA, July 31 - August 5, 2005, page 18, USA, 2005. USENIX Association. URL: https://www.usenix.org/conference/14th-usenix-security-symposium/finding-security-vulnerabilities-java-applications-static.
  • [24] Jingbo Lu and Jingling Xue. Precision-preserving yet fast object-sensitive pointer analysis with partial context sensitivity. Proc. ACM Program. Lang., 3(OOPSLA):148:1–148:29, October 2019. doi:10.1145/3360574.
  • [25] Long Lu, Zhichun Li, Zhenyu Wu, Wenke Lee, and Guofei Jiang. CHEX: statically vetting android apps for component hijacking vulnerabilities. In Ting Yu, George Danezis, and Virgil D. Gligor, editors, the ACM Conference on Computer and Communications Security, CCS’12, Raleigh, NC, USA, October 16-18, 2012, CCS ’12, pages 229–240, New York, NY, USA, October 2012. ACM. doi:10.1145/2382196.2382223.
  • [26] Changhua Luo, Penghui Li, and Wei Meng. TChecker: Precise Static Inter-Procedural Analysis for Detecting Taint-Style Vulnerabilities in PHP Applications. In Heng Yin, Angelos Stavrou, Cas Cremers, and Elaine Shi, editors, Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security, CCS 2022, Los Angeles, CA, USA, November 7-11, 2022, CCS ’22, pages 2175–2188, New York, NY, USA, 2022. ACM. doi:10.1145/3548606.3559391.
  • [27] Linghui Luo, Felix Pauck, Goran Piskachev, Manuel Benz, Ivan Pashchenko, Martin Mory, Eric Bodden, Ben Hermann, and Fabio Massacci. TaintBench: Automatic real-world malware benchmarking of Android taint analyses. Empir. Softw. Eng., 27(1):16, January 2022. doi:10.1007/s10664-021-10013-5.
  • [28] David Melski and Thomas W. Reps. Interconvertibility of a class of set constraints and context-free-language reachability. Theor. Comput. Sci., 248(1-2):29–98, October 2000. doi:10.1016/S0304-3975(00)00049-9.
  • [29] Ana L. Milanova. FlowCFL: generalized type-based reachability analysis: graph reduction and equivalence of CFL-based and type-based reachability. Proc. ACM Program. Lang., 4(OOPSLA):178:1–178:29, November 2020. doi:10.1145/3428246.
  • [30] Nomair A. Naeem, Ondrej Lhoták, and Jonathan Rodriguez. Practical Extensions to the IFDS Algorithm. In Rajiv Gupta, editor, Compiler Construction, 19th International Conference, CC 2010, Held as Part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2010, Paphos, Cyprus, March 20-28, 2010. Proceedings, volume 6011 of Lecture Notes in Computer Science, pages 124–144, Berlin, Heidelberg, 2010. Springer. doi:10.1007/978-3-642-11970-5_8.
  • [31] Zhenxiao Qi, Qian Feng, Yueqiang Cheng, Mengjia Yan, Peng Li, Heng Yin, and Tao Wei. SpecTaint: Speculative Taint Analysis for Discovering Spectre Gadgets. In 28th Annual Network and Distributed System Security Symposium, NDSS 2021, virtually, February 21-25, 2021. The Internet Society, 2021. URL: https://www.ndss-symposium.org/ndss-paper/spectaint-speculative-taint-analysis-for-discovering-spectre-gadgets/.
  • [32] Thomas W. Reps. Program analysis via graph reachability. Inf. Softw. Technol., 40(11-12):701–726, December 1998. doi:10.1016/S0950-5849(98)00093-7.
  • [33] Thomas W. Reps. Undecidability of context-sensitive data-independence analysis. ACM Trans. Program. Lang. Syst., 22(1):162–186, 2000. doi:10.1145/345099.345137.
  • [34] Thomas W. Reps, Susan Horwitz, and Shmuel Sagiv. Precise Interprocedural Dataflow Analysis via Graph Reachability. In Ron K. Cytron and Peter Lee, editors, Conference Record of POPL’95: 22nd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, San Francisco, California, USA, January 23-25, 1995, POPL ’95, pages 49–61, New York, NY, USA, 1995. ACM Press. doi:10.1145/199448.199462.
  • [35] Thomas W. Reps, Susan Horwitz, Shmuel Sagiv, and Genevieve Rosay. Speeding up Slicing. In David S. Wile, editor, Proceedings of the Second ACM SIGSOFT Symposium on Foundations of Software Engineering, SIGSOFT 1994, New Orleans, Louisiana, USA, December 6-9, 1994, SIGSOFT ’94, pages 11–20, New York, NY, USA, 1994. ACM. doi:10.1145/193173.195287.
  • [36] Shmuel Sagiv, Thomas W. Reps, and Susan Horwitz. Precise Interprocedural Dataflow Analysis with Applications to Constant Propagation. Theor. Comput. Sci., 167(1&2):131–170, 1996. doi:10.1016/0304-3975(96)00072-2.
  • [37] Philipp Dominik Schubert, Ben Hermann, and Eric Bodden. PhASAR: An Inter-procedural Static Analysis Framework for C/C++. In Tomás Vojnar and Lijun Zhang, editors, Tools and Algorithms for the Construction and Analysis of Systems - 25th International Conference, TACAS 2019, Held as Part of the European Joint Conferences on Theory and Practice of Software, ETAPS 2019, Prague, Czech Republic, April 6-11, 2019, Proceedings, Part II, volume 11428 of Lecture Notes in Computer Science, pages 393–410, Cham, 2019. Springer. doi:10.1007/978-3-030-17465-1_22.
  • [38] Johannes Späth, Karim Ali, and Eric Bodden. Context-, flow-, and field-sensitive data-flow analysis using synchronized Pushdown systems. Proc. ACM Program. Lang., 3(POPL):48:1–48:29, January 2019. doi:10.1145/3290361.
  • [39] Johannes Späth, Lisa Nguyen Quang Do, Karim Ali, and Eric Bodden. Boomerang: Demand-Driven Flow- and Context-Sensitive Pointer Analysis for Java. In Shriram Krishnamurthi and Benjamin S. Lerner, editors, 30th European Conference on Object-Oriented Programming, ECOOP 2016, Rome, Italy, July 18-22, 2016, volume 56 of LIPIcs, pages 22:1–22:26. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2016. doi:10.4230/LIPIcs.ECOOP.2016.22.
  • [40] Manu Sridharan and Rastislav Bodík. Refinement-based context-sensitive points-to analysis for Java. In Michael I. Schwartzbach and Thomas Ball, editors, Proceedings of the ACM SIGPLAN 2006 Conference on Programming Language Design and Implementation, Ottawa, Ontario, Canada, June 11-14, 2006, PLDI ’06, pages 387–400, New York, NY, USA, 2006. ACM. event-place: Ottawa, Ontario, Canada. doi:10.1145/1133981.1134027.
  • [41] Manu Sridharan, Stephen J. Fink, and Rastislav Bodík. Thin slicing. In Jeanne Ferrante and Kathryn S. McKinley, editors, Proceedings of the ACM SIGPLAN 2007 Conference on Programming Language Design and Implementation, San Diego, California, USA, June 10-13, 2007, PLDI ’07, pages 112–122, New York, NY, USA, 2007. ACM. doi:10.1145/1250734.1250748.
  • [42] SSE-Group at EC SPRIDE. DroidBench: an open test suite for evaluating the effectiveness of taint-analysis tools specifically for Android apps, 2017. URL: https://github.com/secure-software-engineering/DroidBench.
  • [43] He Su, Feng Li, Lili Xu, Wenbo Hu, Yujie Sun, Qing Sun, Huina Chao, and Wei Huo. Splendor: Static Detection of Stored XSS in Modern Web Applications. In René Just and Gordon Fraser, editors, Proceedings of the 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis, ISSTA 2023, Seattle, WA, USA, July 17-21, 2023, ISSTA 2023, pages 1043–1054, New York, NY, USA, 2023. ACM. doi:10.1145/3597926.3598116.
  • [44] Yulei Sui, Ding Ye, and Jingling Xue. Static memory leak detection using full-sparse value-flow analysis. In Mats Per Erik Heimdahl and Zhendong Su, editors, International Symposium on Software Testing and Analysis, ISSTA 2012, Minneapolis, MN, USA, July 15-20, 2012, ISSTA 2012, pages 254–264, New York, NY, USA, 2012. ACM. event-place: Minneapolis, MN, USA. doi:10.1145/2338965.2336784.
  • [45] Omer Tripp, Marco Pistoia, Patrick Cousot, Radhia Cousot, and Salvatore Guarnieri. Andromeda: Accurate and Scalable Security Analysis of Web Applications. In Vittorio Cortellessa and Dániel Varró, editors, Fundamental Approaches to Software Engineering - 16th International Conference, FASE 2013, Held as Part of the European Joint Conferences on Theory and Practice of Software, ETAPS 2013, Rome, Italy, March 16-24, 2013. Proceedings, volume 7793 of Lecture Notes in Computer Science, pages 210–225, Berlin, Heidelberg, 2013. Springer. doi:10.1007/978-3-642-37057-1_15.
  • [46] WALA. WALA: T.J. Watson Libraries for Analysis, 2023. URL: http://wala.sourceforge.net/.
  • [47] Guanhua Wang, Sudipta Chattopadhyay, Ivan Gotovchits, Tulika Mitra, and Abhik Roychoudhury. oo7: Low-Overhead Defense Against Spectre Attacks via Program Analysis. IEEE Trans. Software Eng., 47(11):2504–2519, 2021. doi:10.1109/TSE.2019.2953709.
  • [48] Xizao Wang, Zhiqiang Zuo, Lei Bu, and Jianhua Zhao. DStream: A Streaming-Based Highly Parallel IFDS Framework. In 45th IEEE/ACM International Conference on Software Engineering, ICSE 2023, Melbourne, Australia, May 14-20, 2023, pages 2488–2500. IEEE, 2023. doi:10.1109/ICSE48619.2023.00208.
  • [49] Fengguo Wei, Sankardas Roy, Xinming Ou, and Robby. Amandroid: A Precise and General Inter-component Data Flow Analysis Framework for Security Vetting of Android Apps. In Gail-Joon Ahn, Moti Yung, and Ninghui Li, editors, Proceedings of the 2014 ACM SIGSAC Conference on Computer and Communications Security, Scottsdale, AZ, USA, November 3-7, 2014, pages 1329–1341, New York, NY, USA, 2014. ACM. doi:10.1145/2660267.2660357.
  • [50] Mihalis Yannakakis. Graph-Theoretic Methods in Database Theory. In Daniel J. Rosenkrantz and Yehoshua Sagiv, editors, Proceedings of the Ninth ACM SIGACT-SIGMOD-SIGART Symposium on Principles of Database Systems, April 2-4, 1990, Nashville, Tennessee, USA, PODS ’90, pages 230–242, New York, NY, USA, 1990. ACM Press. doi:10.1145/298514.298576.
  • [51] Xin Zheng and Radu Rugina. Demand-driven alias analysis for C. In George C. Necula and Philip Wadler, editors, Proceedings of the 35th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, POPL 2008, San Francisco, California, USA, January 7-12, 2008, POPL ’08, pages 197–208, New York, NY, USA, 2008. ACM. doi:10.1145/1328438.1328464.