java-topology/defects/minecraft/patch/minecraft-0003-redstone-wire-deque-hashset.md

1.7 KiB

UNDF: UNDF-2026-000000392

Classification

Field Value
CWE CWE-407 Inefficient Algorithmic Complexity
Severity HIGH
Component net/minecraft/world/level/redstone/ExperimentalRedstoneWireEvaluator.java
Function propagateSignal() BFS
Hot path Called every redstone update tick

Defect

ExperimentalRedstoneWireEvaluator maintains wiresToTurnOn and wiresToTurnOff as Deque<BlockPos>. During BFS propagation, deque.contains(pos) is called for each candidate wire — O(N) scan per call, inside the BFS loop: O(N²) total for N-wire networks.

// BEFORE — O(N²): Deque.contains() inside BFS loop
private final Deque<BlockPos> wiresToTurnOff = new ArrayDeque<>();
private final Deque<BlockPos> wiresToTurnOn  = new ArrayDeque<>();

// In BFS loop:
if (!wiresToTurnOff.contains(pos)) wiresToTurnOff.add(pos);
if (!wiresToTurnOn.contains(pos))  wiresToTurnOn.add(pos);

Redstone wire networks of N=200 wires require 40,000 comparisons instead of 200.

Fix

Add parallel HashSet<BlockPos> for O(1) duplicate detection.

// AFTER — O(N): companion sets for O(1) membership
private final Deque<BlockPos> wiresToTurnOff    = new ArrayDeque<>();
private final Set<BlockPos>   wiresToTurnOffSet = new HashSet<>();
private final Deque<BlockPos> wiresToTurnOn     = new ArrayDeque<>();
private final Set<BlockPos>   wiresToTurnOnSet  = new HashSet<>();

// In BFS loop:
if (wiresToTurnOffSet.add(pos)) wiresToTurnOff.add(pos);
if (wiresToTurnOnSet.add(pos))  wiresToTurnOn.add(pos);

The Deque is retained for ordered BFS traversal. The Set is used only for membership testing.