# Apache Ant — Diamond Recursion CWE-407 Scan: CLEAN **Pattern:** Recursive cycle/reachability without visited set (O(2^D) on diamond DAGs) **Scan date:** 2026-03-29 **Scope:** `src/main/org/apache/tools/ant/` ## Method Searched for `isCyclic`, `hasCycle`, `createsCycle`, `addsCycle`, `willCycle`, `isReachable`, `canReach`, `hasPath`, `detectCycle` across all Java sources. Checked each hit for recursive traversal lacking a visited-accumulator parameter. ## Key candidate: `Project.tsort()` `src/main/org/apache/tools/ant/Project.java` lines 1898–1939: the target dependency topological sort passes a `Hashtable state` through every recursive call. State values are `VISITING`/`VISITED`. This is a proper DFS with O(1) visit check per node — not the diamond recursion anti-pattern. ## Other candidates | File | Method | Verdict | |------|--------|---------| | `Project.java` | `tsort()` | Passes `state` Hashtable — CLEAN | | `taskdefs/optional/depend/Depend.java` | `isRmiStub()` / `isStub()` | Not recursive on a DAG — CLEAN | | `taskdefs/condition/IsReachable.java` | Network connectivity check | Not a graph traversal — CLEAN | ## Verdict CLEAN. No diamond recursion CWE-407 found. Ant's dependency resolution uses a state-tracking Hashtable (equivalent to a visited set) through all recursive calls.