diff --git a/defects/mindustry/CLEAN b/defects/mindustry/CLEAN new file mode 100644 index 000000000..104a5710c --- /dev/null +++ b/defects/mindustry/CLEAN @@ -0,0 +1,65 @@ +CLEAN — Mindustry (Anuken/Mindustry) — all 5 MOADs scanned 2026-03-31 + +Repository: https://github.com/Anuken/Mindustry +Version: HEAD (depth=1 clone) +Stars: 24.6k +Language: Java + +## MOAD-0001 (CWE-407): CLEAN + +Thorough scan of 817 Java source files across core/src/mindustry/. + +Mindustry uses Arc library data structures throughout. Key findings: + +- ObjectSet, IntSet, ObjectMap, ObjectIntMap used for all hot-path membership checks +- PowerGraph.reflow() uses IntSet closedSet for BFS visited tracking +- PayloadSeq uses ObjectIntMap internally (hash-based) +- BlockIndexer uses QuadTree for spatial queries, IntSet for position tracking +- Rules.objectiveFlags is ObjectSet +- Mods.ModResolutionContext uses ObjectSet for visited, OrderedSet for ordered +- EntityGroup uses IntMap for entity ID mapping + +Seq.contains() calls found but all are: +1. Predicate-based (lambda searching by property, not identity membership) +2. On small fixed-size collections (weapons, plans, requirements, block flags) +3. In non-hot paths (UI, connection-time, init, config changes) + +Administration.bannedIPs/whitelist/subnetBans are Seq with contains() +calls, but only checked per-connection (not per-tick). Typical N < 100. + +BlockIndexer.IntSeq.addUnique() for ore quadrants is O(N) but N is bounded +by quadrant size (20x20 = 400 tiles max per quadrant per ore type). + +No O(N^2) patterns found in game-tick paths, entity update loops, +pathfinding, power graph updates, or network sync code. + +## MOAD-0002 (Intertangle): NOTED but not patchable + +Vars.java is a classic god object with 40+ public static mutable fields +(state, world, net, content, mods, renderer, ui, pathfinder, indexer, +spawner, controlPath, fogControl, logic, control, player, etc.). + +Every subsystem accesses every other subsystem through these globals. +This is a deliberate architectural choice common in game engines, +especially modding-friendly ones. Fixing would require massive +architectural refactoring, not a patch. + +## MOAD-0003 (Leaked Context): CLEAN + +ThreadLocal usage found in: +- ArcNetProvider: decompression buffers (infrastructure, not request-scoped identity) +- ModClassLoader.inChild: recursion guard Boolean + +No request-scoped identity leaked through ThreadLocal. + +## MOAD-0004 (Logged Secret): CLEAN + +No secrets (passwords, tokens, API keys) found in Log.info/warn/err calls. +Network code does not log authentication headers or credentials. + +## MOAD-0005 (Thundering Herd): CLEAN + +Game is largely single-threaded (game loop on main thread). +No cache get+miss+compute+put patterns without synchronization found. +The synchronized block in ArcNetProvider.discoverServers is a simple +lock for foundAddresses deduplication, not a thundering herd.