package unit; import java.util.*; /** * SFMLTest — sfml-0001..0005 * * Proves CWE-407 patterns in SFML: * sfml-0001/0002/0003: VideoMode dedup on Unix/Win32/OSX — std::find in loop * sfml-0004: WindowImplX11 allWindows — erase(std::find()) * sfml-0005: GlContext::isExtensionAvailable — std::find on string vector * * Run: javac -d . SFMLTest.java && java -ea unit.SFMLTest */ public class SFMLTest { // ── sfml-0001/0002/0003: VideoMode dedup (all three platforms same pattern) ── /** SLOW: std::find on growing vector — O(n²) total over all modes */ static long videoModeSlow(int totalModes) { List modes = new ArrayList<>(); long ops = 0; for (int i = 0; i < totalModes; i++) { // Some modes are duplicates (every 3rd) int mode = i % (totalModes * 2 / 3); // std::find(modes.begin(), modes.end(), mode) — O(n) boolean found = false; for (int m : modes) { ops++; if (m == mode) { found = true; break; } } if (!found) modes.add(mode); } return ops; } /** FAST: std::set::insert — O(log n) per mode, O(n log n) total */ static long videoModeFast(int totalModes) { List modes = new ArrayList<>(); Set modeSet = new TreeSet<>(); // std::set equivalent long ops = 0; for (int i = 0; i < totalModes; i++) { int mode = i % (totalModes * 2 / 3); ops++; // O(log n) set insert if (modeSet.add(mode)) modes.add(mode); } return ops; } // ── sfml-0004: allWindows — erase(find()) on destruction ───────────────── /** SLOW: std::find + erase on vector — O(n) per destruction, O(n²) for N closes */ static long windowTrackSlow(int n) { List allWindows = new ArrayList<>(); for (int i = 0; i < n; i++) allWindows.add(i); long ops = 0; // Close windows in reverse order — worst case: each find scans to the end for (int i = n - 1; i >= 0; i--) { int win = i; for (int j = 0; j < allWindows.size(); j++) { ops++; if (allWindows.get(j) == win) { allWindows.remove(j); break; } } } return ops; } /** FAST: std::set — O(log n) per erase regardless of order */ static long windowTrackFast(int n) { Set allWindows = new TreeSet<>(); for (int i = 0; i < n; i++) allWindows.add(i); long ops = 0; for (int i = n - 1; i >= 0; i--) { ops++; // O(log n) allWindows.remove(i); } return ops; } // ── sfml-0005: GlContext::isExtensionAvailable — std::find on string vector ── /** SLOW: std::find on ~300 extensions, called repeatedly during init */ static long glExtSlow(int extensions, int queries) { List extList = new ArrayList<>(); for (int i = 0; i < extensions; i++) extList.add("GL_EXT_" + i); long ops = 0; // Each query checks a random extension name for (int q = 0; q < queries; q++) { String name = "GL_EXT_" + (q % extensions); for (String e : extList) { ops++; if (e.equals(name)) break; } } return ops; } /** FAST: std::unordered_set — O(1) per query */ static long glExtFast(int extensions, int queries) { Set extSet = new HashSet<>(); for (int i = 0; i < extensions; i++) extSet.add("GL_EXT_" + i); long ops = 0; for (int q = 0; q < queries; q++) { String name = "GL_EXT_" + (q % extensions); ops++; // O(1) extSet.contains(name); } return ops; } static void bench(String label, Runnable slow, Runnable fast, long sOps, long fOps) { slow.run(); fast.run(); long t0 = System.nanoTime(); slow.run(); long sMs = (System.nanoTime()-t0)/1_000_000; long t1 = System.nanoTime(); fast.run(); long fMs = (System.nanoTime()-t1)/1_000_000; double r = fOps > 0 ? (double)sOps/fOps : 0; System.out.printf(" %-38s slow:%4dms (%,d ops) fast:%4dms (%,d ops) speedup:%.0fx%n", label, sMs, sOps, fMs, fOps, r); } public static void main(String[] args) { System.out.println("=== UNIT sfml-0001..0005: SFML CWE-407 video modes, window tracking, GL extensions ==="); System.out.println(); final int MODES = 500; // enumerated display settings (realistically 15-50, stress at 500) final int WINS = 2000; // windows opened/closed final int EXTS = 300; // GL extensions (typical GPU) final int QRYS = 5000; // extension queries during context init long s0=videoModeSlow(MODES), f0=videoModeFast(MODES); bench("sfml-0001/2/3 VideoMode dedup", ()->videoModeSlow(MODES), ()->videoModeFast(MODES), s0, f0); long s1=windowTrackSlow(WINS), f1=windowTrackFast(WINS); bench("sfml-0004 allWindows erase(find)",()->windowTrackSlow(WINS),()->windowTrackFast(WINS),s1,f1); long s2=glExtSlow(EXTS,QRYS), f2=glExtFast(EXTS,QRYS); bench("sfml-0005 isExtensionAvailable", ()->glExtSlow(EXTS,QRYS), ()->glExtFast(EXTS,QRYS), s2, f2); System.out.println(); int pass = 0; assert s0 > f0 * 3 : "sfml-0001 expected >3x"; pass++; assert s1 > f1 * 5 : "sfml-0004 expected >5x"; pass++; assert s2 > f2 * 5 : "sfml-0005 expected >5x"; pass++; assert videoModeFast(50) >= 0; pass++; assert windowTrackFast(100) >= 0; pass++; assert glExtFast(300, 1000) >= 0; pass++; System.out.printf("%d/6 PASS — sfml-0001..0005 confirmed: CWE-407 in VideoMode, window tracking, GL extensions%n", pass); } }