diff --git a/UNDF-REGISTRY.json b/UNDF-REGISTRY.json index fae885891..cfae42077 100644 --- a/UNDF-REGISTRY.json +++ b/UNDF-REGISTRY.json @@ -93,9 +93,6 @@ "cargo-0001": "UNDF-2026-000000021", "cargo-0002": "UNDF-2026-000000022", "cassandra-0001": "UNDF-2026-000000023", - "cassandra-0002": "UNDF-2026-000001282", - "cassandra-0003": "UNDF-2026-000001283", - "cassandra-0004": "UNDF-2026-000001284", "cassandra-0005": "UNDF-2026-000000024", "cataclysm-0001-0001": "UNDF-2026-000000935", "cataclysm-0002-0002": "UNDF-2026-000000936", @@ -113,7 +110,6 @@ "cfengine-0001": "UNDF-2026-000000027", "cfengine-0002": "UNDF-2026-000000028", "cfengine-0003": "UNDF-2026-000000029", - "check-0001": "UNDF-2026-000001292", "chef-0001": "UNDF-2026-000000362", "cilium-0001": "UNDF-2026-000000030", "cilium-0002": "UNDF-2026-000000363", @@ -325,7 +321,6 @@ "frrouting-0003": "UNDF-2026-000000401", "frrouting-0004": "UNDF-2026-000000402", "fs-uae-0001-0001": "UNDF-2026-000001047", - "gatsby-0001": "UNDF-2026-000001299", "gcc-0001": "UNDF-2026-000000076", "gcc-0002": "UNDF-2026-000000077", "gearboy-0001-0001": "UNDF-2026-000001096", @@ -334,9 +329,6 @@ "geth-0001": "UNDF-2026-000000632", "ghc-0001": "UNDF-2026-000000078", "ghc-0003": "UNDF-2026-000000079", - "ghidra-0001": "UNDF-2026-000001303", - "ghidra-0002": "UNDF-2026-000001304", - "ghost-0001": "UNDF-2026-000001302", "gimp-0001": "UNDF-2026-000000793", "gimp-0002": "UNDF-2026-000000794", "gimp-0003": "UNDF-2026-000001098", @@ -393,7 +385,6 @@ "hadoop-0002": "UNDF-2026-000000097", "hadoop-0003": "UNDF-2026-000000098", "hadoop-0004": "UNDF-2026-000000099", - "hadoop-rpc-0001": "UNDF-2026-000001285", "hanami-0001": "UNDF-2026-000000100", "haproxy-0001": "UNDF-2026-000000101", "haproxy-0002": "UNDF-2026-000000413", @@ -468,7 +459,6 @@ "jami-daemon-0001": "UNDF-2026-000000115", "jami-daemon-0002": "UNDF-2026-000000116", "janusgraph-0001": "UNDF-2026-000000430", - "jasmine-0001": "UNDF-2026-000001293", "javac-0001": "UNDF-2026-000000117", "javac-0002": "UNDF-2026-000000118", "javac-0003": "UNDF-2026-000000119", @@ -510,7 +500,6 @@ "kafka-0009": "UNDF-2026-000000451", "kafka-0010": "UNDF-2026-000000686", "kafka-0011": "UNDF-2026-000000687", - "katago-0001": "UNDF-2026-000000226", "kdenlive-0001": "UNDF-2026-000000798", "kdenlive-0002": "UNDF-2026-000000799", "kdenlive-0003": "UNDF-2026-000000800", @@ -527,7 +516,6 @@ "kicad-0001": "UNDF-2026-000000133", "kicad-0002": "UNDF-2026-000000589", "kicad-0003-0003": "UNDF-2026-000001113", - "knex-0001": "UNDF-2026-000001298", "kotlin-0001": "UNDF-2026-000000134", "kotlin-0002": "UNDF-2026-000000135", "krita-0001-0001": "UNDF-2026-000001216", @@ -600,7 +588,6 @@ "llvm-0006": "UNDF-2026-000000774", "lmdb-0001": "UNDF-2026-000000454", "lmdb-001": "UNDF-2026-000000638", - "log4j2-0001": "UNDF-2026-000001308", "loki-0001": "UNDF-2026-000000821", "lotus-0001-0001": "UNDF-2026-000001018", "love2d-0001": "UNDF-2026-000000157", @@ -613,7 +600,6 @@ "mariadb-0002": "UNDF-2026-000000161", "mastodon-0001": "UNDF-2026-000000609", "mastodon-0002": "UNDF-2026-000000610", - "mastodon-0003": "UNDF-2026-000001275", "mattermost-0001": "UNDF-2026-000000162", "maven-0001": "UNDF-2026-000000163", "maven-0003": "UNDF-2026-000000164", @@ -632,10 +618,6 @@ "mesa-0001": "UNDF-2026-000000170", "meson-0001": "UNDF-2026-000000171", "meson-0002": "UNDF-2026-000000412", - "meson-0003": "UNDF-2026-000001278", - "meson-0004": "UNDF-2026-000001279", - "meson-0005": "UNDF-2026-000001280", - "meson-0006": "UNDF-2026-000001281", "metaflow-0001": "UNDF-2026-000000460", "mgba-0001-0001": "UNDF-2026-000001126", "micronaut-0001": "UNDF-2026-000000461", @@ -661,8 +643,6 @@ "minio-0003": "UNDF-2026-000000770", "moby-0001": "UNDF-2026-000000172", "moby-0002": "UNDF-2026-000000688", - "mongo-0001": "UNDF-2026-000001286", - "mongo-0002": "UNDF-2026-000001287", "mongodb-0001": "UNDF-2026-000000173", "mongodb-0008": "UNDF-2026-000000465", "monogame-0001-0001": "UNDF-2026-000000941", @@ -682,7 +662,6 @@ "naev-0002-0002": "UNDF-2026-000001000", "nagioscore-0001-0001": "UNDF-2026-000000879", "nagioscore-0002-0002": "UNDF-2026-000000880", - "nakama-0001": "UNDF-2026-000001309", "natron-0001": "UNDF-2026-000001129", "nats-0001": "UNDF-2026-000000466", "nats-server-0001": "UNDF-2026-000000179", @@ -803,7 +782,6 @@ "otel-collector-0001": "UNDF-2026-000000205", "otel-collector-0002": "UNDF-2026-000000709", "ovs-0001": "UNDF-2026-000000206", - "pachi-0001": "UNDF-2026-000001274", "panda3d-0001": "UNDF-2026-000000207", "panda3d-0002": "UNDF-2026-000000208", "pandas-0001": "UNDF-2026-000000497", @@ -832,7 +810,6 @@ "pip-0001": "UNDF-2026-000000215", "pitivi-0001-0001": "UNDF-2026-000001143", "play-0001-0001": "UNDF-2026-000001144", - "playwright-0001": "UNDF-2026-000001276", "podman-0001": "UNDF-2026-000000501", "podman-0002": "UNDF-2026-000000502", "poetry-0001": "UNDF-2026-000000575", @@ -862,7 +839,6 @@ "prusaslicer-0002-0002": "UNDF-2026-000000911", "prusaslicer-0003-0003": "UNDF-2026-000000912", "prusaslicer-0004-0004": "UNDF-2026-000001207", - "psalm-0001": "UNDF-2026-000001296", "pulsar-0001": "UNDF-2026-000000505", "pulsar-0002": "UNDF-2026-000000506", "pulsar-0003": "UNDF-2026-000000507", @@ -882,8 +858,6 @@ "pyramid-0003": "UNDF-2026-000000233", "pyramid-0004": "UNDF-2026-000000234", "pyramid-0005": "UNDF-2026-000000235", - "pyright-0001": "UNDF-2026-000001311", - "pyroscope-0001": "UNDF-2026-000001301", "python-igraph-0001": "UNDF-2026-000000511", "pytorch-0001": "UNDF-2026-000000512", "pytorch-0002": "UNDF-2026-000000513", @@ -1025,8 +999,6 @@ "seaorm-0004": "UNDF-2026-000000277", "seaweedfs-0001-0001": "UNDF-2026-000001032", "seaweedfs-0002-0002": "UNDF-2026-000001033", - "selenium-0001": "UNDF-2026-000001277", - "selenium-0002": "UNDF-2026-000001288", "sendmail-0001-0001": "UNDF-2026-000001189", "sequelize-0001": "UNDF-2026-000000278", "sequelize-0002": "UNDF-2026-000000279", @@ -1127,7 +1099,6 @@ "suricata-0002-0002": "UNDF-2026-000001186", "swift-0001": "UNDF-2026-000000545", "swift-0002": "UNDF-2026-000000546", - "symfony-0001": "UNDF-2026-000001310", "synapse-0001": "UNDF-2026-000000305", "synapse-0002": "UNDF-2026-000000306", "syncthing-0001": "UNDF-2026-000000850", @@ -1143,8 +1114,6 @@ "tensorflow-0001": "UNDF-2026-000000551", "terraform-0001": "UNDF-2026-000000307", "terraform-0002": "UNDF-2026-000000308", - "testcafe-0001": "UNDF-2026-000001290", - "testng-0001": "UNDF-2026-000001294", "tf-0001": "UNDF-2026-000000668", "tf-0002": "UNDF-2026-000000669", "tf-aws-0001": "UNDF-2026-000000670", @@ -1209,7 +1178,6 @@ "v8-0002": "UNDF-2026-000000564", "v8-0003": "UNDF-2026-000000565", "v8-0004": "UNDF-2026-000000593", - "vagrant-0001": "UNDF-2026-000001297", "valhalla-0001": "UNDF-2026-000000566", "valkey-0001": "UNDF-2026-000000326", "valkey-0002": "UNDF-2026-000000327", @@ -1228,7 +1196,6 @@ "vim-0001": "UNDF-2026-000000571", "vim-0002": "UNDF-2026-000000572", "vita3k-0001-0001": "UNDF-2026-000001173", - "vitest-0001": "UNDF-2026-000001295", "vlc-0001": "UNDF-2026-000000331", "vlc-0002": "UNDF-2026-000000718", "vlc-0003-0003": "UNDF-2026-000001174", @@ -1248,9 +1215,6 @@ "wasmer-0002": "UNDF-2026-000000335", "wasmtime-0001": "UNDF-2026-000000336", "wasmtime-0002": "UNDF-2026-000000337", - "weaviate-0001": "UNDF-2026-000001300", - "webdriverio-0001": "UNDF-2026-000001289", - "webdriverio-0002": "UNDF-2026-000001291", "webpack-0001": "UNDF-2026-000000338", "webpack-0002": "UNDF-2026-000000339", "weechat-0001": "UNDF-2026-000000340", @@ -1271,9 +1235,6 @@ "widelands-0001-0001": "UNDF-2026-000000976", "widelands-0002-0002": "UNDF-2026-000000977", "widelands-0003-0003": "UNDF-2026-000000978", - "wildfly-0001": "UNDF-2026-000001305", - "wildfly-0002": "UNDF-2026-000001306", - "wildfly-0003": "UNDF-2026-000001307", "wine-0001-0001": "UNDF-2026-000000886", "wine-0002-0002": "UNDF-2026-000001193", "wine-0003-0003": "UNDF-2026-000001194", @@ -1309,5 +1270,20 @@ "zookeeper-0002": "UNDF-2026-000000724", "zulip-0001-0001": "UNDF-2026-000001190", "zulip-0002-0002": "UNDF-2026-000001191", - "zulip-0003-0003": "UNDF-2026-000001192" -} \ No newline at end of file + "zulip-0003-0003": "UNDF-2026-000001192", + "katago-0001": "UNDF-2026-000000226", + "pachi-0001": "UNDF-2026-000001274", + "mastodon-0003": "UNDF-2026-000001275", + "ktor-0001": "UNDF-2026-000001276", + "ktor-0002": "UNDF-2026-000001277", + "meson-0003": "UNDF-2026-000001278", + "meson-0004": "UNDF-2026-000001279", + "meson-0005": "UNDF-2026-000001280", + "meson-0006": "UNDF-2026-000001281", + "cassandra-0002": "UNDF-2026-000001282", + "cassandra-0003": "UNDF-2026-000001283", + "cassandra-0004": "UNDF-2026-000001284", + "hadoop-rpc-0001": "UNDF-2026-000001285", + "mongo-0001": "UNDF-2026-000001286", + "mongo-0002": "UNDF-2026-000001287" +} diff --git a/defects/0ad-0001/Makefile b/defects/0ad-0001/Makefile deleted file mode 100644 index fbb083eb5..000000000 --- a/defects/0ad-0001/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# 0ad-0001 bench runner -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/0ad-0001/bench/bench-0ad-0001-0001.py b/defects/0ad-0001/bench/bench-0ad-0001-0001.py deleted file mode 100644 index bb834ebfe..000000000 --- a/defects/0ad-0001/bench/bench-0ad-0001-0001.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 -# bench-0ad-0001-0001.py -# CCmpObstructionManager dirty shape tracking: std::find on std::vector for -# dedup, called per nearby shape per frame. With N nearby shapes × D dirty -# list size, cost is O(N·D) = O(N²) in large battles (200v200, hundreds of -# shapes moving per frame). Fix: std::unordered_set for O(1) membership. - -import sys -import time - - -def bench_defective(n_shapes, dirty_before): - """std::find over a growing vector, called per shape per frame.""" - dirty = list(range(dirty_before)) # starts with D entries - updates = [i for i in range(n_shapes)] # N shapes to dedup-add - - t0 = time.perf_counter() - for s in updates: - if s not in dirty: # list.__contains__: O(len(dirty)) - dirty.append(s) - return time.perf_counter() - t0 - - -def bench_fixed(n_shapes, dirty_before): - """unordered_set membership, O(1) per check.""" - dirty = set(range(dirty_before)) - updates = [i for i in range(n_shapes)] - - t0 = time.perf_counter() - for s in updates: - if s not in dirty: - dirty.add(s) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (300, 300), (500, 500), (1000, 1000)] - - -def run(): - lines = [] - header = "=== 0ad-0001-0001: CCmpObstructionManager dirty shapes std::find vs unordered_set ===" - print(header); lines.append(header) - for n, d in CASES: - df = min(bench_defective(n, d) for _ in range(TRIALS)) - fx = min(bench_fixed(n, d) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<4} D={d:<4}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/0ad-0001/bench/results.txt b/defects/0ad-0001/bench/results.txt deleted file mode 100644 index 66514e621..000000000 --- a/defects/0ad-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== 0ad-0001-0001: CCmpObstructionManager dirty shapes std::find vs unordered_set === -N=100 D=100 : defective=0.108ms fixed=0.004ms speedup=26.0x -N=300 D=300 : defective=0.963ms fixed=0.014ms speedup=70.0x -N=500 D=500 : defective=2.580ms fixed=0.025ms speedup=104.1x -N=1000 D=1000: defective=11.218ms fixed=0.187ms speedup=59.9x - diff --git a/defects/0ad-0001/bench/run_all.py b/defects/0ad-0001/bench/run_all.py deleted file mode 100644 index 453fba431..000000000 --- a/defects/0ad-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-0ad-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/0ad-0002/Makefile b/defects/0ad-0002/Makefile deleted file mode 100644 index 1e1800c91..000000000 --- a/defects/0ad-0002/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# 0ad-0002 bench runner -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/0ad-0002/bench/bench-0ad-0002-0002.py b/defects/0ad-0002/bench/bench-0ad-0002-0002.py deleted file mode 100644 index f3a3271fc..000000000 --- a/defects/0ad-0002/bench/bench-0ad-0002-0002.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -# bench-0ad-0002-0002.py -# CCmpSelectable modified-entity tracking: std::find on m_ModifiedEntities -# vector inside a per-entity loop. O(N²) as the set of modified entities -# grows over a frame. Fix: unordered_set for O(1) membership. - -import sys -import time - - -def bench_defective(n): - modified = [] - entities = list(range(n)) - t0 = time.perf_counter() - for ent in entities: - if ent not in modified: # O(|modified|) - modified.append(ent) - return time.perf_counter() - t0 - - -def bench_fixed(n): - modified = set() - entities = list(range(n)) - t0 = time.perf_counter() - for ent in entities: - if ent not in modified: - modified.add(ent) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== 0ad-0002-0002: CCmpSelectable modified-entities std::find vs unordered_set ===" - print(header); lines.append(header) - for n in SIZES: - df = min(bench_defective(n) for _ in range(TRIALS)) - fx = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/0ad-0002/bench/results.txt b/defects/0ad-0002/bench/results.txt deleted file mode 100644 index 328c059d3..000000000 --- a/defects/0ad-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== 0ad-0002-0002: CCmpSelectable modified-entities std::find vs unordered_set === -N=100 : defective=0.221ms fixed=0.020ms speedup=10.9x -N=500 : defective=4.980ms fixed=0.078ms speedup=63.9x -N=1000 : defective=19.368ms fixed=0.176ms speedup=110.1x -N=2000 : defective=72.550ms fixed=0.212ms speedup=341.5x - diff --git a/defects/0ad-0002/bench/run_all.py b/defects/0ad-0002/bench/run_all.py deleted file mode 100644 index 4a5ebb2a4..000000000 --- a/defects/0ad-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-0ad-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/0ad-0003/Makefile b/defects/0ad-0003/Makefile deleted file mode 100644 index 10ca1b3e4..000000000 --- a/defects/0ad-0003/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# 0ad-0003 bench runner -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/0ad-0003/bench/bench-0ad-0003-0003.py b/defects/0ad-0003/bench/bench-0ad-0003-0003.py deleted file mode 100644 index f4bb3d19e..000000000 --- a/defects/0ad-0003/bench/bench-0ad-0003-0003.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -# bench-0ad-0003-0003.py -# Template-cache usedTemplates tracking: std::find on usedTemplates vector -# inside a per-template-instance loop. O(N²) across instances × template names. -# Fix: unordered_set of template ids for O(1) dedup. - -import sys -import time - - -def bench_defective(n, unique_ratio=0.5): - used = [] - distinct = max(1, int(n * unique_ratio)) - candidates = [f"tpl_{i % distinct}" for i in range(n)] - t0 = time.perf_counter() - for t in candidates: - if t not in used: # O(|used|) - used.append(t) - return time.perf_counter() - t0 - - -def bench_fixed(n, unique_ratio=0.5): - used = set() - distinct = max(1, int(n * unique_ratio)) - candidates = [f"tpl_{i % distinct}" for i in range(n)] - t0 = time.perf_counter() - for t in candidates: - if t not in used: - used.add(t) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== 0ad-0003-0003: usedTemplates std::find vs unordered_set ===" - print(header); lines.append(header) - for n in SIZES: - df = min(bench_defective(n) for _ in range(TRIALS)) - fx = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/0ad-0003/bench/results.txt b/defects/0ad-0003/bench/results.txt deleted file mode 100644 index aefc1f4bb..000000000 --- a/defects/0ad-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== 0ad-0003-0003: usedTemplates std::find vs unordered_set === -N=100 : defective=0.120ms fixed=0.018ms speedup=6.6x -N=500 : defective=2.615ms fixed=0.118ms speedup=22.1x -N=1000 : defective=8.730ms fixed=0.111ms speedup=78.4x -N=2000 : defective=37.381ms fixed=0.372ms speedup=100.6x - diff --git a/defects/0ad-0003/bench/run_all.py b/defects/0ad-0003/bench/run_all.py deleted file mode 100644 index 517a954f0..000000000 --- a/defects/0ad-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-0ad-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/0ad-0004/Makefile b/defects/0ad-0004/Makefile deleted file mode 100644 index e0673caa8..000000000 --- a/defects/0ad-0004/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# 0ad-0004 bench runner -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/0ad-0004/bench/bench-0ad-0004-0004.py b/defects/0ad-0004/bench/bench-0ad-0004-0004.py deleted file mode 100644 index eabd2724f..000000000 --- a/defects/0ad-0004/bench/bench-0ad-0004-0004.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python3 -# bench-0ad-0004-0004.py -# XmppClient + NetServer: lobby auth tokens logged verbatim. CWE-312 / MOAD-0004 -# A Logged Secret. Correctness metric: does log output contain the raw token? -# Fixed path replaces token with "[REDACTED]" before logging. - -import re -import sys - - -def emit_defective(username, token, logsink): - # Verbatim log of the token — the defect. - logsink.append(f"XmppClient: Received lobby auth: {token} from {username}") - - -def emit_fixed(username, token, logsink): - # Redacted log — the fix. - logsink.append(f"XmppClient: Received lobby auth: [REDACTED] from {username}") - - -def count_leaks(logsink, tokens): - """Return the number of log lines that contain a raw token value.""" - leaks = 0 - for line in logsink: - for tok in tokens: - if tok in line: - leaks += 1 - break - return leaks - - -def run(): - lines = [] - header = "=== 0ad-0004-0004: lobby auth token log redaction (correctness) ===" - print(header); lines.append(header) - - # Simulate N auth events with random-looking tokens - cases = [100, 1000, 10000] - for n in cases: - tokens = [f"tok_{i:08x}" for i in range(n)] - users = [f"user{i}" for i in range(n)] - - sink_def = [] - sink_fix = [] - for u, t in zip(users, tokens): - emit_defective(u, t, sink_def) - emit_fixed(u, t, sink_fix) - - leaks_def = count_leaks(sink_def, tokens) - leaks_fix = count_leaks(sink_fix, tokens) - line = (f"N={n:<5}: defective_leaks={leaks_def:>5} fixed_leaks={leaks_fix:>5}" - f" redaction_rate={(n - leaks_fix) / n * 100:.1f}%") - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/0ad-0004/bench/results.txt b/defects/0ad-0004/bench/results.txt deleted file mode 100644 index 3c2521f43..000000000 --- a/defects/0ad-0004/bench/results.txt +++ /dev/null @@ -1,5 +0,0 @@ -=== 0ad-0004-0004: lobby auth token log redaction (correctness) === -N=100 : defective_leaks= 100 fixed_leaks= 0 redaction_rate=100.0% -N=1000 : defective_leaks= 1000 fixed_leaks= 0 redaction_rate=100.0% -N=10000: defective_leaks=10000 fixed_leaks= 0 redaction_rate=100.0% - diff --git a/defects/0ad-0004/bench/run_all.py b/defects/0ad-0004/bench/run_all.py deleted file mode 100644 index 2233799f7..000000000 --- a/defects/0ad-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-0ad-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/activemq-artemis/Makefile b/defects/activemq-artemis/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/activemq-artemis/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/activemq-artemis/bench/bench-activemq-artemis-0001.py b/defects/activemq-artemis/bench/bench-activemq-artemis-0001.py deleted file mode 100644 index ed4fa00df..000000000 --- a/defects/activemq-artemis/bench/bench-activemq-artemis-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-activemq-artemis-0001.py -# CWE-407: list-scan inside loop in activemq-artemis-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== activemq-artemis-0001: CWE-407: list-scan inside loop in activemq-artemis-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/activemq-artemis/bench/bench-activemq-artemis-0002.py b/defects/activemq-artemis/bench/bench-activemq-artemis-0002.py deleted file mode 100644 index 76b1eb44a..000000000 --- a/defects/activemq-artemis/bench/bench-activemq-artemis-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-activemq-artemis-0002.py -# CWE-407: list-scan inside loop in activemq-artemis-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== activemq-artemis-0002: CWE-407: list-scan inside loop in activemq-artemis-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/activemq-artemis/bench/results.txt b/defects/activemq-artemis/bench/results.txt deleted file mode 100644 index 9e085f210..000000000 --- a/defects/activemq-artemis/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== activemq-artemis-0001: CWE-407: list-scan inside loop in activemq-artemis-0001 (generic model) === -N=100 k=100 : defective=0.180ms fixed=0.007ms speedup=25.8x -N=500 k=500 : defective=5.061ms fixed=0.043ms speedup=117.8x -N=1000 k=1000 : defective=19.862ms fixed=0.097ms speedup=203.8x -N=2000 k=2000 : defective=42.342ms fixed=0.100ms speedup=423.3x - -=== activemq-artemis-0002: CWE-407: list-scan inside loop in activemq-artemis-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.294ms fixed=0.021ms speedup=107.1x -N=1000 k=1000 : defective=9.116ms fixed=0.053ms speedup=172.8x -N=2000 k=2000 : defective=43.585ms fixed=0.097ms speedup=450.4x - diff --git a/defects/activemq-artemis/bench/run_all.py b/defects/activemq-artemis/bench/run_all.py deleted file mode 100644 index 1b534299d..000000000 --- a/defects/activemq-artemis/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-activemq-artemis-0001.py", "bench-activemq-artemis-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/activemq/Makefile b/defects/activemq/Makefile deleted file mode 100644 index 470c53582..000000000 --- a/defects/activemq/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# activemq bench runner -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/activemq/bench/bench-activemq-0001.py b/defects/activemq/bench/bench-activemq-0001.py deleted file mode 100644 index 9569403d0..000000000 --- a/defects/activemq/bench/bench-activemq-0001.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python3 -# bench-activemq-0001.py -# ActiveMQ Queue/Topic consumer list: per-message round-robin rotation via -# remove+add on the consumers List. For C consumers and M messages, cost is -# O(M·C) per dispatch. Topic path also does linear contains() for dedup. -# Fix: rotation-index pointer + parallel Set for O(1) checks. - -import sys -import time - - -def bench_defective(n_consumers, n_messages): - """Remove + append to rotate; O(C) per message.""" - consumers = list(range(n_consumers)) - t0 = time.perf_counter() - for m in range(n_messages): - target = consumers[0] - # remove target from list and re-append — O(C) - consumers.pop(0) - consumers.append(target) - return time.perf_counter() - t0 - - -def bench_fixed(n_consumers, n_messages): - """Rotation index cursor; O(1) per message.""" - consumers = list(range(n_consumers)) - rot = 0 - t0 = time.perf_counter() - for m in range(n_messages): - target = consumers[rot] - rot = (rot + 1) % len(consumers) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 1000), (200, 5000), (500, 10000), (1000, 20000)] - - -def run(): - lines = [] - header = "=== activemq-0001: Queue/Topic consumer rotation list.remove+add vs index cursor ===" - print(header); lines.append(header) - for c, m in CASES: - df = min(bench_defective(c, m) for _ in range(TRIALS)) - fx = min(bench_fixed(c, m) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"C={c:<5} M={m:<6}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/activemq/bench/bench-activemq-0002.py b/defects/activemq/bench/bench-activemq-0002.py deleted file mode 100644 index cc7926c31..000000000 --- a/defects/activemq/bench/bench-activemq-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-activemq-0002.py -# DemandBridge candidateConsumers.contains() inside a per-consumer loop: -# O(N²) across N candidates. Fix: parallel HashSet for O(1) membership. - -import sys -import time - - -def bench_defective(n): - candidates = [] - incoming = list(range(n)) - t0 = time.perf_counter() - for c in incoming: - if c not in candidates: # O(len(candidates)) - candidates.append(c) - return time.perf_counter() - t0 - - -def bench_fixed(n): - candidates_set = set() - candidates = [] - incoming = list(range(n)) - t0 = time.perf_counter() - for c in incoming: - if c not in candidates_set: - candidates_set.add(c) - candidates.append(c) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== activemq-0002: DemandBridge candidateConsumers List.contains vs HashSet ===" - print(header); lines.append(header) - for n in SIZES: - df = min(bench_defective(n) for _ in range(TRIALS)) - fx = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/activemq/bench/bench-activemq-0003.py b/defects/activemq/bench/bench-activemq-0003.py deleted file mode 100644 index e2326e2dd..000000000 --- a/defects/activemq/bench/bench-activemq-0003.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -# bench-activemq-0003.py -# TransactionContext endedXATransactions List: .contains check before add on -# a growing ended-XA-txn list. Per-transaction O(N) check over all prior -# endings; fix is a parallel HashSet for O(1) membership. - -import sys -import time - - -def bench_defective(n): - ended = [] - incoming = [f"xid_{i:06d}" for i in range(n)] - t0 = time.perf_counter() - for xid in incoming: - if xid not in ended: # O(|ended|) - ended.append(xid) - return time.perf_counter() - t0 - - -def bench_fixed(n): - ended_set = set() - ended = [] - incoming = [f"xid_{i:06d}" for i in range(n)] - t0 = time.perf_counter() - for xid in incoming: - if xid not in ended_set: - ended_set.add(xid) - ended.append(xid) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== activemq-0003: TransactionContext endedXATransactions List.contains vs HashSet ===" - print(header); lines.append(header) - for n in SIZES: - df = min(bench_defective(n) for _ in range(TRIALS)) - fx = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/activemq/bench/results.txt b/defects/activemq/bench/results.txt deleted file mode 100644 index e0166d010..000000000 --- a/defects/activemq/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== activemq-0001: Queue/Topic consumer rotation list.remove+add vs index cursor === -C=50 M=1000 : defective=0.307ms fixed=0.104ms speedup=3.0x -C=200 M=5000 : defective=0.735ms fixed=0.537ms speedup=1.4x -C=500 M=10000 : defective=1.630ms fixed=1.489ms speedup=1.1x -C=1000 M=20000 : defective=4.415ms fixed=3.119ms speedup=1.4x - -=== activemq-0002: DemandBridge candidateConsumers List.contains vs HashSet === -N=100 : defective=0.089ms fixed=0.010ms speedup=8.7x -N=500 : defective=2.128ms fixed=0.047ms speedup=45.4x -N=1000 : defective=8.872ms fixed=0.090ms speedup=98.4x -N=2000 : defective=35.776ms fixed=0.218ms speedup=163.8x - -=== activemq-0003: TransactionContext endedXATransactions List.contains vs HashSet === -N=100 : defective=0.119ms fixed=0.014ms speedup=8.8x -N=500 : defective=2.891ms fixed=0.058ms speedup=49.4x -N=1000 : defective=11.783ms fixed=0.124ms speedup=95.3x -N=2000 : defective=51.216ms fixed=0.288ms speedup=178.0x - diff --git a/defects/activemq/bench/run_all.py b/defects/activemq/bench/run_all.py deleted file mode 100644 index e09de9693..000000000 --- a/defects/activemq/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-activemq-0001.py", "bench-activemq-0002.py", "bench-activemq-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/actix-web/Makefile b/defects/actix-web/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/actix-web/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/actix-web/bench/bench-actix-web-0001.py b/defects/actix-web/bench/bench-actix-web-0001.py deleted file mode 100644 index 2f83484e0..000000000 --- a/defects/actix-web/bench/bench-actix-web-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-web-0001.py -# introspection update_unique Vec::contains() O(N×M) during route registration -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-web-0001: introspection update_unique Vec::contains() O(N×M) during route registration ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix-web/bench/bench-actix-web-0002.py b/defects/actix-web/bench/bench-actix-web-0002.py deleted file mode 100644 index c0cb9a5c2..000000000 --- a/defects/actix-web/bench/bench-actix-web-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-web-0002.py -# WebSocket handshake protocol negotiation O(R×P) per upgrade request -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-web-0002: WebSocket handshake protocol negotiation O(R×P) per upgrade request ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix-web/bench/bench-actix-web-0003.py b/defects/actix-web/bench/bench-actix-web-0003.py deleted file mode 100644 index 5d92a4751..000000000 --- a/defects/actix-web/bench/bench-actix-web-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-web-0003.py -# CWE-407: list-scan inside loop in actix-web-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-web-0003: CWE-407: list-scan inside loop in actix-web-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix-web/bench/results.txt b/defects/actix-web/bench/results.txt deleted file mode 100644 index c804bade5..000000000 --- a/defects/actix-web/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== actix-web-0001: introspection update_unique Vec::contains() O(N×M) during route registration === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.445ms fixed=0.040ms speedup=61.2x -N=1000 k=1000 : defective=9.866ms fixed=0.051ms speedup=192.6x -N=2000 k=2000 : defective=41.815ms fixed=0.109ms speedup=384.6x - -=== actix-web-0002: WebSocket handshake protocol negotiation O(R×P) per upgrade request === -N=100 k=100 : defective=0.186ms fixed=0.004ms speedup=47.6x -N=500 k=500 : defective=2.590ms fixed=0.024ms speedup=108.8x -N=1000 k=1000 : defective=10.025ms fixed=0.057ms speedup=177.1x -N=2000 k=2000 : defective=48.127ms fixed=0.117ms speedup=411.5x - -=== actix-web-0003: CWE-407: list-scan inside loop in actix-web-0003 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.621ms fixed=0.025ms speedup=103.0x -N=1000 k=1000 : defective=12.017ms fixed=0.052ms speedup=232.4x -N=2000 k=2000 : defective=35.418ms fixed=0.097ms speedup=365.2x - diff --git a/defects/actix-web/bench/run_all.py b/defects/actix-web/bench/run_all.py deleted file mode 100644 index b85986ba2..000000000 --- a/defects/actix-web/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-actix-web-0001.py", "bench-actix-web-0002.py", "bench-actix-web-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/actix/Makefile b/defects/actix/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/actix/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/actix/bench/bench-actix-0003.py b/defects/actix/bench/bench-actix-0003.py deleted file mode 100644 index b8887d3f6..000000000 --- a/defects/actix/bench/bench-actix-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-0003.py -# CWE-407: list-scan inside loop in actix-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-0003: CWE-407: list-scan inside loop in actix-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix/bench/bench-actix-web-0001.py b/defects/actix/bench/bench-actix-web-0001.py deleted file mode 100644 index bb1b0c262..000000000 --- a/defects/actix/bench/bench-actix-web-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-web-0001.py -# CWE-407: list-scan inside loop in actix-web-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-web-0001: CWE-407: list-scan inside loop in actix-web-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix/bench/bench-actix-web-0002.py b/defects/actix/bench/bench-actix-web-0002.py deleted file mode 100644 index 2b0a0b664..000000000 --- a/defects/actix/bench/bench-actix-web-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-web-0002.py -# CWE-407: list-scan inside loop in actix-web-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-web-0002: CWE-407: list-scan inside loop in actix-web-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix/bench/bench-actix-web-0003.py b/defects/actix/bench/bench-actix-web-0003.py deleted file mode 100644 index 5d92a4751..000000000 --- a/defects/actix/bench/bench-actix-web-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-actix-web-0003.py -# CWE-407: list-scan inside loop in actix-web-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== actix-web-0003: CWE-407: list-scan inside loop in actix-web-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/actix/bench/results.txt b/defects/actix/bench/results.txt deleted file mode 100644 index fae3ec5c8..000000000 --- a/defects/actix/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== actix-0003: CWE-407: list-scan inside loop in actix-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.500ms fixed=0.023ms speedup=107.5x -N=1000 k=1000 : defective=8.894ms fixed=0.046ms speedup=191.9x -N=2000 k=2000 : defective=35.238ms fixed=0.097ms speedup=363.3x - -=== actix-web-0001: CWE-407: list-scan inside loop in actix-web-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.119ms fixed=0.021ms speedup=103.3x -N=1000 k=1000 : defective=9.240ms fixed=0.051ms speedup=183.0x -N=2000 k=2000 : defective=41.678ms fixed=0.101ms speedup=412.8x - -=== actix-web-0002: CWE-407: list-scan inside loop in actix-web-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.435ms fixed=0.020ms speedup=118.8x -N=1000 k=1000 : defective=10.267ms fixed=0.050ms speedup=206.3x -N=2000 k=2000 : defective=38.750ms fixed=0.097ms speedup=399.7x - -=== actix-web-0003: CWE-407: list-scan inside loop in actix-web-0003 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.338ms fixed=0.022ms speedup=104.9x -N=1000 k=1000 : defective=9.135ms fixed=0.046ms speedup=198.3x -N=2000 k=2000 : defective=35.604ms fixed=0.098ms speedup=363.8x - diff --git a/defects/actix/bench/run_all.py b/defects/actix/bench/run_all.py deleted file mode 100644 index 8745d5406..000000000 --- a/defects/actix/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-actix-0003.py", "bench-actix-web-0001.py", "bench-actix-web-0002.py", "bench-actix-web-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/airflow/Makefile b/defects/airflow/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/airflow/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/airflow/bench/bench-airflow-0001.py b/defects/airflow/bench/bench-airflow-0001.py deleted file mode 100644 index 7deb63ce7..000000000 --- a/defects/airflow/bench/bench-airflow-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-airflow-0001.py -# airflow-0001 — O(N²) Topological Sort in TaskGroup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== airflow-0001: airflow-0001 — O(N²) Topological Sort in TaskGroup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/airflow/bench/results.txt b/defects/airflow/bench/results.txt deleted file mode 100644 index 59095b0ec..000000000 --- a/defects/airflow/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== airflow-0001: airflow-0001 — O(N²) Topological Sort in TaskGroup === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.632ms fixed=0.025ms speedup=104.2x -N=1000 k=1000 : defective=11.752ms fixed=0.055ms speedup=213.0x -N=2000 k=2000 : defective=40.821ms fixed=0.193ms speedup=211.3x - diff --git a/defects/airflow/bench/run_all.py b/defects/airflow/bench/run_all.py deleted file mode 100644 index 45561ed30..000000000 --- a/defects/airflow/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-airflow-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/allegro5/Makefile b/defects/allegro5/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/allegro5/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/allegro5/bench/bench-allegro5-0001.py b/defects/allegro5/bench/bench-allegro5-0001.py deleted file mode 100644 index 120155ce0..000000000 --- a/defects/allegro5/bench/bench-allegro5-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-allegro5-0001.py -# CWE-407: list-scan inside loop in allegro5-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== allegro5-0001: CWE-407: list-scan inside loop in allegro5-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/allegro5/bench/results.txt b/defects/allegro5/bench/results.txt deleted file mode 100644 index 44a436018..000000000 --- a/defects/allegro5/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== allegro5-0001: CWE-407: list-scan inside loop in allegro5-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.417ms fixed=0.024ms speedup=102.2x -N=1000 k=1000 : defective=11.967ms fixed=0.050ms speedup=237.3x -N=2000 k=2000 : defective=43.017ms fixed=0.105ms speedup=408.3x - diff --git a/defects/allegro5/bench/run_all.py b/defects/allegro5/bench/run_all.py deleted file mode 100644 index e67fbeccc..000000000 --- a/defects/allegro5/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-allegro5-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/amarok/Makefile b/defects/amarok/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/amarok/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/amarok/bench/bench-amarok-0001.py b/defects/amarok/bench/bench-amarok-0001.py deleted file mode 100644 index 360285f4d..000000000 --- a/defects/amarok/bench/bench-amarok-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-amarok-0001.py -# In Playlist::TrackNavigator::queueIds(), each incoming id is checked -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== amarok-0001: In Playlist::TrackNavigator::queueIds(), each incoming id is checked ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/amarok/bench/bench-amarok-0002.py b/defects/amarok/bench/bench-amarok-0002.py deleted file mode 100644 index 4093cc908..000000000 --- a/defects/amarok/bench/bench-amarok-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-amarok-0002.py -# In QtGroupingProxy::mapFromSource(), mapping a source row to a proxy -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== amarok-0002: In QtGroupingProxy::mapFromSource(), mapping a source row to a proxy ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/amarok/bench/results.txt b/defects/amarok/bench/results.txt deleted file mode 100644 index 6e22f74c3..000000000 --- a/defects/amarok/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== amarok-0001: In Playlist::TrackNavigator::queueIds(), each incoming id is checked === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.372ms fixed=0.023ms speedup=104.1x -N=1000 k=1000 : defective=9.784ms fixed=0.050ms speedup=197.0x -N=2000 k=2000 : defective=40.739ms fixed=0.106ms speedup=382.9x - -=== amarok-0002: In QtGroupingProxy::mapFromSource(), mapping a source row to a proxy === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.309ms fixed=0.023ms speedup=99.9x -N=1000 k=1000 : defective=9.160ms fixed=0.047ms speedup=196.7x -N=2000 k=2000 : defective=35.427ms fixed=0.098ms speedup=359.7x - diff --git a/defects/amarok/bench/run_all.py b/defects/amarok/bench/run_all.py deleted file mode 100644 index 218a9ec5b..000000000 --- a/defects/amarok/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-amarok-0001.py", "bench-amarok-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/angelscript/Makefile b/defects/angelscript/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/angelscript/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/angelscript/bench/bench-angelscript-0001.py b/defects/angelscript/bench/bench-angelscript-0001.py deleted file mode 100644 index b62e8559b..000000000 --- a/defects/angelscript/bench/bench-angelscript-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-angelscript-0001.py -# shadow set for O(1) shared-type ownership lookup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== angelscript-0001: shadow set for O(1) shared-type ownership lookup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/angelscript/bench/bench-angelscript-0003.py b/defects/angelscript/bench/bench-angelscript-0003.py deleted file mode 100644 index fb67251eb..000000000 --- a/defects/angelscript/bench/bench-angelscript-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-angelscript-0003.py -# CompileSwitch — caseValues.IndexOf() O(n) inside while loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== angelscript-0003: CompileSwitch — caseValues.IndexOf() O(n) inside while loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/angelscript/bench/results.txt b/defects/angelscript/bench/results.txt deleted file mode 100644 index 857dc0514..000000000 --- a/defects/angelscript/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== angelscript-0001: shadow set for O(1) shared-type ownership lookup === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.157ms fixed=0.021ms speedup=102.4x -N=1000 k=1000 : defective=8.770ms fixed=0.068ms speedup=128.1x -N=2000 k=2000 : defective=37.403ms fixed=0.114ms speedup=329.1x - -=== angelscript-0003: CompileSwitch — caseValues.IndexOf() O(n) inside while loop === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.435ms fixed=0.021ms speedup=117.7x -N=1000 k=1000 : defective=11.221ms fixed=0.047ms speedup=239.7x -N=2000 k=2000 : defective=39.893ms fixed=0.097ms speedup=412.5x - diff --git a/defects/angelscript/bench/run_all.py b/defects/angelscript/bench/run_all.py deleted file mode 100644 index 2791b4e01..000000000 --- a/defects/angelscript/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-angelscript-0001.py", "bench-angelscript-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ans/Makefile b/defects/ans/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ans/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ans/bench/bench-ans-0001.py b/defects/ans/bench/bench-ans-0001.py deleted file mode 100644 index ac2e437ea..000000000 --- a/defects/ans/bench/bench-ans-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ans-0001.py -# CWE-407: list-scan inside loop in ans-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ans-0001: CWE-407: list-scan inside loop in ans-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ans/bench/bench-ans-0002.py b/defects/ans/bench/bench-ans-0002.py deleted file mode 100644 index 615b543cf..000000000 --- a/defects/ans/bench/bench-ans-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ans-0002.py -# CWE-407: list-scan inside loop in ans-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ans-0002: CWE-407: list-scan inside loop in ans-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ans/bench/results.txt b/defects/ans/bench/results.txt deleted file mode 100644 index f072c052a..000000000 --- a/defects/ans/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ans-0001: CWE-407: list-scan inside loop in ans-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.660ms fixed=0.025ms speedup=104.9x -N=1000 k=1000 : defective=12.643ms fixed=0.127ms speedup=99.3x -N=2000 k=2000 : defective=51.882ms fixed=0.106ms speedup=487.9x - -=== ans-0002: CWE-407: list-scan inside loop in ans-0002 (generic model) === -N=100 k=100 : defective=0.116ms fixed=0.004ms speedup=31.5x -N=500 k=500 : defective=2.785ms fixed=0.023ms speedup=119.2x -N=1000 k=1000 : defective=13.994ms fixed=0.114ms speedup=123.1x -N=2000 k=2000 : defective=54.807ms fixed=0.185ms speedup=296.1x - diff --git a/defects/ans/bench/run_all.py b/defects/ans/bench/run_all.py deleted file mode 100644 index 14667ce4e..000000000 --- a/defects/ans/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ans-0001.py", "bench-ans-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ansible/Makefile b/defects/ansible/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ansible/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ansible/bench/bench-ansible-0001.py b/defects/ansible/bench/bench-ansible-0001.py deleted file mode 100644 index 6fb4ae6ea..000000000 --- a/defects/ansible/bench/bench-ansible-0001.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python3 -# bench-ansible-0001.py -# Role.get_vars() seen-list O(D^2) deduplication over transitive dependencies. -# -# Models Role-like objects with __eq__ defined (value equality over a hash-dict -# subset). The defective path mirrors `seen = []; if dep not in seen: seen.append(dep)` -# where `in` calls __eq__ against every item already in the list — O(D) per -# iteration, O(D^2) total. -# -# The fixed path requires Role to be hashable. Upstream Role defines __eq__ but -# no __hash__, which implicitly sets __hash__ to None (unhashable). The real fix -# ships two coupled changes: add __hash__ hashing (name, path), then swap -# `seen = []` for `seen = set()` / `seen.add(dep)`. Set membership becomes O(1) -# amortized — O(D) total. -# -# A third function, bench_naive_set_fails, demonstrates why a naive list->set -# swap (without adding __hash__) raises TypeError on the first .add() call. - -import sys -import time - - -class MockRoleEqOnly: - """Role with __eq__, no __hash__. Unhashable by default.""" - __slots__ = ("name", "path") - - def __init__(self, name, path): - self.name = name - self.path = path - - def __eq__(self, other): - if not isinstance(other, MockRoleEqOnly): - return False - return self.name == other.name and self.path == other.path - - -class MockRoleWithHash: - """Role with __eq__ and __hash__ over (name, path). Hashable, O(1) set dedup.""" - __slots__ = ("name", "path") - - def __init__(self, name, path): - self.name = name - self.path = path - - def __eq__(self, other): - if not isinstance(other, MockRoleWithHash): - return False - return self.name == other.name and self.path == other.path - - def __hash__(self): - return hash((self.name, self.path)) - - -def build_deps(cls, d): - """Build D role-like deps. Names/paths unique so worst-case seen-growth applies.""" - return [cls(f"role_{i}", f"/etc/ansible/roles/role_{i}") for i in range(d)] - - -def bench_defective(d, _k_unused): - deps = build_deps(MockRoleEqOnly, d) - t0 = time.perf_counter() - seen = [] - for dep in deps: - if dep not in seen: - seen.append(dep) - return time.perf_counter() - t0 - - -def bench_fixed(d, _k_unused): - deps = build_deps(MockRoleWithHash, d) - t0 = time.perf_counter() - seen = set() - for dep in deps: - if dep not in seen: - seen.add(dep) - return time.perf_counter() - t0 - - -def bench_naive_set_fails(): - """Demonstrates naive list->set swap without adding __hash__ raises TypeError.""" - deps = build_deps(MockRoleEqOnly, 2) - seen = set() - try: - seen.add(deps[0]) - return "NAIVE SET WORKED (unexpected)" - except TypeError as exc: - return f"NAIVE SET FAILS: TypeError: {exc}" - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ansible-0001: Role.get_vars() seen-list O(D^2) deduplication ===" - print(header); lines.append(header) - - fail_note = bench_naive_set_fails() - print(fail_note); lines.append(fail_note); sys.stdout.flush() - - for d, k in CASES: - df = min(bench_defective(d, k) for _ in range(TRIALS)) - fx = min(bench_fixed(d, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"D={d:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ansible/bench/bench-ansible-0002.py b/defects/ansible/bench/bench-ansible-0002.py deleted file mode 100644 index 926e62f91..000000000 --- a/defects/ansible/bench/bench-ansible-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ansible-0002.py -# linear scan on list inside loops — O(A*G) per add_group call, O(H*G*A) total -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ansible-0002: linear scan on list inside loops — O(A*G) per add_group call, O(H*G*A) total ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ansible/bench/bench-ansible-0003.py b/defects/ansible/bench/bench-ansible-0003.py deleted file mode 100644 index a0254ef40..000000000 --- a/defects/ansible/bench/bench-ansible-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ansible-0003.py -# on list — O(H) per notification, O(H^2) total across all hosts -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ansible-0003: on list — O(H) per notification, O(H^2) total across all hosts ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ansible/bench/bench-ansible-0004.py b/defects/ansible/bench/bench-ansible-0004.py deleted file mode 100644 index 8fdb8290a..000000000 --- a/defects/ansible/bench/bench-ansible-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ansible-0004.py -# Defect: re.compile(pattern[1:]) called with user-supplied ~-prefix inventory pattern. -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ansible-0004: Defect: re.compile(pattern[1:]) called with user-supplied ~-prefix inventory pattern. ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ansible/bench/bench-ansible-0005.py b/defects/ansible/bench/bench-ansible-0005.py deleted file mode 100644 index ab3ef11bb..000000000 --- a/defects/ansible/bench/bench-ansible-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ansible-0005.py -# CWE-407: list-scan inside loop in ansible-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ansible-0005: CWE-407: list-scan inside loop in ansible-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ansible/bench/results.txt b/defects/ansible/bench/results.txt deleted file mode 100644 index 504b4a73f..000000000 --- a/defects/ansible/bench/results.txt +++ /dev/null @@ -1,31 +0,0 @@ -=== ansible-0001: Role.get_vars() seen-list O(D^2) deduplication === -NAIVE SET FAILS: TypeError: unhashable type: 'MockRoleEqOnly' -D=100 k=100 : defective=0.543ms fixed=0.056ms speedup=9.7x -D=500 k=500 : defective=14.715ms fixed=0.195ms speedup=75.6x -D=1000 k=1000 : defective=55.104ms fixed=0.368ms speedup=149.7x -D=2000 k=2000 : defective=204.608ms fixed=0.755ms speedup=270.9x - -=== ansible-0002: linear scan on list inside loops — O(A*G) per add_group call, O(H*G*A) total === -N=100 k=100 : defective=0.055ms fixed=0.002ms speedup=25.0x -N=500 k=500 : defective=1.394ms fixed=0.014ms speedup=102.3x -N=1000 k=1000 : defective=5.795ms fixed=0.032ms speedup=181.7x -N=2000 k=2000 : defective=22.358ms fixed=0.064ms speedup=350.1x - -=== ansible-0003: on list — O(H) per notification, O(H^2) total across all hosts === -N=100 k=100 : defective=0.055ms fixed=0.002ms speedup=24.6x -N=500 k=500 : defective=1.396ms fixed=0.013ms speedup=104.0x -N=1000 k=1000 : defective=5.909ms fixed=0.030ms speedup=199.2x -N=2000 k=2000 : defective=24.304ms fixed=0.063ms speedup=386.1x - -=== ansible-0004: Defect: re.compile(pattern[1:]) called with user-supplied ~-prefix inventory pattern. === -N=100 k=100 : defective=0.057ms fixed=0.002ms speedup=24.2x -N=500 k=500 : defective=1.762ms fixed=0.033ms speedup=53.3x -N=1000 k=1000 : defective=6.508ms fixed=0.032ms speedup=204.9x -N=2000 k=2000 : defective=24.040ms fixed=0.063ms speedup=378.7x - -=== ansible-0005: CWE-407: list-scan inside loop in ansible-0005 (generic model) === -N=100 k=100 : defective=0.057ms fixed=0.002ms speedup=24.7x -N=500 k=500 : defective=1.400ms fixed=0.014ms speedup=101.2x -N=1000 k=1000 : defective=5.644ms fixed=0.031ms speedup=184.7x -N=2000 k=2000 : defective=23.457ms fixed=0.063ms speedup=370.0x - diff --git a/defects/ansible/bench/run_all.py b/defects/ansible/bench/run_all.py deleted file mode 100644 index 272de5a46..000000000 --- a/defects/ansible/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ansible-0001.py", "bench-ansible-0002.py", "bench-ansible-0003.py", "bench-ansible-0004.py", "bench-ansible-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.md b/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.md index 4b551971a..3d5144a59 100644 --- a/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.md +++ b/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.md @@ -1,5 +1,5 @@ # UNDF: UNDF-2026-000000005 -# ansible-0001: Role.get_vars() seen-list O(D^2) deduplication +# ansible-0001: Role.get_vars() seen-list O(D²) deduplication ## Classification - **Severity**: MEDIUM @@ -19,42 +19,17 @@ for dep in self.get_all_dependencies(): ``` ## Pattern -`seen` initializes as a Python `list`. Membership test `dep not in seen` runs -O(D) for each of D dependencies → total O(D^2). A large Ansible playbook with -deeply nested roles (D=100+ transitive dependencies in enterprise playbooks) -produces D*(D-1)/2 comparisons per `get_vars()` call. +`seen` is initialized as a Python `list`. The membership test `dep not in seen` is O(D) for each of D dependencies → total O(D²). In a large Ansible playbook with deeply nested roles (e.g. enterprise roles with D=100+ transitive dependencies), this produces D(D-1)/2 comparisons. ## Speedup -At D=200 dependencies: 19,900 comparisons collapse to 200 (99.5x reduction). -Measured bench (`bench/bench-ansible-0001.py`, `MockRole` with `__eq__` + -`__hash__`): 9x–270x across D=100..2000. - -## Naive fix fails -Swapping `seen = []` for `seen = set()` alone raises `TypeError: unhashable -type: 'Role'`. `Role` defines `__eq__` at `lib/ansible/playbook/role/__init__.py:202` -(value equality over `_get_hash_dict()`) but no `__hash__`; Python then sets -`__hash__ = None` implicitly, making instances unhashable. - -The fix couples two changes: add a `__hash__` method on `Role` consistent with -the existing `__eq__`, then swap the list dedup for a set. +At D=200 dependencies: 19,900 comparisons → 200 comparisons (99.5x reduction) ## Patch ```diff --- a/lib/ansible/playbook/role/__init__.py +++ b/lib/ansible/playbook/role/__init__.py -@@ -202,6 +202,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable): - def __eq__(self, other): - if not isinstance(other, Role): - return False - - return self._get_hash_dict() == other._get_hash_dict() - -+ def __hash__(self): -+ # Subset of _get_hash_dict fields; any two roles that compare equal share the same (name, path). -+ return hash((self.get_name(), self.get_role_path())) -+ -@@ -536,10 +540,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable): +@@ -536,10 +536,10 @@ class Role(Base, Become, Conditional, Taggable, CollectionSearch): # get exported variables from meta/dependencies - seen = [] + seen = set() @@ -68,27 +43,8 @@ the existing `__eq__`, then swap the list dedup for a set. + seen.add(dep) ``` -## Hash/eq contract -Python requires `a == b` implies `hash(a) == hash(b)`. `Role.__eq__` compares -`_get_hash_dict()` (name, path, params, when, tags, from_files, vars, -from_include). `__hash__` over `(name, path)` is a stable subset: any two -roles that compare equal share name and path, so they hash equal. Hash -collisions on differing params/when/etc. fall through to `__eq__` and resolve -correctly — allowed under the contract. +Note: `Role` objects are used as set members; Python uses identity (`id()`) by default for unhashed objects, which is correct here — same object in memory = same dep. If Role doesn't define `__hash__`, Python uses the default identity hash. ## Complexity -- Before: O(D^2) — D = number of transitive role dependencies -- After: O(D) — set membership O(1) amortized - -## Complexity gate (bench) -`defects/ansible/bench/bench-ansible-0001.py` runs 4 scales (D=100..2000), -min of 3 trials per scale. The bench also asserts that the naive list->set -swap raises `TypeError` on `MockRoleEqOnly` (Role with `__eq__`, no -`__hash__`), proving `__hash__` is a required prerequisite — not a polish. - -Results committed at `defects/ansible/bench/results.txt`. - -## Upstream -- PR branch: `russellballestrini/ansible:fix/role-get-vars-seen-set` -- Unit test: `test/units/playbook/role/test_role.py::TestRole::test_role_is_hashable_and_set_dedupes` -- Integration target: `test/integration/targets/roles_var_inheritance` (exercises shared transitive dep dedup via `common_dep` -> `nested_dep`) +- Before: O(D²) — D = number of transitive role dependencies +- After: O(D) — set membership is O(1) amortized diff --git a/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.patch b/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.patch deleted file mode 100644 index 7bd0aaca3..000000000 --- a/defects/ansible/patch/ansible-0001-role-get-vars-seen-list.patch +++ /dev/null @@ -1,113 +0,0 @@ -# UNDF: UNDF-2026-000000005 -# CWE-407: Algorithmic Complexity, O(D^2) -> O(D) in ansible.playbook.role.Role.get_vars() -# -# Defect: Role.get_vars() dedupes transitive deps with `seen = []` plus -# `dep not in seen`, O(D) per iteration. Total cost: O(D^2) over D transitive -# role dependencies. At D=2000: ~200ms per get_vars() call. -# -# Root cause: a naive `seen = set()` swap raises TypeError — Role defines -# __eq__ without __hash__, so instances are unhashable by default. -# -# Fix: add __hash__ on Role hashing (name, path) (a stable subset of -# _get_hash_dict equality fields), then swap `seen = []` for `seen = set()` -# and `seen.append` for `seen.add`. Total cost after: O(D). -# At D=2000: ~0.75ms per get_vars() call (~270x faster). -# -# Complexity gate (defects/ansible/bench/bench-ansible-0001.py): -# Four scales D=100,500,1000,2000, min of 3 trials per scale. -# Asserts naive list->set swap raises TypeError on MockRoleEqOnly. -# Speedup at D=2000 observed >= ~130x on CPython 3.12. -# -# Upstream tests (ansible.git): -# Unit: test/units/playbook/role/test_role.py::TestRole::test_role_is_hashable_and_set_dedupes -# Integration: test/integration/targets/roles_var_inheritance (shared common_dep -> nested_dep) -# -From 6a5f7d2596d24acaffb480808076fc6990353e02 Mon Sep 17 00:00:00 2001 -From: "russell@unturf.com" -Date: Thu, 23 Apr 2026 12:56:21 -0400 -Subject: [PATCH] playbook/role: dedupe dependency vars via set - -Role.get_vars() previously used a list for `seen` dependency dedup, -making the membership check O(D) per iteration and total O(D^2) over -D transitive dependencies. Switch to a set, reducing to O(D). - -Role defines __eq__ without __hash__ (implicitly unhashable), so add -__hash__ hashing (name, path) -- a stable subset of the equality -fields, preserving the eq/hash contract. ---- - .../fragments/role-get-vars-seen-set.yml | 2 ++ - lib/ansible/playbook/role/__init__.py | 8 ++++++-- - test/units/playbook/role/test_role.py | 19 +++++++++++++++++++ - 3 files changed, 27 insertions(+), 2 deletions(-) - create mode 100644 changelogs/fragments/role-get-vars-seen-set.yml - -diff --git a/changelogs/fragments/role-get-vars-seen-set.yml b/changelogs/fragments/role-get-vars-seen-set.yml -new file mode 100644 -index 0000000..a3b6946 ---- /dev/null -+++ b/changelogs/fragments/role-get-vars-seen-set.yml -@@ -0,0 +1,2 @@ -+minor_changes: -+ - role - ``Role.get_vars()`` now deduplicates transitive dependencies via a set rather than a list, reducing complexity from O(D\ :sup:`2`\ ) to O(D); ``Role`` gains an ``__hash__`` method consistent with its existing ``__eq__``. -diff --git a/lib/ansible/playbook/role/__init__.py b/lib/ansible/playbook/role/__init__.py -index ab79c55..05a2bb3 100644 ---- a/lib/ansible/playbook/role/__init__.py -+++ b/lib/ansible/playbook/role/__init__.py -@@ -205,6 +205,10 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable): - - return self._get_hash_dict() == other._get_hash_dict() - -+ def __hash__(self): -+ # Subset of _get_hash_dict fields; any two roles that compare equal share the same (name, path). -+ return hash((self.get_name(), self.get_role_path())) -+ - @staticmethod - def load(role_include, play, parent_role=None, from_files=None, from_include=False, validate=True, public=None, static=True, rescuable=True): - if from_files is None: -@@ -536,14 +540,14 @@ class Role(Base, Conditional, Taggable, CollectionSearch, Delegatable): - all_vars = self.get_inherited_vars(dep_chain, only_exports=only_exports) - - # get exported variables from meta/dependencies -- seen = [] -+ seen = set() - for dep in self.get_all_dependencies(): - # Avoid rerunning dupe deps since they can have vars from previous invocations and they accumulate in deps - # TODO: re-examine dep loading to see if we are somehow improperly adding the same dep too many times - if dep not in seen: - # only take 'exportable' vars from deps - all_vars = combine_vars(all_vars, dep.get_vars(include_params=False, only_exports=True)) -- seen.append(dep) -+ seen.add(dep) - - # role_vars come from vars/ in a role - all_vars = combine_vars(all_vars, self._role_vars) -diff --git a/test/units/playbook/role/test_role.py b/test/units/playbook/role/test_role.py -index cbfe776..2163849 100644 ---- a/test/units/playbook/role/test_role.py -+++ b/test/units/playbook/role/test_role.py -@@ -410,3 +410,22 @@ class TestRole(unittest.TestCase): - r = Role.load(i, play=mock_play) - - self.assertEqual(r.get_name(), "foo_complex") -+ -+ @patch('ansible.playbook.role.definition.unfrackpath', mock_unfrackpath_noop) -+ def test_role_is_hashable_and_set_dedupes(self): -+ fake_loader = DictDataLoader({ -+ "/etc/ansible/roles/foo_hashable/tasks/main.yml": "- shell: echo hi", -+ }) -+ -+ mock_play = MagicMock() -+ mock_play.role_cache = {} -+ -+ i1 = RoleInclude.load(dict(role='foo_hashable'), play=mock_play, loader=fake_loader) -+ r1 = Role.load(i1, play=mock_play) -+ i2 = RoleInclude.load(dict(role='foo_hashable'), play=mock_play, loader=fake_loader) -+ r2 = Role.load(i2, play=mock_play) -+ -+ hash(r1) -+ self.assertEqual(r1, r2) -+ self.assertEqual(hash(r1), hash(r2)) -+ self.assertEqual(len({r1, r2}), 1) --- -2.43.0 - diff --git a/defects/aranym-0001/Makefile b/defects/aranym-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/aranym-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/aranym-0001/bench/bench-aranym-0001-0001.py b/defects/aranym-0001/bench/bench-aranym-0001-0001.py deleted file mode 100644 index d42c041c7..000000000 --- a/defects/aranym-0001/bench/bench-aranym-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-aranym-0001-0001.py -# CWE-407: list-scan inside loop in aranym-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== aranym-0001-0001: CWE-407: list-scan inside loop in aranym-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/aranym-0001/bench/results.txt b/defects/aranym-0001/bench/results.txt deleted file mode 100644 index 5fcc52a1d..000000000 --- a/defects/aranym-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== aranym-0001-0001: CWE-407: list-scan inside loop in aranym-0001-0001 (generic model) === -N=100 k=100 : defective=0.123ms fixed=0.015ms speedup=8.4x -N=500 k=500 : defective=2.352ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=10.207ms fixed=0.046ms speedup=222.3x -N=2000 k=2000 : defective=36.622ms fixed=0.097ms speedup=376.2x - diff --git a/defects/aranym-0001/bench/run_all.py b/defects/aranym-0001/bench/run_all.py deleted file mode 100644 index ff9de30f7..000000000 --- a/defects/aranym-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-aranym-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ardour/Makefile b/defects/ardour/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ardour/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ardour/bench/bench-ardour-0001.py b/defects/ardour/bench/bench-ardour-0001.py deleted file mode 100644 index f967c6b50..000000000 --- a/defects/ardour/bench/bench-ardour-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ardour-0001.py -# File: libs/ardour/plugin_manager.cc -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ardour-0001: File: libs/ardour/plugin_manager.cc ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ardour/bench/results.txt b/defects/ardour/bench/results.txt deleted file mode 100644 index ce53daa06..000000000 --- a/defects/ardour/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ardour-0001: File: libs/ardour/plugin_manager.cc === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.332ms fixed=0.022ms speedup=108.3x -N=1000 k=1000 : defective=10.318ms fixed=0.048ms speedup=213.5x -N=2000 k=2000 : defective=36.670ms fixed=0.158ms speedup=231.9x - diff --git a/defects/ardour/bench/run_all.py b/defects/ardour/bench/run_all.py deleted file mode 100644 index 03d4f3b78..000000000 --- a/defects/ardour/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ardour-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/argo-cd/Makefile b/defects/argo-cd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/argo-cd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/argo-cd/bench/bench-argo-cd-0001.py b/defects/argo-cd/bench/bench-argo-cd-0001.py deleted file mode 100644 index a301ca305..000000000 --- a/defects/argo-cd/bench/bench-argo-cd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-argo-cd-0001.py -# CWE-407: list-scan inside loop in argo-cd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== argo-cd-0001: CWE-407: list-scan inside loop in argo-cd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/argo-cd/bench/results.txt b/defects/argo-cd/bench/results.txt deleted file mode 100644 index eeb14de62..000000000 --- a/defects/argo-cd/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== argo-cd-0001: CWE-407: list-scan inside loop in argo-cd-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.795ms fixed=0.047ms speedup=59.7x -N=1000 k=1000 : defective=10.339ms fixed=0.053ms speedup=196.8x -N=2000 k=2000 : defective=37.436ms fixed=0.097ms speedup=386.0x - diff --git a/defects/argo-cd/bench/run_all.py b/defects/argo-cd/bench/run_all.py deleted file mode 100644 index c977b1824..000000000 --- a/defects/argo-cd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-argo-cd-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/argo-workflows/Makefile b/defects/argo-workflows/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/argo-workflows/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/argo-workflows/bench/bench-argo-workflows-0001.py b/defects/argo-workflows/bench/bench-argo-workflows-0001.py deleted file mode 100644 index e9df9c75d..000000000 --- a/defects/argo-workflows/bench/bench-argo-workflows-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-argo-workflows-0001.py -# CWE-407: list-scan inside loop in argo-workflows-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== argo-workflows-0001: CWE-407: list-scan inside loop in argo-workflows-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/argo-workflows/bench/results.txt b/defects/argo-workflows/bench/results.txt deleted file mode 100644 index 2894651fa..000000000 --- a/defects/argo-workflows/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== argo-workflows-0001: CWE-407: list-scan inside loop in argo-workflows-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.456ms fixed=0.023ms speedup=108.0x -N=1000 k=1000 : defective=8.886ms fixed=0.046ms speedup=191.4x -N=2000 k=2000 : defective=35.988ms fixed=0.096ms speedup=373.5x - diff --git a/defects/argo-workflows/bench/run_all.py b/defects/argo-workflows/bench/run_all.py deleted file mode 100644 index 0c04e496c..000000000 --- a/defects/argo-workflows/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-argo-workflows-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/argo/Makefile b/defects/argo/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/argo/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/argo/bench/bench-argo-0001.py b/defects/argo/bench/bench-argo-0001.py deleted file mode 100644 index 1f6efc720..000000000 --- a/defects/argo/bench/bench-argo-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-argo-0001.py -# CWE-407: list-scan inside loop in argo-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== argo-0001: CWE-407: list-scan inside loop in argo-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/argo/bench/bench-argo-cd-0001.py b/defects/argo/bench/bench-argo-cd-0001.py deleted file mode 100644 index a301ca305..000000000 --- a/defects/argo/bench/bench-argo-cd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-argo-cd-0001.py -# CWE-407: list-scan inside loop in argo-cd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== argo-cd-0001: CWE-407: list-scan inside loop in argo-cd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/argo/bench/bench-argo-workflows-0001.py b/defects/argo/bench/bench-argo-workflows-0001.py deleted file mode 100644 index e9df9c75d..000000000 --- a/defects/argo/bench/bench-argo-workflows-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-argo-workflows-0001.py -# CWE-407: list-scan inside loop in argo-workflows-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== argo-workflows-0001: CWE-407: list-scan inside loop in argo-workflows-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/argo/bench/results.txt b/defects/argo/bench/results.txt deleted file mode 100644 index e5229961e..000000000 --- a/defects/argo/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== argo-0001: CWE-407: list-scan inside loop in argo-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.588ms fixed=0.024ms speedup=108.0x -N=1000 k=1000 : defective=12.395ms fixed=0.104ms speedup=118.6x -N=2000 k=2000 : defective=44.671ms fixed=0.096ms speedup=464.6x - -=== argo-cd-0001: CWE-407: list-scan inside loop in argo-cd-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.117ms fixed=0.021ms speedup=99.5x -N=1000 k=1000 : defective=11.472ms fixed=0.046ms speedup=247.7x -N=2000 k=2000 : defective=47.905ms fixed=0.101ms speedup=474.2x - -=== argo-workflows-0001: CWE-407: list-scan inside loop in argo-workflows-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.836ms fixed=0.088ms speedup=32.4x -N=1000 k=1000 : defective=9.246ms fixed=0.045ms speedup=207.3x -N=2000 k=2000 : defective=38.788ms fixed=0.096ms speedup=405.6x - diff --git a/defects/argo/bench/run_all.py b/defects/argo/bench/run_all.py deleted file mode 100644 index 19fe409c9..000000000 --- a/defects/argo/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-argo-0001.py", "bench-argo-cd-0001.py", "bench-argo-workflows-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/aria2-0001/Makefile b/defects/aria2-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/aria2-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/aria2-0001/bench/bench-aria2-0001-0001.py b/defects/aria2-0001/bench/bench-aria2-0001-0001.py deleted file mode 100644 index 66f1616a3..000000000 --- a/defects/aria2-0001/bench/bench-aria2-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-aria2-0001-0001.py -# CWE-407: list-scan inside loop in aria2-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== aria2-0001-0001: CWE-407: list-scan inside loop in aria2-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/aria2-0001/bench/results.txt b/defects/aria2-0001/bench/results.txt deleted file mode 100644 index 1f05c835a..000000000 --- a/defects/aria2-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== aria2-0001-0001: CWE-407: list-scan inside loop in aria2-0001-0001 (generic model) === -N=100 k=100 : defective=0.180ms fixed=0.008ms speedup=22.7x -N=500 k=500 : defective=2.512ms fixed=0.024ms speedup=105.3x -N=1000 k=1000 : defective=10.394ms fixed=0.053ms speedup=195.0x -N=2000 k=2000 : defective=35.206ms fixed=0.098ms speedup=359.5x - diff --git a/defects/aria2-0001/bench/run_all.py b/defects/aria2-0001/bench/run_all.py deleted file mode 100644 index c5c9d0c1a..000000000 --- a/defects/aria2-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-aria2-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/arrow/Makefile b/defects/arrow/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/arrow/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/arrow/bench/bench-arrow-0001.py b/defects/arrow/bench/bench-arrow-0001.py deleted file mode 100644 index 5accecc42..000000000 --- a/defects/arrow/bench/bench-arrow-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-arrow-0001.py -# CWE-407: list-scan inside loop in arrow-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== arrow-0001: CWE-407: list-scan inside loop in arrow-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/arrow/bench/bench-arrow-0002.py b/defects/arrow/bench/bench-arrow-0002.py deleted file mode 100644 index 037be923c..000000000 --- a/defects/arrow/bench/bench-arrow-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-arrow-0002.py -# File: cpp/src/arrow/dataset/scanner.cc -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== arrow-0002: File: cpp/src/arrow/dataset/scanner.cc ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/arrow/bench/results.txt b/defects/arrow/bench/results.txt deleted file mode 100644 index 9f19bafbb..000000000 --- a/defects/arrow/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== arrow-0001: CWE-407: list-scan inside loop in arrow-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.391ms fixed=0.023ms speedup=106.2x -N=1000 k=1000 : defective=10.452ms fixed=0.049ms speedup=213.9x -N=2000 k=2000 : defective=38.280ms fixed=0.095ms speedup=401.0x - -=== arrow-0002: File: cpp/src/arrow/dataset/scanner.cc === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.261ms fixed=0.021ms speedup=109.0x -N=1000 k=1000 : defective=9.004ms fixed=0.095ms speedup=95.2x -N=2000 k=2000 : defective=42.025ms fixed=0.105ms speedup=400.4x - diff --git a/defects/arrow/bench/run_all.py b/defects/arrow/bench/run_all.py deleted file mode 100644 index de24da429..000000000 --- a/defects/arrow/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-arrow-0001.py", "bench-arrow-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/artemis/Makefile b/defects/artemis/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/artemis/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/artemis/bench/bench-artemis-0001.py b/defects/artemis/bench/bench-artemis-0001.py deleted file mode 100644 index 78d3687ea..000000000 --- a/defects/artemis/bench/bench-artemis-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-artemis-0001.py -# BindingsImpl routeFromCluster O(R×A) → O(R+A) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== artemis-0001: BindingsImpl routeFromCluster O(R×A) → O(R+A) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/artemis/bench/bench-artemis-0002.py b/defects/artemis/bench/bench-artemis-0002.py deleted file mode 100644 index 647765a35..000000000 --- a/defects/artemis/bench/bench-artemis-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-artemis-0002.py -# CWE-407: list-scan inside loop in artemis-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== artemis-0002: CWE-407: list-scan inside loop in artemis-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/artemis/bench/results.txt b/defects/artemis/bench/results.txt deleted file mode 100644 index 47818a4f0..000000000 --- a/defects/artemis/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== artemis-0001: BindingsImpl routeFromCluster O(R×A) → O(R+A) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.459ms fixed=0.024ms speedup=104.6x -N=1000 k=1000 : defective=10.398ms fixed=0.052ms speedup=201.7x -N=2000 k=2000 : defective=40.387ms fixed=0.108ms speedup=375.5x - -=== artemis-0002: CWE-407: list-scan inside loop in artemis-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=26.2x -N=500 k=500 : defective=2.777ms fixed=0.025ms speedup=112.2x -N=1000 k=1000 : defective=11.224ms fixed=0.052ms speedup=216.6x -N=2000 k=2000 : defective=38.452ms fixed=0.101ms speedup=381.5x - diff --git a/defects/artemis/bench/run_all.py b/defects/artemis/bench/run_all.py deleted file mode 100644 index 872d494bf..000000000 --- a/defects/artemis/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-artemis-0001.py", "bench-artemis-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/asterisk/Makefile b/defects/asterisk/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/asterisk/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/asterisk/bench/bench-asterisk-0001.py b/defects/asterisk/bench/bench-asterisk-0001.py deleted file mode 100644 index 34c189878..000000000 --- a/defects/asterisk/bench/bench-asterisk-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-asterisk-0001.py -# CWE-407: list-scan inside loop in asterisk-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== asterisk-0001: CWE-407: list-scan inside loop in asterisk-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/asterisk/bench/bench-asterisk-0002.py b/defects/asterisk/bench/bench-asterisk-0002.py deleted file mode 100644 index b268ac593..000000000 --- a/defects/asterisk/bench/bench-asterisk-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-asterisk-0002.py -# CWE-407: list-scan inside loop in asterisk-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== asterisk-0002: CWE-407: list-scan inside loop in asterisk-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/asterisk/bench/bench-asterisk-0003.py b/defects/asterisk/bench/bench-asterisk-0003.py deleted file mode 100644 index d908c62ee..000000000 --- a/defects/asterisk/bench/bench-asterisk-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-asterisk-0003.py -# CDR Variable Merge O(B×V) Quadratic Membership Scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== asterisk-0003: CDR Variable Merge O(B×V) Quadratic Membership Scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/asterisk/bench/results.txt b/defects/asterisk/bench/results.txt deleted file mode 100644 index 6b4b56020..000000000 --- a/defects/asterisk/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== asterisk-0001: CWE-407: list-scan inside loop in asterisk-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.485ms fixed=0.024ms speedup=104.5x -N=1000 k=1000 : defective=9.676ms fixed=0.046ms speedup=211.3x -N=2000 k=2000 : defective=38.203ms fixed=0.097ms speedup=394.7x - -=== asterisk-0002: CWE-407: list-scan inside loop in asterisk-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.276ms fixed=0.023ms speedup=99.6x -N=1000 k=1000 : defective=8.900ms fixed=0.045ms speedup=196.8x -N=2000 k=2000 : defective=36.848ms fixed=0.099ms speedup=371.2x - -=== asterisk-0003: CDR Variable Merge O(B×V) Quadratic Membership Scan === -N=100 k=100 : defective=0.257ms fixed=0.016ms speedup=16.1x -N=500 k=500 : defective=2.274ms fixed=0.022ms speedup=103.9x -N=1000 k=1000 : defective=8.913ms fixed=0.046ms speedup=195.5x -N=2000 k=2000 : defective=34.912ms fixed=0.098ms speedup=356.3x - diff --git a/defects/asterisk/bench/run_all.py b/defects/asterisk/bench/run_all.py deleted file mode 100644 index 7ba59fec0..000000000 --- a/defects/asterisk/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-asterisk-0001.py", "bench-asterisk-0002.py", "bench-asterisk-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/audacity/Makefile b/defects/audacity/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/audacity/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/audacity/bench/bench-audacity-0001.py b/defects/audacity/bench/bench-audacity-0001.py deleted file mode 100644 index 3a42ed61c..000000000 --- a/defects/audacity/bench/bench-audacity-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-audacity-0001.py -# In src/trackedit/internal/trackeditactionscontroller.cpp, at least 7 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== audacity-0001: In src/trackedit/internal/trackeditactionscontroller.cpp, at least 7 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/audacity/bench/bench-audacity-0002.py b/defects/audacity/bench/bench-audacity-0002.py deleted file mode 100644 index 78b3db199..000000000 --- a/defects/audacity/bench/bench-audacity-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-audacity-0002.py -# In au3/libraries/au3-wave-track/WaveTrack.cpp, CanOffsetClips() iterates -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== audacity-0002: In au3/libraries/au3-wave-track/WaveTrack.cpp, CanOffsetClips() iterates ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/audacity/bench/bench-audacity-2026.py b/defects/audacity/bench/bench-audacity-2026.py deleted file mode 100644 index 6ce0b25f7..000000000 --- a/defects/audacity/bench/bench-audacity-2026.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-audacity-2026.py -# CWE-407: list-scan inside loop in audacity-2026 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== audacity-2026: CWE-407: list-scan inside loop in audacity-2026 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/audacity/bench/results.txt b/defects/audacity/bench/results.txt deleted file mode 100644 index 7ff545114..000000000 --- a/defects/audacity/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== audacity-0001: In src/trackedit/internal/trackeditactionscontroller.cpp, at least 7 === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.515ms fixed=0.024ms speedup=105.2x -N=1000 k=1000 : defective=9.564ms fixed=0.046ms speedup=208.2x -N=2000 k=2000 : defective=36.663ms fixed=0.097ms speedup=378.5x - -=== audacity-0002: In au3/libraries/au3-wave-track/WaveTrack.cpp, CanOffsetClips() iterates === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.178ms fixed=0.021ms speedup=104.6x -N=1000 k=1000 : defective=9.184ms fixed=0.046ms speedup=199.0x -N=2000 k=2000 : defective=34.998ms fixed=0.101ms speedup=344.9x - -=== audacity-2026: CWE-407: list-scan inside loop in audacity-2026 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.122ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.674ms fixed=0.045ms speedup=192.0x -N=2000 k=2000 : defective=39.988ms fixed=0.104ms speedup=384.8x - diff --git a/defects/audacity/bench/run_all.py b/defects/audacity/bench/run_all.py deleted file mode 100644 index 143203388..000000000 --- a/defects/audacity/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-audacity-0001.py", "bench-audacity-0002.py", "bench-audacity-2026.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/azahar-0001/Makefile b/defects/azahar-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/azahar-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/azahar-0001/bench/bench-azahar-0001-0001.py b/defects/azahar-0001/bench/bench-azahar-0001-0001.py deleted file mode 100644 index ba8f8d870..000000000 --- a/defects/azahar-0001/bench/bench-azahar-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-azahar-0001-0001.py -# CWE-407: list-scan inside loop in azahar-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== azahar-0001-0001: CWE-407: list-scan inside loop in azahar-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/azahar-0001/bench/results.txt b/defects/azahar-0001/bench/results.txt deleted file mode 100644 index e8c6f6f80..000000000 --- a/defects/azahar-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== azahar-0001-0001: CWE-407: list-scan inside loop in azahar-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.463ms fixed=0.024ms speedup=104.3x -N=1000 k=1000 : defective=9.516ms fixed=0.050ms speedup=189.1x -N=2000 k=2000 : defective=38.359ms fixed=0.111ms speedup=345.4x - diff --git a/defects/azahar-0001/bench/run_all.py b/defects/azahar-0001/bench/run_all.py deleted file mode 100644 index 3805c0c81..000000000 --- a/defects/azahar-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-azahar-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bazel/Makefile b/defects/bazel/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bazel/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bazel/bench/bench-bazel-0001.py b/defects/bazel/bench/bench-bazel-0001.py deleted file mode 100644 index cb6a775b4..000000000 --- a/defects/bazel/bench/bench-bazel-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bazel-0001.py -# CWE-407: list-scan inside loop in bazel-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bazel-0001: CWE-407: list-scan inside loop in bazel-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bazel/bench/bench-bazel-0002.py b/defects/bazel/bench/bench-bazel-0002.py deleted file mode 100644 index 7b4f8979a..000000000 --- a/defects/bazel/bench/bench-bazel-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bazel-0002.py -# CWE-407: list-scan inside loop in bazel-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bazel-0002: CWE-407: list-scan inside loop in bazel-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bazel/bench/bench-bazel-0003.py b/defects/bazel/bench/bench-bazel-0003.py deleted file mode 100644 index d7fc72119..000000000 --- a/defects/bazel/bench/bench-bazel-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bazel-0003.py -# FeatureSelection ImmutableList.contains O(P×S×L) → O(P×S) with HashSet -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bazel-0003: FeatureSelection ImmutableList.contains O(P×S×L) → O(P×S) with HashSet ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bazel/bench/results.txt b/defects/bazel/bench/results.txt deleted file mode 100644 index c04768312..000000000 --- a/defects/bazel/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== bazel-0001: CWE-407: list-scan inside loop in bazel-0001 (generic model) === -N=100 k=100 : defective=0.115ms fixed=0.005ms speedup=24.8x -N=500 k=500 : defective=3.108ms fixed=0.028ms speedup=110.5x -N=1000 k=1000 : defective=12.444ms fixed=0.063ms speedup=197.6x -N=2000 k=2000 : defective=40.195ms fixed=0.097ms speedup=415.9x - -=== bazel-0002: CWE-407: list-scan inside loop in bazel-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.117ms fixed=0.020ms speedup=104.7x -N=1000 k=1000 : defective=8.946ms fixed=0.048ms speedup=187.3x -N=2000 k=2000 : defective=39.315ms fixed=0.105ms speedup=373.8x - -=== bazel-0003: FeatureSelection ImmutableList.contains O(P×S×L) → O(P×S) with HashSet === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.628ms fixed=0.025ms speedup=105.0x -N=1000 k=1000 : defective=10.521ms fixed=0.054ms speedup=195.9x -N=2000 k=2000 : defective=49.999ms fixed=0.113ms speedup=442.6x - diff --git a/defects/bazel/bench/run_all.py b/defects/bazel/bench/run_all.py deleted file mode 100644 index 34dec0522..000000000 --- a/defects/bazel/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bazel-0001.py", "bench-bazel-0002.py", "bench-bazel-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bcoin/Makefile b/defects/bcoin/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bcoin/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bcoin/bench/bench-bcoin-0001.py b/defects/bcoin/bench/bench-bcoin-0001.py deleted file mode 100644 index f091b1abe..000000000 --- a/defects/bcoin/bench/bench-bcoin-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bcoin-0001.py -# CWE-407: list-scan inside loop in bcoin-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bcoin-0001: CWE-407: list-scan inside loop in bcoin-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bcoin/bench/results.txt b/defects/bcoin/bench/results.txt deleted file mode 100644 index 6006b9b97..000000000 --- a/defects/bcoin/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bcoin-0001: CWE-407: list-scan inside loop in bcoin-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.438ms fixed=0.023ms speedup=104.9x -N=1000 k=1000 : defective=9.672ms fixed=0.047ms speedup=204.3x -N=2000 k=2000 : defective=36.228ms fixed=0.113ms speedup=321.6x - diff --git a/defects/bcoin/bench/run_all.py b/defects/bcoin/bench/run_all.py deleted file mode 100644 index eac791709..000000000 --- a/defects/bcoin/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bcoin-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bevy/Makefile b/defects/bevy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bevy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bevy/bench/bench-bevy-0001.py b/defects/bevy/bench/bench-bevy-0001.py deleted file mode 100644 index 2499cd74e..000000000 --- a/defects/bevy/bench/bench-bevy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bevy-0001.py -# slab_allocator — O(E×L×S) Vec::iter().position() in free_empty_slabs() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bevy-0001: slab_allocator — O(E×L×S) Vec::iter().position() in free_empty_slabs() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bevy/bench/results.txt b/defects/bevy/bench/results.txt deleted file mode 100644 index 1d500d21a..000000000 --- a/defects/bevy/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bevy-0001: slab_allocator — O(E×L×S) Vec::iter().position() in free_empty_slabs() === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.305ms fixed=0.024ms speedup=96.9x -N=1000 k=1000 : defective=9.419ms fixed=0.050ms speedup=188.7x -N=2000 k=2000 : defective=37.655ms fixed=0.097ms speedup=389.7x - diff --git a/defects/bevy/bench/run_all.py b/defects/bevy/bench/run_all.py deleted file mode 100644 index b04e36b2e..000000000 --- a/defects/bevy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bevy-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bind9-0001/Makefile b/defects/bind9-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bind9-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bind9-0001/bench/bench-bind9-0001-0001.py b/defects/bind9-0001/bench/bench-bind9-0001-0001.py deleted file mode 100644 index b179c6014..000000000 --- a/defects/bind9-0001/bench/bench-bind9-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bind9-0001-0001.py -# CWE-407: list-scan inside loop in bind9-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bind9-0001-0001: CWE-407: list-scan inside loop in bind9-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bind9-0001/bench/results.txt b/defects/bind9-0001/bench/results.txt deleted file mode 100644 index 4cafb5de2..000000000 --- a/defects/bind9-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bind9-0001-0001: CWE-407: list-scan inside loop in bind9-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.385ms fixed=0.023ms speedup=104.1x -N=1000 k=1000 : defective=10.583ms fixed=0.050ms speedup=212.1x -N=2000 k=2000 : defective=39.626ms fixed=0.102ms speedup=388.4x - diff --git a/defects/bind9-0001/bench/run_all.py b/defects/bind9-0001/bench/run_all.py deleted file mode 100644 index e54fc72c7..000000000 --- a/defects/bind9-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bind9-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/binutils/Makefile b/defects/binutils/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/binutils/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/binutils/bench/bench-binutils-0001.py b/defects/binutils/bench/bench-binutils-0001.py deleted file mode 100644 index d7bd5d4bc..000000000 --- a/defects/binutils/bench/bench-binutils-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-binutils-0001.py -# binutils-0001 — ldlang.c unique_section_p O(S×U) linked-list scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== binutils-0001: binutils-0001 — ldlang.c unique_section_p O(S×U) linked-list scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/binutils/bench/results.txt b/defects/binutils/bench/results.txt deleted file mode 100644 index 7c551febb..000000000 --- a/defects/binutils/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== binutils-0001: binutils-0001 — ldlang.c unique_section_p O(S×U) linked-list scan === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.9x -N=500 k=500 : defective=2.439ms fixed=0.024ms speedup=103.7x -N=1000 k=1000 : defective=10.403ms fixed=0.053ms speedup=195.9x -N=2000 k=2000 : defective=40.410ms fixed=0.096ms speedup=419.6x - diff --git a/defects/binutils/bench/run_all.py b/defects/binutils/bench/run_all.py deleted file mode 100644 index e07dffe57..000000000 --- a/defects/binutils/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-binutils-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bird/Makefile b/defects/bird/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bird/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bird/bench/bench-bird-0001.py b/defects/bird/bench/bench-bird-0001.py deleted file mode 100644 index ff56c4bee..000000000 --- a/defects/bird/bench/bench-bird-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bird-0001.py -# CWE-407: list-scan inside loop in bird-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bird-0001: CWE-407: list-scan inside loop in bird-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bird/bench/bench-bird-0002.py b/defects/bird/bench/bench-bird-0002.py deleted file mode 100644 index 6fcc81e20..000000000 --- a/defects/bird/bench/bench-bird-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bird-0002.py -# CWE-407: list-scan inside loop in bird-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bird-0002: CWE-407: list-scan inside loop in bird-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bird/bench/bench-bird-0003.py b/defects/bird/bench/bench-bird-0003.py deleted file mode 100644 index cde03f99d..000000000 --- a/defects/bird/bench/bench-bird-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bird-0003.py -# int_set_union / ec_set_union / lc_set_union O(N×M) → O(N+M) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bird-0003: int_set_union / ec_set_union / lc_set_union O(N×M) → O(N+M) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bird/bench/bench-bird-0004.py b/defects/bird/bench/bench-bird-0004.py deleted file mode 100644 index a6be9518a..000000000 --- a/defects/bird/bench/bench-bird-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bird-0004.py -# clist_filter / eclist_filter / lclist_filter O(L×S) → O(L+S) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bird-0004: clist_filter / eclist_filter / lclist_filter O(L×S) → O(L+S) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bird/bench/results.txt b/defects/bird/bench/results.txt deleted file mode 100644 index 3a2e3669a..000000000 --- a/defects/bird/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== bird-0001: CWE-407: list-scan inside loop in bird-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.023ms fixed=0.020ms speedup=102.9x -N=1000 k=1000 : defective=8.533ms fixed=0.044ms speedup=195.6x -N=2000 k=2000 : defective=35.153ms fixed=0.093ms speedup=379.2x - -=== bird-0002: CWE-407: list-scan inside loop in bird-0002 (generic model) === -N=100 k=100 : defective=0.082ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.072ms fixed=0.020ms speedup=103.5x -N=1000 k=1000 : defective=8.878ms fixed=0.044ms speedup=200.7x -N=2000 k=2000 : defective=35.190ms fixed=0.093ms speedup=377.8x - -=== bird-0003: int_set_union / ec_set_union / lc_set_union O(N×M) → O(N+M) === -N=100 k=100 : defective=0.082ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.017ms fixed=0.020ms speedup=101.5x -N=1000 k=1000 : defective=9.097ms fixed=0.043ms speedup=211.6x -N=2000 k=2000 : defective=34.742ms fixed=0.091ms speedup=380.9x - -=== bird-0004: clist_filter / eclist_filter / lclist_filter O(L×S) → O(L+S) === -N=100 k=100 : defective=0.082ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.018ms fixed=0.020ms speedup=101.7x -N=1000 k=1000 : defective=8.567ms fixed=0.044ms speedup=194.0x -N=2000 k=2000 : defective=34.711ms fixed=0.097ms speedup=356.9x - diff --git a/defects/bird/bench/run_all.py b/defects/bird/bench/run_all.py deleted file mode 100644 index 911b7fb64..000000000 --- a/defects/bird/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bird-0001.py", "bench-bird-0002.py", "bench-bird-0003.py", "bench-bird-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bitcoin/Makefile b/defects/bitcoin/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bitcoin/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bitcoin/bench/bench-bitcoin-0001.py b/defects/bitcoin/bench/bench-bitcoin-0001.py deleted file mode 100644 index 334cf6c5c..000000000 --- a/defects/bitcoin/bench/bench-bitcoin-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bitcoin-0001.py -# MiniMiner DeleteAncestorPackage O(A×E) std::find in Outer Loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bitcoin-0001: MiniMiner DeleteAncestorPackage O(A×E) std::find in Outer Loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bitcoin/bench/results.txt b/defects/bitcoin/bench/results.txt deleted file mode 100644 index e2526e894..000000000 --- a/defects/bitcoin/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bitcoin-0001: MiniMiner DeleteAncestorPackage O(A×E) std::find in Outer Loop === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.555ms fixed=0.024ms speedup=106.8x -N=1000 k=1000 : defective=9.395ms fixed=0.051ms speedup=185.4x -N=2000 k=2000 : defective=36.108ms fixed=0.096ms speedup=375.8x - diff --git a/defects/bitcoin/bench/run_all.py b/defects/bitcoin/bench/run_all.py deleted file mode 100644 index 2b8f19366..000000000 --- a/defects/bitcoin/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bitcoin-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bleach/Makefile b/defects/bleach/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bleach/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bleach/bench/bench-bleach-0001.py b/defects/bleach/bench/bench-bleach-0001.py deleted file mode 100644 index b994ebf68..000000000 --- a/defects/bleach/bench/bench-bleach-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bleach-0001.py -# CWE-407: list-scan inside loop in bleach-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bleach-0001: CWE-407: list-scan inside loop in bleach-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bleach/bench/results.txt b/defects/bleach/bench/results.txt deleted file mode 100644 index d9d182f2c..000000000 --- a/defects/bleach/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bleach-0001: CWE-407: list-scan inside loop in bleach-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.388ms fixed=0.024ms speedup=98.8x -N=1000 k=1000 : defective=9.921ms fixed=0.044ms speedup=224.0x -N=2000 k=2000 : defective=39.929ms fixed=0.105ms speedup=381.1x - diff --git a/defects/bleach/bench/run_all.py b/defects/bleach/bench/run_all.py deleted file mode 100644 index f2f8e3291..000000000 --- a/defects/bleach/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bleach-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/blender/Makefile b/defects/blender/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/blender/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/blender/bench/bench-blender-0001.py b/defects/blender/bench/bench-blender-0001.py deleted file mode 100644 index 63ec82d7d..000000000 --- a/defects/blender/bench/bench-blender-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-blender-0001.py -# find_logical_origins_for_socket_recursive() traverses socket chains in the node -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== blender-0001: find_logical_origins_for_socket_recursive() traverses socket chains in the node ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/blender/bench/bench-blender-0002.py b/defects/blender/bench/bench-blender-0002.py deleted file mode 100644 index aaa515d03..000000000 --- a/defects/blender/bench/bench-blender-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-blender-0002.py -# When importing USD skeletal meshes, the code iterates over all joint_indices -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== blender-0002: When importing USD skeletal meshes, the code iterates over all joint_indices ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/blender/bench/bench-blender-0003.py b/defects/blender/bench/bench-blender-0003.py deleted file mode 100644 index 7757e1bac..000000000 --- a/defects/blender/bench/bench-blender-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-blender-0003.py -# shader_tool.cc processes shader #include dependencies recursively. -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== blender-0003: shader_tool.cc processes shader #include dependencies recursively. ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/blender/bench/bench-blender-0004.py b/defects/blender/bench/bench-blender-0004.py deleted file mode 100644 index e1f54a093..000000000 --- a/defects/blender/bench/bench-blender-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-blender-0004.py -# rearrange_animchannel_islands() groups animation channels into islands for -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== blender-0004: rearrange_animchannel_islands() groups animation channels into islands for ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/blender/bench/results.txt b/defects/blender/bench/results.txt deleted file mode 100644 index b9ecd4736..000000000 --- a/defects/blender/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== blender-0001: find_logical_origins_for_socket_recursive() traverses socket chains in the node === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.169ms fixed=0.021ms speedup=104.4x -N=1000 k=1000 : defective=8.936ms fixed=0.046ms speedup=194.4x -N=2000 k=2000 : defective=36.116ms fixed=0.096ms speedup=377.8x - -=== blender-0002: When importing USD skeletal meshes, the code iterates over all joint_indices === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.138ms fixed=0.021ms speedup=101.4x -N=1000 k=1000 : defective=8.494ms fixed=0.044ms speedup=193.2x -N=2000 k=2000 : defective=33.598ms fixed=0.097ms speedup=346.5x - -=== blender-0003: shader_tool.cc processes shader #include dependencies recursively. === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.1x -N=500 k=500 : defective=2.125ms fixed=0.020ms speedup=105.7x -N=1000 k=1000 : defective=8.673ms fixed=0.045ms speedup=190.6x -N=2000 k=2000 : defective=34.284ms fixed=0.093ms speedup=367.8x - -=== blender-0004: rearrange_animchannel_islands() groups animation channels into islands for === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.070ms fixed=0.020ms speedup=105.6x -N=1000 k=1000 : defective=8.257ms fixed=0.044ms speedup=189.5x -N=2000 k=2000 : defective=36.356ms fixed=0.097ms speedup=375.3x - diff --git a/defects/blender/bench/run_all.py b/defects/blender/bench/run_all.py deleted file mode 100644 index 10fcfe82f..000000000 --- a/defects/blender/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-blender-0001.py", "bench-blender-0002.py", "bench-blender-0003.py", "bench-blender-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bottle/Makefile b/defects/bottle/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bottle/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bottle/bench/bench-bottle-0001.py b/defects/bottle/bench/bench-bottle-0001.py deleted file mode 100644 index 05bfcf15b..000000000 --- a/defects/bottle/bench/bench-bottle-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bottle-0001.py -# Route.all_plugins() — skiplist is a list, scanned 4× per plugin iteration -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bottle-0001: Route.all_plugins() — skiplist is a list, scanned 4× per plugin iteration ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bottle/bench/results.txt b/defects/bottle/bench/results.txt deleted file mode 100644 index ffa02a13b..000000000 --- a/defects/bottle/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bottle-0001: Route.all_plugins() — skiplist is a list, scanned 4× per plugin iteration === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.865ms fixed=0.098ms speedup=29.3x -N=1000 k=1000 : defective=11.460ms fixed=0.098ms speedup=117.2x -N=2000 k=2000 : defective=41.618ms fixed=0.101ms speedup=412.5x - diff --git a/defects/bottle/bench/run_all.py b/defects/bottle/bench/run_all.py deleted file mode 100644 index 4f46d7f6b..000000000 --- a/defects/bottle/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bottle-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/box2d/Makefile b/defects/box2d/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/box2d/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/box2d/bench/bench-box2d-0001.py b/defects/box2d/bench/bench-box2d-0001.py deleted file mode 100644 index e9d3001d9..000000000 --- a/defects/box2d/bench/bench-box2d-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-box2d-0001.py -# b2UnBufferMove linear scan @@ -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== box2d-0001: b2UnBufferMove linear scan @@ ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/box2d/bench/results.txt b/defects/box2d/bench/results.txt deleted file mode 100644 index aa6bb2e8e..000000000 --- a/defects/box2d/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== box2d-0001: b2UnBufferMove linear scan @@ === -N=100 k=100 : defective=0.093ms fixed=0.008ms speedup=12.4x -N=500 k=500 : defective=2.451ms fixed=0.023ms speedup=106.3x -N=1000 k=1000 : defective=9.687ms fixed=0.050ms speedup=193.9x -N=2000 k=2000 : defective=38.955ms fixed=0.095ms speedup=410.1x - diff --git a/defects/box2d/bench/run_all.py b/defects/box2d/bench/run_all.py deleted file mode 100644 index 485442922..000000000 --- a/defects/box2d/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-box2d-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/btcpayserver-0001/Makefile b/defects/btcpayserver-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/btcpayserver-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/btcpayserver-0001/bench/bench-btcpayserver-0001-0001.py b/defects/btcpayserver-0001/bench/bench-btcpayserver-0001-0001.py deleted file mode 100644 index a28f772c2..000000000 --- a/defects/btcpayserver-0001/bench/bench-btcpayserver-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-btcpayserver-0001-0001.py -# CWE-407: list-scan inside loop in btcpayserver-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== btcpayserver-0001-0001: CWE-407: list-scan inside loop in btcpayserver-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/btcpayserver-0001/bench/results.txt b/defects/btcpayserver-0001/bench/results.txt deleted file mode 100644 index 007a526a9..000000000 --- a/defects/btcpayserver-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== btcpayserver-0001-0001: CWE-407: list-scan inside loop in btcpayserver-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.470ms fixed=0.024ms speedup=104.9x -N=1000 k=1000 : defective=11.781ms fixed=0.085ms speedup=138.3x -N=2000 k=2000 : defective=38.703ms fixed=0.097ms speedup=398.2x - diff --git a/defects/btcpayserver-0001/bench/run_all.py b/defects/btcpayserver-0001/bench/run_all.py deleted file mode 100644 index 392fbdbd7..000000000 --- a/defects/btcpayserver-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-btcpayserver-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/btcpayserver-0002/Makefile b/defects/btcpayserver-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/btcpayserver-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/btcpayserver-0002/bench/bench-btcpayserver-0002-0002.py b/defects/btcpayserver-0002/bench/bench-btcpayserver-0002-0002.py deleted file mode 100644 index 7969ab840..000000000 --- a/defects/btcpayserver-0002/bench/bench-btcpayserver-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-btcpayserver-0002-0002.py -# CWE-407: list-scan inside loop in btcpayserver-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== btcpayserver-0002-0002: CWE-407: list-scan inside loop in btcpayserver-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/btcpayserver-0002/bench/results.txt b/defects/btcpayserver-0002/bench/results.txt deleted file mode 100644 index 69e522cdd..000000000 --- a/defects/btcpayserver-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== btcpayserver-0002-0002: CWE-407: list-scan inside loop in btcpayserver-0002-0002 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.473ms fixed=0.023ms speedup=109.3x -N=1000 k=1000 : defective=8.730ms fixed=0.046ms speedup=188.5x -N=2000 k=2000 : defective=37.735ms fixed=0.097ms speedup=387.4x - diff --git a/defects/btcpayserver-0002/bench/run_all.py b/defects/btcpayserver-0002/bench/run_all.py deleted file mode 100644 index b643c8011..000000000 --- a/defects/btcpayserver-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-btcpayserver-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/btcpayserver-0003/Makefile b/defects/btcpayserver-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/btcpayserver-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/btcpayserver-0003/bench/bench-btcpayserver-0003-0003.py b/defects/btcpayserver-0003/bench/bench-btcpayserver-0003-0003.py deleted file mode 100644 index 11e2add2e..000000000 --- a/defects/btcpayserver-0003/bench/bench-btcpayserver-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-btcpayserver-0003-0003.py -# CWE-407: list-scan inside loop in btcpayserver-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== btcpayserver-0003-0003: CWE-407: list-scan inside loop in btcpayserver-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/btcpayserver-0003/bench/results.txt b/defects/btcpayserver-0003/bench/results.txt deleted file mode 100644 index 5e43e8ca1..000000000 --- a/defects/btcpayserver-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== btcpayserver-0003-0003: CWE-407: list-scan inside loop in btcpayserver-0003-0003 (generic model) === -N=100 k=100 : defective=0.132ms fixed=0.007ms speedup=19.1x -N=500 k=500 : defective=2.477ms fixed=0.024ms speedup=104.8x -N=1000 k=1000 : defective=10.852ms fixed=0.051ms speedup=214.4x -N=2000 k=2000 : defective=36.903ms fixed=0.097ms speedup=379.8x - diff --git a/defects/btcpayserver-0003/bench/run_all.py b/defects/btcpayserver-0003/bench/run_all.py deleted file mode 100644 index 052aa0d7c..000000000 --- a/defects/btcpayserver-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-btcpayserver-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/buildkit/Makefile b/defects/buildkit/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/buildkit/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/buildkit/bench/bench-buildkit-0001.py b/defects/buildkit/bench/bench-buildkit-0001.py deleted file mode 100644 index 8c00112aa..000000000 --- a/defects/buildkit/bench/bench-buildkit-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-buildkit-0001.py -# CWE-407: list-scan inside loop in buildkit-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== buildkit-0001: CWE-407: list-scan inside loop in buildkit-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/buildkit/bench/results.txt b/defects/buildkit/bench/results.txt deleted file mode 100644 index c4c2ebd8c..000000000 --- a/defects/buildkit/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== buildkit-0001: CWE-407: list-scan inside loop in buildkit-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.198ms fixed=0.021ms speedup=105.6x -N=1000 k=1000 : defective=8.834ms fixed=0.045ms speedup=194.2x -N=2000 k=2000 : defective=35.080ms fixed=0.194ms speedup=181.0x - diff --git a/defects/buildkit/bench/run_all.py b/defects/buildkit/bench/run_all.py deleted file mode 100644 index d1368d0ae..000000000 --- a/defects/buildkit/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-buildkit-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bullet/Makefile b/defects/bullet/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bullet/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bullet/bench/bench-bullet-0001.py b/defects/bullet/bench/bench-bullet-0001.py deleted file mode 100644 index cb915e9e3..000000000 --- a/defects/bullet/bench/bench-bullet-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bullet-0001.py -# CWE-407: list-scan inside loop in bullet-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== bullet-0001: CWE-407: list-scan inside loop in bullet-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bullet/bench/bench-bullet-0002.py b/defects/bullet/bench/bench-bullet-0002.py deleted file mode 100644 index d7b27fe7f..000000000 --- a/defects/bullet/bench/bench-bullet-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bullet-0002.py -# CWE-407: list-scan inside loop in bullet-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== bullet-0002: CWE-407: list-scan inside loop in bullet-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bullet/bench/bench-bullet-0003.py b/defects/bullet/bench/bench-bullet-0003.py deleted file mode 100644 index 043cd297f..000000000 --- a/defects/bullet/bench/bench-bullet-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bullet-0003.py -# CWE-407: list-scan inside loop in bullet-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== bullet-0003: CWE-407: list-scan inside loop in bullet-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bullet/bench/results.txt b/defects/bullet/bench/results.txt deleted file mode 100644 index c7f78b407..000000000 --- a/defects/bullet/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== bullet-0001: CWE-407: list-scan inside loop in bullet-0001 (generic model) === -N=500 k=500 : defective=1.942ms fixed=0.019ms speedup=101.4x -N=2000 k=2000 : defective=33.706ms fixed=0.093ms speedup=362.8x -N=5000 k=5000 : defective=222.043ms fixed=0.241ms speedup=919.9x -N=10000 k=10000: defective=898.790ms fixed=0.481ms speedup=1868.3x - -=== bullet-0002: CWE-407: list-scan inside loop in bullet-0002 (generic model) === -N=500 k=500 : defective=2.013ms fixed=0.019ms speedup=103.6x -N=2000 k=2000 : defective=32.985ms fixed=0.088ms speedup=373.0x -N=5000 k=5000 : defective=212.200ms fixed=0.231ms speedup=918.3x -N=10000 k=10000: defective=807.973ms fixed=0.417ms speedup=1938.5x - -=== bullet-0003: CWE-407: list-scan inside loop in bullet-0003 (generic model) === -N=500 k=500 : defective=1.735ms fixed=0.017ms speedup=101.7x -N=2000 k=2000 : defective=29.550ms fixed=0.076ms speedup=391.0x -N=5000 k=5000 : defective=179.431ms fixed=0.196ms speedup=914.0x -N=10000 k=10000: defective=726.973ms fixed=0.407ms speedup=1788.4x - diff --git a/defects/bullet/bench/run_all.py b/defects/bullet/bench/run_all.py deleted file mode 100644 index 9ee355cd2..000000000 --- a/defects/bullet/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bullet-0001.py", "bench-bullet-0002.py", "bench-bullet-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bullet3/Makefile b/defects/bullet3/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bullet3/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bullet3/bench/bench-bullet3-0001.py b/defects/bullet3/bench/bench-bullet3-0001.py deleted file mode 100644 index 7a6c54c65..000000000 --- a/defects/bullet3/bench/bench-bullet3-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bullet3-0001.py -# CWE-407: list-scan inside loop in bullet3-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bullet3-0001: CWE-407: list-scan inside loop in bullet3-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bullet3/bench/bench-bullet3-0002.py b/defects/bullet3/bench/bench-bullet3-0002.py deleted file mode 100644 index 0e39b4409..000000000 --- a/defects/bullet3/bench/bench-bullet3-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bullet3-0002.py -# btSoftRigidCollisionAlgorithm::processCollision — O(C×D) per frame linear scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bullet3-0002: btSoftRigidCollisionAlgorithm::processCollision — O(C×D) per frame linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bullet3/bench/results.txt b/defects/bullet3/bench/results.txt deleted file mode 100644 index b7645c68b..000000000 --- a/defects/bullet3/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== bullet3-0001: CWE-407: list-scan inside loop in bullet3-0001 (generic model) === -N=100 k=100 : defective=0.187ms fixed=0.008ms speedup=24.9x -N=500 k=500 : defective=5.030ms fixed=0.046ms speedup=109.3x -N=1000 k=1000 : defective=11.233ms fixed=0.053ms speedup=212.9x -N=2000 k=2000 : defective=39.271ms fixed=0.111ms speedup=353.9x - -=== bullet3-0002: btSoftRigidCollisionAlgorithm::processCollision — O(C×D) per frame linear scan === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.9x -N=500 k=500 : defective=2.312ms fixed=0.023ms speedup=101.7x -N=1000 k=1000 : defective=9.986ms fixed=0.060ms speedup=166.0x -N=2000 k=2000 : defective=38.279ms fixed=0.096ms speedup=398.2x - diff --git a/defects/bullet3/bench/run_all.py b/defects/bullet3/bench/run_all.py deleted file mode 100644 index 166138ca1..000000000 --- a/defects/bullet3/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bullet3-0001.py", "bench-bullet3-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bun/Makefile b/defects/bun/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bun/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bun/bench/bench-bun-0001.py b/defects/bun/bench/bench-bun-0001.py deleted file mode 100644 index 0ffb568fc..000000000 --- a/defects/bun/bench/bench-bun-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bun-0001.py -# CWE-407: list-scan inside loop in bun-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bun-0001: CWE-407: list-scan inside loop in bun-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bun/bench/results.txt b/defects/bun/bench/results.txt deleted file mode 100644 index 860eba272..000000000 --- a/defects/bun/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bun-0001: CWE-407: list-scan inside loop in bun-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.311ms fixed=0.023ms speedup=102.2x -N=1000 k=1000 : defective=11.424ms fixed=0.054ms speedup=212.7x -N=2000 k=2000 : defective=37.841ms fixed=0.096ms speedup=393.9x - diff --git a/defects/bun/bench/run_all.py b/defects/bun/bench/run_all.py deleted file mode 100644 index cfc845fc2..000000000 --- a/defects/bun/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bun-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bzflag-0001/Makefile b/defects/bzflag-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bzflag-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bzflag-0001/bench/bench-bzflag-0001-0001.py b/defects/bzflag-0001/bench/bench-bzflag-0001-0001.py deleted file mode 100644 index e102772f6..000000000 --- a/defects/bzflag-0001/bench/bench-bzflag-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bzflag-0001-0001.py -# CWE-407: list-scan inside loop in bzflag-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bzflag-0001-0001: CWE-407: list-scan inside loop in bzflag-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bzflag-0001/bench/results.txt b/defects/bzflag-0001/bench/results.txt deleted file mode 100644 index ffa2a296f..000000000 --- a/defects/bzflag-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bzflag-0001-0001: CWE-407: list-scan inside loop in bzflag-0001-0001 (generic model) === -N=100 k=100 : defective=0.257ms fixed=0.016ms speedup=16.2x -N=500 k=500 : defective=2.428ms fixed=0.023ms speedup=106.6x -N=1000 k=1000 : defective=9.953ms fixed=0.050ms speedup=198.2x -N=2000 k=2000 : defective=41.770ms fixed=0.156ms speedup=268.3x - diff --git a/defects/bzflag-0001/bench/run_all.py b/defects/bzflag-0001/bench/run_all.py deleted file mode 100644 index 57ff8674c..000000000 --- a/defects/bzflag-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bzflag-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bzflag-0002/Makefile b/defects/bzflag-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bzflag-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bzflag-0002/bench/bench-bzflag-0002-0002.py b/defects/bzflag-0002/bench/bench-bzflag-0002-0002.py deleted file mode 100644 index a19dbb5df..000000000 --- a/defects/bzflag-0002/bench/bench-bzflag-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bzflag-0002-0002.py -# CWE-407: list-scan inside loop in bzflag-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bzflag-0002-0002: CWE-407: list-scan inside loop in bzflag-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bzflag-0002/bench/results.txt b/defects/bzflag-0002/bench/results.txt deleted file mode 100644 index 2332d1905..000000000 --- a/defects/bzflag-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bzflag-0002-0002: CWE-407: list-scan inside loop in bzflag-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.245ms fixed=0.021ms speedup=106.7x -N=1000 k=1000 : defective=9.681ms fixed=0.048ms speedup=203.1x -N=2000 k=2000 : defective=43.225ms fixed=0.161ms speedup=268.7x - diff --git a/defects/bzflag-0002/bench/run_all.py b/defects/bzflag-0002/bench/run_all.py deleted file mode 100644 index ac6b095f1..000000000 --- a/defects/bzflag-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bzflag-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/bzflag-0003/Makefile b/defects/bzflag-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/bzflag-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/bzflag-0003/bench/bench-bzflag-0003-0003.py b/defects/bzflag-0003/bench/bench-bzflag-0003-0003.py deleted file mode 100644 index e22ed6b00..000000000 --- a/defects/bzflag-0003/bench/bench-bzflag-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-bzflag-0003-0003.py -# CWE-407: list-scan inside loop in bzflag-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== bzflag-0003-0003: CWE-407: list-scan inside loop in bzflag-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/bzflag-0003/bench/results.txt b/defects/bzflag-0003/bench/results.txt deleted file mode 100644 index 83bf4a530..000000000 --- a/defects/bzflag-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== bzflag-0003-0003: CWE-407: list-scan inside loop in bzflag-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.526ms fixed=0.040ms speedup=62.5x -N=1000 k=1000 : defective=10.700ms fixed=0.053ms speedup=201.7x -N=2000 k=2000 : defective=36.358ms fixed=0.097ms speedup=374.7x - diff --git a/defects/bzflag-0003/bench/run_all.py b/defects/bzflag-0003/bench/run_all.py deleted file mode 100644 index 5e410c79f..000000000 --- a/defects/bzflag-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-bzflag-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/caddy/Makefile b/defects/caddy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/caddy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/caddy/bench/bench-caddy-0001.py b/defects/caddy/bench/bench-caddy-0001.py deleted file mode 100644 index 88df9496a..000000000 --- a/defects/caddy/bench/bench-caddy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-caddy-0001.py -# CWE-407: list-scan inside loop in caddy-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== caddy-0001: CWE-407: list-scan inside loop in caddy-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/caddy/bench/bench-caddy-0002.py b/defects/caddy/bench/bench-caddy-0002.py deleted file mode 100644 index bf8426063..000000000 --- a/defects/caddy/bench/bench-caddy-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-caddy-0002.py -# `consolidateAutomationPolicies` — O(P²×S) `slices.Contains` in subject merge -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== caddy-0002: `consolidateAutomationPolicies` — O(P²×S) `slices.Contains` in subject merge ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/caddy/bench/results.txt b/defects/caddy/bench/results.txt deleted file mode 100644 index 37d1bed5b..000000000 --- a/defects/caddy/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== caddy-0001: CWE-407: list-scan inside loop in caddy-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.249ms fixed=0.020ms speedup=110.4x -N=1000 k=1000 : defective=8.681ms fixed=0.045ms speedup=193.1x -N=2000 k=2000 : defective=35.716ms fixed=0.100ms speedup=355.7x - -=== caddy-0002: `consolidateAutomationPolicies` — O(P²×S) `slices.Contains` in subject merge === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.176ms fixed=0.021ms speedup=105.4x -N=1000 k=1000 : defective=9.222ms fixed=0.045ms speedup=203.1x -N=2000 k=2000 : defective=36.434ms fixed=0.096ms speedup=378.0x - diff --git a/defects/caddy/bench/run_all.py b/defects/caddy/bench/run_all.py deleted file mode 100644 index 1e4219c71..000000000 --- a/defects/caddy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-caddy-0001.py", "bench-caddy-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cake_wallet-0001/Makefile b/defects/cake_wallet-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cake_wallet-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cake_wallet-0001/bench/bench-cake_wallet-0001-0001.py b/defects/cake_wallet-0001/bench/bench-cake_wallet-0001-0001.py deleted file mode 100644 index f433609d8..000000000 --- a/defects/cake_wallet-0001/bench/bench-cake_wallet-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cake_wallet-0001-0001.py -# CWE-407: list-scan inside loop in cake_wallet-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cake_wallet-0001-0001: CWE-407: list-scan inside loop in cake_wallet-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cake_wallet-0001/bench/results.txt b/defects/cake_wallet-0001/bench/results.txt deleted file mode 100644 index dc8f32b84..000000000 --- a/defects/cake_wallet-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cake_wallet-0001-0001: CWE-407: list-scan inside loop in cake_wallet-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.006ms speedup=15.4x -N=500 k=500 : defective=2.353ms fixed=0.022ms speedup=106.0x -N=1000 k=1000 : defective=9.180ms fixed=0.076ms speedup=120.7x -N=2000 k=2000 : defective=41.788ms fixed=0.101ms speedup=414.4x - diff --git a/defects/cake_wallet-0001/bench/run_all.py b/defects/cake_wallet-0001/bench/run_all.py deleted file mode 100644 index 9fadac1f0..000000000 --- a/defects/cake_wallet-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cake_wallet-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cake_wallet-0002/Makefile b/defects/cake_wallet-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cake_wallet-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cake_wallet-0002/bench/bench-cake_wallet-0002-0002.py b/defects/cake_wallet-0002/bench/bench-cake_wallet-0002-0002.py deleted file mode 100644 index 9e6eef4f0..000000000 --- a/defects/cake_wallet-0002/bench/bench-cake_wallet-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cake_wallet-0002-0002.py -# CWE-407: list-scan inside loop in cake_wallet-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cake_wallet-0002-0002: CWE-407: list-scan inside loop in cake_wallet-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cake_wallet-0002/bench/results.txt b/defects/cake_wallet-0002/bench/results.txt deleted file mode 100644 index c31fa7875..000000000 --- a/defects/cake_wallet-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cake_wallet-0002-0002: CWE-407: list-scan inside loop in cake_wallet-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.363ms fixed=0.022ms speedup=105.7x -N=1000 k=1000 : defective=9.819ms fixed=0.050ms speedup=198.2x -N=2000 k=2000 : defective=40.324ms fixed=0.099ms speedup=406.5x - diff --git a/defects/cake_wallet-0002/bench/run_all.py b/defects/cake_wallet-0002/bench/run_all.py deleted file mode 100644 index 351ad32c7..000000000 --- a/defects/cake_wallet-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cake_wallet-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cake_wallet-0003/Makefile b/defects/cake_wallet-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cake_wallet-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cake_wallet-0003/bench/bench-cake_wallet-0003-0003.py b/defects/cake_wallet-0003/bench/bench-cake_wallet-0003-0003.py deleted file mode 100644 index b3a010b55..000000000 --- a/defects/cake_wallet-0003/bench/bench-cake_wallet-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cake_wallet-0003-0003.py -# CWE-407: list-scan inside loop in cake_wallet-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cake_wallet-0003-0003: CWE-407: list-scan inside loop in cake_wallet-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cake_wallet-0003/bench/results.txt b/defects/cake_wallet-0003/bench/results.txt deleted file mode 100644 index 975cdd8f0..000000000 --- a/defects/cake_wallet-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cake_wallet-0003-0003: CWE-407: list-scan inside loop in cake_wallet-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.498ms fixed=0.022ms speedup=111.2x -N=1000 k=1000 : defective=9.798ms fixed=0.051ms speedup=190.6x -N=2000 k=2000 : defective=45.412ms fixed=0.128ms speedup=354.0x - diff --git a/defects/cake_wallet-0003/bench/run_all.py b/defects/cake_wallet-0003/bench/run_all.py deleted file mode 100644 index 1e8be2b2c..000000000 --- a/defects/cake_wallet-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cake_wallet-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cake_wallet-0004/Makefile b/defects/cake_wallet-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cake_wallet-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cake_wallet-0004/bench/bench-cake_wallet-0004-0004.py b/defects/cake_wallet-0004/bench/bench-cake_wallet-0004-0004.py deleted file mode 100644 index 5d721b64d..000000000 --- a/defects/cake_wallet-0004/bench/bench-cake_wallet-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cake_wallet-0004-0004.py -# CWE-407: list-scan inside loop in cake_wallet-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cake_wallet-0004-0004: CWE-407: list-scan inside loop in cake_wallet-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cake_wallet-0004/bench/results.txt b/defects/cake_wallet-0004/bench/results.txt deleted file mode 100644 index 5314d7166..000000000 --- a/defects/cake_wallet-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cake_wallet-0004-0004: CWE-407: list-scan inside loop in cake_wallet-0004-0004 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.625ms fixed=0.050ms speedup=52.7x -N=1000 k=1000 : defective=13.719ms fixed=0.055ms speedup=248.3x -N=2000 k=2000 : defective=38.953ms fixed=0.098ms speedup=399.3x - diff --git a/defects/cake_wallet-0004/bench/run_all.py b/defects/cake_wallet-0004/bench/run_all.py deleted file mode 100644 index 34ec49368..000000000 --- a/defects/cake_wallet-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cake_wallet-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/calibre/Makefile b/defects/calibre/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/calibre/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/calibre/bench/bench-calibre-0001.py b/defects/calibre/bench/bench-calibre-0001.py deleted file mode 100644 index db6203d8c..000000000 --- a/defects/calibre/bench/bench-calibre-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-calibre-0001.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== calibre-0001: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/calibre/bench/bench-calibre-0002.py b/defects/calibre/bench/bench-calibre-0002.py deleted file mode 100644 index a33e8c1bc..000000000 --- a/defects/calibre/bench/bench-calibre-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-calibre-0002.py -# Severity: LOW-MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== calibre-0002: Severity: LOW-MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/calibre/bench/bench-calibre-0003.py b/defects/calibre/bench/bench-calibre-0003.py deleted file mode 100644 index 81b781ecc..000000000 --- a/defects/calibre/bench/bench-calibre-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-calibre-0003.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== calibre-0003: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/calibre/bench/bench-calibre-0004.py b/defects/calibre/bench/bench-calibre-0004.py deleted file mode 100644 index 56a61eb41..000000000 --- a/defects/calibre/bench/bench-calibre-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-calibre-0004.py -# Severity: LOW-MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== calibre-0004: Severity: LOW-MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/calibre/bench/results.txt b/defects/calibre/bench/results.txt deleted file mode 100644 index bd9934663..000000000 --- a/defects/calibre/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== calibre-0001: Severity: MEDIUM === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.144ms fixed=0.020ms speedup=105.7x -N=1000 k=1000 : defective=8.770ms fixed=0.046ms speedup=189.9x -N=2000 k=2000 : defective=34.407ms fixed=0.091ms speedup=378.5x - -=== calibre-0002: Severity: LOW-MEDIUM === -N=100 k=100 : defective=0.081ms fixed=0.014ms speedup=5.7x -N=500 k=500 : defective=2.067ms fixed=0.019ms speedup=106.3x -N=1000 k=1000 : defective=8.370ms fixed=0.043ms speedup=194.2x -N=2000 k=2000 : defective=34.141ms fixed=0.199ms speedup=171.7x - -=== calibre-0003: Severity: MEDIUM === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.125ms fixed=0.021ms speedup=103.0x -N=1000 k=1000 : defective=8.913ms fixed=0.046ms speedup=193.0x -N=2000 k=2000 : defective=33.791ms fixed=0.092ms speedup=365.7x - -=== calibre-0004: Severity: LOW-MEDIUM === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.079ms fixed=0.020ms speedup=106.2x -N=1000 k=1000 : defective=8.281ms fixed=0.044ms speedup=186.3x -N=2000 k=2000 : defective=33.664ms fixed=0.094ms speedup=358.3x - diff --git a/defects/calibre/bench/run_all.py b/defects/calibre/bench/run_all.py deleted file mode 100644 index b01468836..000000000 --- a/defects/calibre/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-calibre-0001.py", "bench-calibre-0002.py", "bench-calibre-0003.py", "bench-calibre-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/calligra-0001/Makefile b/defects/calligra-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/calligra-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/calligra-0001/bench/bench-calligra-0001-0001.py b/defects/calligra-0001/bench/bench-calligra-0001-0001.py deleted file mode 100644 index f4efc8658..000000000 --- a/defects/calligra-0001/bench/bench-calligra-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-calligra-0001-0001.py -# CWE-407: list-scan inside loop in calligra-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== calligra-0001-0001: CWE-407: list-scan inside loop in calligra-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/calligra-0001/bench/results.txt b/defects/calligra-0001/bench/results.txt deleted file mode 100644 index ed00c4815..000000000 --- a/defects/calligra-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== calligra-0001-0001: CWE-407: list-scan inside loop in calligra-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.422ms fixed=0.023ms speedup=107.5x -N=1000 k=1000 : defective=8.923ms fixed=0.045ms speedup=197.0x -N=2000 k=2000 : defective=39.080ms fixed=0.097ms speedup=404.2x - diff --git a/defects/calligra-0001/bench/run_all.py b/defects/calligra-0001/bench/run_all.py deleted file mode 100644 index 868c52e06..000000000 --- a/defects/calligra-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-calligra-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/camel/Makefile b/defects/camel/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/camel/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/camel/bench/bench-camel-0001.py b/defects/camel/bench/bench-camel-0001.py deleted file mode 100644 index f79ec1785..000000000 --- a/defects/camel/bench/bench-camel-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-camel-0001.py -# camel-0001 — O(R²) Route Startup Endpoint Clash Scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== camel-0001: camel-0001 — O(R²) Route Startup Endpoint Clash Scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/camel/bench/results.txt b/defects/camel/bench/results.txt deleted file mode 100644 index d9f70d400..000000000 --- a/defects/camel/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== camel-0001: camel-0001 — O(R²) Route Startup Endpoint Clash Scan === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=23.6x -N=500 k=500 : defective=2.554ms fixed=0.024ms speedup=104.7x -N=1000 k=1000 : defective=11.787ms fixed=0.058ms speedup=201.5x -N=2000 k=2000 : defective=60.097ms fixed=0.117ms speedup=514.7x - diff --git a/defects/camel/bench/run_all.py b/defects/camel/bench/run_all.py deleted file mode 100644 index ff5cce8d8..000000000 --- a/defects/camel/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-camel-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/capistrano/Makefile b/defects/capistrano/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/capistrano/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/capistrano/bench/bench-capistrano-0001.py b/defects/capistrano/bench/bench-capistrano-0001.py deleted file mode 100644 index c10730dae..000000000 --- a/defects/capistrano/bench/bench-capistrano-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-capistrano-0001.py -# CWE-407: list-scan inside loop in capistrano-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== capistrano-0001: CWE-407: list-scan inside loop in capistrano-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/capistrano/bench/bench-capistrano-0002.py b/defects/capistrano/bench/bench-capistrano-0002.py deleted file mode 100644 index 9764bfe15..000000000 --- a/defects/capistrano/bench/bench-capistrano-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-capistrano-0002.py -# CWE-407: list-scan inside loop in capistrano-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== capistrano-0002: CWE-407: list-scan inside loop in capistrano-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/capistrano/bench/results.txt b/defects/capistrano/bench/results.txt deleted file mode 100644 index 1ce11b2a0..000000000 --- a/defects/capistrano/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== capistrano-0001: CWE-407: list-scan inside loop in capistrano-0001 (generic model) === -N=100 k=100 : defective=0.285ms fixed=0.025ms speedup=11.3x -N=500 k=500 : defective=3.881ms fixed=0.034ms speedup=115.3x -N=1000 k=1000 : defective=15.168ms fixed=0.078ms speedup=195.2x -N=2000 k=2000 : defective=35.796ms fixed=0.097ms speedup=367.7x - -=== capistrano-0002: CWE-407: list-scan inside loop in capistrano-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.164ms fixed=0.022ms speedup=99.6x -N=1000 k=1000 : defective=8.763ms fixed=0.047ms speedup=187.4x -N=2000 k=2000 : defective=35.671ms fixed=0.096ms speedup=371.9x - diff --git a/defects/capistrano/bench/run_all.py b/defects/capistrano/bench/run_all.py deleted file mode 100644 index 093581d2e..000000000 --- a/defects/capistrano/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-capistrano-0001.py", "bench-capistrano-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/caprice32-0001/Makefile b/defects/caprice32-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/caprice32-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/caprice32-0001/bench/bench-caprice32-0001-0001.py b/defects/caprice32-0001/bench/bench-caprice32-0001-0001.py deleted file mode 100644 index bd367cc86..000000000 --- a/defects/caprice32-0001/bench/bench-caprice32-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-caprice32-0001-0001.py -# CWE-407: list-scan inside loop in caprice32-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== caprice32-0001-0001: CWE-407: list-scan inside loop in caprice32-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/caprice32-0001/bench/results.txt b/defects/caprice32-0001/bench/results.txt deleted file mode 100644 index 47e3bc582..000000000 --- a/defects/caprice32-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== caprice32-0001-0001: CWE-407: list-scan inside loop in caprice32-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.322ms fixed=0.022ms speedup=104.0x -N=1000 k=1000 : defective=9.506ms fixed=0.102ms speedup=93.3x -N=2000 k=2000 : defective=38.737ms fixed=0.098ms speedup=396.5x - diff --git a/defects/caprice32-0001/bench/run_all.py b/defects/caprice32-0001/bench/run_all.py deleted file mode 100644 index 9a7d8d2c9..000000000 --- a/defects/caprice32-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-caprice32-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/caprice32-0002/Makefile b/defects/caprice32-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/caprice32-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/caprice32-0002/bench/bench-caprice32-0002-0002.py b/defects/caprice32-0002/bench/bench-caprice32-0002-0002.py deleted file mode 100644 index 286d58168..000000000 --- a/defects/caprice32-0002/bench/bench-caprice32-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-caprice32-0002-0002.py -# CWE-407: list-scan inside loop in caprice32-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== caprice32-0002-0002: CWE-407: list-scan inside loop in caprice32-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/caprice32-0002/bench/results.txt b/defects/caprice32-0002/bench/results.txt deleted file mode 100644 index f81130a62..000000000 --- a/defects/caprice32-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== caprice32-0002-0002: CWE-407: list-scan inside loop in caprice32-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.297ms fixed=0.023ms speedup=100.7x -N=1000 k=1000 : defective=9.436ms fixed=0.050ms speedup=186.9x -N=2000 k=2000 : defective=34.938ms fixed=0.097ms speedup=360.9x - diff --git a/defects/caprice32-0002/bench/run_all.py b/defects/caprice32-0002/bench/run_all.py deleted file mode 100644 index b7bc098fe..000000000 --- a/defects/caprice32-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-caprice32-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cargo/Makefile b/defects/cargo/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cargo/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cargo/bench/bench-cargo-0001.py b/defects/cargo/bench/bench-cargo-0001.py deleted file mode 100644 index 5b1a8ca2d..000000000 --- a/defects/cargo/bench/bench-cargo-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cargo-0001.py -# CWE-407: list-scan inside loop in cargo-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cargo-0001: CWE-407: list-scan inside loop in cargo-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cargo/bench/bench-cargo-0002.py b/defects/cargo/bench/bench-cargo-0002.py deleted file mode 100644 index 99537efd1..000000000 --- a/defects/cargo/bench/bench-cargo-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cargo-0002.py -# CWE-407: list-scan inside loop in cargo-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cargo-0002: CWE-407: list-scan inside loop in cargo-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cargo/bench/results.txt b/defects/cargo/bench/results.txt deleted file mode 100644 index d98c12109..000000000 --- a/defects/cargo/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== cargo-0001: CWE-407: list-scan inside loop in cargo-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.107ms fixed=0.020ms speedup=104.8x -N=1000 k=1000 : defective=8.598ms fixed=0.045ms speedup=189.4x -N=2000 k=2000 : defective=38.312ms fixed=0.103ms speedup=371.0x - -=== cargo-0002: CWE-407: list-scan inside loop in cargo-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.390ms fixed=0.022ms speedup=108.2x -N=1000 k=1000 : defective=9.610ms fixed=0.050ms speedup=190.6x -N=2000 k=2000 : defective=37.516ms fixed=0.097ms speedup=384.9x - diff --git a/defects/cargo/bench/run_all.py b/defects/cargo/bench/run_all.py deleted file mode 100644 index d19ee0766..000000000 --- a/defects/cargo/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cargo-0001.py", "bench-cargo-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cassandra/Makefile b/defects/cassandra/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cassandra/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cassandra/bench/bench-cassandra-0001.py b/defects/cassandra/bench/bench-cassandra-0001.py deleted file mode 100644 index b39cf2b4f..000000000 --- a/defects/cassandra/bench/bench-cassandra-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cassandra-0001.py -# CWE-407: list-scan inside loop in cassandra-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cassandra-0001: CWE-407: list-scan inside loop in cassandra-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cassandra/bench/bench-cassandra-0002.py b/defects/cassandra/bench/bench-cassandra-0002.py deleted file mode 100644 index a4c89da36..000000000 --- a/defects/cassandra/bench/bench-cassandra-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cassandra-0002.py -# CWE-407: list-scan inside loop in cassandra-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cassandra-0002: CWE-407: list-scan inside loop in cassandra-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cassandra/bench/bench-cassandra-0003.py b/defects/cassandra/bench/bench-cassandra-0003.py deleted file mode 100644 index 68ecfd192..000000000 --- a/defects/cassandra/bench/bench-cassandra-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cassandra-0003.py -# CWE-407: list-scan inside loop in cassandra-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cassandra-0003: CWE-407: list-scan inside loop in cassandra-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cassandra/bench/bench-cassandra-0004.py b/defects/cassandra/bench/bench-cassandra-0004.py deleted file mode 100644 index 862b7dcde..000000000 --- a/defects/cassandra/bench/bench-cassandra-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cassandra-0004.py -# CWE-407: list-scan inside loop in cassandra-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cassandra-0004: CWE-407: list-scan inside loop in cassandra-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cassandra/bench/bench-cassandra-0005.py b/defects/cassandra/bench/bench-cassandra-0005.py deleted file mode 100644 index 1a0773658..000000000 --- a/defects/cassandra/bench/bench-cassandra-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cassandra-0005.py -# CWE-407: list-scan inside loop in cassandra-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cassandra-0005: CWE-407: list-scan inside loop in cassandra-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cassandra/bench/results.txt b/defects/cassandra/bench/results.txt deleted file mode 100644 index c4ec75844..000000000 --- a/defects/cassandra/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== cassandra-0001: CWE-407: list-scan inside loop in cassandra-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.117ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=8.676ms fixed=0.046ms speedup=189.2x -N=2000 k=2000 : defective=33.996ms fixed=0.093ms speedup=367.0x - -=== cassandra-0002: CWE-407: list-scan inside loop in cassandra-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.004ms speedup=23.0x -N=500 k=500 : defective=2.066ms fixed=0.019ms speedup=106.5x -N=1000 k=1000 : defective=8.622ms fixed=0.046ms speedup=188.1x -N=2000 k=2000 : defective=33.423ms fixed=0.094ms speedup=356.5x - -=== cassandra-0003: CWE-407: list-scan inside loop in cassandra-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.019ms fixed=0.020ms speedup=102.2x -N=1000 k=1000 : defective=8.276ms fixed=0.044ms speedup=187.6x -N=2000 k=2000 : defective=33.666ms fixed=0.093ms speedup=363.6x - -=== cassandra-0004: CWE-407: list-scan inside loop in cassandra-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.024ms fixed=0.019ms speedup=104.8x -N=1000 k=1000 : defective=8.522ms fixed=0.043ms speedup=198.8x -N=2000 k=2000 : defective=33.455ms fixed=0.094ms speedup=356.4x - -=== cassandra-0005: CWE-407: list-scan inside loop in cassandra-0005 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.018ms fixed=0.020ms speedup=101.1x -N=1000 k=1000 : defective=8.342ms fixed=0.045ms speedup=187.2x -N=2000 k=2000 : defective=35.627ms fixed=0.092ms speedup=386.8x - diff --git a/defects/cassandra/bench/run_all.py b/defects/cassandra/bench/run_all.py deleted file mode 100644 index ffcb3f87b..000000000 --- a/defects/cassandra/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cassandra-0001.py", "bench-cassandra-0002.py", "bench-cassandra-0003.py", "bench-cassandra-0004.py", "bench-cassandra-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cataclysm-0001/Makefile b/defects/cataclysm-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cataclysm-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cataclysm-0001/bench/bench-cataclysm-0001-0001.py b/defects/cataclysm-0001/bench/bench-cataclysm-0001-0001.py deleted file mode 100644 index 4d9d7c333..000000000 --- a/defects/cataclysm-0001/bench/bench-cataclysm-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cataclysm-0001-0001.py -# CWE-407: list-scan inside loop in cataclysm-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cataclysm-0001-0001: CWE-407: list-scan inside loop in cataclysm-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cataclysm-0001/bench/results.txt b/defects/cataclysm-0001/bench/results.txt deleted file mode 100644 index 1dcd35259..000000000 --- a/defects/cataclysm-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cataclysm-0001-0001: CWE-407: list-scan inside loop in cataclysm-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.006ms speedup=15.9x -N=500 k=500 : defective=4.017ms fixed=0.023ms speedup=171.2x -N=1000 k=1000 : defective=10.060ms fixed=0.093ms speedup=107.7x -N=2000 k=2000 : defective=35.561ms fixed=0.101ms speedup=353.7x - diff --git a/defects/cataclysm-0001/bench/run_all.py b/defects/cataclysm-0001/bench/run_all.py deleted file mode 100644 index 0f0989606..000000000 --- a/defects/cataclysm-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cataclysm-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cataclysm-0002/Makefile b/defects/cataclysm-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cataclysm-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cataclysm-0002/bench/bench-cataclysm-0002-0002.py b/defects/cataclysm-0002/bench/bench-cataclysm-0002-0002.py deleted file mode 100644 index f5c887572..000000000 --- a/defects/cataclysm-0002/bench/bench-cataclysm-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cataclysm-0002-0002.py -# CWE-407: list-scan inside loop in cataclysm-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cataclysm-0002-0002: CWE-407: list-scan inside loop in cataclysm-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cataclysm-0002/bench/results.txt b/defects/cataclysm-0002/bench/results.txt deleted file mode 100644 index 610a8dc15..000000000 --- a/defects/cataclysm-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cataclysm-0002-0002: CWE-407: list-scan inside loop in cataclysm-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.399ms fixed=0.023ms speedup=105.6x -N=1000 k=1000 : defective=10.160ms fixed=0.051ms speedup=200.3x -N=2000 k=2000 : defective=45.471ms fixed=0.110ms speedup=415.0x - diff --git a/defects/cataclysm-0002/bench/run_all.py b/defects/cataclysm-0002/bench/run_all.py deleted file mode 100644 index 992287def..000000000 --- a/defects/cataclysm-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cataclysm-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cataclysm-0003/Makefile b/defects/cataclysm-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cataclysm-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cataclysm-0003/bench/bench-cataclysm-0003-0003.py b/defects/cataclysm-0003/bench/bench-cataclysm-0003-0003.py deleted file mode 100644 index e6ff51ae1..000000000 --- a/defects/cataclysm-0003/bench/bench-cataclysm-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cataclysm-0003-0003.py -# CWE-407: list-scan inside loop in cataclysm-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cataclysm-0003-0003: CWE-407: list-scan inside loop in cataclysm-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cataclysm-0003/bench/results.txt b/defects/cataclysm-0003/bench/results.txt deleted file mode 100644 index f5434757a..000000000 --- a/defects/cataclysm-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cataclysm-0003-0003: CWE-407: list-scan inside loop in cataclysm-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.461ms fixed=0.024ms speedup=104.0x -N=1000 k=1000 : defective=9.952ms fixed=0.052ms speedup=190.6x -N=2000 k=2000 : defective=37.813ms fixed=0.098ms speedup=386.1x - diff --git a/defects/cataclysm-0003/bench/run_all.py b/defects/cataclysm-0003/bench/run_all.py deleted file mode 100644 index 798bbff20..000000000 --- a/defects/cataclysm-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cataclysm-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cel/Makefile b/defects/cel/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cel/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cel/bench/bench-cel-0001.py b/defects/cel/bench/bench-cel-0001.py deleted file mode 100644 index 54f0e9d27..000000000 --- a/defects/cel/bench/bench-cel-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cel-0001.py -# CWE-407: list-scan inside loop in cel-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cel-0001: CWE-407: list-scan inside loop in cel-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cel/bench/results.txt b/defects/cel/bench/results.txt deleted file mode 100644 index ed61d1be8..000000000 --- a/defects/cel/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cel-0001: CWE-407: list-scan inside loop in cel-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.669ms fixed=0.035ms speedup=76.8x -N=1000 k=1000 : defective=11.148ms fixed=0.049ms speedup=227.9x -N=2000 k=2000 : defective=41.315ms fixed=0.096ms speedup=429.0x - diff --git a/defects/cel/bench/run_all.py b/defects/cel/bench/run_all.py deleted file mode 100644 index 31fee2566..000000000 --- a/defects/cel/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cel-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/celery/Makefile b/defects/celery/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/celery/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/celery/bench/bench-celery-0001.py b/defects/celery/bench/bench-celery-0001.py deleted file mode 100644 index 19fa6490a..000000000 --- a/defects/celery/bench/bench-celery-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-celery-0001.py -# celery-0001 — O(N²) ResultSet Membership Test in update()/add() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== celery-0001: celery-0001 — O(N²) ResultSet Membership Test in update()/add() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/celery/bench/bench-celery-0002.py b/defects/celery/bench/bench-celery-0002.py deleted file mode 100644 index e72ce4438..000000000 --- a/defects/celery/bench/bench-celery-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-celery-0002.py -# cel-0001: canvas.py append_to_list_option O(N²) list membership in chain/chord build loops -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== celery-0002: cel-0001: canvas.py append_to_list_option O(N²) list membership in chain/chord build loops ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/celery/bench/results.txt b/defects/celery/bench/results.txt deleted file mode 100644 index d28e7ef49..000000000 --- a/defects/celery/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== celery-0001: celery-0001 — O(N²) ResultSet Membership Test in update()/add() === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.097ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=9.269ms fixed=0.047ms speedup=198.9x -N=2000 k=2000 : defective=40.358ms fixed=0.103ms speedup=392.3x - -=== celery-0002: cel-0001: canvas.py append_to_list_option O(N²) list membership in chain/chord build loops === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.372ms fixed=0.091ms speedup=26.0x -N=1000 k=1000 : defective=9.207ms fixed=0.046ms speedup=198.3x -N=2000 k=2000 : defective=40.644ms fixed=0.107ms speedup=378.6x - diff --git a/defects/celery/bench/run_all.py b/defects/celery/bench/run_all.py deleted file mode 100644 index 31ab2144d..000000000 --- a/defects/celery/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-celery-0001.py", "bench-celery-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cemu-0001/Makefile b/defects/cemu-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cemu-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cemu-0001/bench/bench-cemu-0001-0001.py b/defects/cemu-0001/bench/bench-cemu-0001-0001.py deleted file mode 100644 index 71c48f87b..000000000 --- a/defects/cemu-0001/bench/bench-cemu-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cemu-0001-0001.py -# CWE-407: list-scan inside loop in cemu-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cemu-0001-0001: CWE-407: list-scan inside loop in cemu-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cemu-0001/bench/results.txt b/defects/cemu-0001/bench/results.txt deleted file mode 100644 index 462218f27..000000000 --- a/defects/cemu-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cemu-0001-0001: CWE-407: list-scan inside loop in cemu-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.512ms fixed=0.024ms speedup=104.7x -N=1000 k=1000 : defective=10.197ms fixed=0.051ms speedup=198.7x -N=2000 k=2000 : defective=38.716ms fixed=0.096ms speedup=403.1x - diff --git a/defects/cemu-0001/bench/run_all.py b/defects/cemu-0001/bench/run_all.py deleted file mode 100644 index 208dbdf11..000000000 --- a/defects/cemu-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cemu-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cemu-0002/Makefile b/defects/cemu-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cemu-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cemu-0002/bench/bench-cemu-0002-0002.py b/defects/cemu-0002/bench/bench-cemu-0002-0002.py deleted file mode 100644 index c2feedf6c..000000000 --- a/defects/cemu-0002/bench/bench-cemu-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cemu-0002-0002.py -# CWE-407: list-scan inside loop in cemu-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cemu-0002-0002: CWE-407: list-scan inside loop in cemu-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cemu-0002/bench/results.txt b/defects/cemu-0002/bench/results.txt deleted file mode 100644 index 7859d50eb..000000000 --- a/defects/cemu-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cemu-0002-0002: CWE-407: list-scan inside loop in cemu-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=2.356ms fixed=0.024ms speedup=99.1x -N=1000 k=1000 : defective=9.450ms fixed=0.050ms speedup=190.5x -N=2000 k=2000 : defective=37.679ms fixed=0.098ms speedup=386.0x - diff --git a/defects/cemu-0002/bench/run_all.py b/defects/cemu-0002/bench/run_all.py deleted file mode 100644 index ff9a74ce3..000000000 --- a/defects/cemu-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cemu-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ceph/Makefile b/defects/ceph/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ceph/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ceph/bench/bench-ceph-0001.py b/defects/ceph/bench/bench-ceph-0001.py deleted file mode 100644 index a15653068..000000000 --- a/defects/ceph/bench/bench-ceph-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ceph-0001.py -# CWE-407: list-scan inside loop in ceph-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ceph-0001: CWE-407: list-scan inside loop in ceph-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ceph/bench/bench-ceph-0002.py b/defects/ceph/bench/bench-ceph-0002.py deleted file mode 100644 index 645d77d93..000000000 --- a/defects/ceph/bench/bench-ceph-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ceph-0002.py -# `BlueStore::_do_remove` — O(E×U) `std::find` over `unshared_blobs` vector -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ceph-0002: `BlueStore::_do_remove` — O(E×U) `std::find` over `unshared_blobs` vector ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ceph/bench/results.txt b/defects/ceph/bench/results.txt deleted file mode 100644 index f8303e095..000000000 --- a/defects/ceph/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ceph-0001: CWE-407: list-scan inside loop in ceph-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.636ms fixed=0.024ms speedup=111.8x -N=1000 k=1000 : defective=9.369ms fixed=0.046ms speedup=203.8x -N=2000 k=2000 : defective=35.386ms fixed=0.096ms speedup=367.2x - -=== ceph-0002: `BlueStore::_do_remove` — O(E×U) `std::find` over `unshared_blobs` vector === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=99.5x -N=1000 k=1000 : defective=8.965ms fixed=0.046ms speedup=194.0x -N=2000 k=2000 : defective=39.446ms fixed=0.104ms speedup=377.7x - diff --git a/defects/ceph/bench/run_all.py b/defects/ceph/bench/run_all.py deleted file mode 100644 index a6cd81dba..000000000 --- a/defects/ceph/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ceph-0001.py", "bench-ceph-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cfe/Makefile b/defects/cfe/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cfe/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cfe/bench/bench-cfe-0001.py b/defects/cfe/bench/bench-cfe-0001.py deleted file mode 100644 index cac430ac9..000000000 --- a/defects/cfe/bench/bench-cfe-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cfe-0001.py -# CWE-407: list-scan inside loop in cfe-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cfe-0001: CWE-407: list-scan inside loop in cfe-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cfe/bench/bench-cfe-0002.py b/defects/cfe/bench/bench-cfe-0002.py deleted file mode 100644 index a3dcbb2c0..000000000 --- a/defects/cfe/bench/bench-cfe-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cfe-0002.py -# CWE-407: list-scan inside loop in cfe-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cfe-0002: CWE-407: list-scan inside loop in cfe-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cfe/bench/bench-cfe-0003.py b/defects/cfe/bench/bench-cfe-0003.py deleted file mode 100644 index 984e992c6..000000000 --- a/defects/cfe/bench/bench-cfe-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cfe-0003.py -# CWE-407: list-scan inside loop in cfe-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cfe-0003: CWE-407: list-scan inside loop in cfe-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cfe/bench/results.txt b/defects/cfe/bench/results.txt deleted file mode 100644 index 5a8e5e42d..000000000 --- a/defects/cfe/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== cfe-0001: CWE-407: list-scan inside loop in cfe-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.319ms fixed=0.021ms speedup=111.0x -N=1000 k=1000 : defective=9.082ms fixed=0.046ms speedup=198.9x -N=2000 k=2000 : defective=43.871ms fixed=0.097ms speedup=450.4x - -=== cfe-0002: CWE-407: list-scan inside loop in cfe-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.338ms fixed=0.021ms speedup=113.4x -N=1000 k=1000 : defective=9.300ms fixed=0.046ms speedup=202.4x -N=2000 k=2000 : defective=41.926ms fixed=0.097ms speedup=430.5x - -=== cfe-0003: CWE-407: list-scan inside loop in cfe-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.117ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=10.777ms fixed=0.093ms speedup=115.3x -N=2000 k=2000 : defective=43.851ms fixed=0.101ms speedup=432.5x - diff --git a/defects/cfe/bench/run_all.py b/defects/cfe/bench/run_all.py deleted file mode 100644 index c070f6aee..000000000 --- a/defects/cfe/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cfe-0001.py", "bench-cfe-0002.py", "bench-cfe-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cfengine/Makefile b/defects/cfengine/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cfengine/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cfengine/bench/bench-cfengine-0001.py b/defects/cfengine/bench/bench-cfengine-0001.py deleted file mode 100644 index 5c58c1b68..000000000 --- a/defects/cfengine/bench/bench-cfengine-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cfengine-0001.py -# CWE-407: list-scan inside loop in cfengine-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== cfengine-0001: CWE-407: list-scan inside loop in cfengine-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cfengine/bench/bench-cfengine-0002.py b/defects/cfengine/bench/bench-cfengine-0002.py deleted file mode 100644 index 65c93d031..000000000 --- a/defects/cfengine/bench/bench-cfengine-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cfengine-0002.py -# CWE-407: list-scan inside loop in cfengine-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== cfengine-0002: CWE-407: list-scan inside loop in cfengine-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cfengine/bench/bench-cfengine-0003.py b/defects/cfengine/bench/bench-cfengine-0003.py deleted file mode 100644 index 3dd1c5d0d..000000000 --- a/defects/cfengine/bench/bench-cfengine-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cfengine-0003.py -# CWE-407: list-scan inside loop in cfengine-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== cfengine-0003: CWE-407: list-scan inside loop in cfengine-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cfengine/bench/results.txt b/defects/cfengine/bench/results.txt deleted file mode 100644 index 8d22a0459..000000000 --- a/defects/cfengine/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== cfengine-0001: CWE-407: list-scan inside loop in cfengine-0001 (generic model) === -N=500 k=500 : defective=1.937ms fixed=0.019ms speedup=103.0x -N=2000 k=2000 : defective=31.965ms fixed=0.091ms speedup=350.3x -N=5000 k=5000 : defective=212.844ms fixed=0.231ms speedup=921.8x -N=10000 k=10000: defective=913.063ms fixed=0.457ms speedup=1997.9x - -=== cfengine-0002: CWE-407: list-scan inside loop in cfengine-0002 (generic model) === -N=500 k=500 : defective=1.950ms fixed=0.019ms speedup=102.6x -N=2000 k=2000 : defective=34.057ms fixed=0.089ms speedup=381.0x -N=5000 k=5000 : defective=224.890ms fixed=0.234ms speedup=960.2x -N=10000 k=10000: defective=874.789ms fixed=0.469ms speedup=1865.5x - -=== cfengine-0003: CWE-407: list-scan inside loop in cfengine-0003 (generic model) === -N=500 k=500 : defective=1.937ms fixed=0.019ms speedup=102.1x -N=2000 k=2000 : defective=32.125ms fixed=0.089ms speedup=360.5x -N=5000 k=5000 : defective=208.477ms fixed=0.417ms speedup=499.6x -N=10000 k=10000: defective=876.097ms fixed=0.452ms speedup=1936.9x - diff --git a/defects/cfengine/bench/run_all.py b/defects/cfengine/bench/run_all.py deleted file mode 100644 index cd0422321..000000000 --- a/defects/cfengine/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cfengine-0001.py", "bench-cfengine-0002.py", "bench-cfengine-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/check/Makefile b/defects/check/Makefile deleted file mode 100644 index 935ae87c8..000000000 --- a/defects/check/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# check patch test + bench runner - -PYTHON := python3 -TEST_FILE := tests/test-check-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/check/bench/bench-check-0001.py b/defects/check/bench/bench-check-0001.py deleted file mode 100644 index 75f498974..000000000 --- a/defects/check/bench/bench-check-0001.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -# bench-check-0001.py -# libcheck Suite tcase-by-name lookup: linear strcmp scan over List -# vs hashtable lookup. Models the runner filter path. - -import sys -import time - - -def bench_defective(n, lookups): - """Linear scan with strcmp per lookup.""" - tcases = [{"name": f"tc_{i:04d}"} for i in range(n)] - lookup_names = [f"tc_{i:04d}" for i in range(lookups)] - - t0 = time.perf_counter() - for tcname in lookup_names: - found = False - for tc in tcases: # O(N) scan, strcmp per entry - if tc["name"] == tcname: - found = True - break - return time.perf_counter() - t0 - - -def bench_fixed(n, lookups): - """Hashtable lookup, O(1) amortized.""" - tcases = [{"name": f"tc_{i:04d}"} for i in range(n)] - lookup_names = [f"tc_{i:04d}" for i in range(lookups)] - - t0 = time.perf_counter() - index = {tc["name"]: tc for tc in tcases} - for tcname in lookup_names: - found = tcname in index - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 50), (100, 100), (200, 200), (500, 500), (1000, 1000)] - - -def run(): - lines = [] - header = "=== check-0001: Suite tcase linear strcmp vs hashtable ===" - print(header); lines.append(header) - - for n, l in CASES: - d = min(bench_defective(n, l) for _ in range(TRIALS)) - f = min(bench_fixed(n, l) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - line = f"N={n:<5} lookups={l:<5}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/check/bench/results.txt b/defects/check/bench/results.txt deleted file mode 100644 index e3cc699d2..000000000 --- a/defects/check/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== check-0001: Suite tcase linear strcmp vs hashtable === -N=50 lookups=50 : defective=0.042ms fixed=0.007ms speedup=5.9x -N=100 lookups=100 : defective=0.160ms fixed=0.012ms speedup=13.1x -N=200 lookups=200 : defective=0.631ms fixed=0.024ms speedup=26.8x -N=500 lookups=500 : defective=4.131ms fixed=0.067ms speedup=61.8x -N=1000 lookups=1000 : defective=16.796ms fixed=0.143ms speedup=117.1x - diff --git a/defects/check/bench/run_all.py b/defects/check/bench/run_all.py deleted file mode 100644 index acae35041..000000000 --- a/defects/check/bench/run_all.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run check bench scripts and write results.txt -import importlib.util, os, sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-check-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/check/patch/check-0001-suite-tcase_by_name-linear-strcmp.patch b/defects/check/patch/check-0001-suite-tcase_by_name-linear-strcmp.patch deleted file mode 100644 index 1108d872c..000000000 --- a/defects/check/patch/check-0001-suite-tcase_by_name-linear-strcmp.patch +++ /dev/null @@ -1,70 +0,0 @@ -# UNDF: UNDF-2026-000001292 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N) per lookup -> O(1) amortized in Suite tcase lookup -# -# Defect: suite_tcase walks the s->tclst List linearly, calling strcmp per -# entry. Invoked by the runner's filter logic (src/check_run.c) per tcase -# per filter application. For suites with M tcases and N filter/lookup -# calls, cost scales as O(N*M). The runner filter runs strcmp against every -# tcase's name on each suite iteration, giving a classic O(N^2) pattern -# on big test suites. -# -# Fix: Maintain a parallel hashtable keyed by name alongside the ordered -# List. Insert into the hashtable on tcase_add / suite_add_tcase; look up -# in O(1) amortized. The List is preserved for ordered iteration (test-run -# order matters for deterministic output). This patch sketches the approach; -# upstream integration requires plumbing through suite_t/tcase_t lifetimes -# and free path. -# -# Complexity gate (tests/test-check-cwe407.py): -# N=M=500 tcases + 500 lookups: fixed must complete in <5ms -# k-scaling 5x: time ratio must be <17.5x -# -# NOTE: patch provided as a design sketch; upstream integration requires a -# companion hashtable implementation (libcheck does not currently ship one). -# The sketch swaps suite_tcase from linear to hashtable-lookup. ---- a/src/check.c -+++ b/src/check.c -@@ -72,24 +72,24 @@ void suite_add_tcase(Suite * s, TCase * tc) - } - if(tcase_matching_mask(tc, getenv("CK_RUN_CASE"))) - { - check_list_add_end(s->tclst, tc); -+ /* -+ * A future patch should also update s->tcname_index (a hashtable -+ * keyed by tc->name) so suite_tcase can look up by name in O(1) -+ * instead of the linear strcmp scan below. See suite-0001 ticket. -+ */ - } - } - - int suite_tcase(Suite * s, const char *tcname) - { -- List *l; -- -- if(s == NULL) -- return 0; -- -- l = s->tclst; -- for(check_list_front(l); !check_list_at_end(l); check_list_advance(l)) -- { -- TCase *tc = (TCase *)check_list_val(l); -- if(strcmp(tcname, tc->name) == 0) -- return 1; -- } -- -- return 0; -+ /* -+ * Previously: linear scan over s->tclst calling strcmp per entry. -+ * For N tcases * N lookups (runner filter path) this was O(N^2). -+ * -+ * New path: O(1) amortized lookup via s->tcname_index hashtable. -+ * Falls back to the linear scan if the index is not built (e.g. during -+ * teardown or if the suite was built by an older API path). -+ */ -+ if(s == NULL) return 0; -+ if(s->tcname_index != NULL) { -+ return hashtable_search(s->tcname_index, tcname) != NULL; -+ } -+ return suite_tcase_linear_fallback(s, tcname); - } diff --git a/defects/check/tests/test-check-cwe407.py b/defects/check/tests/test-check-cwe407.py deleted file mode 100644 index 7b4fb72a7..000000000 --- a/defects/check/tests/test-check-cwe407.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001292 (check-0001) -# -# CWE-407: Algorithmic Complexity -# -# Defect: -# check-0001: suite_tcase walks s->tclst linearly with strcmp per entry. -# For N tcases and N lookups in the runner filter path, total -# cost is O(N^2). -# -# Fix: -# Maintain a parallel hashtable keyed by tcase name; lookup drops to O(1) -# amortized. Ordered List preserved for deterministic test-run output. -# -# Complexity gate (from bench/results.txt): -# N=1000, lookups=1000: defective=17ms, fixed=0.14ms (117x). -# Fixed must complete in <5ms at N=500. k-scaling <17.5x. - -import importlib.util, os, sys, unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-check-0001.py") - - -class TestCheck0001Correctness(unittest.TestCase): - def test_hashtable_matches_linear_membership(self): - names = [f"tc_{i:03d}" for i in range(100)] - index = {n: {"name": n} for n in names} - # known-present - for n in names[::7]: - self.assertIn(n, index) - # known-absent - for n in ["tc_999", "tc_1000", "nope"]: - self.assertNotIn(n, index) - - -class TestCheck0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N500(self): - t_s = min(_mod.bench_fixed(500, 500) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=500, expected <5ms") - - def test_fixed_scaling_linear(self): - t_100 = min(_mod.bench_fixed(100, 100) for _ in range(3)) - t_500 = min(_mod.bench_fixed(500, 500) for _ in range(3)) - ratio = t_500 / t_100 if t_100 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=500/N=100 ratio {ratio:.2f}x, expected <17.5x") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/chef/Makefile b/defects/chef/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/chef/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/chef/bench/bench-chef-0001.py b/defects/chef/bench/bench-chef-0001.py deleted file mode 100644 index 96aa30d18..000000000 --- a/defects/chef/bench/bench-chef-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-chef-0001.py -# chef-0001 — O(N²) run list dedup via Array#include? -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== chef-0001: chef-0001 — O(N²) run list dedup via Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/chef/bench/results.txt b/defects/chef/bench/results.txt deleted file mode 100644 index 08a24169b..000000000 --- a/defects/chef/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== chef-0001: chef-0001 — O(N²) run list dedup via Array#include? === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.965ms fixed=0.024ms speedup=123.8x -N=1000 k=1000 : defective=9.317ms fixed=0.050ms speedup=187.3x -N=2000 k=2000 : defective=39.882ms fixed=0.107ms speedup=373.7x - diff --git a/defects/chef/bench/run_all.py b/defects/chef/bench/run_all.py deleted file mode 100644 index bee6f55cb..000000000 --- a/defects/chef/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-chef-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cilium/Makefile b/defects/cilium/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cilium/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cilium/bench/bench-cilium-0001.py b/defects/cilium/bench/bench-cilium-0001.py deleted file mode 100644 index 01b765874..000000000 --- a/defects/cilium/bench/bench-cilium-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cilium-0001.py -# CWE-407: list-scan inside loop in cilium-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cilium-0001: CWE-407: list-scan inside loop in cilium-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cilium/bench/bench-cilium-0002.py b/defects/cilium/bench/bench-cilium-0002.py deleted file mode 100644 index f679b2e52..000000000 --- a/defects/cilium/bench/bench-cilium-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cilium-0002.py -# CWE-407: list-scan inside loop in cilium-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cilium-0002: CWE-407: list-scan inside loop in cilium-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cilium/bench/bench-cilium-0003.py b/defects/cilium/bench/bench-cilium-0003.py deleted file mode 100644 index 7c5069cee..000000000 --- a/defects/cilium/bench/bench-cilium-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cilium-0003.py -# CWE-407 — Quadratic IP address deduplication in node manager -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cilium-0003: CWE-407 — Quadratic IP address deduplication in node manager ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cilium/bench/bench-cilium-0004.py b/defects/cilium/bench/bench-cilium-0004.py deleted file mode 100644 index 91b19d0c4..000000000 --- a/defects/cilium/bench/bench-cilium-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cilium-0004.py -# CWE-407 — Quadratic predecessor deduplication in eBPF CFG construction -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cilium-0004: CWE-407 — Quadratic predecessor deduplication in eBPF CFG construction ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cilium/bench/results.txt b/defects/cilium/bench/results.txt deleted file mode 100644 index d09ce7432..000000000 --- a/defects/cilium/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== cilium-0001: CWE-407: list-scan inside loop in cilium-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.013ms fixed=0.019ms speedup=104.4x -N=1000 k=1000 : defective=8.680ms fixed=0.043ms speedup=200.3x -N=2000 k=2000 : defective=34.494ms fixed=0.095ms speedup=362.4x - -=== cilium-0002: CWE-407: list-scan inside loop in cilium-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.136ms fixed=0.019ms speedup=110.0x -N=1000 k=1000 : defective=8.506ms fixed=0.043ms speedup=196.6x -N=2000 k=2000 : defective=34.962ms fixed=0.096ms speedup=362.6x - -=== cilium-0003: CWE-407 — Quadratic IP address deduplication in node manager === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.109ms fixed=0.021ms speedup=100.2x -N=1000 k=1000 : defective=8.822ms fixed=0.046ms speedup=192.4x -N=2000 k=2000 : defective=37.025ms fixed=0.096ms speedup=386.4x - -=== cilium-0004: CWE-407 — Quadratic predecessor deduplication in eBPF CFG construction === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=101.9x -N=1000 k=1000 : defective=10.608ms fixed=0.096ms speedup=110.4x -N=2000 k=2000 : defective=36.541ms fixed=0.096ms speedup=381.7x - diff --git a/defects/cilium/bench/run_all.py b/defects/cilium/bench/run_all.py deleted file mode 100644 index 63426c26e..000000000 --- a/defects/cilium/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cilium-0001.py", "bench-cilium-0002.py", "bench-cilium-0003.py", "bench-cilium-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/citra-0001/Makefile b/defects/citra-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/citra-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/citra-0001/bench/bench-citra-0001-0001.py b/defects/citra-0001/bench/bench-citra-0001-0001.py deleted file mode 100644 index 1aa35f3d0..000000000 --- a/defects/citra-0001/bench/bench-citra-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-citra-0001-0001.py -# CWE-407: list-scan inside loop in citra-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== citra-0001-0001: CWE-407: list-scan inside loop in citra-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/citra-0001/bench/results.txt b/defects/citra-0001/bench/results.txt deleted file mode 100644 index fa14920c8..000000000 --- a/defects/citra-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== citra-0001-0001: CWE-407: list-scan inside loop in citra-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.550ms fixed=0.023ms speedup=109.9x -N=1000 k=1000 : defective=14.370ms fixed=0.058ms speedup=249.9x -N=2000 k=2000 : defective=57.334ms fixed=0.111ms speedup=517.6x - diff --git a/defects/citra-0001/bench/run_all.py b/defects/citra-0001/bench/run_all.py deleted file mode 100644 index 2ebe1943a..000000000 --- a/defects/citra-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-citra-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/clamav-0001/Makefile b/defects/clamav-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/clamav-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/clamav-0001/bench/bench-clamav-0001-0001.py b/defects/clamav-0001/bench/bench-clamav-0001-0001.py deleted file mode 100644 index b85e71281..000000000 --- a/defects/clamav-0001/bench/bench-clamav-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clamav-0001-0001.py -# CWE-407: list-scan inside loop in clamav-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clamav-0001-0001: CWE-407: list-scan inside loop in clamav-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clamav-0001/bench/results.txt b/defects/clamav-0001/bench/results.txt deleted file mode 100644 index 1f4073ede..000000000 --- a/defects/clamav-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== clamav-0001-0001: CWE-407: list-scan inside loop in clamav-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.418ms fixed=0.024ms speedup=102.4x -N=1000 k=1000 : defective=10.379ms fixed=0.053ms speedup=196.0x -N=2000 k=2000 : defective=36.279ms fixed=0.097ms speedup=372.8x - diff --git a/defects/clamav-0001/bench/run_all.py b/defects/clamav-0001/bench/run_all.py deleted file mode 100644 index 57ef0a45f..000000000 --- a/defects/clamav-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-clamav-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/clementine/Makefile b/defects/clementine/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/clementine/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/clementine/bench/bench-clementine-0001.py b/defects/clementine/bench/bench-clementine-0001.py deleted file mode 100644 index f1bba9db1..000000000 --- a/defects/clementine/bench/bench-clementine-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clementine-0001.py -# Severity: HIGH -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clementine-0001: Severity: HIGH ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clementine/bench/bench-clementine-0002.py b/defects/clementine/bench/bench-clementine-0002.py deleted file mode 100644 index 929283b05..000000000 --- a/defects/clementine/bench/bench-clementine-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clementine-0002.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clementine-0002: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clementine/bench/results.txt b/defects/clementine/bench/results.txt deleted file mode 100644 index e1e2f3fc5..000000000 --- a/defects/clementine/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== clementine-0001: Severity: HIGH === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=3.179ms fixed=0.037ms speedup=86.2x -N=1000 k=1000 : defective=10.805ms fixed=0.051ms speedup=210.9x -N=2000 k=2000 : defective=40.631ms fixed=0.106ms speedup=382.3x - -=== clementine-0002: Severity: MEDIUM === -N=100 k=100 : defective=0.119ms fixed=0.006ms speedup=18.5x -N=500 k=500 : defective=3.007ms fixed=0.095ms speedup=31.6x -N=1000 k=1000 : defective=12.607ms fixed=0.094ms speedup=133.7x -N=2000 k=2000 : defective=42.040ms fixed=0.102ms speedup=412.2x - diff --git a/defects/clementine/bench/run_all.py b/defects/clementine/bench/run_all.py deleted file mode 100644 index 6005d2d76..000000000 --- a/defects/clementine/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-clementine-0001.py", "bench-clementine-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/clickhouse-java/Makefile b/defects/clickhouse-java/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/clickhouse-java/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/clickhouse-java/bench/bench-clickhouse-java-0001.py b/defects/clickhouse-java/bench/bench-clickhouse-java-0001.py deleted file mode 100644 index 8dabb33b6..000000000 --- a/defects/clickhouse-java/bench/bench-clickhouse-java-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clickhouse-java-0001.py -# CWE-407: list-scan inside loop in clickhouse-java-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clickhouse-java-0001: CWE-407: list-scan inside loop in clickhouse-java-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clickhouse-java/bench/results.txt b/defects/clickhouse-java/bench/results.txt deleted file mode 100644 index ebb2ea732..000000000 --- a/defects/clickhouse-java/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== clickhouse-java-0001: CWE-407: list-scan inside loop in clickhouse-java-0001 (generic model) === -N=100 k=100 : defective=0.116ms fixed=0.005ms speedup=24.7x -N=500 k=500 : defective=2.894ms fixed=0.028ms speedup=103.4x -N=1000 k=1000 : defective=11.913ms fixed=0.131ms speedup=91.2x -N=2000 k=2000 : defective=39.584ms fixed=0.111ms speedup=356.8x - diff --git a/defects/clickhouse-java/bench/run_all.py b/defects/clickhouse-java/bench/run_all.py deleted file mode 100644 index ac2cc2238..000000000 --- a/defects/clickhouse-java/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-clickhouse-java-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/clickhouse/Makefile b/defects/clickhouse/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/clickhouse/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/clickhouse/bench/bench-clickhouse-0001.py b/defects/clickhouse/bench/bench-clickhouse-0001.py deleted file mode 100644 index ad3b50356..000000000 --- a/defects/clickhouse/bench/bench-clickhouse-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clickhouse-0001.py -# StorageSystemColumns linear scan per column for key membership -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clickhouse-0001: StorageSystemColumns linear scan per column for key membership ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clickhouse/bench/bench-clickhouse-0002.py b/defects/clickhouse/bench/bench-clickhouse-0002.py deleted file mode 100644 index 64a75d188..000000000 --- a/defects/clickhouse/bench/bench-clickhouse-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clickhouse-0002.py -# ReplaceColumnTransformerNode::findReplacementExpression O(C×R) linear scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clickhouse-0002: ReplaceColumnTransformerNode::findReplacementExpression O(C×R) linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clickhouse/bench/bench-clickhouse-java-0001.py b/defects/clickhouse/bench/bench-clickhouse-java-0001.py deleted file mode 100644 index 8dabb33b6..000000000 --- a/defects/clickhouse/bench/bench-clickhouse-java-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-clickhouse-java-0001.py -# CWE-407: list-scan inside loop in clickhouse-java-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== clickhouse-java-0001: CWE-407: list-scan inside loop in clickhouse-java-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/clickhouse/bench/results.txt b/defects/clickhouse/bench/results.txt deleted file mode 100644 index 2bad51086..000000000 --- a/defects/clickhouse/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== clickhouse-0001: StorageSystemColumns linear scan per column for key membership === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.587ms fixed=0.024ms speedup=109.5x -N=1000 k=1000 : defective=10.389ms fixed=0.053ms speedup=197.4x -N=2000 k=2000 : defective=38.465ms fixed=0.114ms speedup=337.1x - -=== clickhouse-0002: ReplaceColumnTransformerNode::findReplacementExpression O(C×R) linear scan === -N=100 k=100 : defective=0.167ms fixed=0.007ms speedup=23.2x -N=500 k=500 : defective=2.486ms fixed=0.022ms speedup=111.1x -N=1000 k=1000 : defective=8.804ms fixed=0.046ms speedup=193.5x -N=2000 k=2000 : defective=35.414ms fixed=0.098ms speedup=361.9x - -=== clickhouse-java-0001: CWE-407: list-scan inside loop in clickhouse-java-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=8.837ms fixed=0.046ms speedup=191.8x -N=2000 k=2000 : defective=35.437ms fixed=0.096ms speedup=370.7x - diff --git a/defects/clickhouse/bench/run_all.py b/defects/clickhouse/bench/run_all.py deleted file mode 100644 index 4684337f9..000000000 --- a/defects/clickhouse/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-clickhouse-0001.py", "bench-clickhouse-0002.py", "bench-clickhouse-java-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cmake-0005/Makefile b/defects/cmake-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cmake-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cmake-0005/bench/bench-cmake-0005-0005.py b/defects/cmake-0005/bench/bench-cmake-0005-0005.py deleted file mode 100644 index af76774fb..000000000 --- a/defects/cmake-0005/bench/bench-cmake-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0005-0005.py -# CWE-407: list-scan inside loop in cmake-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0005-0005: CWE-407: list-scan inside loop in cmake-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake-0005/bench/results.txt b/defects/cmake-0005/bench/results.txt deleted file mode 100644 index d42fd2364..000000000 --- a/defects/cmake-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cmake-0005-0005: CWE-407: list-scan inside loop in cmake-0005-0005 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.704ms fixed=0.047ms speedup=57.0x -N=1000 k=1000 : defective=11.193ms fixed=0.052ms speedup=213.8x -N=2000 k=2000 : defective=43.701ms fixed=0.118ms speedup=371.0x - diff --git a/defects/cmake-0005/bench/run_all.py b/defects/cmake-0005/bench/run_all.py deleted file mode 100644 index 0c9e6f893..000000000 --- a/defects/cmake-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cmake-0005-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cmake-0006/Makefile b/defects/cmake-0006/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cmake-0006/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cmake-0006/bench/bench-cmake-0006-0006.py b/defects/cmake-0006/bench/bench-cmake-0006-0006.py deleted file mode 100644 index bbffdc234..000000000 --- a/defects/cmake-0006/bench/bench-cmake-0006-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0006-0006.py -# CWE-407: list-scan inside loop in cmake-0006-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0006-0006: CWE-407: list-scan inside loop in cmake-0006-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake-0006/bench/results.txt b/defects/cmake-0006/bench/results.txt deleted file mode 100644 index d4c7ee995..000000000 --- a/defects/cmake-0006/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cmake-0006-0006: CWE-407: list-scan inside loop in cmake-0006-0006 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=3.041ms fixed=0.025ms speedup=119.9x -N=1000 k=1000 : defective=11.021ms fixed=0.056ms speedup=196.7x -N=2000 k=2000 : defective=37.121ms fixed=0.422ms speedup=87.9x - diff --git a/defects/cmake-0006/bench/run_all.py b/defects/cmake-0006/bench/run_all.py deleted file mode 100644 index 151b7ab39..000000000 --- a/defects/cmake-0006/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cmake-0006-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cmake-0007/Makefile b/defects/cmake-0007/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cmake-0007/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cmake-0007/bench/bench-cmake-0007-0007.py b/defects/cmake-0007/bench/bench-cmake-0007-0007.py deleted file mode 100644 index c99fb2518..000000000 --- a/defects/cmake-0007/bench/bench-cmake-0007-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0007-0007.py -# CWE-407: list-scan inside loop in cmake-0007-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0007-0007: CWE-407: list-scan inside loop in cmake-0007-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake-0007/bench/results.txt b/defects/cmake-0007/bench/results.txt deleted file mode 100644 index 33eb3c849..000000000 --- a/defects/cmake-0007/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cmake-0007-0007: CWE-407: list-scan inside loop in cmake-0007-0007 (generic model) === -N=100 k=100 : defective=0.114ms fixed=0.005ms speedup=24.9x -N=500 k=500 : defective=2.888ms fixed=0.027ms speedup=105.1x -N=1000 k=1000 : defective=15.313ms fixed=0.061ms speedup=252.2x -N=2000 k=2000 : defective=37.817ms fixed=0.096ms speedup=392.6x - diff --git a/defects/cmake-0007/bench/run_all.py b/defects/cmake-0007/bench/run_all.py deleted file mode 100644 index 05437e804..000000000 --- a/defects/cmake-0007/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cmake-0007-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cmake/Makefile b/defects/cmake/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cmake/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cmake/bench/bench-cmake-0001.py b/defects/cmake/bench/bench-cmake-0001.py deleted file mode 100644 index ecf19a562..000000000 --- a/defects/cmake/bench/bench-cmake-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0001.py -# CWE-407: list-scan inside loop in cmake-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0001: CWE-407: list-scan inside loop in cmake-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/bench-cmake-0002.py b/defects/cmake/bench/bench-cmake-0002.py deleted file mode 100644 index 69686721d..000000000 --- a/defects/cmake/bench/bench-cmake-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0002.py -# CWE-407: list-scan inside loop in cmake-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0002: CWE-407: list-scan inside loop in cmake-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/bench-cmake-0003.py b/defects/cmake/bench/bench-cmake-0003.py deleted file mode 100644 index 0e833a06b..000000000 --- a/defects/cmake/bench/bench-cmake-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0003.py -# CWE-407: list-scan inside loop in cmake-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0003: CWE-407: list-scan inside loop in cmake-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/bench-cmake-0004.py b/defects/cmake/bench/bench-cmake-0004.py deleted file mode 100644 index c0a0304f8..000000000 --- a/defects/cmake/bench/bench-cmake-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0004.py -# CWE-407: list-scan inside loop in cmake-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0004: CWE-407: list-scan inside loop in cmake-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/bench-cmake-0005-0005.py b/defects/cmake/bench/bench-cmake-0005-0005.py deleted file mode 100644 index af76774fb..000000000 --- a/defects/cmake/bench/bench-cmake-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0005-0005.py -# CWE-407: list-scan inside loop in cmake-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0005-0005: CWE-407: list-scan inside loop in cmake-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/bench-cmake-0006-0006.py b/defects/cmake/bench/bench-cmake-0006-0006.py deleted file mode 100644 index bbffdc234..000000000 --- a/defects/cmake/bench/bench-cmake-0006-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0006-0006.py -# CWE-407: list-scan inside loop in cmake-0006-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0006-0006: CWE-407: list-scan inside loop in cmake-0006-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/bench-cmake-0007-0007.py b/defects/cmake/bench/bench-cmake-0007-0007.py deleted file mode 100644 index c99fb2518..000000000 --- a/defects/cmake/bench/bench-cmake-0007-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cmake-0007-0007.py -# CWE-407: list-scan inside loop in cmake-0007-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cmake-0007-0007: CWE-407: list-scan inside loop in cmake-0007-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cmake/bench/results.txt b/defects/cmake/bench/results.txt deleted file mode 100644 index 4a6a01e3d..000000000 --- a/defects/cmake/bench/results.txt +++ /dev/null @@ -1,42 +0,0 @@ -=== cmake-0001: CWE-407: list-scan inside loop in cmake-0001 (generic model) === -N=100 k=100 : defective=0.086ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.122ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=8.708ms fixed=0.045ms speedup=191.8x -N=2000 k=2000 : defective=34.155ms fixed=0.093ms speedup=367.9x - -=== cmake-0002: CWE-407: list-scan inside loop in cmake-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.143ms fixed=0.033ms speedup=64.1x -N=1000 k=1000 : defective=9.301ms fixed=0.074ms speedup=125.9x -N=2000 k=2000 : defective=34.928ms fixed=0.096ms speedup=363.2x - -=== cmake-0003: CWE-407: list-scan inside loop in cmake-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.131ms fixed=0.020ms speedup=104.9x -N=1000 k=1000 : defective=8.925ms fixed=0.045ms speedup=199.8x -N=2000 k=2000 : defective=33.851ms fixed=0.093ms speedup=364.5x - -=== cmake-0004: CWE-407: list-scan inside loop in cmake-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.039ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=8.454ms fixed=0.045ms speedup=189.7x -N=2000 k=2000 : defective=34.121ms fixed=0.093ms speedup=367.0x - -=== cmake-0005-0005: CWE-407: list-scan inside loop in cmake-0005-0005 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.030ms fixed=0.020ms speedup=102.9x -N=1000 k=1000 : defective=8.473ms fixed=0.072ms speedup=117.7x -N=2000 k=2000 : defective=36.604ms fixed=0.094ms speedup=390.0x - -=== cmake-0006-0006: CWE-407: list-scan inside loop in cmake-0006-0006 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.047ms fixed=0.020ms speedup=104.7x -N=1000 k=1000 : defective=8.308ms fixed=0.044ms speedup=187.9x -N=2000 k=2000 : defective=33.554ms fixed=0.092ms speedup=365.5x - -=== cmake-0007-0007: CWE-407: list-scan inside loop in cmake-0007-0007 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.031ms fixed=0.019ms speedup=105.3x -N=1000 k=1000 : defective=8.278ms fixed=0.044ms speedup=187.5x -N=2000 k=2000 : defective=33.565ms fixed=0.096ms speedup=351.0x - diff --git a/defects/cmake/bench/run_all.py b/defects/cmake/bench/run_all.py deleted file mode 100644 index 2f4454e80..000000000 --- a/defects/cmake/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cmake-0001.py", "bench-cmake-0002.py", "bench-cmake-0003.py", "bench-cmake-0004.py", "bench-cmake-0005-0005.py", "bench-cmake-0006-0006.py", "bench-cmake-0007-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cockroach/Makefile b/defects/cockroach/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cockroach/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cockroach/bench/bench-cockroach-0001.py b/defects/cockroach/bench/bench-cockroach-0001.py deleted file mode 100644 index 7de924f7d..000000000 --- a/defects/cockroach/bench/bench-cockroach-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cockroach-0001.py -# CWE-407: list-scan inside loop in cockroach-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cockroach-0001: CWE-407: list-scan inside loop in cockroach-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cockroach/bench/bench-cockroach-0002.py b/defects/cockroach/bench/bench-cockroach-0002.py deleted file mode 100644 index c6167cd73..000000000 --- a/defects/cockroach/bench/bench-cockroach-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cockroach-0002.py -# CWE-407: list-scan inside loop in cockroach-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cockroach-0002: CWE-407: list-scan inside loop in cockroach-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cockroach/bench/bench-cockroach-0003.py b/defects/cockroach/bench/bench-cockroach-0003.py deleted file mode 100644 index 21b0a3be3..000000000 --- a/defects/cockroach/bench/bench-cockroach-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cockroach-0003.py -# CWE-407: list-scan inside loop in cockroach-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cockroach-0003: CWE-407: list-scan inside loop in cockroach-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cockroach/bench/results.txt b/defects/cockroach/bench/results.txt deleted file mode 100644 index c931b6e1f..000000000 --- a/defects/cockroach/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== cockroach-0001: CWE-407: list-scan inside loop in cockroach-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.447ms fixed=0.023ms speedup=104.7x -N=1000 k=1000 : defective=9.341ms fixed=0.045ms speedup=207.5x -N=2000 k=2000 : defective=44.362ms fixed=0.097ms speedup=457.6x - -=== cockroach-0002: CWE-407: list-scan inside loop in cockroach-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.111ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=8.935ms fixed=0.045ms speedup=196.6x -N=2000 k=2000 : defective=35.889ms fixed=0.101ms speedup=355.6x - -=== cockroach-0003: CWE-407: list-scan inside loop in cockroach-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.336ms fixed=0.023ms speedup=102.6x -N=1000 k=1000 : defective=10.185ms fixed=0.051ms speedup=198.7x -N=2000 k=2000 : defective=37.453ms fixed=0.096ms speedup=388.6x - diff --git a/defects/cockroach/bench/run_all.py b/defects/cockroach/bench/run_all.py deleted file mode 100644 index 6fac609c0..000000000 --- a/defects/cockroach/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cockroach-0001.py", "bench-cockroach-0002.py", "bench-cockroach-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cockroachdb/Makefile b/defects/cockroachdb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cockroachdb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cockroachdb/bench/bench-cockroachdb-0001.py b/defects/cockroachdb/bench/bench-cockroachdb-0001.py deleted file mode 100644 index edc4135c6..000000000 --- a/defects/cockroachdb/bench/bench-cockroachdb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cockroachdb-0001.py -# CWE-407: list-scan inside loop in cockroachdb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cockroachdb-0001: CWE-407: list-scan inside loop in cockroachdb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cockroachdb/bench/bench-cockroachdb-0002.py b/defects/cockroachdb/bench/bench-cockroachdb-0002.py deleted file mode 100644 index 58862c14c..000000000 --- a/defects/cockroachdb/bench/bench-cockroachdb-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cockroachdb-0002.py -# EnsureUserOnlyBelongsToRoles O(R²) slices.Contains in role sync loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cockroachdb-0002: EnsureUserOnlyBelongsToRoles O(R²) slices.Contains in role sync loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cockroachdb/bench/results.txt b/defects/cockroachdb/bench/results.txt deleted file mode 100644 index ffc663873..000000000 --- a/defects/cockroachdb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== cockroachdb-0001: CWE-407: list-scan inside loop in cockroachdb-0001 (generic model) === -N=100 k=100 : defective=0.115ms fixed=0.004ms speedup=25.9x -N=500 k=500 : defective=2.996ms fixed=0.028ms speedup=108.2x -N=1000 k=1000 : defective=13.305ms fixed=0.125ms speedup=106.2x -N=2000 k=2000 : defective=49.552ms fixed=0.105ms speedup=469.7x - -=== cockroachdb-0002: EnsureUserOnlyBelongsToRoles O(R²) slices.Contains in role sync loop === -N=100 k=100 : defective=0.093ms fixed=0.005ms speedup=17.1x -N=500 k=500 : defective=2.323ms fixed=0.053ms speedup=44.2x -N=1000 k=1000 : defective=9.736ms fixed=0.052ms speedup=188.8x -N=2000 k=2000 : defective=36.128ms fixed=0.106ms speedup=339.5x - diff --git a/defects/cockroachdb/bench/run_all.py b/defects/cockroachdb/bench/run_all.py deleted file mode 100644 index 8a6c88926..000000000 --- a/defects/cockroachdb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cockroachdb-0001.py", "bench-cockroachdb-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cocos2d-0001/Makefile b/defects/cocos2d-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cocos2d-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cocos2d-0001/bench/bench-cocos2d-0001-0001.py b/defects/cocos2d-0001/bench/bench-cocos2d-0001-0001.py deleted file mode 100644 index dcc5ba21f..000000000 --- a/defects/cocos2d-0001/bench/bench-cocos2d-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cocos2d-0001-0001.py -# CWE-407: list-scan inside loop in cocos2d-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cocos2d-0001-0001: CWE-407: list-scan inside loop in cocos2d-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cocos2d-0001/bench/results.txt b/defects/cocos2d-0001/bench/results.txt deleted file mode 100644 index 773a0d772..000000000 --- a/defects/cocos2d-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cocos2d-0001-0001: CWE-407: list-scan inside loop in cocos2d-0001-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.014ms speedup=6.8x -N=500 k=500 : defective=2.415ms fixed=0.024ms speedup=101.5x -N=1000 k=1000 : defective=10.050ms fixed=0.054ms speedup=187.1x -N=2000 k=2000 : defective=42.333ms fixed=0.104ms speedup=406.7x - diff --git a/defects/cocos2d-0001/bench/run_all.py b/defects/cocos2d-0001/bench/run_all.py deleted file mode 100644 index 215e6989c..000000000 --- a/defects/cocos2d-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cocos2d-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cocos2d-0002/Makefile b/defects/cocos2d-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cocos2d-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cocos2d-0002/bench/bench-cocos2d-0002-0002.py b/defects/cocos2d-0002/bench/bench-cocos2d-0002-0002.py deleted file mode 100644 index 0dddc3efd..000000000 --- a/defects/cocos2d-0002/bench/bench-cocos2d-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cocos2d-0002-0002.py -# CWE-407: list-scan inside loop in cocos2d-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cocos2d-0002-0002: CWE-407: list-scan inside loop in cocos2d-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cocos2d-0002/bench/results.txt b/defects/cocos2d-0002/bench/results.txt deleted file mode 100644 index a8d073b31..000000000 --- a/defects/cocos2d-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cocos2d-0002-0002: CWE-407: list-scan inside loop in cocos2d-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.507ms fixed=0.024ms speedup=106.5x -N=1000 k=1000 : defective=9.966ms fixed=0.048ms speedup=206.7x -N=2000 k=2000 : defective=41.099ms fixed=0.211ms speedup=194.9x - diff --git a/defects/cocos2d-0002/bench/run_all.py b/defects/cocos2d-0002/bench/run_all.py deleted file mode 100644 index 818c8faf7..000000000 --- a/defects/cocos2d-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cocos2d-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cocos2d-0003/Makefile b/defects/cocos2d-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cocos2d-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cocos2d-0003/bench/bench-cocos2d-0003-0003.py b/defects/cocos2d-0003/bench/bench-cocos2d-0003-0003.py deleted file mode 100644 index b0271af7a..000000000 --- a/defects/cocos2d-0003/bench/bench-cocos2d-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cocos2d-0003-0003.py -# CWE-407: list-scan inside loop in cocos2d-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cocos2d-0003-0003: CWE-407: list-scan inside loop in cocos2d-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cocos2d-0003/bench/results.txt b/defects/cocos2d-0003/bench/results.txt deleted file mode 100644 index 10342ce1e..000000000 --- a/defects/cocos2d-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cocos2d-0003-0003: CWE-407: list-scan inside loop in cocos2d-0003-0003 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.553ms fixed=0.025ms speedup=100.9x -N=1000 k=1000 : defective=10.627ms fixed=0.055ms speedup=193.8x -N=2000 k=2000 : defective=39.497ms fixed=0.106ms speedup=371.5x - diff --git a/defects/cocos2d-0003/bench/run_all.py b/defects/cocos2d-0003/bench/run_all.py deleted file mode 100644 index bb13fb329..000000000 --- a/defects/cocos2d-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cocos2d-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/composer/Makefile b/defects/composer/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/composer/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/composer/bench/bench-composer-0001.py b/defects/composer/bench/bench-composer-0001.py deleted file mode 100644 index bc490badf..000000000 --- a/defects/composer/bench/bench-composer-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-composer-0001.py -# CWE-407: list-scan inside loop in composer-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== composer-0001: CWE-407: list-scan inside loop in composer-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/composer/bench/bench-composer-0002.py b/defects/composer/bench/bench-composer-0002.py deleted file mode 100644 index 5d0442cf0..000000000 --- a/defects/composer/bench/bench-composer-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-composer-0002.py -# CWE-407: list-scan inside loop in composer-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== composer-0002: CWE-407: list-scan inside loop in composer-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/composer/bench/bench-composer-0003.py b/defects/composer/bench/bench-composer-0003.py deleted file mode 100644 index 233171700..000000000 --- a/defects/composer/bench/bench-composer-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-composer-0003.py -# InstalledRepository::getDependents — O(P²) in_array on growing needles list -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== composer-0003: InstalledRepository::getDependents — O(P²) in_array on growing needles list ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/composer/bench/results.txt b/defects/composer/bench/results.txt deleted file mode 100644 index c9ff05720..000000000 --- a/defects/composer/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== composer-0001: CWE-407: list-scan inside loop in composer-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.582ms fixed=0.024ms speedup=105.4x -N=1000 k=1000 : defective=13.715ms fixed=0.055ms speedup=250.8x -N=2000 k=2000 : defective=41.626ms fixed=0.097ms speedup=427.9x - -=== composer-0002: CWE-407: list-scan inside loop in composer-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.319ms fixed=0.023ms speedup=101.2x -N=1000 k=1000 : defective=8.734ms fixed=0.048ms speedup=182.4x -N=2000 k=2000 : defective=35.711ms fixed=0.095ms speedup=376.7x - -=== composer-0003: InstalledRepository::getDependents — O(P²) in_array on growing needles list === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.097ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.622ms fixed=0.046ms speedup=188.1x -N=2000 k=2000 : defective=34.948ms fixed=0.106ms speedup=329.6x - diff --git a/defects/composer/bench/run_all.py b/defects/composer/bench/run_all.py deleted file mode 100644 index 9338afb00..000000000 --- a/defects/composer/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-composer-0001.py", "bench-composer-0002.py", "bench-composer-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/conduit/Makefile b/defects/conduit/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/conduit/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/conduit/bench/bench-conduit-0001.py b/defects/conduit/bench/bench-conduit-0001.py deleted file mode 100644 index ebd8a76af..000000000 --- a/defects/conduit/bench/bench-conduit-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-conduit-0001.py -# CWE-407: list-scan inside loop in conduit-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== conduit-0001: CWE-407: list-scan inside loop in conduit-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/conduit/bench/results.txt b/defects/conduit/bench/results.txt deleted file mode 100644 index b2912c2d6..000000000 --- a/defects/conduit/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== conduit-0001: CWE-407: list-scan inside loop in conduit-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.364ms fixed=0.022ms speedup=106.9x -N=1000 k=1000 : defective=8.962ms fixed=0.046ms speedup=196.9x -N=2000 k=2000 : defective=36.996ms fixed=0.104ms speedup=357.4x - diff --git a/defects/conduit/bench/run_all.py b/defects/conduit/bench/run_all.py deleted file mode 100644 index fa5adf997..000000000 --- a/defects/conduit/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-conduit-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/consul/Makefile b/defects/consul/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/consul/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/consul/bench/bench-consul-0001.py b/defects/consul/bench/bench-consul-0001.py deleted file mode 100644 index e741de6d9..000000000 --- a/defects/consul/bench/bench-consul-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-consul-0001.py -# CWE-407: list-scan inside loop in consul-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== consul-0001: CWE-407: list-scan inside loop in consul-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/consul/bench/bench-consul-0002.py b/defects/consul/bench/bench-consul-0002.py deleted file mode 100644 index cd15f0815..000000000 --- a/defects/consul/bench/bench-consul-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-consul-0002.py -# CWE-407: list-scan inside loop in consul-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== consul-0002: CWE-407: list-scan inside loop in consul-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/consul/bench/results.txt b/defects/consul/bench/results.txt deleted file mode 100644 index 87da71c03..000000000 --- a/defects/consul/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== consul-0001: CWE-407: list-scan inside loop in consul-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.423ms fixed=0.023ms speedup=103.6x -N=1000 k=1000 : defective=9.513ms fixed=0.050ms speedup=188.8x -N=2000 k=2000 : defective=40.819ms fixed=0.096ms speedup=425.4x - -=== consul-0002: CWE-407: list-scan inside loop in consul-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.099ms fixed=0.020ms speedup=102.7x -N=1000 k=1000 : defective=8.594ms fixed=0.046ms speedup=186.0x -N=2000 k=2000 : defective=35.488ms fixed=0.098ms speedup=362.6x - diff --git a/defects/consul/bench/run_all.py b/defects/consul/bench/run_all.py deleted file mode 100644 index bb1e9d1e6..000000000 --- a/defects/consul/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-consul-0001.py", "bench-consul-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/containerd/Makefile b/defects/containerd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/containerd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/containerd/bench/bench-containerd-0001.py b/defects/containerd/bench/bench-containerd-0001.py deleted file mode 100644 index 5596ceb61..000000000 --- a/defects/containerd/bench/bench-containerd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-containerd-0001.py -# filterCaps + WithAddedCapabilities O(n²) — capsContain inside loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== containerd-0001: filterCaps + WithAddedCapabilities O(n²) — capsContain inside loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/containerd/bench/results.txt b/defects/containerd/bench/results.txt deleted file mode 100644 index b3cc03375..000000000 --- a/defects/containerd/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== containerd-0001: filterCaps + WithAddedCapabilities O(n²) — capsContain inside loop === -N=100 k=100 : defective=0.098ms fixed=0.005ms speedup=19.5x -N=500 k=500 : defective=2.463ms fixed=0.023ms speedup=105.2x -N=1000 k=1000 : defective=11.314ms fixed=0.053ms speedup=212.8x -N=2000 k=2000 : defective=40.488ms fixed=0.097ms speedup=415.4x - diff --git a/defects/containerd/bench/run_all.py b/defects/containerd/bench/run_all.py deleted file mode 100644 index d969f5006..000000000 --- a/defects/containerd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-containerd-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/contiki-0001/Makefile b/defects/contiki-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/contiki-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/contiki-0001/bench/bench-contiki-0001-0001.py b/defects/contiki-0001/bench/bench-contiki-0001-0001.py deleted file mode 100644 index cf1e6d9d7..000000000 --- a/defects/contiki-0001/bench/bench-contiki-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-contiki-0001-0001.py -# CWE-407: list-scan inside loop in contiki-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== contiki-0001-0001: CWE-407: list-scan inside loop in contiki-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/contiki-0001/bench/results.txt b/defects/contiki-0001/bench/results.txt deleted file mode 100644 index 41633da2f..000000000 --- a/defects/contiki-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== contiki-0001-0001: CWE-407: list-scan inside loop in contiki-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.609ms fixed=0.024ms speedup=110.6x -N=1000 k=1000 : defective=12.379ms fixed=0.056ms speedup=220.8x -N=2000 k=2000 : defective=43.036ms fixed=0.097ms speedup=443.0x - diff --git a/defects/contiki-0001/bench/run_all.py b/defects/contiki-0001/bench/run_all.py deleted file mode 100644 index 4341417e5..000000000 --- a/defects/contiki-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-contiki-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cpython/Makefile b/defects/cpython/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cpython/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cpython/bench/bench-cpython-0001.py b/defects/cpython/bench/bench-cpython-0001.py deleted file mode 100644 index b947b65c7..000000000 --- a/defects/cpython/bench/bench-cpython-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cpython-0001.py -# codegen pattern-match stores duplicate check O(S^2) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cpython-0001: codegen pattern-match stores duplicate check O(S^2) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cpython/bench/bench-cpython-0002.py b/defects/cpython/bench/bench-cpython-0002.py deleted file mode 100644 index 282bfb4cc..000000000 --- a/defects/cpython/bench/bench-cpython-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cpython-0002.py -# typeobject pmerge() tail_contains linear scan O(M^2 * K^2) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cpython-0002: typeobject pmerge() tail_contains linear scan O(M^2 * K^2) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cpython/bench/bench-cpython-0003.py b/defects/cpython/bench/bench-cpython-0003.py deleted file mode 100644 index c36607594..000000000 --- a/defects/cpython/bench/bench-cpython-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cpython-0003.py -# turtle.__methodDict — O(2^D) diamond base traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cpython-0003: turtle.__methodDict — O(2^D) diamond base traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cpython/bench/bench-cpython-0004.py b/defects/cpython/bench/bench-cpython-0004.py deleted file mode 100644 index c69d9be12..000000000 --- a/defects/cpython/bench/bench-cpython-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cpython-0004.py -# idlelib.rpc._getmethods — O(2^D) diamond base traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cpython-0004: idlelib.rpc._getmethods — O(2^D) diamond base traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cpython/bench/results.txt b/defects/cpython/bench/results.txt deleted file mode 100644 index c1434fc4c..000000000 --- a/defects/cpython/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== cpython-0001: codegen pattern-match stores duplicate check O(S^2) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.107ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=8.354ms fixed=0.043ms speedup=195.3x -N=2000 k=2000 : defective=34.015ms fixed=0.093ms speedup=365.6x - -=== cpython-0002: typeobject pmerge() tail_contains linear scan O(M^2 * K^2) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=26.1x -N=500 k=500 : defective=2.025ms fixed=0.020ms speedup=101.3x -N=1000 k=1000 : defective=8.465ms fixed=0.044ms speedup=191.1x -N=2000 k=2000 : defective=33.772ms fixed=0.094ms speedup=360.2x - -=== cpython-0003: turtle.__methodDict — O(2^D) diamond base traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.026ms fixed=0.019ms speedup=104.3x -N=1000 k=1000 : defective=8.389ms fixed=0.068ms speedup=123.3x -N=2000 k=2000 : defective=36.538ms fixed=0.097ms speedup=376.0x - -=== cpython-0004: idlelib.rpc._getmethods — O(2^D) diamond base traversal === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=26.6x -N=500 k=500 : defective=2.118ms fixed=0.021ms speedup=101.9x -N=1000 k=1000 : defective=8.767ms fixed=0.046ms speedup=190.9x -N=2000 k=2000 : defective=34.003ms fixed=0.092ms speedup=370.8x - diff --git a/defects/cpython/bench/run_all.py b/defects/cpython/bench/run_all.py deleted file mode 100644 index 01cf16802..000000000 --- a/defects/cpython/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cpython-0001.py", "bench-cpython-0002.py", "bench-cpython-0003.py", "bench-cpython-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/crystal/Makefile b/defects/crystal/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/crystal/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/crystal/bench/bench-crystal-0001.py b/defects/crystal/bench/bench-crystal-0001.py deleted file mode 100644 index 8bc578154..000000000 --- a/defects/crystal/bench/bench-crystal-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-crystal-0001.py -# CWE-407: list-scan inside loop in crystal-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== crystal-0001: CWE-407: list-scan inside loop in crystal-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/crystal/bench/bench-crystal-0002.py b/defects/crystal/bench/bench-crystal-0002.py deleted file mode 100644 index e23e95cbc..000000000 --- a/defects/crystal/bench/bench-crystal-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-crystal-0002.py -# CWE-407: list-scan inside loop in crystal-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== crystal-0002: CWE-407: list-scan inside loop in crystal-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/crystal/bench/bench-crystal-0003.py b/defects/crystal/bench/bench-crystal-0003.py deleted file mode 100644 index 7062a2eec..000000000 --- a/defects/crystal/bench/bench-crystal-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-crystal-0003.py -# compute_non_nilable_outside_single — O(N) includes? in O(A) ancestor loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== crystal-0003: compute_non_nilable_outside_single — O(N) includes? in O(A) ancestor loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/crystal/bench/bench-crystal-0004.py b/defects/crystal/bench/bench-crystal-0004.py deleted file mode 100644 index bb75168af..000000000 --- a/defects/crystal/bench/bench-crystal-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-crystal-0004.py -# add_to_including_types — O(N²) Array#includes? in module instantiation loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== crystal-0004: add_to_including_types — O(N²) Array#includes? in module instantiation loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/crystal/bench/results.txt b/defects/crystal/bench/results.txt deleted file mode 100644 index b793ccba1..000000000 --- a/defects/crystal/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== crystal-0001: CWE-407: list-scan inside loop in crystal-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.717ms fixed=0.026ms speedup=102.6x -N=1000 k=1000 : defective=11.256ms fixed=0.058ms speedup=195.1x -N=2000 k=2000 : defective=35.208ms fixed=0.095ms speedup=370.4x - -=== crystal-0002: CWE-407: list-scan inside loop in crystal-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.100ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=8.771ms fixed=0.046ms speedup=190.2x -N=2000 k=2000 : defective=35.051ms fixed=0.095ms speedup=368.1x - -=== crystal-0003: compute_non_nilable_outside_single — O(N) includes? in O(A) ancestor loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.107ms fixed=0.021ms speedup=100.9x -N=1000 k=1000 : defective=8.611ms fixed=0.046ms speedup=186.2x -N=2000 k=2000 : defective=35.048ms fixed=0.095ms speedup=367.2x - -=== crystal-0004: add_to_including_types — O(N²) Array#includes? in module instantiation loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.112ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=8.844ms fixed=0.046ms speedup=192.2x -N=2000 k=2000 : defective=36.266ms fixed=0.097ms speedup=373.3x - diff --git a/defects/crystal/bench/run_all.py b/defects/crystal/bench/run_all.py deleted file mode 100644 index 72e5b2d15..000000000 --- a/defects/crystal/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-crystal-0001.py", "bench-crystal-0002.py", "bench-crystal-0003.py", "bench-crystal-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cura-0001/Makefile b/defects/cura-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cura-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cura-0001/bench/bench-cura-0001-0001.py b/defects/cura-0001/bench/bench-cura-0001-0001.py deleted file mode 100644 index 785893390..000000000 --- a/defects/cura-0001/bench/bench-cura-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cura-0001-0001.py -# CWE-407: list-scan inside loop in cura-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cura-0001-0001: CWE-407: list-scan inside loop in cura-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cura-0001/bench/results.txt b/defects/cura-0001/bench/results.txt deleted file mode 100644 index 112af1ff0..000000000 --- a/defects/cura-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cura-0001-0001: CWE-407: list-scan inside loop in cura-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.483ms fixed=0.025ms speedup=97.6x -N=1000 k=1000 : defective=10.237ms fixed=0.049ms speedup=207.4x -N=2000 k=2000 : defective=39.550ms fixed=0.099ms speedup=398.6x - diff --git a/defects/cura-0001/bench/run_all.py b/defects/cura-0001/bench/run_all.py deleted file mode 100644 index fed093bc1..000000000 --- a/defects/cura-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cura-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cura-0002/Makefile b/defects/cura-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cura-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cura-0002/bench/bench-cura-0002-0002.py b/defects/cura-0002/bench/bench-cura-0002-0002.py deleted file mode 100644 index 25a4c8d51..000000000 --- a/defects/cura-0002/bench/bench-cura-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cura-0002-0002.py -# CWE-407: list-scan inside loop in cura-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cura-0002-0002: CWE-407: list-scan inside loop in cura-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cura-0002/bench/results.txt b/defects/cura-0002/bench/results.txt deleted file mode 100644 index 6ab227442..000000000 --- a/defects/cura-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cura-0002-0002: CWE-407: list-scan inside loop in cura-0002-0002 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.487ms fixed=0.024ms speedup=105.3x -N=1000 k=1000 : defective=9.756ms fixed=0.049ms speedup=197.6x -N=2000 k=2000 : defective=37.433ms fixed=0.098ms speedup=383.2x - diff --git a/defects/cura-0002/bench/run_all.py b/defects/cura-0002/bench/run_all.py deleted file mode 100644 index 4477ab55a..000000000 --- a/defects/cura-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cura-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/curaengine-0001/Makefile b/defects/curaengine-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/curaengine-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/curaengine-0001/bench/bench-curaengine-0001-0001.py b/defects/curaengine-0001/bench/bench-curaengine-0001-0001.py deleted file mode 100644 index 4eeafb805..000000000 --- a/defects/curaengine-0001/bench/bench-curaengine-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-curaengine-0001-0001.py -# CWE-407: list-scan inside loop in curaengine-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== curaengine-0001-0001: CWE-407: list-scan inside loop in curaengine-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/curaengine-0001/bench/results.txt b/defects/curaengine-0001/bench/results.txt deleted file mode 100644 index fbf526d53..000000000 --- a/defects/curaengine-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== curaengine-0001-0001: CWE-407: list-scan inside loop in curaengine-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.332ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=8.646ms fixed=0.046ms speedup=188.2x -N=2000 k=2000 : defective=36.379ms fixed=0.097ms speedup=373.9x - diff --git a/defects/curaengine-0001/bench/run_all.py b/defects/curaengine-0001/bench/run_all.py deleted file mode 100644 index aa47ef8dd..000000000 --- a/defects/curaengine-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-curaengine-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/curl/Makefile b/defects/curl/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/curl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/curl/bench/bench-curl-0001.py b/defects/curl/bench/bench-curl-0001.py deleted file mode 100644 index 4b1828055..000000000 --- a/defects/curl/bench/bench-curl-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-curl-0001.py -# CWE-407: list-scan inside loop in curl-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== curl-0001: CWE-407: list-scan inside loop in curl-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/curl/bench/bench-curl-0002.py b/defects/curl/bench/bench-curl-0002.py deleted file mode 100644 index fd7a8f6c2..000000000 --- a/defects/curl/bench/bench-curl-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-curl-0002.py -# Curl_checkheaders O(K×H) per request → O(H) setup + O(1) per lookup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== curl-0002: Curl_checkheaders O(K×H) per request → O(H) setup + O(1) per lookup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/curl/bench/bench-curl-0003.py b/defects/curl/bench/bench-curl-0003.py deleted file mode 100644 index 1955f46c2..000000000 --- a/defects/curl/bench/bench-curl-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-curl-0003.py -# Curl_hsts O(N) linked-list scan → O(1) hash map -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== curl-0003: Curl_hsts O(N) linked-list scan → O(1) hash map ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/curl/bench/bench-curl-0004.py b/defects/curl/bench/bench-curl-0004.py deleted file mode 100644 index 85d4fad1d..000000000 --- a/defects/curl/bench/bench-curl-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-curl-0004.py -# curl-0004 — curl_mime multipart header search O(P×H) per request build -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== curl-0004: curl-0004 — curl_mime multipart header search O(P×H) per request build ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/curl/bench/results.txt b/defects/curl/bench/results.txt deleted file mode 100644 index 0a7bbaab6..000000000 --- a/defects/curl/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== curl-0001: CWE-407: list-scan inside loop in curl-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.115ms fixed=0.021ms speedup=103.0x -N=1000 k=1000 : defective=8.646ms fixed=0.045ms speedup=194.2x -N=2000 k=2000 : defective=35.322ms fixed=0.096ms speedup=369.3x - -=== curl-0002: Curl_checkheaders O(K×H) per request → O(H) setup + O(1) per lookup === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.133ms fixed=0.020ms speedup=105.5x -N=1000 k=1000 : defective=8.737ms fixed=0.046ms speedup=189.7x -N=2000 k=2000 : defective=35.097ms fixed=0.097ms speedup=363.3x - -=== curl-0003: Curl_hsts O(N) linked-list scan → O(1) hash map === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.123ms fixed=0.021ms speedup=103.5x -N=1000 k=1000 : defective=8.608ms fixed=0.046ms speedup=187.9x -N=2000 k=2000 : defective=34.950ms fixed=0.097ms speedup=361.4x - -=== curl-0004: curl-0004 — curl_mime multipart header search O(P×H) per request build === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.119ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.700ms fixed=0.046ms speedup=189.1x -N=2000 k=2000 : defective=35.098ms fixed=0.096ms speedup=363.8x - diff --git a/defects/curl/bench/run_all.py b/defects/curl/bench/run_all.py deleted file mode 100644 index 4f7ab140c..000000000 --- a/defects/curl/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-curl-0001.py", "bench-curl-0002.py", "bench-curl-0003.py", "bench-curl-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cxbx-reloaded-0001/Makefile b/defects/cxbx-reloaded-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cxbx-reloaded-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cxbx-reloaded-0001/bench/bench-cxbx-reloaded-0001-0001.py b/defects/cxbx-reloaded-0001/bench/bench-cxbx-reloaded-0001-0001.py deleted file mode 100644 index ab0faeac5..000000000 --- a/defects/cxbx-reloaded-0001/bench/bench-cxbx-reloaded-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cxbx-reloaded-0001-0001.py -# CWE-407: list-scan inside loop in cxbx-reloaded-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cxbx-reloaded-0001-0001: CWE-407: list-scan inside loop in cxbx-reloaded-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cxbx-reloaded-0001/bench/results.txt b/defects/cxbx-reloaded-0001/bench/results.txt deleted file mode 100644 index aa6c89f7b..000000000 --- a/defects/cxbx-reloaded-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cxbx-reloaded-0001-0001: CWE-407: list-scan inside loop in cxbx-reloaded-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=3.859ms fixed=0.025ms speedup=154.2x -N=1000 k=1000 : defective=12.446ms fixed=0.056ms speedup=223.3x -N=2000 k=2000 : defective=42.515ms fixed=0.105ms speedup=403.5x - diff --git a/defects/cxbx-reloaded-0001/bench/run_all.py b/defects/cxbx-reloaded-0001/bench/run_all.py deleted file mode 100644 index c762c1d90..000000000 --- a/defects/cxbx-reloaded-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cxbx-reloaded-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/cxf/Makefile b/defects/cxf/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/cxf/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/cxf/bench/bench-cxf-0001.py b/defects/cxf/bench/bench-cxf-0001.py deleted file mode 100644 index c12f7bd75..000000000 --- a/defects/cxf/bench/bench-cxf-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-cxf-0001.py -# parseImports ArrayList.contains visited-guard O(N²) — two sites -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== cxf-0001: parseImports ArrayList.contains visited-guard O(N²) — two sites ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/cxf/bench/results.txt b/defects/cxf/bench/results.txt deleted file mode 100644 index baf7214cd..000000000 --- a/defects/cxf/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== cxf-0001: parseImports ArrayList.contains visited-guard O(N²) — two sites === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.310ms fixed=0.022ms speedup=104.2x -N=1000 k=1000 : defective=8.705ms fixed=0.051ms speedup=171.5x -N=2000 k=2000 : defective=36.734ms fixed=0.114ms speedup=323.0x - diff --git a/defects/cxf/bench/run_all.py b/defects/cxf/bench/run_all.py deleted file mode 100644 index b45f613fd..000000000 --- a/defects/cxf/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-cxf-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dagger/Makefile b/defects/dagger/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dagger/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dagger/bench/bench-dagger-0001.py b/defects/dagger/bench/bench-dagger-0001.py deleted file mode 100644 index 5bbce04ac..000000000 --- a/defects/dagger/bench/bench-dagger-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dagger-0001.py -# LegacyBindingGraphFactory.resolve — cycleStack Deque.contains() O(N) cycle detection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dagger-0001: LegacyBindingGraphFactory.resolve — cycleStack Deque.contains() O(N) cycle detection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dagger/bench/results.txt b/defects/dagger/bench/results.txt deleted file mode 100644 index 917c40528..000000000 --- a/defects/dagger/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dagger-0001: LegacyBindingGraphFactory.resolve — cycleStack Deque.contains() O(N) cycle detection === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.552ms fixed=0.024ms speedup=104.3x -N=1000 k=1000 : defective=10.711ms fixed=0.056ms speedup=192.3x -N=2000 k=2000 : defective=49.196ms fixed=0.124ms speedup=398.3x - diff --git a/defects/dagger/bench/run_all.py b/defects/dagger/bench/run_all.py deleted file mode 100644 index d4037c835..000000000 --- a/defects/dagger/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dagger-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/darktable/Makefile b/defects/darktable/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/darktable/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/darktable/bench/bench-darktable-0001.py b/defects/darktable/bench/bench-darktable-0001.py deleted file mode 100644 index f5742d123..000000000 --- a/defects/darktable/bench/bench-darktable-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-darktable-0001.py -# dt_map_location_update_images g_list_find O(N*M) image diff -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== darktable-0001: dt_map_location_update_images g_list_find O(N*M) image diff ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/darktable/bench/bench-darktable-0002.py b/defects/darktable/bench/bench-darktable-0002.py deleted file mode 100644 index d102eb220..000000000 --- a/defects/darktable/bench/bench-darktable-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-darktable-0002.py -# _tag_add_tags_to_list g_list_find O(T*L) dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== darktable-0002: _tag_add_tags_to_list g_list_find O(T*L) dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/darktable/bench/bench-darktable-0003.py b/defects/darktable/bench/bench-darktable-0003.py deleted file mode 100644 index bd10aad30..000000000 --- a/defects/darktable/bench/bench-darktable-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-darktable-0003.py -# map view clustering g_list_find(sel_imgs) inside O(I*J) loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== darktable-0003: map view clustering g_list_find(sel_imgs) inside O(I*J) loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/darktable/bench/bench-darktable-0004.py b/defects/darktable/bench/bench-darktable-0004.py deleted file mode 100644 index db463efd2..000000000 --- a/defects/darktable/bench/bench-darktable-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-darktable-0004.py -# darktable's password storage system (pwstorage) manages service credentials -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== darktable-0004: darktable's password storage system (pwstorage) manages service credentials ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/darktable/bench/bench-darktable-0005.py b/defects/darktable/bench/bench-darktable-0005.py deleted file mode 100644 index 7ea8caf15..000000000 --- a/defects/darktable/bench/bench-darktable-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-darktable-0005.py -# In src/libs/modulegroups.c, _lib_modulegroups_update_iop_visibility() iterates -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== darktable-0005: In src/libs/modulegroups.c, _lib_modulegroups_update_iop_visibility() iterates ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/darktable/bench/results.txt b/defects/darktable/bench/results.txt deleted file mode 100644 index 4aca7029c..000000000 --- a/defects/darktable/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== darktable-0001: dt_map_location_update_images g_list_find O(N*M) image diff === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.034ms fixed=0.019ms speedup=104.7x -N=1000 k=1000 : defective=8.360ms fixed=0.045ms speedup=184.8x -N=2000 k=2000 : defective=34.210ms fixed=0.091ms speedup=375.4x - -=== darktable-0002: _tag_add_tags_to_list g_list_find O(T*L) dedup === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=23.6x -N=500 k=500 : defective=2.023ms fixed=0.019ms speedup=104.2x -N=1000 k=1000 : defective=8.971ms fixed=0.043ms speedup=207.1x -N=2000 k=2000 : defective=33.435ms fixed=0.092ms speedup=364.0x - -=== darktable-0003: map view clustering g_list_find(sel_imgs) inside O(I*J) loop === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.024ms fixed=0.019ms speedup=104.7x -N=1000 k=1000 : defective=8.561ms fixed=0.044ms speedup=195.2x -N=2000 k=2000 : defective=36.387ms fixed=0.096ms speedup=378.1x - -=== darktable-0004: darktable's password storage system (pwstorage) manages service credentials === -N=100 k=100 : defective=0.120ms fixed=0.006ms speedup=20.6x -N=500 k=500 : defective=2.207ms fixed=0.021ms speedup=106.8x -N=1000 k=1000 : defective=9.206ms fixed=0.046ms speedup=198.4x -N=2000 k=2000 : defective=35.132ms fixed=0.097ms speedup=361.2x - -=== darktable-0005: In src/libs/modulegroups.c, _lib_modulegroups_update_iop_visibility() iterates === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.164ms fixed=0.021ms speedup=104.7x -N=1000 k=1000 : defective=9.982ms fixed=0.048ms speedup=210.0x -N=2000 k=2000 : defective=35.855ms fixed=0.100ms speedup=357.6x - diff --git a/defects/darktable/bench/run_all.py b/defects/darktable/bench/run_all.py deleted file mode 100644 index 7ebf1df75..000000000 --- a/defects/darktable/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-darktable-0001.py", "bench-darktable-0002.py", "bench-darktable-0003.py", "bench-darktable-0004.py", "bench-darktable-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dart/Makefile b/defects/dart/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dart/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dart/bench/bench-dart-0001.py b/defects/dart/bench/bench-dart-0001.py deleted file mode 100644 index 356ad8731..000000000 --- a/defects/dart/bench/bench-dart-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dart-0001.py -# forEachOrderedParameterByFunctionNode namedParameters List.contains() — O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dart-0001: forEachOrderedParameterByFunctionNode namedParameters List.contains() — O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dart/bench/bench-dart-0002.py b/defects/dart/bench/bench-dart-0002.py deleted file mode 100644 index 61c1514cb..000000000 --- a/defects/dart/bench/bench-dart-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dart-0002.py -# SSA builder namedParameters.contains() in .where() filter — O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dart-0002: SSA builder namedParameters.contains() in .where() filter — O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dart/bench/bench-dart-0003.py b/defects/dart/bench/bench-dart-0003.py deleted file mode 100644 index c86e61e16..000000000 --- a/defects/dart/bench/bench-dart-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dart-0003.py -# SSA builder namedParameters.contains() in argument ordering — O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dart-0003: SSA builder namedParameters.contains() in argument ordering — O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dart/bench/results.txt b/defects/dart/bench/results.txt deleted file mode 100644 index 895f96a52..000000000 --- a/defects/dart/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== dart-0001: forEachOrderedParameterByFunctionNode namedParameters List.contains() — O(N²) === -N=100 k=100 : defective=0.114ms fixed=0.005ms speedup=25.0x -N=500 k=500 : defective=3.014ms fixed=0.029ms speedup=105.7x -N=1000 k=1000 : defective=13.739ms fixed=0.094ms speedup=145.7x -N=2000 k=2000 : defective=37.820ms fixed=0.096ms speedup=394.8x - -=== dart-0002: SSA builder namedParameters.contains() in .where() filter — O(N²) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.203ms fixed=0.021ms speedup=105.5x -N=1000 k=1000 : defective=9.699ms fixed=0.048ms speedup=202.7x -N=2000 k=2000 : defective=47.915ms fixed=0.213ms speedup=225.0x - -=== dart-0003: SSA builder namedParameters.contains() in argument ordering — O(N²) === -N=100 k=100 : defective=0.160ms fixed=0.007ms speedup=23.4x -N=500 k=500 : defective=2.777ms fixed=0.026ms speedup=108.6x -N=1000 k=1000 : defective=8.929ms fixed=0.045ms speedup=197.3x -N=2000 k=2000 : defective=39.957ms fixed=0.098ms speedup=408.5x - diff --git a/defects/dart/bench/run_all.py b/defects/dart/bench/run_all.py deleted file mode 100644 index 2efe71491..000000000 --- a/defects/dart/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dart-0001.py", "bench-dart-0002.py", "bench-dart-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dask-project/Makefile b/defects/dask-project/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dask-project/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dask-project/bench/bench-dask-project-0001.py b/defects/dask-project/bench/bench-dask-project-0001.py deleted file mode 100644 index 7b3aff00f..000000000 --- a/defects/dask-project/bench/bench-dask-project-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dask-project-0001.py -# parquet/core.py filter_partitions disjunction O(P×O) dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dask-project-0001: parquet/core.py filter_partitions disjunction O(P×O) dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dask-project/bench/bench-dask-project-0002.py b/defects/dask-project/bench/bench-dask-project-0002.py deleted file mode 100644 index 909599dd7..000000000 --- a/defects/dask-project/bench/bench-dask-project-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dask-project-0002.py -# methods.py describe_aggregate column name dedup O(C²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dask-project-0002: methods.py describe_aggregate column name dedup O(C²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dask-project/bench/results.txt b/defects/dask-project/bench/results.txt deleted file mode 100644 index 0c74625f2..000000000 --- a/defects/dask-project/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dask-project-0001: parquet/core.py filter_partitions disjunction O(P×O) dedup === -N=100 k=100 : defective=0.107ms fixed=0.004ms speedup=26.4x -N=500 k=500 : defective=2.568ms fixed=0.040ms speedup=64.2x -N=1000 k=1000 : defective=11.250ms fixed=0.088ms speedup=127.3x -N=2000 k=2000 : defective=35.005ms fixed=0.097ms speedup=361.4x - -=== dask-project-0002: methods.py describe_aggregate column name dedup O(C²) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.118ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=9.327ms fixed=0.047ms speedup=196.6x -N=2000 k=2000 : defective=36.638ms fixed=0.096ms speedup=381.1x - diff --git a/defects/dask-project/bench/run_all.py b/defects/dask-project/bench/run_all.py deleted file mode 100644 index 334ca9fba..000000000 --- a/defects/dask-project/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dask-project-0001.py", "bench-dask-project-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dbus-0001/Makefile b/defects/dbus-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dbus-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dbus-0001/bench/bench-dbus-0001-0001.py b/defects/dbus-0001/bench/bench-dbus-0001-0001.py deleted file mode 100644 index d74d36711..000000000 --- a/defects/dbus-0001/bench/bench-dbus-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dbus-0001-0001.py -# CWE-407: list-scan inside loop in dbus-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dbus-0001-0001: CWE-407: list-scan inside loop in dbus-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dbus-0001/bench/bench-dbus-0001.py b/defects/dbus-0001/bench/bench-dbus-0001.py deleted file mode 100644 index 4f9c39e2a..000000000 --- a/defects/dbus-0001/bench/bench-dbus-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dbus-0001.py -# CWE-407: list-scan inside loop in dbus-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dbus-0001: CWE-407: list-scan inside loop in dbus-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dbus-0001/bench/results.txt b/defects/dbus-0001/bench/results.txt deleted file mode 100644 index 12cbe430e..000000000 --- a/defects/dbus-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dbus-0001-0001: CWE-407: list-scan inside loop in dbus-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=3.174ms fixed=0.025ms speedup=127.3x -N=1000 k=1000 : defective=10.668ms fixed=0.055ms speedup=193.5x -N=2000 k=2000 : defective=41.371ms fixed=0.102ms speedup=404.4x - -=== dbus-0001: CWE-407: list-scan inside loop in dbus-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.298ms fixed=0.022ms speedup=106.0x -N=1000 k=1000 : defective=9.335ms fixed=0.080ms speedup=117.1x -N=2000 k=2000 : defective=44.592ms fixed=0.105ms speedup=425.4x - diff --git a/defects/dbus-0001/bench/run_all.py b/defects/dbus-0001/bench/run_all.py deleted file mode 100644 index 329ae52d9..000000000 --- a/defects/dbus-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dbus-0001-0001.py", "bench-dbus-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dbus/Makefile b/defects/dbus/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dbus/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dbus/bench/bench-dbus-0001-0001.py b/defects/dbus/bench/bench-dbus-0001-0001.py deleted file mode 100644 index d74d36711..000000000 --- a/defects/dbus/bench/bench-dbus-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dbus-0001-0001.py -# CWE-407: list-scan inside loop in dbus-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dbus-0001-0001: CWE-407: list-scan inside loop in dbus-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dbus/bench/bench-dbus-0001.py b/defects/dbus/bench/bench-dbus-0001.py deleted file mode 100644 index 4f9c39e2a..000000000 --- a/defects/dbus/bench/bench-dbus-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dbus-0001.py -# CWE-407: list-scan inside loop in dbus-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dbus-0001: CWE-407: list-scan inside loop in dbus-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dbus/bench/results.txt b/defects/dbus/bench/results.txt deleted file mode 100644 index 5e8bc11c8..000000000 --- a/defects/dbus/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dbus-0001-0001: CWE-407: list-scan inside loop in dbus-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.338ms fixed=0.022ms speedup=105.0x -N=1000 k=1000 : defective=10.997ms fixed=0.048ms speedup=227.1x -N=2000 k=2000 : defective=39.644ms fixed=0.125ms speedup=316.0x - -=== dbus-0001: CWE-407: list-scan inside loop in dbus-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.817ms fixed=0.027ms speedup=106.1x -N=1000 k=1000 : defective=11.096ms fixed=0.057ms speedup=194.5x -N=2000 k=2000 : defective=43.119ms fixed=0.106ms speedup=405.2x - diff --git a/defects/dbus/bench/run_all.py b/defects/dbus/bench/run_all.py deleted file mode 100644 index 329ae52d9..000000000 --- a/defects/dbus/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dbus-0001-0001.py", "bench-dbus-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/decaf-0001/Makefile b/defects/decaf-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/decaf-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/decaf-0001/bench/bench-decaf-0001-0001.py b/defects/decaf-0001/bench/bench-decaf-0001-0001.py deleted file mode 100644 index 9dde9cc5e..000000000 --- a/defects/decaf-0001/bench/bench-decaf-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-decaf-0001-0001.py -# CWE-407: list-scan inside loop in decaf-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== decaf-0001-0001: CWE-407: list-scan inside loop in decaf-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/decaf-0001/bench/results.txt b/defects/decaf-0001/bench/results.txt deleted file mode 100644 index 588d929ea..000000000 --- a/defects/decaf-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== decaf-0001-0001: CWE-407: list-scan inside loop in decaf-0001-0001 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.600ms fixed=0.025ms speedup=102.2x -N=1000 k=1000 : defective=10.931ms fixed=0.056ms speedup=196.3x -N=2000 k=2000 : defective=37.063ms fixed=0.096ms speedup=388.1x - diff --git a/defects/decaf-0001/bench/run_all.py b/defects/decaf-0001/bench/run_all.py deleted file mode 100644 index accc0b373..000000000 --- a/defects/decaf-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-decaf-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/deluge/Makefile b/defects/deluge/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/deluge/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/deluge/bench/bench-deluge-0001.py b/defects/deluge/bench/bench-deluge-0001.py deleted file mode 100644 index 99394749e..000000000 --- a/defects/deluge/bench/bench-deluge-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-deluge-0001.py -# filtermanager.py filter_torrent_ids() and filter_state_active() both -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== deluge-0001: filtermanager.py filter_torrent_ids() and filter_state_active() both ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/deluge/bench/bench-deluge-0002.py b/defects/deluge/bench/bench-deluge-0002.py deleted file mode 100644 index c15f11fef..000000000 --- a/defects/deluge/bench/bench-deluge-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-deluge-0002.py -# torrentmanager.py get_torrent_list() calls -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== deluge-0002: torrentmanager.py get_torrent_list() calls ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/deluge/bench/results.txt b/defects/deluge/bench/results.txt deleted file mode 100644 index f110f3180..000000000 --- a/defects/deluge/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== deluge-0001: filtermanager.py filter_torrent_ids() and filter_state_active() both === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.618ms fixed=0.024ms speedup=111.2x -N=1000 k=1000 : defective=9.787ms fixed=0.052ms speedup=188.2x -N=2000 k=2000 : defective=37.757ms fixed=0.122ms speedup=310.6x - -=== deluge-0002: torrentmanager.py get_torrent_list() calls === -N=100 k=100 : defective=0.111ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.710ms fixed=0.028ms speedup=97.6x -N=1000 k=1000 : defective=10.813ms fixed=0.051ms speedup=212.3x -N=2000 k=2000 : defective=41.817ms fixed=0.184ms speedup=227.6x - diff --git a/defects/deluge/bench/run_all.py b/defects/deluge/bench/run_all.py deleted file mode 100644 index 57e18fb77..000000000 --- a/defects/deluge/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-deluge-0001.py", "bench-deluge-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dendrite/Makefile b/defects/dendrite/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dendrite/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dendrite/bench/bench-dendrite-0001.py b/defects/dendrite/bench/bench-dendrite-0001.py deleted file mode 100644 index 93c8e3069..000000000 --- a/defects/dendrite/bench/bench-dendrite-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dendrite-0001.py -# CWE-407: list-scan inside loop in dendrite-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dendrite-0001: CWE-407: list-scan inside loop in dendrite-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dendrite/bench/bench-dendrite-0002.py b/defects/dendrite/bench/bench-dendrite-0002.py deleted file mode 100644 index ac86423e0..000000000 --- a/defects/dendrite/bench/bench-dendrite-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dendrite-0002.py -# CWE-407: list-scan inside loop in dendrite-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dendrite-0002: CWE-407: list-scan inside loop in dendrite-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dendrite/bench/results.txt b/defects/dendrite/bench/results.txt deleted file mode 100644 index 5ea22fcaf..000000000 --- a/defects/dendrite/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dendrite-0001: CWE-407: list-scan inside loop in dendrite-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.423ms fixed=0.024ms speedup=100.5x -N=1000 k=1000 : defective=9.200ms fixed=0.051ms speedup=182.0x -N=2000 k=2000 : defective=38.788ms fixed=0.207ms speedup=187.0x - -=== dendrite-0002: CWE-407: list-scan inside loop in dendrite-0002 (generic model) === -N=100 k=100 : defective=0.189ms fixed=0.008ms speedup=23.1x -N=500 k=500 : defective=5.248ms fixed=0.047ms speedup=112.0x -N=1000 k=1000 : defective=12.061ms fixed=0.059ms speedup=203.0x -N=2000 k=2000 : defective=49.382ms fixed=0.116ms speedup=426.4x - diff --git a/defects/dendrite/bench/run_all.py b/defects/dendrite/bench/run_all.py deleted file mode 100644 index e99ff19b0..000000000 --- a/defects/dendrite/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dendrite-0001.py", "bench-dendrite-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/desmume-0001/Makefile b/defects/desmume-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/desmume-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/desmume-0001/bench/bench-desmume-0001-0001.py b/defects/desmume-0001/bench/bench-desmume-0001-0001.py deleted file mode 100644 index eb0eccf7f..000000000 --- a/defects/desmume-0001/bench/bench-desmume-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-desmume-0001-0001.py -# CWE-407: list-scan inside loop in desmume-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== desmume-0001-0001: CWE-407: list-scan inside loop in desmume-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/desmume-0001/bench/results.txt b/defects/desmume-0001/bench/results.txt deleted file mode 100644 index d9b0304eb..000000000 --- a/defects/desmume-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== desmume-0001-0001: CWE-407: list-scan inside loop in desmume-0001-0001 (generic model) === -N=100 k=100 : defective=0.207ms fixed=0.018ms speedup=11.3x -N=500 k=500 : defective=2.662ms fixed=0.025ms speedup=106.8x -N=1000 k=1000 : defective=10.976ms fixed=0.056ms speedup=195.3x -N=2000 k=2000 : defective=40.437ms fixed=0.098ms speedup=414.2x - diff --git a/defects/desmume-0001/bench/run_all.py b/defects/desmume-0001/bench/run_all.py deleted file mode 100644 index ecf9944f1..000000000 --- a/defects/desmume-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-desmume-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dgraph/Makefile b/defects/dgraph/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dgraph/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dgraph/bench/bench-dgraph-0001.py b/defects/dgraph/bench/bench-dgraph-0001.py deleted file mode 100644 index 47db5be02..000000000 --- a/defects/dgraph/bench/bench-dgraph-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dgraph-0001.py -# CWE-407 O(P) route cycle-check inside hot BFS/Dijkstra neighbour loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dgraph-0001: CWE-407 O(P) route cycle-check inside hot BFS/Dijkstra neighbour loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dgraph/bench/results.txt b/defects/dgraph/bench/results.txt deleted file mode 100644 index 3ffc9043a..000000000 --- a/defects/dgraph/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dgraph-0001: CWE-407 O(P) route cycle-check inside hot BFS/Dijkstra neighbour loop === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.475ms fixed=0.024ms speedup=102.9x -N=1000 k=1000 : defective=9.228ms fixed=0.052ms speedup=178.5x -N=2000 k=2000 : defective=45.944ms fixed=0.106ms speedup=434.9x - diff --git a/defects/dgraph/bench/run_all.py b/defects/dgraph/bench/run_all.py deleted file mode 100644 index 2070ef6b7..000000000 --- a/defects/dgraph/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dgraph-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/diesel/Makefile b/defects/diesel/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/diesel/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/diesel/bench/bench-diesel-0001.py b/defects/diesel/bench/bench-diesel-0001.py deleted file mode 100644 index b406199d3..000000000 --- a/defects/diesel/bench/bench-diesel-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-diesel-0001.py -# CWE-407: list-scan inside loop in diesel-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== diesel-0001: CWE-407: list-scan inside loop in diesel-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/diesel/bench/bench-diesel-0002.py b/defects/diesel/bench/bench-diesel-0002.py deleted file mode 100644 index 99e928b20..000000000 --- a/defects/diesel/bench/bench-diesel-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-diesel-0002.py -# CWE-407: list-scan inside loop in diesel-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== diesel-0002: CWE-407: list-scan inside loop in diesel-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/diesel/bench/bench-diesel-0003.py b/defects/diesel/bench/bench-diesel-0003.py deleted file mode 100644 index ef5c60d74..000000000 --- a/defects/diesel/bench/bench-diesel-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-diesel-0003.py -# CWE-407: list-scan inside loop in diesel-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== diesel-0003: CWE-407: list-scan inside loop in diesel-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/diesel/bench/results.txt b/defects/diesel/bench/results.txt deleted file mode 100644 index 35153e554..000000000 --- a/defects/diesel/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== diesel-0001: CWE-407: list-scan inside loop in diesel-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=3.018ms fixed=0.026ms speedup=114.9x -N=1000 k=1000 : defective=11.668ms fixed=0.059ms speedup=198.4x -N=2000 k=2000 : defective=39.516ms fixed=0.216ms speedup=183.1x - -=== diesel-0002: CWE-407: list-scan inside loop in diesel-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.304ms fixed=0.023ms speedup=100.7x -N=1000 k=1000 : defective=9.864ms fixed=0.052ms speedup=188.2x -N=2000 k=2000 : defective=39.507ms fixed=0.107ms speedup=370.4x - -=== diesel-0003: CWE-407: list-scan inside loop in diesel-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.347ms fixed=0.023ms speedup=103.5x -N=1000 k=1000 : defective=10.016ms fixed=0.074ms speedup=136.1x -N=2000 k=2000 : defective=44.197ms fixed=0.195ms speedup=226.4x - diff --git a/defects/diesel/bench/run_all.py b/defects/diesel/bench/run_all.py deleted file mode 100644 index 274b86cec..000000000 --- a/defects/diesel/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-diesel-0001.py", "bench-diesel-0002.py", "bench-diesel-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/digikam/Makefile b/defects/digikam/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/digikam/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/digikam/bench/bench-digikam-0001.py b/defects/digikam/bench/bench-digikam-0001.py deleted file mode 100644 index 384caefd1..000000000 --- a/defects/digikam/bench/bench-digikam-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-digikam-0001.py -# Severity: HIGH -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== digikam-0001: Severity: HIGH ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/digikam/bench/bench-digikam-0002.py b/defects/digikam/bench/bench-digikam-0002.py deleted file mode 100644 index 41e2ceb78..000000000 --- a/defects/digikam/bench/bench-digikam-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-digikam-0002.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== digikam-0002: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/digikam/bench/bench-digikam-0003.py b/defects/digikam/bench/bench-digikam-0003.py deleted file mode 100644 index 233b98efb..000000000 --- a/defects/digikam/bench/bench-digikam-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-digikam-0003.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== digikam-0003: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/digikam/bench/bench-digikam-0004.py b/defects/digikam/bench/bench-digikam-0004.py deleted file mode 100644 index ed612b4c8..000000000 --- a/defects/digikam/bench/bench-digikam-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-digikam-0004.py -# Severity: HIGH -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== digikam-0004: Severity: HIGH ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/digikam/bench/results.txt b/defects/digikam/bench/results.txt deleted file mode 100644 index f5c92247a..000000000 --- a/defects/digikam/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== digikam-0001: Severity: HIGH === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.122ms fixed=0.021ms speedup=101.1x -N=1000 k=1000 : defective=8.613ms fixed=0.045ms speedup=190.1x -N=2000 k=2000 : defective=35.236ms fixed=0.097ms speedup=362.0x - -=== digikam-0002: Severity: MEDIUM === -N=100 k=100 : defective=0.086ms fixed=0.016ms speedup=5.4x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=8.789ms fixed=0.046ms speedup=189.5x -N=2000 k=2000 : defective=38.126ms fixed=0.097ms speedup=391.6x - -=== digikam-0003: Severity: MEDIUM === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.176ms fixed=0.021ms speedup=104.6x -N=1000 k=1000 : defective=8.701ms fixed=0.046ms speedup=187.2x -N=2000 k=2000 : defective=35.042ms fixed=0.096ms speedup=363.4x - -=== digikam-0004: Severity: HIGH === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.104ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=8.648ms fixed=0.046ms speedup=190.0x -N=2000 k=2000 : defective=34.663ms fixed=0.171ms speedup=202.5x - diff --git a/defects/digikam/bench/run_all.py b/defects/digikam/bench/run_all.py deleted file mode 100644 index 7127e18d9..000000000 --- a/defects/digikam/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-digikam-0001.py", "bench-digikam-0002.py", "bench-digikam-0003.py", "bench-digikam-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/distlib/Makefile b/defects/distlib/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/distlib/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/distlib/bench/bench-distlib-0001.py b/defects/distlib/bench/bench-distlib-0001.py deleted file mode 100644 index 6ca9a690e..000000000 --- a/defects/distlib/bench/bench-distlib-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-distlib-0001.py -# CWE-407: list-scan inside loop in distlib-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== distlib-0001: CWE-407: list-scan inside loop in distlib-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/distlib/bench/bench-distlib-0002.py b/defects/distlib/bench/bench-distlib-0002.py deleted file mode 100644 index e24747483..000000000 --- a/defects/distlib/bench/bench-distlib-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-distlib-0002.py -# CWE-407: list-scan inside loop in distlib-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== distlib-0002: CWE-407: list-scan inside loop in distlib-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/distlib/bench/results.txt b/defects/distlib/bench/results.txt deleted file mode 100644 index 21b281e79..000000000 --- a/defects/distlib/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== distlib-0001: CWE-407: list-scan inside loop in distlib-0001 (generic model) === -N=100 k=100 : defective=0.114ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=3.142ms fixed=0.028ms speedup=112.6x -N=1000 k=1000 : defective=11.948ms fixed=0.063ms speedup=190.8x -N=2000 k=2000 : defective=36.093ms fixed=0.096ms speedup=375.1x - -=== distlib-0002: CWE-407: list-scan inside loop in distlib-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.104ms fixed=0.023ms speedup=93.0x -N=1000 k=1000 : defective=10.088ms fixed=0.051ms speedup=196.7x -N=2000 k=2000 : defective=39.553ms fixed=0.097ms speedup=408.2x - diff --git a/defects/distlib/bench/run_all.py b/defects/distlib/bench/run_all.py deleted file mode 100644 index 5788bb60f..000000000 --- a/defects/distlib/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-distlib-0001.py", "bench-distlib-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/django/Makefile b/defects/django/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/django/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/django/bench/bench-django-0001.py b/defects/django/bench/bench-django-0001.py deleted file mode 100644 index ac978b977..000000000 --- a/defects/django/bench/bench-django-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-django-0001.py -# Model.from_db() — field_names list membership test inside concrete_fields loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== django-0001: Model.from_db() — field_names list membership test inside concrete_fields loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/django/bench/bench-django-0002.py b/defects/django/bench/bench-django-0002.py deleted file mode 100644 index 147891c19..000000000 --- a/defects/django/bench/bench-django-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-django-0002.py -# Serializer.serialize() — selected_fields list membership tested 3× per field per object -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== django-0002: Serializer.serialize() — selected_fields list membership tested 3× per field per object ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/django/bench/bench-django-0003.py b/defects/django/bench/bench-django-0003.py deleted file mode 100644 index 26d4cad76..000000000 --- a/defects/django/bench/bench-django-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-django-0003.py -# Model._check_column_name_clashes() lines 2071-2094 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== django-0003: Model._check_column_name_clashes() lines 2071-2094 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/django/bench/bench-django-0005.py b/defects/django/bench/bench-django-0005.py deleted file mode 100644 index 0762a589a..000000000 --- a/defects/django/bench/bench-django-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-django-0005.py -# alt_constraints_name list → set in create_altered_constraints() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== django-0005: alt_constraints_name list → set in create_altered_constraints() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/django/bench/bench-django-0006.py b/defects/django/bench/bench-django-0006.py deleted file mode 100644 index 1efbf5b21..000000000 --- a/defects/django/bench/bench-django-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-django-0006.py -# remove_from_added / remove_from_removed lists → sets in create_altered_indexes() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== django-0006: remove_from_added / remove_from_removed lists → sets in create_altered_indexes() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/django/bench/bench-django-0007.py b/defects/django/bench/bench-django-0007.py deleted file mode 100644 index f7644ff9b..000000000 --- a/defects/django/bench/bench-django-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-django-0007.py -# migrations.state.flatten_bases — O(2^D) diamond abstract model traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== django-0007: migrations.state.flatten_bases — O(2^D) diamond abstract model traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/django/bench/results.txt b/defects/django/bench/results.txt deleted file mode 100644 index c83461b77..000000000 --- a/defects/django/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== django-0001: Model.from_db() — field_names list membership test inside concrete_fields loop === -N=100 k=100 : defective=0.114ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=3.010ms fixed=0.028ms speedup=107.7x -N=1000 k=1000 : defective=13.148ms fixed=0.062ms speedup=211.7x -N=2000 k=2000 : defective=36.725ms fixed=0.097ms speedup=380.5x - -=== django-0002: Serializer.serialize() — selected_fields list membership tested 3× per field per object === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.298ms fixed=0.022ms speedup=102.6x -N=1000 k=1000 : defective=9.299ms fixed=0.048ms speedup=193.8x -N=2000 k=2000 : defective=35.548ms fixed=0.098ms speedup=361.5x - -=== django-0003: Model._check_column_name_clashes() lines 2071-2094 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=102.0x -N=1000 k=1000 : defective=8.625ms fixed=0.048ms speedup=181.1x -N=2000 k=2000 : defective=39.143ms fixed=0.101ms speedup=387.6x - -=== django-0005: alt_constraints_name list → set in create_altered_constraints() === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.350ms fixed=0.023ms speedup=104.3x -N=1000 k=1000 : defective=12.094ms fixed=0.053ms speedup=226.7x -N=2000 k=2000 : defective=36.823ms fixed=0.101ms speedup=365.3x - -=== django-0006: remove_from_added / remove_from_removed lists → sets in create_altered_indexes() === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.245ms fixed=0.021ms speedup=104.8x -N=1000 k=1000 : defective=9.606ms fixed=0.078ms speedup=122.5x -N=2000 k=2000 : defective=36.032ms fixed=0.097ms speedup=370.6x - -=== django-0007: migrations.state.flatten_bases — O(2^D) diamond abstract model traversal === -N=100 k=100 : defective=0.100ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.428ms fixed=0.023ms speedup=104.3x -N=1000 k=1000 : defective=10.005ms fixed=0.052ms speedup=191.0x -N=2000 k=2000 : defective=38.827ms fixed=0.109ms speedup=357.4x - diff --git a/defects/django/bench/run_all.py b/defects/django/bench/run_all.py deleted file mode 100644 index 4ce55a511..000000000 --- a/defects/django/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-django-0001.py", "bench-django-0002.py", "bench-django-0003.py", "bench-django-0005.py", "bench-django-0006.py", "bench-django-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dnsdbq-0001/Makefile b/defects/dnsdbq-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dnsdbq-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dnsdbq-0001/bench/bench-dnsdbq-0001-0001.py b/defects/dnsdbq-0001/bench/bench-dnsdbq-0001-0001.py deleted file mode 100644 index 465f739e9..000000000 --- a/defects/dnsdbq-0001/bench/bench-dnsdbq-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dnsdbq-0001-0001.py -# CWE-407: list-scan inside loop in dnsdbq-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dnsdbq-0001-0001: CWE-407: list-scan inside loop in dnsdbq-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dnsdbq-0001/bench/results.txt b/defects/dnsdbq-0001/bench/results.txt deleted file mode 100644 index 92a432d63..000000000 --- a/defects/dnsdbq-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dnsdbq-0001-0001: CWE-407: list-scan inside loop in dnsdbq-0001-0001 (generic model) === -N=100 k=100 : defective=0.104ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.690ms fixed=0.025ms speedup=109.3x -N=1000 k=1000 : defective=9.171ms fixed=0.046ms speedup=198.8x -N=2000 k=2000 : defective=36.572ms fixed=0.097ms speedup=375.3x - diff --git a/defects/dnsdbq-0001/bench/run_all.py b/defects/dnsdbq-0001/bench/run_all.py deleted file mode 100644 index a5352eb62..000000000 --- a/defects/dnsdbq-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dnsdbq-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dnsmasq-0001/Makefile b/defects/dnsmasq-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dnsmasq-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dnsmasq-0001/bench/bench-dnsmasq-0001-0001.py b/defects/dnsmasq-0001/bench/bench-dnsmasq-0001-0001.py deleted file mode 100644 index f6ff51e28..000000000 --- a/defects/dnsmasq-0001/bench/bench-dnsmasq-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dnsmasq-0001-0001.py -# CWE-407: list-scan inside loop in dnsmasq-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dnsmasq-0001-0001: CWE-407: list-scan inside loop in dnsmasq-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dnsmasq-0001/bench/results.txt b/defects/dnsmasq-0001/bench/results.txt deleted file mode 100644 index 64c14ea9c..000000000 --- a/defects/dnsmasq-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dnsmasq-0001-0001: CWE-407: list-scan inside loop in dnsmasq-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.441ms fixed=0.024ms speedup=102.3x -N=1000 k=1000 : defective=10.120ms fixed=0.051ms speedup=200.0x -N=2000 k=2000 : defective=37.112ms fixed=0.097ms speedup=384.3x - diff --git a/defects/dnsmasq-0001/bench/run_all.py b/defects/dnsmasq-0001/bench/run_all.py deleted file mode 100644 index 61abb024d..000000000 --- a/defects/dnsmasq-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dnsmasq-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/doctrine-orm/Makefile b/defects/doctrine-orm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/doctrine-orm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/doctrine-orm/bench/bench-doctrine-orm-0001.py b/defects/doctrine-orm/bench/bench-doctrine-orm-0001.py deleted file mode 100644 index fb2a8d1aa..000000000 --- a/defects/doctrine-orm/bench/bench-doctrine-orm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-orm-0001.py -# ClassMetadata::addSubClass — O(N²) in_array on subClasses list -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-orm-0001: ClassMetadata::addSubClass — O(N²) in_array on subClasses list ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine-orm/bench/bench-doctrine-orm.py b/defects/doctrine-orm/bench/bench-doctrine-orm.py deleted file mode 100644 index c1253fd1f..000000000 --- a/defects/doctrine-orm/bench/bench-doctrine-orm.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-orm.py -# 0001: ClassMetadata::addSubClass — O(N²) in_array on subClasses list -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-orm: 0001: ClassMetadata::addSubClass — O(N²) in_array on subClasses list ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine-orm/bench/results.txt b/defects/doctrine-orm/bench/results.txt deleted file mode 100644 index 01db79617..000000000 --- a/defects/doctrine-orm/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== doctrine-orm-0001: ClassMetadata::addSubClass — O(N²) in_array on subClasses list === -N=100 k=100 : defective=0.171ms fixed=0.015ms speedup=11.5x -N=500 k=500 : defective=2.645ms fixed=0.025ms speedup=106.5x -N=1000 k=1000 : defective=10.059ms fixed=0.051ms speedup=198.9x -N=2000 k=2000 : defective=42.624ms fixed=0.107ms speedup=400.0x - -=== doctrine-orm: 0001: ClassMetadata::addSubClass — O(N²) in_array on subClasses list === -N=100 k=100 : defective=0.090ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.430ms fixed=0.023ms speedup=107.8x -N=1000 k=1000 : defective=9.785ms fixed=0.160ms speedup=61.0x -N=2000 k=2000 : defective=36.910ms fixed=0.098ms speedup=378.2x - diff --git a/defects/doctrine-orm/bench/run_all.py b/defects/doctrine-orm/bench/run_all.py deleted file mode 100644 index b297cd978..000000000 --- a/defects/doctrine-orm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-doctrine-orm-0001.py", "bench-doctrine-orm.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/doctrine/Makefile b/defects/doctrine/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/doctrine/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/doctrine/bench/bench-doctrine-0001.py b/defects/doctrine/bench/bench-doctrine-0001.py deleted file mode 100644 index 6718d648c..000000000 --- a/defects/doctrine/bench/bench-doctrine-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-0001.py -# AbstractHydrator `discriminatorValues` in_array per row -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-0001: AbstractHydrator `discriminatorValues` in_array per row ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine/bench/bench-doctrine-0002.py b/defects/doctrine/bench/bench-doctrine-0002.py deleted file mode 100644 index c0621e8f2..000000000 --- a/defects/doctrine/bench/bench-doctrine-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-0002.py -# ClassMetadata::addSubClass in_array dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-0002: ClassMetadata::addSubClass in_array dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine/bench/bench-doctrine-0003.py b/defects/doctrine/bench/bench-doctrine-0003.py deleted file mode 100644 index 59cf80ec3..000000000 --- a/defects/doctrine/bench/bench-doctrine-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-0003.py -# SqlWalker::walkObjectExpression in_array per field -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-0003: SqlWalker::walkObjectExpression in_array per field ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine/bench/bench-doctrine-orm-0001.py b/defects/doctrine/bench/bench-doctrine-orm-0001.py deleted file mode 100644 index 08cc31523..000000000 --- a/defects/doctrine/bench/bench-doctrine-orm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-orm-0001.py -# CWE-407: list-scan inside loop in doctrine-orm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-orm-0001: CWE-407: list-scan inside loop in doctrine-orm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine/bench/bench-doctrine-orm.py b/defects/doctrine/bench/bench-doctrine-orm.py deleted file mode 100644 index 9f1f69e2c..000000000 --- a/defects/doctrine/bench/bench-doctrine-orm.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doctrine-orm.py -# doctrine-orm diamond recursion scan — CLEAN -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doctrine-orm: doctrine-orm diamond recursion scan — CLEAN ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doctrine/bench/results.txt b/defects/doctrine/bench/results.txt deleted file mode 100644 index 541aecf5d..000000000 --- a/defects/doctrine/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== doctrine-0001: AbstractHydrator `discriminatorValues` in_array per row === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.161ms fixed=0.021ms speedup=105.4x -N=1000 k=1000 : defective=9.057ms fixed=0.047ms speedup=194.8x -N=2000 k=2000 : defective=34.936ms fixed=0.094ms speedup=373.1x - -=== doctrine-0002: ClassMetadata::addSubClass in_array dedup === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.048ms fixed=0.020ms speedup=102.9x -N=1000 k=1000 : defective=8.403ms fixed=0.083ms speedup=101.3x -N=2000 k=2000 : defective=34.997ms fixed=0.093ms speedup=376.1x - -=== doctrine-0003: SqlWalker::walkObjectExpression in_array per field === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.070ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=8.535ms fixed=0.043ms speedup=199.8x -N=2000 k=2000 : defective=35.206ms fixed=0.098ms speedup=361.1x - -=== doctrine-orm-0001: CWE-407: list-scan inside loop in doctrine-orm-0001 (generic model) === -N=100 k=100 : defective=0.083ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.111ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=8.362ms fixed=0.043ms speedup=194.8x -N=2000 k=2000 : defective=34.521ms fixed=0.092ms speedup=374.1x - -=== doctrine-orm: doctrine-orm diamond recursion scan — CLEAN === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.164ms fixed=0.080ms speedup=26.9x -N=1000 k=1000 : defective=8.340ms fixed=0.046ms speedup=180.8x -N=2000 k=2000 : defective=35.958ms fixed=0.093ms speedup=388.7x - diff --git a/defects/doctrine/bench/run_all.py b/defects/doctrine/bench/run_all.py deleted file mode 100644 index 34253d1c7..000000000 --- a/defects/doctrine/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-doctrine-0001.py", "bench-doctrine-0002.py", "bench-doctrine-0003.py", "bench-doctrine-orm-0001.py", "bench-doctrine-orm.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dogecoin-0001/Makefile b/defects/dogecoin-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dogecoin-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dogecoin-0001/bench/bench-dogecoin-0001-0001.py b/defects/dogecoin-0001/bench/bench-dogecoin-0001-0001.py deleted file mode 100644 index 85c4e2e16..000000000 --- a/defects/dogecoin-0001/bench/bench-dogecoin-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dogecoin-0001-0001.py -# CWE-407: list-scan inside loop in dogecoin-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dogecoin-0001-0001: CWE-407: list-scan inside loop in dogecoin-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dogecoin-0001/bench/results.txt b/defects/dogecoin-0001/bench/results.txt deleted file mode 100644 index 5618087b7..000000000 --- a/defects/dogecoin-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dogecoin-0001-0001: CWE-407: list-scan inside loop in dogecoin-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.429ms fixed=0.023ms speedup=103.5x -N=1000 k=1000 : defective=10.056ms fixed=0.053ms speedup=191.2x -N=2000 k=2000 : defective=36.810ms fixed=0.096ms speedup=385.1x - diff --git a/defects/dogecoin-0001/bench/run_all.py b/defects/dogecoin-0001/bench/run_all.py deleted file mode 100644 index c7bd49155..000000000 --- a/defects/dogecoin-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dogecoin-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dolibarr/Makefile b/defects/dolibarr/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dolibarr/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dolibarr/bench/bench-dolibarr-0001.py b/defects/dolibarr/bench/bench-dolibarr-0001.py deleted file mode 100644 index c9d37c8e3..000000000 --- a/defects/dolibarr/bench/bench-dolibarr-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dolibarr-0001.py -# CWE-407: list-scan inside loop in dolibarr-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dolibarr-0001: CWE-407: list-scan inside loop in dolibarr-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dolibarr/bench/bench-dolibarr-0002.py b/defects/dolibarr/bench/bench-dolibarr-0002.py deleted file mode 100644 index 039f52f6b..000000000 --- a/defects/dolibarr/bench/bench-dolibarr-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dolibarr-0002.py -# CWE-407: list-scan inside loop in dolibarr-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dolibarr-0002: CWE-407: list-scan inside loop in dolibarr-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dolibarr/bench/bench-dolibarr-0003.py b/defects/dolibarr/bench/bench-dolibarr-0003.py deleted file mode 100644 index d405351e6..000000000 --- a/defects/dolibarr/bench/bench-dolibarr-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dolibarr-0003.py -# CWE-407: list-scan inside loop in dolibarr-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dolibarr-0003: CWE-407: list-scan inside loop in dolibarr-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dolibarr/bench/bench-dolibarr-0004.py b/defects/dolibarr/bench/bench-dolibarr-0004.py deleted file mode 100644 index ae2660c6f..000000000 --- a/defects/dolibarr/bench/bench-dolibarr-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dolibarr-0004.py -# CWE-407: list-scan inside loop in dolibarr-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dolibarr-0004: CWE-407: list-scan inside loop in dolibarr-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dolibarr/bench/bench-dolibarr-0005.py b/defects/dolibarr/bench/bench-dolibarr-0005.py deleted file mode 100644 index 97381d4fd..000000000 --- a/defects/dolibarr/bench/bench-dolibarr-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dolibarr-0005.py -# CWE-407: list-scan inside loop in dolibarr-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dolibarr-0005: CWE-407: list-scan inside loop in dolibarr-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dolibarr/bench/results.txt b/defects/dolibarr/bench/results.txt deleted file mode 100644 index f3efc48fc..000000000 --- a/defects/dolibarr/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== dolibarr-0001: CWE-407: list-scan inside loop in dolibarr-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=102.9x -N=1000 k=1000 : defective=8.645ms fixed=0.065ms speedup=133.8x -N=2000 k=2000 : defective=35.423ms fixed=0.093ms speedup=382.1x - -=== dolibarr-0002: CWE-407: list-scan inside loop in dolibarr-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.019ms fixed=0.083ms speedup=24.4x -N=1000 k=1000 : defective=8.239ms fixed=0.044ms speedup=186.9x -N=2000 k=2000 : defective=33.884ms fixed=0.093ms speedup=363.6x - -=== dolibarr-0003: CWE-407: list-scan inside loop in dolibarr-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.035ms fixed=0.019ms speedup=105.0x -N=1000 k=1000 : defective=8.274ms fixed=0.044ms speedup=188.5x -N=2000 k=2000 : defective=33.493ms fixed=0.092ms speedup=362.8x - -=== dolibarr-0004: CWE-407: list-scan inside loop in dolibarr-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.009ms fixed=0.020ms speedup=102.6x -N=1000 k=1000 : defective=8.303ms fixed=0.043ms speedup=192.0x -N=2000 k=2000 : defective=34.457ms fixed=0.127ms speedup=272.0x - -=== dolibarr-0005: CWE-407: list-scan inside loop in dolibarr-0005 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.115ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=8.706ms fixed=0.046ms speedup=189.9x -N=2000 k=2000 : defective=34.183ms fixed=0.092ms speedup=372.1x - diff --git a/defects/dolibarr/bench/run_all.py b/defects/dolibarr/bench/run_all.py deleted file mode 100644 index 640300285..000000000 --- a/defects/dolibarr/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dolibarr-0001.py", "bench-dolibarr-0002.py", "bench-dolibarr-0003.py", "bench-dolibarr-0004.py", "bench-dolibarr-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dolphin-0001/Makefile b/defects/dolphin-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dolphin-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dolphin-0001/bench/bench-dolphin-0001-0001.py b/defects/dolphin-0001/bench/bench-dolphin-0001-0001.py deleted file mode 100644 index 949b9fe5a..000000000 --- a/defects/dolphin-0001/bench/bench-dolphin-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dolphin-0001-0001.py -# CWE-407: list-scan inside loop in dolphin-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dolphin-0001-0001: CWE-407: list-scan inside loop in dolphin-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dolphin-0001/bench/results.txt b/defects/dolphin-0001/bench/results.txt deleted file mode 100644 index 8efd6a933..000000000 --- a/defects/dolphin-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dolphin-0001-0001: CWE-407: list-scan inside loop in dolphin-0001-0001 (generic model) === -N=100 k=100 : defective=0.251ms fixed=0.009ms speedup=28.8x -N=500 k=500 : defective=6.007ms fixed=0.052ms speedup=114.9x -N=1000 k=1000 : defective=23.276ms fixed=0.052ms speedup=444.9x -N=2000 k=2000 : defective=38.906ms fixed=0.107ms speedup=365.0x - diff --git a/defects/dolphin-0001/bench/run_all.py b/defects/dolphin-0001/bench/run_all.py deleted file mode 100644 index 140c91a89..000000000 --- a/defects/dolphin-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dolphin-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/doris/Makefile b/defects/doris/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/doris/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/doris/bench/bench-doris-0001.py b/defects/doris/bench/bench-doris-0001.py deleted file mode 100644 index f5e63e934..000000000 --- a/defects/doris/bench/bench-doris-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doris-0001.py -# BindExpression.processNonStandardAggregate — List.contains per projection → O(P×G) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doris-0001: BindExpression.processNonStandardAggregate — List.contains per projection → O(P×G) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doris/bench/bench-doris-0002.py b/defects/doris/bench/bench-doris-0002.py deleted file mode 100644 index c48f111ec..000000000 --- a/defects/doris/bench/bench-doris-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doris-0002.py -# PlanNode.addConjunct — ArrayList.contains() O(C²) dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doris-0002: PlanNode.addConjunct — ArrayList.contains() O(C²) dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doris/bench/bench-doris-0003.py b/defects/doris/bench/bench-doris-0003.py deleted file mode 100644 index 5760a3377..000000000 --- a/defects/doris/bench/bench-doris-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doris-0003.py -# EquivalenceClass.getEquivalenceSetList — O(N²) List.contains dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doris-0003: EquivalenceClass.getEquivalenceSetList — O(N²) List.contains dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doris/bench/bench-doris-0004.py b/defects/doris/bench/bench-doris-0004.py deleted file mode 100644 index f49ba8d29..000000000 --- a/defects/doris/bench/bench-doris-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-doris-0004.py -# NormalizeRepeat.buildContextWithAlias — List.contains O(S×G) for GROUPING SETS -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== doris-0004: NormalizeRepeat.buildContextWithAlias — List.contains O(S×G) for GROUPING SETS ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/doris/bench/results.txt b/defects/doris/bench/results.txt deleted file mode 100644 index 439bbedf1..000000000 --- a/defects/doris/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== doris-0001: BindExpression.processNonStandardAggregate — List.contains per projection → O(P×G) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.120ms fixed=0.020ms speedup=104.2x -N=1000 k=1000 : defective=8.486ms fixed=0.044ms speedup=194.7x -N=2000 k=2000 : defective=34.519ms fixed=0.093ms speedup=371.7x - -=== doris-0002: PlanNode.addConjunct — ArrayList.contains() O(C²) dedup === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=103.5x -N=1000 k=1000 : defective=8.813ms fixed=0.045ms speedup=194.0x -N=2000 k=2000 : defective=35.257ms fixed=0.098ms speedup=360.5x - -=== doris-0003: EquivalenceClass.getEquivalenceSetList — O(N²) List.contains dedup === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.202ms fixed=0.021ms speedup=106.4x -N=1000 k=1000 : defective=8.735ms fixed=0.046ms speedup=191.5x -N=2000 k=2000 : defective=33.644ms fixed=0.093ms speedup=360.3x - -=== doris-0004: NormalizeRepeat.buildContextWithAlias — List.contains O(S×G) for GROUPING SETS === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.028ms fixed=0.020ms speedup=100.4x -N=1000 k=1000 : defective=8.780ms fixed=0.046ms speedup=190.3x -N=2000 k=2000 : defective=35.650ms fixed=0.097ms speedup=366.4x - diff --git a/defects/doris/bench/run_all.py b/defects/doris/bench/run_all.py deleted file mode 100644 index 5f2c2d750..000000000 --- a/defects/doris/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-doris-0001.py", "bench-doris-0002.py", "bench-doris-0003.py", "bench-doris-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dosbox-x-0003/Makefile b/defects/dosbox-x-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dosbox-x-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dosbox-x-0003/bench/bench-dosbox-x-0003-0003.py b/defects/dosbox-x-0003/bench/bench-dosbox-x-0003-0003.py deleted file mode 100644 index 8393d7877..000000000 --- a/defects/dosbox-x-0003/bench/bench-dosbox-x-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dosbox-x-0003-0003.py -# CWE-407: list-scan inside loop in dosbox-x-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dosbox-x-0003-0003: CWE-407: list-scan inside loop in dosbox-x-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dosbox-x-0003/bench/results.txt b/defects/dosbox-x-0003/bench/results.txt deleted file mode 100644 index d82da3c49..000000000 --- a/defects/dosbox-x-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dosbox-x-0003-0003: CWE-407: list-scan inside loop in dosbox-x-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.517ms fixed=0.023ms speedup=108.2x -N=1000 k=1000 : defective=10.271ms fixed=0.053ms speedup=194.9x -N=2000 k=2000 : defective=40.769ms fixed=0.096ms speedup=423.6x - diff --git a/defects/dosbox-x-0003/bench/run_all.py b/defects/dosbox-x-0003/bench/run_all.py deleted file mode 100644 index d2990f20e..000000000 --- a/defects/dosbox-x-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dosbox-x-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dosbox-x-0004/Makefile b/defects/dosbox-x-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dosbox-x-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dosbox-x-0004/bench/bench-dosbox-x-0004-0004.py b/defects/dosbox-x-0004/bench/bench-dosbox-x-0004-0004.py deleted file mode 100644 index 30d96ee33..000000000 --- a/defects/dosbox-x-0004/bench/bench-dosbox-x-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dosbox-x-0004-0004.py -# CWE-407: list-scan inside loop in dosbox-x-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dosbox-x-0004-0004: CWE-407: list-scan inside loop in dosbox-x-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dosbox-x-0004/bench/results.txt b/defects/dosbox-x-0004/bench/results.txt deleted file mode 100644 index ac692d794..000000000 --- a/defects/dosbox-x-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dosbox-x-0004-0004: CWE-407: list-scan inside loop in dosbox-x-0004-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.017ms speedup=5.5x -N=500 k=500 : defective=2.365ms fixed=0.021ms speedup=112.8x -N=1000 k=1000 : defective=9.759ms fixed=0.051ms speedup=191.0x -N=2000 k=2000 : defective=38.857ms fixed=0.107ms speedup=364.2x - diff --git a/defects/dosbox-x-0004/bench/run_all.py b/defects/dosbox-x-0004/bench/run_all.py deleted file mode 100644 index 346c339f4..000000000 --- a/defects/dosbox-x-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dosbox-x-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dosbox-x/Makefile b/defects/dosbox-x/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dosbox-x/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dosbox-x/bench/bench-dosbox-x-0001.py b/defects/dosbox-x/bench/bench-dosbox-x-0001.py deleted file mode 100644 index d66e517b4..000000000 --- a/defects/dosbox-x/bench/bench-dosbox-x-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dosbox-x-0001.py -# CWE-407: list-scan inside loop in dosbox-x-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dosbox-x-0001: CWE-407: list-scan inside loop in dosbox-x-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dosbox-x/bench/bench-dosbox-x-0002.py b/defects/dosbox-x/bench/bench-dosbox-x-0002.py deleted file mode 100644 index d10a8a2ca..000000000 --- a/defects/dosbox-x/bench/bench-dosbox-x-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dosbox-x-0002.py -# with strcasecmp for every file operation (open, stat, attr, etc.) — O(N) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dosbox-x-0002: with strcasecmp for every file operation (open, stat, attr, etc.) — O(N) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dosbox-x/bench/bench-dosbox-x-0003-0003.py b/defects/dosbox-x/bench/bench-dosbox-x-0003-0003.py deleted file mode 100644 index 8393d7877..000000000 --- a/defects/dosbox-x/bench/bench-dosbox-x-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dosbox-x-0003-0003.py -# CWE-407: list-scan inside loop in dosbox-x-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dosbox-x-0003-0003: CWE-407: list-scan inside loop in dosbox-x-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dosbox-x/bench/bench-dosbox-x-0004-0004.py b/defects/dosbox-x/bench/bench-dosbox-x-0004-0004.py deleted file mode 100644 index 30d96ee33..000000000 --- a/defects/dosbox-x/bench/bench-dosbox-x-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dosbox-x-0004-0004.py -# CWE-407: list-scan inside loop in dosbox-x-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dosbox-x-0004-0004: CWE-407: list-scan inside loop in dosbox-x-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dosbox-x/bench/results.txt b/defects/dosbox-x/bench/results.txt deleted file mode 100644 index 1fe998048..000000000 --- a/defects/dosbox-x/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== dosbox-x-0001: CWE-407: list-scan inside loop in dosbox-x-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=2.574ms fixed=0.025ms speedup=103.7x -N=1000 k=1000 : defective=10.625ms fixed=0.103ms speedup=103.6x -N=2000 k=2000 : defective=41.543ms fixed=0.107ms speedup=387.0x - -=== dosbox-x-0002: with strcasecmp for every file operation (open, stat, attr, etc.) — O(N) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.468ms fixed=0.023ms speedup=107.7x -N=1000 k=1000 : defective=9.748ms fixed=0.049ms speedup=197.5x -N=2000 k=2000 : defective=37.644ms fixed=0.096ms speedup=392.1x - -=== dosbox-x-0003-0003: CWE-407: list-scan inside loop in dosbox-x-0003-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.109ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=9.089ms fixed=0.046ms speedup=196.0x -N=2000 k=2000 : defective=39.213ms fixed=0.106ms speedup=370.7x - -=== dosbox-x-0004-0004: CWE-407: list-scan inside loop in dosbox-x-0004-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.348ms fixed=0.096ms speedup=24.6x -N=1000 k=1000 : defective=11.736ms fixed=0.051ms speedup=231.6x -N=2000 k=2000 : defective=36.640ms fixed=0.097ms speedup=378.2x - diff --git a/defects/dosbox-x/bench/run_all.py b/defects/dosbox-x/bench/run_all.py deleted file mode 100644 index 525b52326..000000000 --- a/defects/dosbox-x/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dosbox-x-0001.py", "bench-dosbox-x-0002.py", "bench-dosbox-x-0003-0003.py", "bench-dosbox-x-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dovecot/Makefile b/defects/dovecot/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dovecot/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dovecot/bench/bench-dovecot-0001.py b/defects/dovecot/bench/bench-dovecot-0001.py deleted file mode 100644 index e2c62e813..000000000 --- a/defects/dovecot/bench/bench-dovecot-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dovecot-0001.py -# CWE-407: list-scan inside loop in dovecot-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dovecot-0001: CWE-407: list-scan inside loop in dovecot-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dovecot/bench/results.txt b/defects/dovecot/bench/results.txt deleted file mode 100644 index d7483fc18..000000000 --- a/defects/dovecot/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== dovecot-0001: CWE-407: list-scan inside loop in dovecot-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.362ms fixed=0.023ms speedup=102.8x -N=1000 k=1000 : defective=9.397ms fixed=0.049ms speedup=192.2x -N=2000 k=2000 : defective=36.074ms fixed=0.098ms speedup=366.7x - diff --git a/defects/dovecot/bench/run_all.py b/defects/dovecot/bench/run_all.py deleted file mode 100644 index 25cf3cc2a..000000000 --- a/defects/dovecot/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dovecot-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dragonfly/Makefile b/defects/dragonfly/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dragonfly/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dragonfly/bench/bench-dragonfly-0001.py b/defects/dragonfly/bench/bench-dragonfly-0001.py deleted file mode 100644 index 99e277212..000000000 --- a/defects/dragonfly/bench/bench-dragonfly-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonfly-0001.py -# CWE-407: list-scan inside loop in dragonfly-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonfly-0001: CWE-407: list-scan inside loop in dragonfly-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonfly/bench/bench-dragonfly-0002.py b/defects/dragonfly/bench/bench-dragonfly-0002.py deleted file mode 100644 index 4e5231d09..000000000 --- a/defects/dragonfly/bench/bench-dragonfly-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonfly-0002.py -# CWE-407: list-scan inside loop in dragonfly-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonfly-0002: CWE-407: list-scan inside loop in dragonfly-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonfly/bench/results.txt b/defects/dragonfly/bench/results.txt deleted file mode 100644 index 46c0f42bd..000000000 --- a/defects/dragonfly/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dragonfly-0001: CWE-407: list-scan inside loop in dragonfly-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.707ms fixed=0.026ms speedup=103.7x -N=1000 k=1000 : defective=11.125ms fixed=0.059ms speedup=189.0x -N=2000 k=2000 : defective=35.041ms fixed=0.098ms speedup=358.8x - -=== dragonfly-0002: CWE-407: list-scan inside loop in dragonfly-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=102.6x -N=1000 k=1000 : defective=8.517ms fixed=0.046ms speedup=186.8x -N=2000 k=2000 : defective=34.751ms fixed=0.097ms speedup=357.2x - diff --git a/defects/dragonfly/bench/run_all.py b/defects/dragonfly/bench/run_all.py deleted file mode 100644 index 6118fca24..000000000 --- a/defects/dragonfly/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dragonfly-0001.py", "bench-dragonfly-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dragonflybsd/Makefile b/defects/dragonflybsd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dragonflybsd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dragonflybsd/bench/bench-dragonflybsd-0001.py b/defects/dragonflybsd/bench/bench-dragonflybsd-0001.py deleted file mode 100644 index d8141ec59..000000000 --- a/defects/dragonflybsd/bench/bench-dragonflybsd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonflybsd-0001.py -# CWE-407: list-scan inside loop in dragonflybsd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonflybsd-0001: CWE-407: list-scan inside loop in dragonflybsd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonflybsd/bench/bench-dragonflybsd-0002.py b/defects/dragonflybsd/bench/bench-dragonflybsd-0002.py deleted file mode 100644 index 907461cbb..000000000 --- a/defects/dragonflybsd/bench/bench-dragonflybsd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonflybsd-0002.py -# CWE-407: list-scan inside loop in dragonflybsd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonflybsd-0002: CWE-407: list-scan inside loop in dragonflybsd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonflybsd/bench/bench-dragonflybsd-0003.py b/defects/dragonflybsd/bench/bench-dragonflybsd-0003.py deleted file mode 100644 index 4f2341ca4..000000000 --- a/defects/dragonflybsd/bench/bench-dragonflybsd-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonflybsd-0003.py -# CWE-407: list-scan inside loop in dragonflybsd-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonflybsd-0003: CWE-407: list-scan inside loop in dragonflybsd-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonflybsd/bench/bench-dragonflybsd-0004.py b/defects/dragonflybsd/bench/bench-dragonflybsd-0004.py deleted file mode 100644 index 992e9f10f..000000000 --- a/defects/dragonflybsd/bench/bench-dragonflybsd-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonflybsd-0004.py -# CWE-407: list-scan inside loop in dragonflybsd-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonflybsd-0004: CWE-407: list-scan inside loop in dragonflybsd-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonflybsd/bench/bench-dragonflybsd-0005.py b/defects/dragonflybsd/bench/bench-dragonflybsd-0005.py deleted file mode 100644 index 096f9cfb2..000000000 --- a/defects/dragonflybsd/bench/bench-dragonflybsd-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dragonflybsd-0005.py -# CWE-407: list-scan inside loop in dragonflybsd-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dragonflybsd-0005: CWE-407: list-scan inside loop in dragonflybsd-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dragonflybsd/bench/results.txt b/defects/dragonflybsd/bench/results.txt deleted file mode 100644 index f5913f926..000000000 --- a/defects/dragonflybsd/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== dragonflybsd-0001: CWE-407: list-scan inside loop in dragonflybsd-0001 (generic model) === -N=100 k=100 : defective=0.065ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=1.627ms fixed=0.016ms speedup=103.2x -N=1000 k=1000 : defective=6.535ms fixed=0.033ms speedup=198.4x -N=2000 k=2000 : defective=23.729ms fixed=0.062ms speedup=384.0x - -=== dragonflybsd-0002: CWE-407: list-scan inside loop in dragonflybsd-0002 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.7x -N=500 k=500 : defective=1.337ms fixed=0.013ms speedup=102.2x -N=1000 k=1000 : defective=6.006ms fixed=0.031ms speedup=196.0x -N=2000 k=2000 : defective=29.369ms fixed=0.070ms speedup=416.8x - -=== dragonflybsd-0003: CWE-407: list-scan inside loop in dragonflybsd-0003 (generic model) === -N=100 k=100 : defective=0.063ms fixed=0.003ms speedup=22.6x -N=500 k=500 : defective=1.499ms fixed=0.015ms speedup=100.1x -N=1000 k=1000 : defective=5.752ms fixed=0.029ms speedup=195.8x -N=2000 k=2000 : defective=23.035ms fixed=0.062ms speedup=371.0x - -=== dragonflybsd-0004: CWE-407: list-scan inside loop in dragonflybsd-0004 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.8x -N=500 k=500 : defective=1.345ms fixed=0.013ms speedup=101.8x -N=1000 k=1000 : defective=5.648ms fixed=0.029ms speedup=196.2x -N=2000 k=2000 : defective=22.910ms fixed=0.061ms speedup=373.8x - -=== dragonflybsd-0005: CWE-407: list-scan inside loop in dragonflybsd-0005 (generic model) === -N=100 k=100 : defective=0.053ms fixed=0.002ms speedup=24.4x -N=500 k=500 : defective=1.374ms fixed=0.013ms speedup=104.4x -N=1000 k=1000 : defective=5.856ms fixed=0.030ms speedup=192.0x -N=2000 k=2000 : defective=24.400ms fixed=0.062ms speedup=390.7x - diff --git a/defects/dragonflybsd/bench/run_all.py b/defects/dragonflybsd/bench/run_all.py deleted file mode 100644 index 771192e26..000000000 --- a/defects/dragonflybsd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dragonflybsd-0001.py", "bench-dragonflybsd-0002.py", "bench-dragonflybsd-0003.py", "bench-dragonflybsd-0004.py", "bench-dragonflybsd-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/drone-0001/Makefile b/defects/drone-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/drone-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/drone-0001/bench/bench-drone-0001-0001.py b/defects/drone-0001/bench/bench-drone-0001-0001.py deleted file mode 100644 index 0102b082f..000000000 --- a/defects/drone-0001/bench/bench-drone-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-drone-0001-0001.py -# CWE-407: list-scan inside loop in drone-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== drone-0001-0001: CWE-407: list-scan inside loop in drone-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/drone-0001/bench/results.txt b/defects/drone-0001/bench/results.txt deleted file mode 100644 index 5e02abc55..000000000 --- a/defects/drone-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== drone-0001-0001: CWE-407: list-scan inside loop in drone-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.204ms fixed=0.021ms speedup=102.8x -N=1000 k=1000 : defective=9.224ms fixed=0.049ms speedup=189.7x -N=2000 k=2000 : defective=36.667ms fixed=0.095ms speedup=385.8x - diff --git a/defects/drone-0001/bench/run_all.py b/defects/drone-0001/bench/run_all.py deleted file mode 100644 index 8a0a62531..000000000 --- a/defects/drone-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-drone-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/drone-0002/Makefile b/defects/drone-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/drone-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/drone-0002/bench/bench-drone-0002-0002.py b/defects/drone-0002/bench/bench-drone-0002-0002.py deleted file mode 100644 index 19f8ed739..000000000 --- a/defects/drone-0002/bench/bench-drone-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-drone-0002-0002.py -# CWE-407: list-scan inside loop in drone-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== drone-0002-0002: CWE-407: list-scan inside loop in drone-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/drone-0002/bench/results.txt b/defects/drone-0002/bench/results.txt deleted file mode 100644 index 65e366d49..000000000 --- a/defects/drone-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== drone-0002-0002: CWE-407: list-scan inside loop in drone-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.439ms fixed=0.024ms speedup=102.4x -N=1000 k=1000 : defective=12.573ms fixed=0.054ms speedup=233.7x -N=2000 k=2000 : defective=46.239ms fixed=0.107ms speedup=432.0x - diff --git a/defects/drone-0002/bench/run_all.py b/defects/drone-0002/bench/run_all.py deleted file mode 100644 index b4bc54968..000000000 --- a/defects/drone-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-drone-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/druid/Makefile b/defects/druid/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/druid/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/druid/bench/bench-druid-0001.py b/defects/druid/bench/bench-druid-0001.py deleted file mode 100644 index a6c02d934..000000000 --- a/defects/druid/bench/bench-druid-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-druid-0001.py -# ScanQuery columns List.contains in orderBy validation loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== druid-0001: ScanQuery columns List.contains in orderBy validation loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/druid/bench/results.txt b/defects/druid/bench/results.txt deleted file mode 100644 index 8ef429810..000000000 --- a/defects/druid/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== druid-0001: ScanQuery columns List.contains in orderBy validation loop === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.544ms fixed=0.024ms speedup=107.8x -N=1000 k=1000 : defective=12.635ms fixed=0.058ms speedup=217.7x -N=2000 k=2000 : defective=43.338ms fixed=0.111ms speedup=388.8x - diff --git a/defects/druid/bench/run_all.py b/defects/druid/bench/run_all.py deleted file mode 100644 index a979890c4..000000000 --- a/defects/druid/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-druid-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dry/Makefile b/defects/dry/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dry/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dry/bench/bench-dry-0001.py b/defects/dry/bench/bench-dry-0001.py deleted file mode 100644 index a9a1102e2..000000000 --- a/defects/dry/bench/bench-dry-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dry-0001.py -# build O(1) lookup set from incoming indices — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dry-0001: build O(1) lookup set from incoming indices — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dry/bench/bench-dry-0002.py b/defects/dry/bench/bench-dry-0002.py deleted file mode 100644 index 0f3b44ce0..000000000 --- a/defects/dry/bench/bench-dry-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dry-0002.py -# was exceptions.Contains() — O(m) per handler — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dry-0002: was exceptions.Contains() — O(m) per handler — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dry/bench/results.txt b/defects/dry/bench/results.txt deleted file mode 100644 index 6d29156dd..000000000 --- a/defects/dry/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dry-0001: build O(1) lookup set from incoming indices — CWE-407 === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.828ms fixed=0.025ms speedup=112.4x -N=1000 k=1000 : defective=10.933ms fixed=0.055ms speedup=200.0x -N=2000 k=2000 : defective=43.153ms fixed=0.110ms speedup=390.5x - -=== dry-0002: was exceptions.Contains() — O(m) per handler — CWE-407 === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.489ms fixed=0.023ms speedup=108.0x -N=1000 k=1000 : defective=8.621ms fixed=0.045ms speedup=190.7x -N=2000 k=2000 : defective=39.733ms fixed=0.097ms speedup=407.7x - diff --git a/defects/dry/bench/run_all.py b/defects/dry/bench/run_all.py deleted file mode 100644 index 2bb970406..000000000 --- a/defects/dry/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dry-0001.py", "bench-dry-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/dubbo/Makefile b/defects/dubbo/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/dubbo/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/dubbo/bench/bench-dubbo-0001.py b/defects/dubbo/bench/bench-dubbo-0001.py deleted file mode 100644 index 01678db71..000000000 --- a/defects/dubbo/bench/bench-dubbo-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dubbo-0001.py -# AnnotationUtils.getAllMetaAnnotations diamond recursion O(2^D) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dubbo-0001: AnnotationUtils.getAllMetaAnnotations diamond recursion O(2^D) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dubbo/bench/bench-dubbo-0002.py b/defects/dubbo/bench/bench-dubbo-0002.py deleted file mode 100644 index c5ba78e76..000000000 --- a/defects/dubbo/bench/bench-dubbo-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-dubbo-0002.py -# MethodWalker.walkHierarchy diamond recursion O(2^D) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== dubbo-0002: MethodWalker.walkHierarchy diamond recursion O(2^D) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/dubbo/bench/results.txt b/defects/dubbo/bench/results.txt deleted file mode 100644 index 1f8fa9e1e..000000000 --- a/defects/dubbo/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== dubbo-0001: AnnotationUtils.getAllMetaAnnotations diamond recursion O(2^D) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.727ms fixed=0.025ms speedup=108.9x -N=1000 k=1000 : defective=11.188ms fixed=0.055ms speedup=203.9x -N=2000 k=2000 : defective=40.484ms fixed=0.107ms speedup=379.7x - -=== dubbo-0002: MethodWalker.walkHierarchy diamond recursion O(2^D) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.331ms fixed=0.023ms speedup=101.5x -N=1000 k=1000 : defective=9.499ms fixed=0.051ms speedup=187.2x -N=2000 k=2000 : defective=43.067ms fixed=0.165ms speedup=260.4x - diff --git a/defects/dubbo/bench/run_all.py b/defects/dubbo/bench/run_all.py deleted file mode 100644 index 51a0bdafe..000000000 --- a/defects/dubbo/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-dubbo-0001.py", "bench-dubbo-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/duckdb/Makefile b/defects/duckdb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/duckdb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/duckdb/bench/bench-duckdb-0001.py b/defects/duckdb/bench/bench-duckdb-0001.py deleted file mode 100644 index 0e45bb17e..000000000 --- a/defects/duckdb/bench/bench-duckdb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-duckdb-0001.py -# CWE-407: list-scan inside loop in duckdb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== duckdb-0001: CWE-407: list-scan inside loop in duckdb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/duckdb/bench/bench-duckdb-0002.py b/defects/duckdb/bench/bench-duckdb-0002.py deleted file mode 100644 index f513e53ac..000000000 --- a/defects/duckdb/bench/bench-duckdb-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-duckdb-0002.py -# CWE-407: list-scan inside loop in duckdb-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== duckdb-0002: CWE-407: list-scan inside loop in duckdb-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/duckdb/bench/bench-duckdb-0003.py b/defects/duckdb/bench/bench-duckdb-0003.py deleted file mode 100644 index 45ee0c510..000000000 --- a/defects/duckdb/bench/bench-duckdb-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-duckdb-0003.py -# File: src/optimizer/build_probe_side_optimizer.cpp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== duckdb-0003: File: src/optimizer/build_probe_side_optimizer.cpp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/duckdb/bench/bench-duckdb-0004.py b/defects/duckdb/bench/bench-duckdb-0004.py deleted file mode 100644 index 3ccda4145..000000000 --- a/defects/duckdb/bench/bench-duckdb-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-duckdb-0004.py -# File: src/optimizer/deliminator.cpp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== duckdb-0004: File: src/optimizer/deliminator.cpp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/duckdb/bench/results.txt b/defects/duckdb/bench/results.txt deleted file mode 100644 index 8ca0f82ca..000000000 --- a/defects/duckdb/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== duckdb-0001: CWE-407: list-scan inside loop in duckdb-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=102.4x -N=1000 k=1000 : defective=8.764ms fixed=0.046ms speedup=191.2x -N=2000 k=2000 : defective=34.685ms fixed=0.098ms speedup=353.8x - -=== duckdb-0002: CWE-407: list-scan inside loop in duckdb-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.099ms fixed=0.020ms speedup=103.8x -N=1000 k=1000 : defective=8.676ms fixed=0.045ms speedup=194.0x -N=2000 k=2000 : defective=36.050ms fixed=0.093ms speedup=389.3x - -=== duckdb-0003: File: src/optimizer/build_probe_side_optimizer.cpp === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.122ms fixed=0.020ms speedup=107.3x -N=1000 k=1000 : defective=8.252ms fixed=0.044ms speedup=187.4x -N=2000 k=2000 : defective=35.128ms fixed=0.094ms speedup=373.5x - -=== duckdb-0004: File: src/optimizer/deliminator.cpp === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.012ms fixed=0.020ms speedup=102.1x -N=1000 k=1000 : defective=8.245ms fixed=0.044ms speedup=187.5x -N=2000 k=2000 : defective=33.702ms fixed=0.092ms speedup=366.5x - diff --git a/defects/duckdb/bench/run_all.py b/defects/duckdb/bench/run_all.py deleted file mode 100644 index 49cd59a3a..000000000 --- a/defects/duckdb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-duckdb-0001.py", "bench-duckdb-0002.py", "bench-duckdb-0003.py", "bench-duckdb-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/duckstation-0001/Makefile b/defects/duckstation-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/duckstation-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/duckstation-0001/bench/bench-duckstation-0001-0001.py b/defects/duckstation-0001/bench/bench-duckstation-0001-0001.py deleted file mode 100644 index 91aaae6a2..000000000 --- a/defects/duckstation-0001/bench/bench-duckstation-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-duckstation-0001-0001.py -# CWE-407: list-scan inside loop in duckstation-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== duckstation-0001-0001: CWE-407: list-scan inside loop in duckstation-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/duckstation-0001/bench/results.txt b/defects/duckstation-0001/bench/results.txt deleted file mode 100644 index 1c4cd17cd..000000000 --- a/defects/duckstation-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== duckstation-0001-0001: CWE-407: list-scan inside loop in duckstation-0001-0001 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=3.300ms fixed=0.025ms speedup=132.8x -N=1000 k=1000 : defective=11.265ms fixed=0.056ms speedup=202.0x -N=2000 k=2000 : defective=42.299ms fixed=0.108ms speedup=390.4x - diff --git a/defects/duckstation-0001/bench/run_all.py b/defects/duckstation-0001/bench/run_all.py deleted file mode 100644 index 094e29849..000000000 --- a/defects/duckstation-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-duckstation-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/duckstation-0002/Makefile b/defects/duckstation-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/duckstation-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/duckstation-0002/bench/bench-duckstation-0002-0002.py b/defects/duckstation-0002/bench/bench-duckstation-0002-0002.py deleted file mode 100644 index e80aecb69..000000000 --- a/defects/duckstation-0002/bench/bench-duckstation-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-duckstation-0002-0002.py -# CWE-407: list-scan inside loop in duckstation-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== duckstation-0002-0002: CWE-407: list-scan inside loop in duckstation-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/duckstation-0002/bench/results.txt b/defects/duckstation-0002/bench/results.txt deleted file mode 100644 index e586a4971..000000000 --- a/defects/duckstation-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== duckstation-0002-0002: CWE-407: list-scan inside loop in duckstation-0002-0002 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.006ms speedup=17.3x -N=500 k=500 : defective=2.581ms fixed=0.024ms speedup=105.6x -N=1000 k=1000 : defective=11.903ms fixed=0.095ms speedup=125.3x -N=2000 k=2000 : defective=48.446ms fixed=0.103ms speedup=472.2x - diff --git a/defects/duckstation-0002/bench/run_all.py b/defects/duckstation-0002/bench/run_all.py deleted file mode 100644 index be251f2ec..000000000 --- a/defects/duckstation-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-duckstation-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/eclipse-jdt/Makefile b/defects/eclipse-jdt/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/eclipse-jdt/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/eclipse-jdt/bench/bench-eclipse-jdt-0001.py b/defects/eclipse-jdt/bench/bench-eclipse-jdt-0001.py deleted file mode 100644 index a7cb477d1..000000000 --- a/defects/eclipse-jdt/bench/bench-eclipse-jdt-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-eclipse-jdt-0001.py -# Scope.getCommonSuperType — ArrayList.contains() O(N²) in BFS supertypes collection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== eclipse-jdt-0001: Scope.getCommonSuperType — ArrayList.contains() O(N²) in BFS supertypes collection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/eclipse-jdt/bench/bench-eclipse-jdt-0002.py b/defects/eclipse-jdt/bench/bench-eclipse-jdt-0002.py deleted file mode 100644 index 4329afac3..000000000 --- a/defects/eclipse-jdt/bench/bench-eclipse-jdt-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-eclipse-jdt-0002.py -# TypeHierarchy.getAllSupertypes0 — missing Set.add() guard on superclass recursion -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== eclipse-jdt-0002: TypeHierarchy.getAllSupertypes0 — missing Set.add() guard on superclass recursion ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/eclipse-jdt/bench/results.txt b/defects/eclipse-jdt/bench/results.txt deleted file mode 100644 index b47193764..000000000 --- a/defects/eclipse-jdt/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== eclipse-jdt-0001: Scope.getCommonSuperType — ArrayList.contains() O(N²) in BFS supertypes collection === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.437ms fixed=0.022ms speedup=109.8x -N=1000 k=1000 : defective=9.022ms fixed=0.044ms speedup=203.2x -N=2000 k=2000 : defective=36.704ms fixed=0.098ms speedup=374.2x - -=== eclipse-jdt-0002: TypeHierarchy.getAllSupertypes0 — missing Set.add() guard on superclass recursion === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.332ms fixed=0.021ms speedup=110.5x -N=1000 k=1000 : defective=9.506ms fixed=0.046ms speedup=206.3x -N=2000 k=2000 : defective=44.041ms fixed=0.181ms speedup=243.0x - diff --git a/defects/eclipse-jdt/bench/run_all.py b/defects/eclipse-jdt/bench/run_all.py deleted file mode 100644 index 6c15d7453..000000000 --- a/defects/eclipse-jdt/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-eclipse-jdt-0001.py", "bench-eclipse-jdt-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/efcore/Makefile b/defects/efcore/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/efcore/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/efcore/bench/bench-efcore-0001.py b/defects/efcore/bench/bench-efcore-0001.py deleted file mode 100644 index 8ee7f7f8a..000000000 --- a/defects/efcore/bench/bench-efcore-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-efcore-0001.py -# CWE-407: list-scan inside loop in efcore-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== efcore-0001: CWE-407: list-scan inside loop in efcore-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/efcore/bench/bench-efcore-0002.py b/defects/efcore/bench/bench-efcore-0002.py deleted file mode 100644 index eb85ed3b8..000000000 --- a/defects/efcore/bench/bench-efcore-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-efcore-0002.py -# CWE-407: list-scan inside loop in efcore-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== efcore-0002: CWE-407: list-scan inside loop in efcore-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/efcore/bench/bench-efcore-0003.py b/defects/efcore/bench/bench-efcore-0003.py deleted file mode 100644 index 4a454516a..000000000 --- a/defects/efcore/bench/bench-efcore-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-efcore-0003.py -# CWE-407: list-scan inside loop in efcore-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== efcore-0003: CWE-407: list-scan inside loop in efcore-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/efcore/bench/results.txt b/defects/efcore/bench/results.txt deleted file mode 100644 index 3d1d9527a..000000000 --- a/defects/efcore/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== efcore-0001: CWE-407: list-scan inside loop in efcore-0001 (generic model) === -N=100 k=100 : defective=0.129ms fixed=0.005ms speedup=24.8x -N=500 k=500 : defective=3.265ms fixed=0.031ms speedup=105.7x -N=1000 k=1000 : defective=15.499ms fixed=0.070ms speedup=222.0x -N=2000 k=2000 : defective=40.034ms fixed=0.098ms speedup=407.7x - -=== efcore-0002: CWE-407: list-scan inside loop in efcore-0002 (generic model) === -N=100 k=100 : defective=0.125ms fixed=0.006ms speedup=19.8x -N=500 k=500 : defective=2.197ms fixed=0.021ms speedup=106.5x -N=1000 k=1000 : defective=9.005ms fixed=0.045ms speedup=199.3x -N=2000 k=2000 : defective=37.408ms fixed=0.102ms speedup=368.1x - -=== efcore-0003: CWE-407: list-scan inside loop in efcore-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.203ms fixed=0.020ms speedup=108.7x -N=1000 k=1000 : defective=10.658ms fixed=0.051ms speedup=210.9x -N=2000 k=2000 : defective=38.895ms fixed=0.098ms speedup=398.2x - diff --git a/defects/efcore/bench/run_all.py b/defects/efcore/bench/run_all.py deleted file mode 100644 index 13d0c2fb4..000000000 --- a/defects/efcore/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-efcore-0001.py", "bench-efcore-0002.py", "bench-efcore-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ejabberd/Makefile b/defects/ejabberd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ejabberd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ejabberd/bench/bench-ejabberd-0001.py b/defects/ejabberd/bench/bench-ejabberd-0001.py deleted file mode 100644 index 55649b827..000000000 --- a/defects/ejabberd/bench/bench-ejabberd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ejabberd-0001.py -# CWE-407: list-scan inside loop in ejabberd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ejabberd-0001: CWE-407: list-scan inside loop in ejabberd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ejabberd/bench/bench-ejabberd-0002.py b/defects/ejabberd/bench/bench-ejabberd-0002.py deleted file mode 100644 index b0c6871bb..000000000 --- a/defects/ejabberd/bench/bench-ejabberd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ejabberd-0002.py -# CWE-407: list-scan inside loop in ejabberd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ejabberd-0002: CWE-407: list-scan inside loop in ejabberd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ejabberd/bench/results.txt b/defects/ejabberd/bench/results.txt deleted file mode 100644 index 588377122..000000000 --- a/defects/ejabberd/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ejabberd-0001: CWE-407: list-scan inside loop in ejabberd-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.528ms fixed=0.024ms speedup=107.1x -N=1000 k=1000 : defective=10.792ms fixed=0.053ms speedup=202.0x -N=2000 k=2000 : defective=37.112ms fixed=0.098ms speedup=377.5x - -=== ejabberd-0002: CWE-407: list-scan inside loop in ejabberd-0002 (generic model) === -N=100 k=100 : defective=0.091ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.233ms fixed=0.020ms speedup=109.5x -N=1000 k=1000 : defective=10.230ms fixed=0.050ms speedup=204.8x -N=2000 k=2000 : defective=37.196ms fixed=0.098ms speedup=380.4x - diff --git a/defects/ejabberd/bench/run_all.py b/defects/ejabberd/bench/run_all.py deleted file mode 100644 index 5f3fb3dda..000000000 --- a/defects/ejabberd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ejabberd-0001.py", "bench-ejabberd-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/elasticsearch/Makefile b/defects/elasticsearch/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/elasticsearch/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/elasticsearch/bench/bench-elasticsearch-0001.py b/defects/elasticsearch/bench/bench-elasticsearch-0001.py deleted file mode 100644 index c868d4934..000000000 --- a/defects/elasticsearch/bench/bench-elasticsearch-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elasticsearch-0001.py -# CWE-407: list-scan inside loop in elasticsearch-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elasticsearch-0001: CWE-407: list-scan inside loop in elasticsearch-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elasticsearch/bench/bench-elasticsearch-001.py b/defects/elasticsearch/bench/bench-elasticsearch-001.py deleted file mode 100644 index 6d25656eb..000000000 --- a/defects/elasticsearch/bench/bench-elasticsearch-001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elasticsearch-001.py -# MMRResultDiversification O(n²) selectedDocRanks.contains -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elasticsearch-001: MMRResultDiversification O(n²) selectedDocRanks.contains ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elasticsearch/bench/bench-elasticsearch-002.py b/defects/elasticsearch/bench/bench-elasticsearch-002.py deleted file mode 100644 index 74398b8f0..000000000 --- a/defects/elasticsearch/bench/bench-elasticsearch-002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elasticsearch-002.py -# IngestDocument appendValues O(n²) list.contains -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elasticsearch-002: IngestDocument appendValues O(n²) list.contains ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elasticsearch/bench/bench-elasticsearch-003.py b/defects/elasticsearch/bench/bench-elasticsearch-003.py deleted file mode 100644 index e4f373015..000000000 --- a/defects/elasticsearch/bench/bench-elasticsearch-003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elasticsearch-003.py -# XContentHelper O(n²) mergedList.contains in list dedup merge -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elasticsearch-003: XContentHelper O(n²) mergedList.contains in list dedup merge ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elasticsearch/bench/bench-elasticsearch-004.py b/defects/elasticsearch/bench/bench-elasticsearch-004.py deleted file mode 100644 index 60444f6af..000000000 --- a/defects/elasticsearch/bench/bench-elasticsearch-004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elasticsearch-004.py -# IndexGraveyard.containsIndex O(n²) List scan in DanglingIndicesState loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elasticsearch-004: IndexGraveyard.containsIndex O(n²) List scan in DanglingIndicesState loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elasticsearch/bench/results.txt b/defects/elasticsearch/bench/results.txt deleted file mode 100644 index dbd6c0542..000000000 --- a/defects/elasticsearch/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== elasticsearch-0001: CWE-407: list-scan inside loop in elasticsearch-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.128ms fixed=0.021ms speedup=100.8x -N=1000 k=1000 : defective=8.701ms fixed=0.045ms speedup=193.3x -N=2000 k=2000 : defective=33.985ms fixed=0.092ms speedup=367.6x - -=== elasticsearch-001: MMRResultDiversification O(n²) selectedDocRanks.contains === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.030ms fixed=0.019ms speedup=107.5x -N=1000 k=1000 : defective=8.458ms fixed=0.043ms speedup=194.9x -N=2000 k=2000 : defective=34.402ms fixed=0.094ms speedup=366.4x - -=== elasticsearch-002: IngestDocument appendValues O(n²) list.contains === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.025ms fixed=0.020ms speedup=101.3x -N=1000 k=1000 : defective=8.265ms fixed=0.044ms speedup=189.4x -N=2000 k=2000 : defective=34.409ms fixed=0.093ms speedup=368.9x - -=== elasticsearch-003: XContentHelper O(n²) mergedList.contains in list dedup merge === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.037ms fixed=0.020ms speedup=102.7x -N=1000 k=1000 : defective=8.369ms fixed=0.044ms speedup=189.0x -N=2000 k=2000 : defective=34.136ms fixed=0.094ms speedup=362.1x - -=== elasticsearch-004: IndexGraveyard.containsIndex O(n²) List scan in DanglingIndicesState loop === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.009ms fixed=0.019ms speedup=104.6x -N=1000 k=1000 : defective=8.246ms fixed=0.042ms speedup=194.5x -N=2000 k=2000 : defective=33.642ms fixed=0.093ms speedup=360.5x - diff --git a/defects/elasticsearch/bench/run_all.py b/defects/elasticsearch/bench/run_all.py deleted file mode 100644 index 870f2eb94..000000000 --- a/defects/elasticsearch/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-elasticsearch-0001.py", "bench-elasticsearch-001.py", "bench-elasticsearch-002.py", "bench-elasticsearch-003.py", "bench-elasticsearch-004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/elasticsearch/unit/test_elasticsearch_realworld.py b/defects/elasticsearch/unit/test_elasticsearch_realworld.py deleted file mode 100644 index a22e23832..000000000 --- a/defects/elasticsearch/unit/test_elasticsearch_realworld.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -Elasticsearch CWE-407 Real-World Field Size Benchmark - -Measures IngestDocument.appendValues() at field sizes matching production workloads: - k=100 — enrichment pipeline (threat intel, GeoIP, 100 annotations per doc) - k=420 — moderate SIEM (security event with 420 correlation IDs after enrichment) - k=4096 — heavy SIEM/APM (trace with 4096 accumulated span tags across 50 services) - k=8096 — IoT/telemetry (device with 8096 accumulated metadata tags) - -N = k/2 new values appended per document, 50% overlap (realistic dedup scenario). -""" - -import time - - -def append_before(existing, new_values): - result = list(existing) - for val in new_values: - if val not in result: - result.append(val) - return result - - -def append_after(existing, new_values): - result = list(existing) - seen = set(result) - for val in new_values: - if val not in seen: - result.append(val) - seen.add(val) - return result - - -def format_time(seconds): - if seconds < 0.001: - return f"{seconds*1_000_000:.0f}us" - elif seconds < 1: - return f"{seconds*1000:.1f}ms" - elif seconds < 60: - return f"{seconds:.2f}s" - elif seconds < 3600: - return f"{seconds/60:.1f}min" - elif seconds < 86400: - return f"{seconds/3600:.1f}hr" - else: - return f"{seconds/86400:.1f} days" - - -def bench_field_size(k, num_docs): - n = k // 2 - overlap = n // 2 - existing = list(range(k)) - new_values = list(range(k - overlap, k - overlap + n)) - - t0 = time.perf_counter() - for _ in range(num_docs): - append_before(existing, new_values) - t_before = time.perf_counter() - t0 - - t0 = time.perf_counter() - for _ in range(num_docs): - append_after(existing, new_values) - t_after = time.perf_counter() - t0 - - speedup = t_before / t_after if t_after > 1e-9 else float('inf') - return t_before, t_after, speedup - - -def main(): - print("=" * 100) - print("Elasticsearch IngestDocument.appendValues() — Real-World Field Sizes") - print("=" * 100) - print() - print("Each document has k existing values in an array field.") - print("Append operation adds k/2 new values with 50% overlap (dedup via contains).") - print() - - field_sizes = [ - (100, "Enrichment pipeline (threat intel + GeoIP + metadata)"), - (420, "Moderate SIEM (security event after multi-stage enrichment)"), - (4096, "Heavy SIEM/APM (trace with accumulated span tags across 50 services)"), - (8096, "IoT/telemetry (device with accumulated metadata tag history)"), - ] - - # --- Per-document cost --- - print("Per-document cost (single append operation):") - print(f"{'k':>6} {'N (appends)':>12} {'Before':>12} {'After':>12} {'Speedup':>10}") - print("-" * 58) - for k, _ in field_sizes: - n = k // 2 - existing = list(range(k)) - overlap = n // 2 - new_values = list(range(k - overlap, k - overlap + n)) - - t0 = time.perf_counter() - for _ in range(100): - append_before(existing, new_values) - t_b = (time.perf_counter() - t0) / 100 - - t0 = time.perf_counter() - for _ in range(100): - append_after(existing, new_values) - t_a = (time.perf_counter() - t0) / 100 - - spd = t_b / t_a if t_a > 1e-9 else 0 - print(f"{k:>6} {n:>12} {format_time(t_b):>12} {format_time(t_a):>12} {spd:>9.0f}x") - - print() - - # --- 10K documents --- - print("10,000 documents (single node):") - print(f"{'k':>6} {'Workload':>55} {'Before':>12} {'After':>12} {'Speedup':>10} {'Saved':>12}") - print("-" * 110) - for k, label in field_sizes: - t_b, t_a, spd = bench_field_size(k, 10_000) - print(f"{k:>6} {label:>55} {format_time(t_b):>12} {format_time(t_a):>12} {spd:>9.0f}x {format_time(t_b - t_a):>12}") - - print() - - # --- Projected at scale --- - print("=" * 100) - print("42-node cluster projections (1 billion documents)") - print("=" * 100) - print() - print(f"{'k':>6} {'Workload':>55} {'Before':>14} {'After':>14} {'Speedup':>8} {'Saved':>14}") - print("-" * 115) - - for k, label in field_sizes: - # Measure at 1K docs, project to 1B across 42 nodes - t_b_1k, t_a_1k, spd = bench_field_size(k, 1_000) - multiplier = 1_000_000 * 42 # 1B docs / 1K measured × 42 nodes - proj_b = t_b_1k * multiplier - proj_a = t_a_1k * multiplier - saved = proj_b - proj_a - print(f"{k:>6} {label:>55} {format_time(proj_b):>14} {format_time(proj_a):>14} {spd:>7.0f}x {format_time(saved):>14}") - - print() - print("=" * 100) - print("At k=8096, a single list.contains() call scans 8,096 entries.") - print("Called k/2 = 4,048 times per document. Per document: 8,096 * 4,048 / 2 = 16.4M comparisons.") - print("At 1B documents across 42 nodes: 688 quadrillion comparisons eliminated by our patch.") - print("=" * 100) - - -if __name__ == "__main__": - main() diff --git a/defects/electrum-0001/Makefile b/defects/electrum-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/electrum-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/electrum-0001/bench/bench-electrum-0001-0001.py b/defects/electrum-0001/bench/bench-electrum-0001-0001.py deleted file mode 100644 index f5118015e..000000000 --- a/defects/electrum-0001/bench/bench-electrum-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-electrum-0001-0001.py -# CWE-407: list-scan inside loop in electrum-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== electrum-0001-0001: CWE-407: list-scan inside loop in electrum-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/electrum-0001/bench/results.txt b/defects/electrum-0001/bench/results.txt deleted file mode 100644 index c0a355044..000000000 --- a/defects/electrum-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== electrum-0001-0001: CWE-407: list-scan inside loop in electrum-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.331ms fixed=0.023ms speedup=102.1x -N=1000 k=1000 : defective=10.179ms fixed=0.051ms speedup=200.1x -N=2000 k=2000 : defective=35.418ms fixed=0.097ms speedup=363.4x - diff --git a/defects/electrum-0001/bench/run_all.py b/defects/electrum-0001/bench/run_all.py deleted file mode 100644 index 5f6ae79fd..000000000 --- a/defects/electrum-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-electrum-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/electrum-0002/Makefile b/defects/electrum-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/electrum-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/electrum-0002/bench/bench-electrum-0002-0002.py b/defects/electrum-0002/bench/bench-electrum-0002-0002.py deleted file mode 100644 index 4146dca94..000000000 --- a/defects/electrum-0002/bench/bench-electrum-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-electrum-0002-0002.py -# CWE-407: list-scan inside loop in electrum-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== electrum-0002-0002: CWE-407: list-scan inside loop in electrum-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/electrum-0002/bench/results.txt b/defects/electrum-0002/bench/results.txt deleted file mode 100644 index 6bd319ceb..000000000 --- a/defects/electrum-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== electrum-0002-0002: CWE-407: list-scan inside loop in electrum-0002-0002 (generic model) === -N=100 k=100 : defective=0.101ms fixed=0.004ms speedup=26.9x -N=500 k=500 : defective=2.463ms fixed=0.023ms speedup=108.5x -N=1000 k=1000 : defective=8.996ms fixed=0.045ms speedup=197.9x -N=2000 k=2000 : defective=38.509ms fixed=0.096ms speedup=402.6x - diff --git a/defects/electrum-0002/bench/run_all.py b/defects/electrum-0002/bench/run_all.py deleted file mode 100644 index 011af6022..000000000 --- a/defects/electrum-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-electrum-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/element-web/Makefile b/defects/element-web/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/element-web/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/element-web/bench/bench-element-web-0001.py b/defects/element-web/bench/bench-element-web-0001.py deleted file mode 100644 index 6b4a82c73..000000000 --- a/defects/element-web/bench/bench-element-web-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0001.py -# CWE-407: list-scan inside loop in element-web-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0001: CWE-407: list-scan inside loop in element-web-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element-web/bench/bench-element-web-0002.py b/defects/element-web/bench/bench-element-web-0002.py deleted file mode 100644 index db9d83dd7..000000000 --- a/defects/element-web/bench/bench-element-web-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0002.py -# CWE-407: list-scan inside loop in element-web-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0002: CWE-407: list-scan inside loop in element-web-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element-web/bench/bench-element-web-0003.py b/defects/element-web/bench/bench-element-web-0003.py deleted file mode 100644 index d461bc290..000000000 --- a/defects/element-web/bench/bench-element-web-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0003.py -# CWE-407: list-scan inside loop in element-web-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0003: CWE-407: list-scan inside loop in element-web-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element-web/bench/bench-element-web-0004.py b/defects/element-web/bench/bench-element-web-0004.py deleted file mode 100644 index c0239f4cc..000000000 --- a/defects/element-web/bench/bench-element-web-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0004.py -# CWE-407: list-scan inside loop in element-web-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0004: CWE-407: list-scan inside loop in element-web-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element-web/bench/bench-element-web.py b/defects/element-web/bench/bench-element-web.py deleted file mode 100644 index 0461ac6a0..000000000 --- a/defects/element-web/bench/bench-element-web.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web.py -# CWE-407: list-scan inside loop in element-web (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web: CWE-407: list-scan inside loop in element-web (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element-web/bench/results.txt b/defects/element-web/bench/results.txt deleted file mode 100644 index 6b90c6adb..000000000 --- a/defects/element-web/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== element-web-0001: CWE-407: list-scan inside loop in element-web-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.152ms fixed=0.020ms speedup=106.0x -N=1000 k=1000 : defective=10.525ms fixed=0.052ms speedup=201.0x -N=2000 k=2000 : defective=35.818ms fixed=0.093ms speedup=383.7x - -=== element-web-0002: CWE-407: list-scan inside loop in element-web-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.021ms fixed=0.020ms speedup=101.6x -N=1000 k=1000 : defective=8.478ms fixed=0.043ms speedup=198.2x -N=2000 k=2000 : defective=34.498ms fixed=0.094ms speedup=366.4x - -=== element-web-0003: CWE-407: list-scan inside loop in element-web-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.013ms fixed=0.020ms speedup=101.6x -N=1000 k=1000 : defective=8.265ms fixed=0.044ms speedup=187.7x -N=2000 k=2000 : defective=33.575ms fixed=0.092ms speedup=366.5x - -=== element-web-0004: CWE-407: list-scan inside loop in element-web-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.039ms fixed=0.019ms speedup=105.1x -N=1000 k=1000 : defective=8.228ms fixed=0.043ms speedup=190.1x -N=2000 k=2000 : defective=33.641ms fixed=0.094ms speedup=358.4x - -=== element-web: CWE-407: list-scan inside loop in element-web (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.287ms fixed=0.020ms speedup=116.1x -N=1000 k=1000 : defective=8.264ms fixed=0.044ms speedup=189.3x -N=2000 k=2000 : defective=35.042ms fixed=0.093ms speedup=377.3x - diff --git a/defects/element-web/bench/run_all.py b/defects/element-web/bench/run_all.py deleted file mode 100644 index e73ea4205..000000000 --- a/defects/element-web/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-element-web-0001.py", "bench-element-web-0002.py", "bench-element-web-0003.py", "bench-element-web-0004.py", "bench-element-web.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/element/Makefile b/defects/element/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/element/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/element/bench/bench-element-web-0001.py b/defects/element/bench/bench-element-web-0001.py deleted file mode 100644 index 6b4a82c73..000000000 --- a/defects/element/bench/bench-element-web-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0001.py -# CWE-407: list-scan inside loop in element-web-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0001: CWE-407: list-scan inside loop in element-web-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element/bench/bench-element-web-0002.py b/defects/element/bench/bench-element-web-0002.py deleted file mode 100644 index db9d83dd7..000000000 --- a/defects/element/bench/bench-element-web-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0002.py -# CWE-407: list-scan inside loop in element-web-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0002: CWE-407: list-scan inside loop in element-web-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element/bench/bench-element-web-0003.py b/defects/element/bench/bench-element-web-0003.py deleted file mode 100644 index d461bc290..000000000 --- a/defects/element/bench/bench-element-web-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0003.py -# CWE-407: list-scan inside loop in element-web-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0003: CWE-407: list-scan inside loop in element-web-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element/bench/bench-element-web-0004.py b/defects/element/bench/bench-element-web-0004.py deleted file mode 100644 index c0239f4cc..000000000 --- a/defects/element/bench/bench-element-web-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web-0004.py -# CWE-407: list-scan inside loop in element-web-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web-0004: CWE-407: list-scan inside loop in element-web-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element/bench/bench-element-web.py b/defects/element/bench/bench-element-web.py deleted file mode 100644 index 0461ac6a0..000000000 --- a/defects/element/bench/bench-element-web.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-element-web.py -# CWE-407: list-scan inside loop in element-web (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== element-web: CWE-407: list-scan inside loop in element-web (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/element/bench/results.txt b/defects/element/bench/results.txt deleted file mode 100644 index 20e6be89a..000000000 --- a/defects/element/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== element-web-0001: CWE-407: list-scan inside loop in element-web-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=3.221ms fixed=0.037ms speedup=87.1x -N=1000 k=1000 : defective=17.058ms fixed=0.057ms speedup=299.5x -N=2000 k=2000 : defective=50.789ms fixed=0.097ms speedup=521.6x - -=== element-web-0002: CWE-407: list-scan inside loop in element-web-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.153ms fixed=0.021ms speedup=104.9x -N=1000 k=1000 : defective=10.996ms fixed=0.048ms speedup=230.3x -N=2000 k=2000 : defective=47.956ms fixed=0.158ms speedup=304.0x - -=== element-web-0003: CWE-407: list-scan inside loop in element-web-0003 (generic model) === -N=100 k=100 : defective=0.153ms fixed=0.005ms speedup=30.2x -N=500 k=500 : defective=2.253ms fixed=0.021ms speedup=106.9x -N=1000 k=1000 : defective=13.024ms fixed=0.104ms speedup=125.0x -N=2000 k=2000 : defective=41.579ms fixed=0.155ms speedup=268.3x - -=== element-web-0004: CWE-407: list-scan inside loop in element-web-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.244ms fixed=0.032ms speedup=69.1x -N=1000 k=1000 : defective=9.021ms fixed=0.047ms speedup=193.8x -N=2000 k=2000 : defective=42.478ms fixed=0.179ms speedup=237.6x - -=== element-web: CWE-407: list-scan inside loop in element-web (generic model) === -N=100 k=100 : defective=0.146ms fixed=0.007ms speedup=21.9x -N=500 k=500 : defective=2.167ms fixed=0.021ms speedup=102.8x -N=1000 k=1000 : defective=8.907ms fixed=0.047ms speedup=191.3x -N=2000 k=2000 : defective=51.391ms fixed=0.105ms speedup=488.6x - diff --git a/defects/element/bench/run_all.py b/defects/element/bench/run_all.py deleted file mode 100644 index e73ea4205..000000000 --- a/defects/element/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-element-web-0001.py", "bench-element-web-0002.py", "bench-element-web-0003.py", "bench-element-web-0004.py", "bench-element-web.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/elixir/Makefile b/defects/elixir/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/elixir/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/elixir/bench/bench-elixir-0001.py b/defects/elixir/bench/bench-elixir-0001.py deleted file mode 100644 index 7ec89bb8f..000000000 --- a/defects/elixir/bench/bench-elixir-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elixir-0001.py -# Mix.Dep.Converger.topological_sort — O(N²) Enum.find in Enum.map -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elixir-0001: Mix.Dep.Converger.topological_sort — O(N²) Enum.find in Enum.map ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elixir/bench/bench-elixir-0002.py b/defects/elixir/bench/bench-elixir-0002.py deleted file mode 100644 index 3a372c00a..000000000 --- a/defects/elixir/bench/bench-elixir-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-elixir-0002.py -# Kernel.Typespec — used_type_pairs list O(T²) compile-time membership scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== elixir-0002: Kernel.Typespec — used_type_pairs list O(T²) compile-time membership scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/elixir/bench/results.txt b/defects/elixir/bench/results.txt deleted file mode 100644 index 20761c20b..000000000 --- a/defects/elixir/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== elixir-0001: Mix.Dep.Converger.topological_sort — O(N²) Enum.find in Enum.map === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.446ms fixed=0.024ms speedup=101.7x -N=1000 k=1000 : defective=9.928ms fixed=0.052ms speedup=192.1x -N=2000 k=2000 : defective=37.819ms fixed=0.096ms speedup=392.2x - -=== elixir-0002: Kernel.Typespec — used_type_pairs list O(T²) compile-time membership scan === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.341ms fixed=0.023ms speedup=102.9x -N=1000 k=1000 : defective=10.924ms fixed=0.046ms speedup=235.8x -N=2000 k=2000 : defective=38.549ms fixed=0.096ms speedup=403.2x - diff --git a/defects/elixir/bench/run_all.py b/defects/elixir/bench/run_all.py deleted file mode 100644 index a73c725a7..000000000 --- a/defects/elixir/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-elixir-0001.py", "bench-elixir-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/emacs/Makefile b/defects/emacs/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/emacs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/emacs/bench/bench-emacs-0001.py b/defects/emacs/bench/bench-emacs-0001.py deleted file mode 100644 index 5dfad272c..000000000 --- a/defects/emacs/bench/bench-emacs-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-emacs-0001.py -# Ffontset_info Fmember dedup O(R×F×N) — MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== emacs-0001: Ffontset_info Fmember dedup O(R×F×N) — MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/emacs/bench/bench-emacs-0002.py b/defects/emacs/bench/bench-emacs-0002.py deleted file mode 100644 index 475478f8a..000000000 --- a/defects/emacs/bench/bench-emacs-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-emacs-0002.py -# bytecomp--code-strings member O(F²) per file — MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== emacs-0002: bytecomp--code-strings member O(F²) per file — MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/emacs/bench/results.txt b/defects/emacs/bench/results.txt deleted file mode 100644 index 587758c23..000000000 --- a/defects/emacs/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== emacs-0001: Ffontset_info Fmember dedup O(R×F×N) — MEDIUM === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.361ms fixed=0.022ms speedup=105.4x -N=1000 k=1000 : defective=10.226ms fixed=0.046ms speedup=224.4x -N=2000 k=2000 : defective=38.018ms fixed=0.096ms speedup=395.0x - -=== emacs-0002: bytecomp--code-strings member O(F²) per file — MEDIUM === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=23.6x -N=500 k=500 : defective=2.323ms fixed=0.022ms speedup=104.9x -N=1000 k=1000 : defective=9.199ms fixed=0.049ms speedup=189.3x -N=2000 k=2000 : defective=38.326ms fixed=0.096ms speedup=400.4x - diff --git a/defects/emacs/bench/run_all.py b/defects/emacs/bench/run_all.py deleted file mode 100644 index eb494c13f..000000000 --- a/defects/emacs/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-emacs-0001.py", "bench-emacs-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/endless-sky-0001/Makefile b/defects/endless-sky-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/endless-sky-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/endless-sky-0001/bench/bench-endless-sky-0001-0001.py b/defects/endless-sky-0001/bench/bench-endless-sky-0001-0001.py deleted file mode 100644 index 8830479b5..000000000 --- a/defects/endless-sky-0001/bench/bench-endless-sky-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-endless-sky-0001-0001.py -# CWE-407: list-scan inside loop in endless-sky-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== endless-sky-0001-0001: CWE-407: list-scan inside loop in endless-sky-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/endless-sky-0001/bench/results.txt b/defects/endless-sky-0001/bench/results.txt deleted file mode 100644 index 39cfd804c..000000000 --- a/defects/endless-sky-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== endless-sky-0001-0001: CWE-407: list-scan inside loop in endless-sky-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.435ms fixed=0.022ms speedup=109.5x -N=1000 k=1000 : defective=9.306ms fixed=0.045ms speedup=205.2x -N=2000 k=2000 : defective=35.749ms fixed=0.096ms speedup=370.7x - diff --git a/defects/endless-sky-0001/bench/run_all.py b/defects/endless-sky-0001/bench/run_all.py deleted file mode 100644 index 127657d92..000000000 --- a/defects/endless-sky-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-endless-sky-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/envoy/Makefile b/defects/envoy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/envoy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/envoy/bench/bench-envoy-0001.py b/defects/envoy/bench/bench-envoy-0001.py deleted file mode 100644 index 4d1480fe8..000000000 --- a/defects/envoy/bench/bench-envoy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-envoy-0001.py -# CWE-407: list-scan inside loop in envoy-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== envoy-0001: CWE-407: list-scan inside loop in envoy-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/envoy/bench/bench-envoy-0002.py b/defects/envoy/bench/bench-envoy-0002.py deleted file mode 100644 index 0e8e077c6..000000000 --- a/defects/envoy/bench/bench-envoy-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-envoy-0002.py -# CWE-407: list-scan inside loop in envoy-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== envoy-0002: CWE-407: list-scan inside loop in envoy-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/envoy/bench/bench-envoy-0003.py b/defects/envoy/bench/bench-envoy-0003.py deleted file mode 100644 index cefb79c15..000000000 --- a/defects/envoy/bench/bench-envoy-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-envoy-0003.py -# CWE-407 — O(H×R) linear scan during EDS host batch merge -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== envoy-0003: CWE-407 — O(H×R) linear scan during EDS host batch merge ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/envoy/bench/bench-envoy-0004.py b/defects/envoy/bench/bench-envoy-0004.py deleted file mode 100644 index 87632c8fe..000000000 --- a/defects/envoy/bench/bench-envoy-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-envoy-0004.py -# CWE-407: list-scan inside loop in envoy-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== envoy-0004: CWE-407: list-scan inside loop in envoy-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/envoy/bench/results.txt b/defects/envoy/bench/results.txt deleted file mode 100644 index 3e511f623..000000000 --- a/defects/envoy/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== envoy-0001: CWE-407: list-scan inside loop in envoy-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.136ms fixed=0.020ms speedup=105.1x -N=1000 k=1000 : defective=8.703ms fixed=0.045ms speedup=193.3x -N=2000 k=2000 : defective=33.902ms fixed=0.093ms speedup=363.1x - -=== envoy-0002: CWE-407: list-scan inside loop in envoy-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.029ms fixed=0.020ms speedup=99.4x -N=1000 k=1000 : defective=8.327ms fixed=0.042ms speedup=197.3x -N=2000 k=2000 : defective=34.392ms fixed=0.096ms speedup=359.0x - -=== envoy-0003: CWE-407 — O(H×R) linear scan during EDS host batch merge === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.098ms fixed=0.020ms speedup=104.4x -N=1000 k=1000 : defective=8.650ms fixed=0.044ms speedup=196.1x -N=2000 k=2000 : defective=33.970ms fixed=0.093ms speedup=367.2x - -=== envoy-0004: CWE-407: list-scan inside loop in envoy-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.019ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.644ms fixed=0.043ms speedup=199.5x -N=2000 k=2000 : defective=33.640ms fixed=0.093ms speedup=363.5x - diff --git a/defects/envoy/bench/run_all.py b/defects/envoy/bench/run_all.py deleted file mode 100644 index c57f33094..000000000 --- a/defects/envoy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-envoy-0001.py", "bench-envoy-0002.py", "bench-envoy-0003.py", "bench-envoy-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/erlang/Makefile b/defects/erlang/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/erlang/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/erlang/bench/bench-erlang-0001.py b/defects/erlang/bench/bench-erlang-0001.py deleted file mode 100644 index f42ea8790..000000000 --- a/defects/erlang/bench/bench-erlang-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-erlang-0001.py -# CWE-407: list-scan inside loop in erlang-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== erlang-0001: CWE-407: list-scan inside loop in erlang-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/erlang/bench/bench-erlang-0003.py b/defects/erlang/bench/bench-erlang-0003.py deleted file mode 100644 index 0d2198278..000000000 --- a/defects/erlang/bench/bench-erlang-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-erlang-0003.py -# CWE-407: list-scan inside loop in erlang-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== erlang-0003: CWE-407: list-scan inside loop in erlang-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/erlang/bench/bench-erlang-0004.py b/defects/erlang/bench/bench-erlang-0004.py deleted file mode 100644 index f76049329..000000000 --- a/defects/erlang/bench/bench-erlang-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-erlang-0004.py -# edlin_type_suggestion print_type — Visited list O(D²) membership scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== erlang-0004: edlin_type_suggestion print_type — Visited list O(D²) membership scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/erlang/bench/results.txt b/defects/erlang/bench/results.txt deleted file mode 100644 index 64e1ea172..000000000 --- a/defects/erlang/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== erlang-0001: CWE-407: list-scan inside loop in erlang-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.366ms fixed=0.022ms speedup=107.3x -N=1000 k=1000 : defective=11.715ms fixed=0.047ms speedup=248.2x -N=2000 k=2000 : defective=35.203ms fixed=0.096ms speedup=367.4x - -=== erlang-0003: CWE-407: list-scan inside loop in erlang-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=9.100ms fixed=0.118ms speedup=77.2x -N=2000 k=2000 : defective=35.514ms fixed=0.098ms speedup=363.6x - -=== erlang-0004: edlin_type_suggestion print_type — Visited list O(D²) membership scan === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=103.1x -N=1000 k=1000 : defective=9.040ms fixed=0.050ms speedup=181.1x -N=2000 k=2000 : defective=39.408ms fixed=0.097ms speedup=405.2x - diff --git a/defects/erlang/bench/run_all.py b/defects/erlang/bench/run_all.py deleted file mode 100644 index 75bc8ede3..000000000 --- a/defects/erlang/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-erlang-0001.py", "bench-erlang-0003.py", "bench-erlang-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/erpnext-0001/Makefile b/defects/erpnext-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/erpnext-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/erpnext-0001/bench/bench-erpnext-0001-0001.py b/defects/erpnext-0001/bench/bench-erpnext-0001-0001.py deleted file mode 100644 index d5e0ab9b0..000000000 --- a/defects/erpnext-0001/bench/bench-erpnext-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-erpnext-0001-0001.py -# CWE-407: list-scan inside loop in erpnext-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== erpnext-0001-0001: CWE-407: list-scan inside loop in erpnext-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/erpnext-0001/bench/results.txt b/defects/erpnext-0001/bench/results.txt deleted file mode 100644 index 89e5e47b4..000000000 --- a/defects/erpnext-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== erpnext-0001-0001: CWE-407: list-scan inside loop in erpnext-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.342ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=9.040ms fixed=0.050ms speedup=181.8x -N=2000 k=2000 : defective=37.082ms fixed=0.097ms speedup=381.5x - diff --git a/defects/erpnext-0001/bench/run_all.py b/defects/erpnext-0001/bench/run_all.py deleted file mode 100644 index 5dbc89823..000000000 --- a/defects/erpnext-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-erpnext-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/erpnext-0002/Makefile b/defects/erpnext-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/erpnext-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/erpnext-0002/bench/bench-erpnext-0002-0002.py b/defects/erpnext-0002/bench/bench-erpnext-0002-0002.py deleted file mode 100644 index 0d3797ebc..000000000 --- a/defects/erpnext-0002/bench/bench-erpnext-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-erpnext-0002-0002.py -# CWE-407: list-scan inside loop in erpnext-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== erpnext-0002-0002: CWE-407: list-scan inside loop in erpnext-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/erpnext-0002/bench/results.txt b/defects/erpnext-0002/bench/results.txt deleted file mode 100644 index 64a5ac3a1..000000000 --- a/defects/erpnext-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== erpnext-0002-0002: CWE-407: list-scan inside loop in erpnext-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.342ms fixed=0.035ms speedup=66.2x -N=1000 k=1000 : defective=11.207ms fixed=0.050ms speedup=224.4x -N=2000 k=2000 : defective=42.619ms fixed=0.097ms speedup=439.8x - diff --git a/defects/erpnext-0002/bench/run_all.py b/defects/erpnext-0002/bench/run_all.py deleted file mode 100644 index ea2f98f4e..000000000 --- a/defects/erpnext-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-erpnext-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/esbuild/Makefile b/defects/esbuild/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/esbuild/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/esbuild/bench/bench-esbuild-0001.py b/defects/esbuild/bench/bench-esbuild-0001.py deleted file mode 100644 index 626db9139..000000000 --- a/defects/esbuild/bench/bench-esbuild-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-esbuild-0001.py -# CWE-407: list-scan inside loop in esbuild-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== esbuild-0001: CWE-407: list-scan inside loop in esbuild-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/esbuild/bench/results.txt b/defects/esbuild/bench/results.txt deleted file mode 100644 index f946a3f38..000000000 --- a/defects/esbuild/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== esbuild-0001: CWE-407: list-scan inside loop in esbuild-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.503ms fixed=0.024ms speedup=104.7x -N=1000 k=1000 : defective=10.200ms fixed=0.053ms speedup=191.3x -N=2000 k=2000 : defective=36.250ms fixed=0.096ms speedup=376.9x - diff --git a/defects/esbuild/bench/run_all.py b/defects/esbuild/bench/run_all.py deleted file mode 100644 index 162972ba6..000000000 --- a/defects/esbuild/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-esbuild-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/esp-idf-0001/Makefile b/defects/esp-idf-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/esp-idf-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/esp-idf-0001/bench/bench-esp-idf-0001-0001.py b/defects/esp-idf-0001/bench/bench-esp-idf-0001-0001.py deleted file mode 100644 index 7d20eddfd..000000000 --- a/defects/esp-idf-0001/bench/bench-esp-idf-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-esp-idf-0001-0001.py -# CWE-407: list-scan inside loop in esp-idf-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== esp-idf-0001-0001: CWE-407: list-scan inside loop in esp-idf-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/esp-idf-0001/bench/results.txt b/defects/esp-idf-0001/bench/results.txt deleted file mode 100644 index 91d5d6780..000000000 --- a/defects/esp-idf-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== esp-idf-0001-0001: CWE-407: list-scan inside loop in esp-idf-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.437ms fixed=0.023ms speedup=104.0x -N=1000 k=1000 : defective=9.392ms fixed=0.046ms speedup=202.4x -N=2000 k=2000 : defective=35.952ms fixed=0.096ms speedup=373.3x - diff --git a/defects/esp-idf-0001/bench/run_all.py b/defects/esp-idf-0001/bench/run_all.py deleted file mode 100644 index 8ba52d8a7..000000000 --- a/defects/esp-idf-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-esp-idf-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/esp-idf-0002/Makefile b/defects/esp-idf-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/esp-idf-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/esp-idf-0002/bench/bench-esp-idf-0002-0002.py b/defects/esp-idf-0002/bench/bench-esp-idf-0002-0002.py deleted file mode 100644 index 4c9fc721d..000000000 --- a/defects/esp-idf-0002/bench/bench-esp-idf-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-esp-idf-0002-0002.py -# CWE-407: list-scan inside loop in esp-idf-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== esp-idf-0002-0002: CWE-407: list-scan inside loop in esp-idf-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/esp-idf-0002/bench/results.txt b/defects/esp-idf-0002/bench/results.txt deleted file mode 100644 index efd03f4d8..000000000 --- a/defects/esp-idf-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== esp-idf-0002-0002: CWE-407: list-scan inside loop in esp-idf-0002-0002 (generic model) === -N=100 k=100 : defective=0.139ms fixed=0.005ms speedup=25.9x -N=500 k=500 : defective=3.788ms fixed=0.043ms speedup=87.6x -N=1000 k=1000 : defective=19.742ms fixed=0.096ms speedup=206.6x -N=2000 k=2000 : defective=35.406ms fixed=0.097ms speedup=365.8x - diff --git a/defects/esp-idf-0002/bench/run_all.py b/defects/esp-idf-0002/bench/run_all.py deleted file mode 100644 index 4271faf61..000000000 --- a/defects/esp-idf-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-esp-idf-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/evince-0001/Makefile b/defects/evince-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/evince-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/evince-0001/bench/bench-evince-0001-0001.py b/defects/evince-0001/bench/bench-evince-0001-0001.py deleted file mode 100644 index e40ea209f..000000000 --- a/defects/evince-0001/bench/bench-evince-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-evince-0001-0001.py -# CWE-407: list-scan inside loop in evince-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== evince-0001-0001: CWE-407: list-scan inside loop in evince-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/evince-0001/bench/results.txt b/defects/evince-0001/bench/results.txt deleted file mode 100644 index 76441866e..000000000 --- a/defects/evince-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== evince-0001-0001: CWE-407: list-scan inside loop in evince-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.311ms fixed=0.022ms speedup=107.4x -N=1000 k=1000 : defective=8.844ms fixed=0.046ms speedup=192.9x -N=2000 k=2000 : defective=37.484ms fixed=0.097ms speedup=388.3x - diff --git a/defects/evince-0001/bench/run_all.py b/defects/evince-0001/bench/run_all.py deleted file mode 100644 index 58c8a1b90..000000000 --- a/defects/evince-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-evince-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/evolution-0001/Makefile b/defects/evolution-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/evolution-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/evolution-0001/bench/bench-evolution-0001-0001.py b/defects/evolution-0001/bench/bench-evolution-0001-0001.py deleted file mode 100644 index 86f5aad39..000000000 --- a/defects/evolution-0001/bench/bench-evolution-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-evolution-0001-0001.py -# CWE-407: list-scan inside loop in evolution-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== evolution-0001-0001: CWE-407: list-scan inside loop in evolution-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/evolution-0001/bench/results.txt b/defects/evolution-0001/bench/results.txt deleted file mode 100644 index 685061f78..000000000 --- a/defects/evolution-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== evolution-0001-0001: CWE-407: list-scan inside loop in evolution-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.357ms fixed=0.023ms speedup=102.5x -N=1000 k=1000 : defective=9.977ms fixed=0.050ms speedup=198.8x -N=2000 k=2000 : defective=38.319ms fixed=0.381ms speedup=100.5x - diff --git a/defects/evolution-0001/bench/run_all.py b/defects/evolution-0001/bench/run_all.py deleted file mode 100644 index 3bfa8e071..000000000 --- a/defects/evolution-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-evolution-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/evolution-0002/Makefile b/defects/evolution-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/evolution-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/evolution-0002/bench/bench-evolution-0002-0002.py b/defects/evolution-0002/bench/bench-evolution-0002-0002.py deleted file mode 100644 index dfeb1eeb9..000000000 --- a/defects/evolution-0002/bench/bench-evolution-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-evolution-0002-0002.py -# CWE-407: list-scan inside loop in evolution-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== evolution-0002-0002: CWE-407: list-scan inside loop in evolution-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/evolution-0002/bench/results.txt b/defects/evolution-0002/bench/results.txt deleted file mode 100644 index 6b90b87d3..000000000 --- a/defects/evolution-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== evolution-0002-0002: CWE-407: list-scan inside loop in evolution-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.431ms fixed=0.100ms speedup=24.3x -N=1000 k=1000 : defective=9.477ms fixed=0.050ms speedup=190.8x -N=2000 k=2000 : defective=36.944ms fixed=0.097ms speedup=381.1x - diff --git a/defects/evolution-0002/bench/run_all.py b/defects/evolution-0002/bench/run_all.py deleted file mode 100644 index a9287cfe5..000000000 --- a/defects/evolution-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-evolution-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/exim/Makefile b/defects/exim/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/exim/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/exim/bench/bench-exim-0001.py b/defects/exim/bench/bench-exim-0001.py deleted file mode 100644 index 754d29c97..000000000 --- a/defects/exim/bench/bench-exim-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-exim-0001.py -# CWE-407: list-scan inside loop in exim-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== exim-0001: CWE-407: list-scan inside loop in exim-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/exim/bench/results.txt b/defects/exim/bench/results.txt deleted file mode 100644 index 94aab1778..000000000 --- a/defects/exim/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== exim-0001: CWE-407: list-scan inside loop in exim-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.132ms fixed=0.021ms speedup=101.4x -N=1000 k=1000 : defective=9.172ms fixed=0.046ms speedup=198.9x -N=2000 k=2000 : defective=35.023ms fixed=0.097ms speedup=360.2x - diff --git a/defects/exim/bench/run_all.py b/defects/exim/bench/run_all.py deleted file mode 100644 index 05c5b375e..000000000 --- a/defects/exim/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-exim-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/exposed/Makefile b/defects/exposed/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/exposed/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/exposed/bench/bench-exposed-0001.py b/defects/exposed/bench/bench-exposed-0001.py deleted file mode 100644 index 719fb471e..000000000 --- a/defects/exposed/bench/bench-exposed-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-exposed-0001.py -# CWE-407: list-scan inside loop in exposed-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== exposed-0001: CWE-407: list-scan inside loop in exposed-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/exposed/bench/bench-exposed-0002.py b/defects/exposed/bench/bench-exposed-0002.py deleted file mode 100644 index 71859f135..000000000 --- a/defects/exposed/bench/bench-exposed-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-exposed-0002.py -# CWE-407: list-scan inside loop in exposed-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== exposed-0002: CWE-407: list-scan inside loop in exposed-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/exposed/bench/bench-exposed-0003.py b/defects/exposed/bench/bench-exposed-0003.py deleted file mode 100644 index 5532898c4..000000000 --- a/defects/exposed/bench/bench-exposed-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-exposed-0003.py -# CWE-407: list-scan inside loop in exposed-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== exposed-0003: CWE-407: list-scan inside loop in exposed-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/exposed/bench/results.txt b/defects/exposed/bench/results.txt deleted file mode 100644 index d730ab106..000000000 --- a/defects/exposed/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== exposed-0001: CWE-407: list-scan inside loop in exposed-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.146ms fixed=0.023ms speedup=94.7x -N=1000 k=1000 : defective=9.794ms fixed=0.044ms speedup=220.4x -N=2000 k=2000 : defective=35.311ms fixed=0.098ms speedup=360.6x - -=== exposed-0002: CWE-407: list-scan inside loop in exposed-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.117ms fixed=0.021ms speedup=102.2x -N=1000 k=1000 : defective=8.938ms fixed=0.045ms speedup=197.7x -N=2000 k=2000 : defective=36.991ms fixed=0.097ms speedup=383.3x - -=== exposed-0003: CWE-407: list-scan inside loop in exposed-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.146ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.945ms fixed=0.045ms speedup=200.0x -N=2000 k=2000 : defective=36.578ms fixed=0.097ms speedup=378.7x - diff --git a/defects/exposed/bench/run_all.py b/defects/exposed/bench/run_all.py deleted file mode 100644 index 5b21e35a9..000000000 --- a/defects/exposed/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-exposed-0001.py", "bench-exposed-0002.py", "bench-exposed-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/fastapi/Makefile b/defects/fastapi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/fastapi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/fastapi/bench/bench-fastapi-0001.py b/defects/fastapi/bench/bench-fastapi-0001.py deleted file mode 100644 index 0ac390753..000000000 --- a/defects/fastapi/bench/bench-fastapi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-fastapi-0001.py -# CWE-407: list-scan inside loop in fastapi-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== fastapi-0001: CWE-407: list-scan inside loop in fastapi-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/fastapi/bench/results.txt b/defects/fastapi/bench/results.txt deleted file mode 100644 index 68b003b11..000000000 --- a/defects/fastapi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== fastapi-0001: CWE-407: list-scan inside loop in fastapi-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.541ms fixed=0.024ms speedup=105.2x -N=1000 k=1000 : defective=11.129ms fixed=0.052ms speedup=215.4x -N=2000 k=2000 : defective=41.392ms fixed=0.100ms speedup=413.2x - diff --git a/defects/fastapi/bench/run_all.py b/defects/fastapi/bench/run_all.py deleted file mode 100644 index f1399e30d..000000000 --- a/defects/fastapi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-fastapi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/fbneo-0001/Makefile b/defects/fbneo-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/fbneo-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/fbneo-0001/bench/bench-fbneo-0001-0001.py b/defects/fbneo-0001/bench/bench-fbneo-0001-0001.py deleted file mode 100644 index 41e86c021..000000000 --- a/defects/fbneo-0001/bench/bench-fbneo-0001-0001.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -# bench-fbneo-0001-0001.py -# BurnDrvGetIndex(): linear strcmp scan over the driver array (N drivers) -# per name lookup. FBNeo ships ~45,000 drivers; game-load and UI filter -# paths invoke the lookup repeatedly. -# Defect: O(N) per lookup via strcmp-inside-for. -# Fix: std::unordered_map index built once at init — -# O(1) per lookup, amortized across every subsequent lookup for the -# life of the process. We measure the steady-state lookup phase so -# the one-time index-build cost is reported separately. - -import sys -import time - - -def bench_defective(n_drivers, m_lookups): - """Per-lookup linear scan over N drivers. No upfront build.""" - drivers = [f"drv_{i:06d}" for i in range(n_drivers)] - queries = [f"drv_{(i * 997) % n_drivers:06d}" for i in range(m_lookups)] - - t0 = time.perf_counter() - hits = 0 - for q in queries: - for d in drivers: - if d == q: - hits += 1 - break - return time.perf_counter() - t0 - - -def bench_fixed(n_drivers, m_lookups): - """Steady-state: index pre-built (as in production), lookup-only cost.""" - drivers = [f"drv_{i:06d}" for i in range(n_drivers)] - queries = [f"drv_{(i * 997) % n_drivers:06d}" for i in range(m_lookups)] - index = {d: i for i, d in enumerate(drivers)} # built once at init, not timed - - t0 = time.perf_counter() - hits = sum(1 for q in queries if q in index) - return time.perf_counter() - t0 - - -TRIALS = 2 -CASES = [ - (5_000, 100), # small emulator set - (15_000, 100), # mid - (30_000, 100), # large - (45_000, 100), # actual FBNeo driver count - (45_000, 1_000), # UI filter / search-as-you-type regime -] - - -def run(): - lines = [] - header = "=== fbneo-0001-0001: BurnDrvGetIndex strcmp scan vs unordered_map (steady-state lookup) ===" - print(header); lines.append(header) - for n, m in CASES: - df = min(bench_defective(n, m) for _ in range(TRIALS)) - fx = min(bench_fixed(n, m) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<6} M={m:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/fbneo-0001/bench/results.txt b/defects/fbneo-0001/bench/results.txt deleted file mode 100644 index 6ac180e2e..000000000 --- a/defects/fbneo-0001/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== fbneo-0001-0001: BurnDrvGetIndex strcmp scan vs unordered_map (steady-state lookup) === -N=5000 M=100 : defective=12.083ms fixed=0.032ms speedup=376.2x -N=15000 M=100 : defective=31.554ms fixed=0.036ms speedup=885.4x -N=30000 M=100 : defective=59.919ms fixed=0.043ms speedup=1408.5x -N=45000 M=100 : defective=87.828ms fixed=0.040ms speedup=2219.6x -N=45000 M=1000 : defective=633.708ms fixed=0.263ms speedup=2410.0x - diff --git a/defects/fbneo-0001/bench/run_all.py b/defects/fbneo-0001/bench/run_all.py deleted file mode 100644 index 2c35a615c..000000000 --- a/defects/fbneo-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-fbneo-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/fceux-0001/Makefile b/defects/fceux-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/fceux-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/fceux-0001/bench/bench-fceux-0001-0001.py b/defects/fceux-0001/bench/bench-fceux-0001-0001.py deleted file mode 100644 index 4a2f71b56..000000000 --- a/defects/fceux-0001/bench/bench-fceux-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-fceux-0001-0001.py -# CWE-407: list-scan inside loop in fceux-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== fceux-0001-0001: CWE-407: list-scan inside loop in fceux-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/fceux-0001/bench/results.txt b/defects/fceux-0001/bench/results.txt deleted file mode 100644 index c14063652..000000000 --- a/defects/fceux-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== fceux-0001-0001: CWE-407: list-scan inside loop in fceux-0001-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.727ms fixed=0.027ms speedup=99.9x -N=1000 k=1000 : defective=11.094ms fixed=0.059ms speedup=186.9x -N=2000 k=2000 : defective=37.513ms fixed=0.096ms speedup=389.1x - diff --git a/defects/fceux-0001/bench/run_all.py b/defects/fceux-0001/bench/run_all.py deleted file mode 100644 index 333a30996..000000000 --- a/defects/fceux-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-fceux-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ffmpeg/Makefile b/defects/ffmpeg/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ffmpeg/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ffmpeg/bench/bench-ffmpeg-0001.py b/defects/ffmpeg/bench/bench-ffmpeg-0001.py deleted file mode 100644 index b48fc5d62..000000000 --- a/defects/ffmpeg/bench/bench-ffmpeg-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ffmpeg-0001.py -# CWE-407: list-scan inside loop in ffmpeg-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ffmpeg-0001: CWE-407: list-scan inside loop in ffmpeg-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ffmpeg/bench/bench-ffmpeg-0002.py b/defects/ffmpeg/bench/bench-ffmpeg-0002.py deleted file mode 100644 index c68111efd..000000000 --- a/defects/ffmpeg/bench/bench-ffmpeg-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ffmpeg-0002.py -# CWE-407: list-scan inside loop in ffmpeg-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ffmpeg-0002: CWE-407: list-scan inside loop in ffmpeg-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ffmpeg/bench/bench-ffmpeg-0003.py b/defects/ffmpeg/bench/bench-ffmpeg-0003.py deleted file mode 100644 index 62a474a60..000000000 --- a/defects/ffmpeg/bench/bench-ffmpeg-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ffmpeg-0003.py -# CWE-407: list-scan inside loop in ffmpeg-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ffmpeg-0003: CWE-407: list-scan inside loop in ffmpeg-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ffmpeg/bench/bench-ffmpeg-0004.py b/defects/ffmpeg/bench/bench-ffmpeg-0004.py deleted file mode 100644 index 879dc4138..000000000 --- a/defects/ffmpeg/bench/bench-ffmpeg-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ffmpeg-0004.py -# File: libavformat/http.c -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ffmpeg-0004: File: libavformat/http.c ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ffmpeg/bench/results.txt b/defects/ffmpeg/bench/results.txt deleted file mode 100644 index fe8be6823..000000000 --- a/defects/ffmpeg/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== ffmpeg-0001: CWE-407: list-scan inside loop in ffmpeg-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.074ms fixed=0.019ms speedup=108.0x -N=1000 k=1000 : defective=8.445ms fixed=0.045ms speedup=189.3x -N=2000 k=2000 : defective=34.418ms fixed=0.092ms speedup=372.5x - -=== ffmpeg-0002: CWE-407: list-scan inside loop in ffmpeg-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=23.9x -N=500 k=500 : defective=2.137ms fixed=0.021ms speedup=104.1x -N=1000 k=1000 : defective=8.662ms fixed=0.044ms speedup=195.7x -N=2000 k=2000 : defective=35.403ms fixed=0.092ms speedup=383.9x - -=== ffmpeg-0003: CWE-407: list-scan inside loop in ffmpeg-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.016ms fixed=0.020ms speedup=102.0x -N=1000 k=1000 : defective=8.316ms fixed=0.045ms speedup=186.1x -N=2000 k=2000 : defective=35.433ms fixed=0.097ms speedup=364.4x - -=== ffmpeg-0004: File: libavformat/http.c === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.104ms fixed=0.021ms speedup=100.4x -N=1000 k=1000 : defective=8.684ms fixed=0.046ms speedup=188.5x -N=2000 k=2000 : defective=34.113ms fixed=0.093ms speedup=366.6x - diff --git a/defects/ffmpeg/bench/run_all.py b/defects/ffmpeg/bench/run_all.py deleted file mode 100644 index 081389191..000000000 --- a/defects/ffmpeg/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ffmpeg-0001.py", "bench-ffmpeg-0002.py", "bench-ffmpeg-0003.py", "bench-ffmpeg-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/fiber/Makefile b/defects/fiber/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/fiber/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/fiber/bench/bench-fiber-0001.py b/defects/fiber/bench/bench-fiber-0001.py deleted file mode 100644 index bb7f74e7c..000000000 --- a/defects/fiber/bench/bench-fiber-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-fiber-0001.py -# CWE-407: list-scan inside loop in fiber-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== fiber-0001: CWE-407: list-scan inside loop in fiber-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/fiber/bench/results.txt b/defects/fiber/bench/results.txt deleted file mode 100644 index 0fc6e51ba..000000000 --- a/defects/fiber/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== fiber-0001: CWE-407: list-scan inside loop in fiber-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.354ms fixed=0.024ms speedup=97.6x -N=1000 k=1000 : defective=8.758ms fixed=0.046ms speedup=190.4x -N=2000 k=2000 : defective=35.854ms fixed=0.102ms speedup=350.1x - diff --git a/defects/fiber/bench/run_all.py b/defects/fiber/bench/run_all.py deleted file mode 100644 index 352770ab1..000000000 --- a/defects/fiber/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-fiber-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/firefox/Makefile b/defects/firefox/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/firefox/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/firefox/bench/bench-firefox-0001.py b/defects/firefox/bench/bench-firefox-0001.py deleted file mode 100644 index 0aedebced..000000000 --- a/defects/firefox/bench/bench-firefox-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-firefox-0001.py -# File: dom/security/sanitizer/SanitizerTypes.h -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== firefox-0001: File: dom/security/sanitizer/SanitizerTypes.h ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/firefox/bench/bench-firefox-0002.py b/defects/firefox/bench/bench-firefox-0002.py deleted file mode 100644 index 6642cdfa5..000000000 --- a/defects/firefox/bench/bench-firefox-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-firefox-0002.py -# File: dom/base/nsDOMTokenList.cpp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== firefox-0002: File: dom/base/nsDOMTokenList.cpp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/firefox/bench/results.txt b/defects/firefox/bench/results.txt deleted file mode 100644 index be2d5050f..000000000 --- a/defects/firefox/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== firefox-0001: File: dom/security/sanitizer/SanitizerTypes.h === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.285ms fixed=0.023ms speedup=100.7x -N=1000 k=1000 : defective=8.970ms fixed=0.046ms speedup=194.6x -N=2000 k=2000 : defective=35.574ms fixed=0.098ms speedup=362.0x - -=== firefox-0002: File: dom/base/nsDOMTokenList.cpp === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.134ms fixed=0.021ms speedup=103.5x -N=1000 k=1000 : defective=8.746ms fixed=0.046ms speedup=191.9x -N=2000 k=2000 : defective=36.255ms fixed=0.099ms speedup=364.5x - diff --git a/defects/firefox/bench/run_all.py b/defects/firefox/bench/run_all.py deleted file mode 100644 index db5bb2689..000000000 --- a/defects/firefox/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-firefox-0001.py", "bench-firefox-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/flightgear-0001/Makefile b/defects/flightgear-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/flightgear-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/flightgear-0001/bench/bench-flightgear-0001-0001.py b/defects/flightgear-0001/bench/bench-flightgear-0001-0001.py deleted file mode 100644 index 79bf920a6..000000000 --- a/defects/flightgear-0001/bench/bench-flightgear-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flightgear-0001-0001.py -# CWE-407: list-scan inside loop in flightgear-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flightgear-0001-0001: CWE-407: list-scan inside loop in flightgear-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flightgear-0001/bench/results.txt b/defects/flightgear-0001/bench/results.txt deleted file mode 100644 index 48aa2700c..000000000 --- a/defects/flightgear-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== flightgear-0001-0001: CWE-407: list-scan inside loop in flightgear-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.309ms fixed=0.022ms speedup=103.0x -N=1000 k=1000 : defective=9.474ms fixed=0.047ms speedup=202.6x -N=2000 k=2000 : defective=36.515ms fixed=0.093ms speedup=392.8x - diff --git a/defects/flightgear-0001/bench/run_all.py b/defects/flightgear-0001/bench/run_all.py deleted file mode 100644 index d50273709..000000000 --- a/defects/flightgear-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-flightgear-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/flightgear-0002/Makefile b/defects/flightgear-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/flightgear-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/flightgear-0002/bench/bench-flightgear-0002-0002.py b/defects/flightgear-0002/bench/bench-flightgear-0002-0002.py deleted file mode 100644 index 59efe0bcb..000000000 --- a/defects/flightgear-0002/bench/bench-flightgear-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flightgear-0002-0002.py -# CWE-407: list-scan inside loop in flightgear-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flightgear-0002-0002: CWE-407: list-scan inside loop in flightgear-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flightgear-0002/bench/results.txt b/defects/flightgear-0002/bench/results.txt deleted file mode 100644 index dd3358207..000000000 --- a/defects/flightgear-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== flightgear-0002-0002: CWE-407: list-scan inside loop in flightgear-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.430ms fixed=0.023ms speedup=107.1x -N=1000 k=1000 : defective=8.688ms fixed=0.046ms speedup=187.1x -N=2000 k=2000 : defective=37.731ms fixed=0.096ms speedup=391.1x - diff --git a/defects/flightgear-0002/bench/run_all.py b/defects/flightgear-0002/bench/run_all.py deleted file mode 100644 index d5e6b0df3..000000000 --- a/defects/flightgear-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-flightgear-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/flightgear-0003/Makefile b/defects/flightgear-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/flightgear-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/flightgear-0003/bench/bench-flightgear-0003-0003.py b/defects/flightgear-0003/bench/bench-flightgear-0003-0003.py deleted file mode 100644 index 43c39175d..000000000 --- a/defects/flightgear-0003/bench/bench-flightgear-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flightgear-0003-0003.py -# CWE-407: list-scan inside loop in flightgear-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flightgear-0003-0003: CWE-407: list-scan inside loop in flightgear-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flightgear-0003/bench/results.txt b/defects/flightgear-0003/bench/results.txt deleted file mode 100644 index 8157e52c4..000000000 --- a/defects/flightgear-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== flightgear-0003-0003: CWE-407: list-scan inside loop in flightgear-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.625ms fixed=0.024ms speedup=110.7x -N=1000 k=1000 : defective=10.343ms fixed=0.052ms speedup=200.4x -N=2000 k=2000 : defective=42.430ms fixed=0.096ms speedup=441.6x - diff --git a/defects/flightgear-0003/bench/run_all.py b/defects/flightgear-0003/bench/run_all.py deleted file mode 100644 index 59108a924..000000000 --- a/defects/flightgear-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-flightgear-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/flink/Makefile b/defects/flink/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/flink/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/flink/bench/bench-flink-0001.py b/defects/flink/bench/bench-flink-0001.py deleted file mode 100644 index 6b091d83c..000000000 --- a/defects/flink/bench/bench-flink-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0001.py -# CWE-407: list-scan inside loop in flink-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0001: CWE-407: list-scan inside loop in flink-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/bench-flink-0002.py b/defects/flink/bench/bench-flink-0002.py deleted file mode 100644 index 4fdd7efd3..000000000 --- a/defects/flink/bench/bench-flink-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0002.py -# RowTypeUtils.getUniqueName — List.contains() inside nested for+do-while -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0002: RowTypeUtils.getUniqueName — List.contains() inside nested for+do-while ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/bench-flink-0003.py b/defects/flink/bench/bench-flink-0003.py deleted file mode 100644 index 38779b4d1..000000000 --- a/defects/flink/bench/bench-flink-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0003.py -# AggregateReduceGroupingRule — List.contains() inside for loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0003: AggregateReduceGroupingRule — List.contains() inside for loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/bench-flink-0004.py b/defects/flink/bench/bench-flink-0004.py deleted file mode 100644 index 90f80602f..000000000 --- a/defects/flink/bench/bench-flink-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0004.py -# DynamicSinkUtils UPDATE column resolution O(C×U) → O(C+U) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0004: DynamicSinkUtils UPDATE column resolution O(C×U) → O(C+U) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/bench-flink-0005.py b/defects/flink/bench/bench-flink-0005.py deleted file mode 100644 index 7689d6e20..000000000 --- a/defects/flink/bench/bench-flink-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0005.py -# DynamicPartitionPruningUtils — List.indexOf + List.contains O(A×F + K×A) → O(F + K) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0005: DynamicPartitionPruningUtils — List.indexOf + List.contains O(A×F + K×A) → O(F + K) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/bench-flink-0006.py b/defects/flink/bench/bench-flink-0006.py deleted file mode 100644 index ef31ae54c..000000000 --- a/defects/flink/bench/bench-flink-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0006.py -# CWE-407: list-scan inside loop in flink-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0006: CWE-407: list-scan inside loop in flink-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/bench-flink-0007.py b/defects/flink/bench/bench-flink-0007.py deleted file mode 100644 index fec8578d4..000000000 --- a/defects/flink/bench/bench-flink-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-flink-0007.py -# CWE-407: list-scan inside loop in flink-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== flink-0007: CWE-407: list-scan inside loop in flink-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/flink/bench/results.txt b/defects/flink/bench/results.txt deleted file mode 100644 index c739e1984..000000000 --- a/defects/flink/bench/results.txt +++ /dev/null @@ -1,42 +0,0 @@ -=== flink-0001: CWE-407: list-scan inside loop in flink-0001 (generic model) === -N=100 k=100 : defective=0.114ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=2.846ms fixed=0.117ms speedup=24.2x -N=1000 k=1000 : defective=11.869ms fixed=0.061ms speedup=193.4x -N=2000 k=2000 : defective=39.422ms fixed=0.095ms speedup=413.6x - -=== flink-0002: RowTypeUtils.getUniqueName — List.contains() inside nested for+do-while === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.222ms fixed=0.023ms speedup=96.8x -N=1000 k=1000 : defective=9.315ms fixed=0.049ms speedup=188.8x -N=2000 k=2000 : defective=43.225ms fixed=0.105ms speedup=410.1x - -=== flink-0003: AggregateReduceGroupingRule — List.contains() inside for loop === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.340ms fixed=0.022ms speedup=107.7x -N=1000 k=1000 : defective=8.738ms fixed=0.048ms speedup=183.1x -N=2000 k=2000 : defective=41.662ms fixed=0.096ms speedup=435.6x - -=== flink-0004: DynamicSinkUtils UPDATE column resolution O(C×U) → O(C+U) === -N=100 k=100 : defective=0.161ms fixed=0.015ms speedup=10.5x -N=500 k=500 : defective=2.109ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=9.328ms fixed=0.051ms speedup=181.4x -N=2000 k=2000 : defective=38.021ms fixed=0.110ms speedup=345.8x - -=== flink-0005: DynamicPartitionPruningUtils — List.indexOf + List.contains O(A×F + K×A) → O(F + K) === -N=100 k=100 : defective=0.165ms fixed=0.004ms speedup=42.1x -N=500 k=500 : defective=2.609ms fixed=0.023ms speedup=114.8x -N=1000 k=1000 : defective=14.368ms fixed=0.051ms speedup=283.8x -N=2000 k=2000 : defective=45.228ms fixed=0.100ms speedup=450.2x - -=== flink-0006: CWE-407: list-scan inside loop in flink-0006 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=22.3x -N=500 k=500 : defective=2.301ms fixed=0.021ms speedup=107.5x -N=1000 k=1000 : defective=8.888ms fixed=0.084ms speedup=105.5x -N=2000 k=2000 : defective=43.637ms fixed=0.105ms speedup=416.4x - -=== flink-0007: CWE-407: list-scan inside loop in flink-0007 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.346ms fixed=0.023ms speedup=103.2x -N=1000 k=1000 : defective=9.020ms fixed=0.046ms speedup=194.1x -N=2000 k=2000 : defective=36.440ms fixed=0.096ms speedup=380.2x - diff --git a/defects/flink/bench/run_all.py b/defects/flink/bench/run_all.py deleted file mode 100644 index e10df5f39..000000000 --- a/defects/flink/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-flink-0001.py", "bench-flink-0002.py", "bench-flink-0003.py", "bench-flink-0004.py", "bench-flink-0005.py", "bench-flink-0006.py", "bench-flink-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/forgejo-0001/Makefile b/defects/forgejo-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/forgejo-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/forgejo-0001/bench/bench-forgejo-0001-0001.py b/defects/forgejo-0001/bench/bench-forgejo-0001-0001.py deleted file mode 100644 index 83d9e3242..000000000 --- a/defects/forgejo-0001/bench/bench-forgejo-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-forgejo-0001-0001.py -# CWE-407: list-scan inside loop in forgejo-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== forgejo-0001-0001: CWE-407: list-scan inside loop in forgejo-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/forgejo-0001/bench/results.txt b/defects/forgejo-0001/bench/results.txt deleted file mode 100644 index 2de8cecf6..000000000 --- a/defects/forgejo-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== forgejo-0001-0001: CWE-407: list-scan inside loop in forgejo-0001-0001 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.270ms fixed=0.021ms speedup=106.9x -N=1000 k=1000 : defective=9.010ms fixed=0.046ms speedup=195.7x -N=2000 k=2000 : defective=36.110ms fixed=0.097ms speedup=371.9x - diff --git a/defects/forgejo-0001/bench/run_all.py b/defects/forgejo-0001/bench/run_all.py deleted file mode 100644 index e73eb6293..000000000 --- a/defects/forgejo-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-forgejo-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/forgejo-0002/Makefile b/defects/forgejo-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/forgejo-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/forgejo-0002/bench/bench-forgejo-0002-0002.py b/defects/forgejo-0002/bench/bench-forgejo-0002-0002.py deleted file mode 100644 index ac8592d85..000000000 --- a/defects/forgejo-0002/bench/bench-forgejo-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-forgejo-0002-0002.py -# CWE-407: list-scan inside loop in forgejo-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== forgejo-0002-0002: CWE-407: list-scan inside loop in forgejo-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/forgejo-0002/bench/results.txt b/defects/forgejo-0002/bench/results.txt deleted file mode 100644 index 1be004780..000000000 --- a/defects/forgejo-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== forgejo-0002-0002: CWE-407: list-scan inside loop in forgejo-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.309ms fixed=0.023ms speedup=101.6x -N=1000 k=1000 : defective=9.781ms fixed=0.050ms speedup=195.6x -N=2000 k=2000 : defective=38.654ms fixed=0.096ms speedup=402.9x - diff --git a/defects/forgejo-0002/bench/run_all.py b/defects/forgejo-0002/bench/run_all.py deleted file mode 100644 index f3920efea..000000000 --- a/defects/forgejo-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-forgejo-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/forgejo-0003/Makefile b/defects/forgejo-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/forgejo-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/forgejo-0003/bench/bench-forgejo-0003-0003.py b/defects/forgejo-0003/bench/bench-forgejo-0003-0003.py deleted file mode 100644 index b6957abdb..000000000 --- a/defects/forgejo-0003/bench/bench-forgejo-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-forgejo-0003-0003.py -# CWE-407: list-scan inside loop in forgejo-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== forgejo-0003-0003: CWE-407: list-scan inside loop in forgejo-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/forgejo-0003/bench/results.txt b/defects/forgejo-0003/bench/results.txt deleted file mode 100644 index 400ad4a3a..000000000 --- a/defects/forgejo-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== forgejo-0003-0003: CWE-407: list-scan inside loop in forgejo-0003-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.256ms fixed=0.021ms speedup=106.4x -N=1000 k=1000 : defective=8.960ms fixed=0.045ms speedup=200.0x -N=2000 k=2000 : defective=36.412ms fixed=0.097ms speedup=374.0x - diff --git a/defects/forgejo-0003/bench/run_all.py b/defects/forgejo-0003/bench/run_all.py deleted file mode 100644 index 8c138ff54..000000000 --- a/defects/forgejo-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-forgejo-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/foundationdb/Makefile b/defects/foundationdb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/foundationdb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/foundationdb/bench/bench-foundationdb-0001.py b/defects/foundationdb/bench/bench-foundationdb-0001.py deleted file mode 100644 index bad9d4619..000000000 --- a/defects/foundationdb/bench/bench-foundationdb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-foundationdb-0001.py -# foundationdb-0001 — canLaunchSrc: std::count nested inside O(S×R) double loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== foundationdb-0001: foundationdb-0001 — canLaunchSrc: std::count nested inside O(S×R) double loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/foundationdb/bench/results.txt b/defects/foundationdb/bench/results.txt deleted file mode 100644 index 8abc7f8e6..000000000 --- a/defects/foundationdb/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== foundationdb-0001: foundationdb-0001 — canLaunchSrc: std::count nested inside O(S×R) double loop === -N=100 k=100 : defective=0.203ms fixed=0.008ms speedup=24.4x -N=500 k=500 : defective=3.018ms fixed=0.027ms speedup=113.3x -N=1000 k=1000 : defective=11.140ms fixed=0.057ms speedup=195.2x -N=2000 k=2000 : defective=35.209ms fixed=0.096ms speedup=366.1x - diff --git a/defects/foundationdb/bench/run_all.py b/defects/foundationdb/bench/run_all.py deleted file mode 100644 index d9ac6a9d7..000000000 --- a/defects/foundationdb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-foundationdb-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freecad-0001/Makefile b/defects/freecad-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freecad-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freecad-0001/bench/bench-freecad-0001-0001.py b/defects/freecad-0001/bench/bench-freecad-0001-0001.py deleted file mode 100644 index d466dfe1a..000000000 --- a/defects/freecad-0001/bench/bench-freecad-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freecad-0001-0001.py -# CWE-407: list-scan inside loop in freecad-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== freecad-0001-0001: CWE-407: list-scan inside loop in freecad-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freecad-0001/bench/results.txt b/defects/freecad-0001/bench/results.txt deleted file mode 100644 index 7dd3960e3..000000000 --- a/defects/freecad-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freecad-0001-0001: CWE-407: list-scan inside loop in freecad-0001-0001 (generic model) === -N=500 k=500 : defective=1.760ms fixed=0.017ms speedup=104.6x -N=2000 k=2000 : defective=29.679ms fixed=0.078ms speedup=378.6x -N=5000 k=5000 : defective=222.150ms fixed=0.203ms speedup=1093.1x -N=10000 k=10000: defective=930.448ms fixed=0.707ms speedup=1316.2x - diff --git a/defects/freecad-0001/bench/run_all.py b/defects/freecad-0001/bench/run_all.py deleted file mode 100644 index 903179523..000000000 --- a/defects/freecad-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freecad-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freecad-0002/Makefile b/defects/freecad-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freecad-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freecad-0002/bench/bench-freecad-0002-0002.py b/defects/freecad-0002/bench/bench-freecad-0002-0002.py deleted file mode 100644 index 2709d0472..000000000 --- a/defects/freecad-0002/bench/bench-freecad-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freecad-0002-0002.py -# CWE-407: list-scan inside loop in freecad-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freecad-0002-0002: CWE-407: list-scan inside loop in freecad-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freecad-0002/bench/results.txt b/defects/freecad-0002/bench/results.txt deleted file mode 100644 index 2428a193a..000000000 --- a/defects/freecad-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freecad-0002-0002: CWE-407: list-scan inside loop in freecad-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.582ms fixed=0.027ms speedup=94.6x -N=1000 k=1000 : defective=12.405ms fixed=0.062ms speedup=199.2x -N=2000 k=2000 : defective=53.119ms fixed=0.116ms speedup=458.8x - diff --git a/defects/freecad-0002/bench/run_all.py b/defects/freecad-0002/bench/run_all.py deleted file mode 100644 index ae53c1b54..000000000 --- a/defects/freecad-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freecad-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freecad-0003/Makefile b/defects/freecad-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freecad-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freecad-0003/bench/bench-freecad-0003-0003.py b/defects/freecad-0003/bench/bench-freecad-0003-0003.py deleted file mode 100644 index 3209400eb..000000000 --- a/defects/freecad-0003/bench/bench-freecad-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freecad-0003-0003.py -# CWE-407: list-scan inside loop in freecad-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freecad-0003-0003: CWE-407: list-scan inside loop in freecad-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freecad-0003/bench/results.txt b/defects/freecad-0003/bench/results.txt deleted file mode 100644 index 36955a413..000000000 --- a/defects/freecad-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freecad-0003-0003: CWE-407: list-scan inside loop in freecad-0003-0003 (generic model) === -N=100 k=100 : defective=0.313ms fixed=0.020ms speedup=16.0x -N=500 k=500 : defective=2.810ms fixed=0.025ms speedup=112.4x -N=1000 k=1000 : defective=10.467ms fixed=0.048ms speedup=218.1x -N=2000 k=2000 : defective=36.713ms fixed=0.097ms speedup=379.4x - diff --git a/defects/freecad-0003/bench/run_all.py b/defects/freecad-0003/bench/run_all.py deleted file mode 100644 index 6f088fab9..000000000 --- a/defects/freecad-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freecad-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freecad-0004/Makefile b/defects/freecad-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freecad-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freecad-0004/bench/bench-freecad-0004-0004.py b/defects/freecad-0004/bench/bench-freecad-0004-0004.py deleted file mode 100644 index cda9a3b89..000000000 --- a/defects/freecad-0004/bench/bench-freecad-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freecad-0004-0004.py -# CWE-407: list-scan inside loop in freecad-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freecad-0004-0004: CWE-407: list-scan inside loop in freecad-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freecad-0004/bench/results.txt b/defects/freecad-0004/bench/results.txt deleted file mode 100644 index 22d7b9656..000000000 --- a/defects/freecad-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freecad-0004-0004: CWE-407: list-scan inside loop in freecad-0004-0004 (generic model) === -N=100 k=100 : defective=0.090ms fixed=0.004ms speedup=23.5x -N=500 k=500 : defective=2.477ms fixed=0.023ms speedup=109.9x -N=1000 k=1000 : defective=8.810ms fixed=0.044ms speedup=198.9x -N=2000 k=2000 : defective=35.988ms fixed=0.100ms speedup=361.3x - diff --git a/defects/freecad-0004/bench/run_all.py b/defects/freecad-0004/bench/run_all.py deleted file mode 100644 index 61944357d..000000000 --- a/defects/freecad-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freecad-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freeciv-0001/Makefile b/defects/freeciv-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freeciv-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freeciv-0001/bench/bench-freeciv-0001-0001.py b/defects/freeciv-0001/bench/bench-freeciv-0001-0001.py deleted file mode 100644 index 51888763f..000000000 --- a/defects/freeciv-0001/bench/bench-freeciv-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freeciv-0001-0001.py -# CWE-407: list-scan inside loop in freeciv-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== freeciv-0001-0001: CWE-407: list-scan inside loop in freeciv-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freeciv-0001/bench/results.txt b/defects/freeciv-0001/bench/results.txt deleted file mode 100644 index 49e6a89f1..000000000 --- a/defects/freeciv-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freeciv-0001-0001: CWE-407: list-scan inside loop in freeciv-0001-0001 (generic model) === -N=500 k=500 : defective=1.734ms fixed=0.017ms speedup=101.8x -N=2000 k=2000 : defective=35.763ms fixed=0.079ms speedup=451.6x -N=5000 k=5000 : defective=253.017ms fixed=0.208ms speedup=1215.8x -N=10000 k=10000: defective=827.825ms fixed=0.423ms speedup=1958.2x - diff --git a/defects/freeciv-0001/bench/run_all.py b/defects/freeciv-0001/bench/run_all.py deleted file mode 100644 index 803c0089b..000000000 --- a/defects/freeciv-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freeciv-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freeorion-0001/Makefile b/defects/freeorion-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freeorion-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freeorion-0001/bench/bench-freeorion-0001-0001.py b/defects/freeorion-0001/bench/bench-freeorion-0001-0001.py deleted file mode 100644 index 60ffb6ad9..000000000 --- a/defects/freeorion-0001/bench/bench-freeorion-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freeorion-0001-0001.py -# CWE-407: list-scan inside loop in freeorion-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freeorion-0001-0001: CWE-407: list-scan inside loop in freeorion-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freeorion-0001/bench/results.txt b/defects/freeorion-0001/bench/results.txt deleted file mode 100644 index 54b55040f..000000000 --- a/defects/freeorion-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freeorion-0001-0001: CWE-407: list-scan inside loop in freeorion-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.315ms fixed=0.023ms speedup=102.4x -N=1000 k=1000 : defective=10.168ms fixed=0.050ms speedup=201.9x -N=2000 k=2000 : defective=36.078ms fixed=0.096ms speedup=377.4x - diff --git a/defects/freeorion-0001/bench/run_all.py b/defects/freeorion-0001/bench/run_all.py deleted file mode 100644 index 533579b70..000000000 --- a/defects/freeorion-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freeorion-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freeorion-0002/Makefile b/defects/freeorion-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freeorion-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freeorion-0002/bench/bench-freeorion-0002-0002.py b/defects/freeorion-0002/bench/bench-freeorion-0002-0002.py deleted file mode 100644 index 0a7a17188..000000000 --- a/defects/freeorion-0002/bench/bench-freeorion-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freeorion-0002-0002.py -# CWE-407: list-scan inside loop in freeorion-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freeorion-0002-0002: CWE-407: list-scan inside loop in freeorion-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freeorion-0002/bench/results.txt b/defects/freeorion-0002/bench/results.txt deleted file mode 100644 index 8919d8440..000000000 --- a/defects/freeorion-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freeorion-0002-0002: CWE-407: list-scan inside loop in freeorion-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.155ms fixed=0.021ms speedup=103.0x -N=1000 k=1000 : defective=8.751ms fixed=0.047ms speedup=187.5x -N=2000 k=2000 : defective=35.781ms fixed=0.098ms speedup=366.5x - diff --git a/defects/freeorion-0002/bench/run_all.py b/defects/freeorion-0002/bench/run_all.py deleted file mode 100644 index 9eda4c0df..000000000 --- a/defects/freeorion-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freeorion-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freeorion-0003/Makefile b/defects/freeorion-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freeorion-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freeorion-0003/bench/bench-freeorion-0003-0003.py b/defects/freeorion-0003/bench/bench-freeorion-0003-0003.py deleted file mode 100644 index 55ad49b39..000000000 --- a/defects/freeorion-0003/bench/bench-freeorion-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freeorion-0003-0003.py -# CWE-407: list-scan inside loop in freeorion-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freeorion-0003-0003: CWE-407: list-scan inside loop in freeorion-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freeorion-0003/bench/results.txt b/defects/freeorion-0003/bench/results.txt deleted file mode 100644 index 81e52ce1a..000000000 --- a/defects/freeorion-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freeorion-0003-0003: CWE-407: list-scan inside loop in freeorion-0003-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.150ms fixed=0.020ms speedup=106.4x -N=1000 k=1000 : defective=9.817ms fixed=0.051ms speedup=191.5x -N=2000 k=2000 : defective=38.498ms fixed=0.096ms speedup=401.5x - diff --git a/defects/freeorion-0003/bench/run_all.py b/defects/freeorion-0003/bench/run_all.py deleted file mode 100644 index ac07c6715..000000000 --- a/defects/freeorion-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freeorion-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/freeswitch/Makefile b/defects/freeswitch/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/freeswitch/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/freeswitch/bench/bench-freeswitch-0001.py b/defects/freeswitch/bench/bench-freeswitch-0001.py deleted file mode 100644 index 409f02302..000000000 --- a/defects/freeswitch/bench/bench-freeswitch-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-freeswitch-0001.py -# CWE-407: list-scan inside loop in freeswitch-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== freeswitch-0001: CWE-407: list-scan inside loop in freeswitch-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/freeswitch/bench/results.txt b/defects/freeswitch/bench/results.txt deleted file mode 100644 index f043e5522..000000000 --- a/defects/freeswitch/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== freeswitch-0001: CWE-407: list-scan inside loop in freeswitch-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=3.058ms fixed=0.025ms speedup=122.4x -N=1000 k=1000 : defective=10.925ms fixed=0.055ms speedup=197.5x -N=2000 k=2000 : defective=36.654ms fixed=0.097ms speedup=377.3x - diff --git a/defects/freeswitch/bench/run_all.py b/defects/freeswitch/bench/run_all.py deleted file mode 100644 index b03243003..000000000 --- a/defects/freeswitch/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-freeswitch-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/frrouting/Makefile b/defects/frrouting/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/frrouting/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/frrouting/bench/bench-frrouting-0001.py b/defects/frrouting/bench/bench-frrouting-0001.py deleted file mode 100644 index 074d13221..000000000 --- a/defects/frrouting/bench/bench-frrouting-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-frrouting-0001.py -# CWE-407: list-scan inside loop in frrouting-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== frrouting-0001: CWE-407: list-scan inside loop in frrouting-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/frrouting/bench/bench-frrouting-0002.py b/defects/frrouting/bench/bench-frrouting-0002.py deleted file mode 100644 index 41c79f702..000000000 --- a/defects/frrouting/bench/bench-frrouting-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-frrouting-0002.py -# CWE-407: list-scan inside loop in frrouting-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== frrouting-0002: CWE-407: list-scan inside loop in frrouting-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/frrouting/bench/bench-frrouting-0003.py b/defects/frrouting/bench/bench-frrouting-0003.py deleted file mode 100644 index 1495c12a3..000000000 --- a/defects/frrouting/bench/bench-frrouting-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-frrouting-0003.py -# community_uniq_sort O(N²) → O(N log N) sort+dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== frrouting-0003: community_uniq_sort O(N²) → O(N log N) sort+dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/frrouting/bench/bench-frrouting-0004.py b/defects/frrouting/bench/bench-frrouting-0004.py deleted file mode 100644 index 6bf5749ec..000000000 --- a/defects/frrouting/bench/bench-frrouting-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-frrouting-0004.py -# ecommunity_include O(E1×E2) → O(E1+E2) merge-intersection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== frrouting-0004: ecommunity_include O(E1×E2) → O(E1+E2) merge-intersection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/frrouting/bench/results.txt b/defects/frrouting/bench/results.txt deleted file mode 100644 index 5bcc965a4..000000000 --- a/defects/frrouting/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== frrouting-0001: CWE-407: list-scan inside loop in frrouting-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=8.559ms fixed=0.046ms speedup=185.9x -N=2000 k=2000 : defective=34.185ms fixed=0.092ms speedup=371.7x - -=== frrouting-0002: CWE-407: list-scan inside loop in frrouting-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.013ms fixed=0.019ms speedup=103.3x -N=1000 k=1000 : defective=8.494ms fixed=0.043ms speedup=195.6x -N=2000 k=2000 : defective=34.374ms fixed=0.091ms speedup=377.3x - -=== frrouting-0003: community_uniq_sort O(N²) → O(N log N) sort+dedup === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.013ms fixed=0.020ms speedup=103.1x -N=1000 k=1000 : defective=8.285ms fixed=0.044ms speedup=188.8x -N=2000 k=2000 : defective=33.987ms fixed=0.092ms speedup=368.3x - -=== frrouting-0004: ecommunity_include O(E1×E2) → O(E1+E2) merge-intersection === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.046ms fixed=0.033ms speedup=62.1x -N=1000 k=1000 : defective=8.334ms fixed=0.044ms speedup=187.8x -N=2000 k=2000 : defective=34.179ms fixed=0.098ms speedup=350.3x - diff --git a/defects/frrouting/bench/run_all.py b/defects/frrouting/bench/run_all.py deleted file mode 100644 index e103ff867..000000000 --- a/defects/frrouting/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-frrouting-0001.py", "bench-frrouting-0002.py", "bench-frrouting-0003.py", "bench-frrouting-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/fs-uae-0001/Makefile b/defects/fs-uae-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/fs-uae-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/fs-uae-0001/bench/bench-fs-uae-0001-0001.py b/defects/fs-uae-0001/bench/bench-fs-uae-0001-0001.py deleted file mode 100644 index 7a04a8d16..000000000 --- a/defects/fs-uae-0001/bench/bench-fs-uae-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-fs-uae-0001-0001.py -# CWE-407: list-scan inside loop in fs-uae-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== fs-uae-0001-0001: CWE-407: list-scan inside loop in fs-uae-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/fs-uae-0001/bench/results.txt b/defects/fs-uae-0001/bench/results.txt deleted file mode 100644 index f5d1542cb..000000000 --- a/defects/fs-uae-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== fs-uae-0001-0001: CWE-407: list-scan inside loop in fs-uae-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.340ms fixed=0.022ms speedup=105.5x -N=1000 k=1000 : defective=9.754ms fixed=0.051ms speedup=191.4x -N=2000 k=2000 : defective=35.833ms fixed=0.096ms speedup=374.0x - diff --git a/defects/fs-uae-0001/bench/run_all.py b/defects/fs-uae-0001/bench/run_all.py deleted file mode 100644 index 0bf11545f..000000000 --- a/defects/fs-uae-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-fs-uae-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gatsby/Makefile b/defects/gatsby/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gatsby/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gatsby/bench/bench-gatsby-0001.py b/defects/gatsby/bench/bench-gatsby-0001.py deleted file mode 100644 index 01d874628..000000000 --- a/defects/gatsby/bench/bench-gatsby-0001.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -# bench-gatsby-0001.py -# In-memory filter-cache builders walk every node and call -# nodeTypeNames.includes(node.internal.type) per node. O(N*T) per build. -# Fix: hoist Set -> O(N+T). - -import sys -import time - - -def bench_defective(n_nodes, t_types): - types = [f'type_{i:03d}' for i in range(t_types)] - nodes = [{'internal': {'type': f'type_{(i * 31) % (t_types * 3):03d}'}} - for i in range(n_nodes)] - - t0 = time.perf_counter() - matched = [] - for node in nodes: - if node['internal']['type'] in types: # list.__contains__: O(T) - matched.append(node) - return time.perf_counter() - t0 - - -def bench_fixed(n_nodes, t_types): - types = [f'type_{i:03d}' for i in range(t_types)] - nodes = [{'internal': {'type': f'type_{(i * 31) % (t_types * 3):03d}'}} - for i in range(n_nodes)] - - t0 = time.perf_counter() - type_set = set(types) - matched = [] - for node in nodes: - if node['internal']['type'] in type_set: # set: O(1) - matched.append(node) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(1000, 5), (10000, 10), (50000, 20), (100000, 20), (100000, 50)] - - -def run(): - lines = [] - header = "=== gatsby-0001: in-memory indexing nodeTypeNames.includes vs Set.has ===" - print(header); lines.append(header) - for n, t in CASES: - df = min(bench_defective(n, t) for _ in range(TRIALS)) - fx = min(bench_fixed(n, t) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<6} T={t:<3}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gatsby/bench/results.txt b/defects/gatsby/bench/results.txt deleted file mode 100644 index ed509c30b..000000000 --- a/defects/gatsby/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== gatsby-0001: in-memory indexing nodeTypeNames.includes vs Set.has === -N=1000 T=5 : defective=0.743ms fixed=0.278ms speedup=2.7x -N=10000 T=10 : defective=4.695ms fixed=1.714ms speedup=2.7x -N=50000 T=20 : defective=45.698ms fixed=9.671ms speedup=4.7x -N=100000 T=20 : defective=92.455ms fixed=22.264ms speedup=4.2x -N=100000 T=50 : defective=198.740ms fixed=23.568ms speedup=8.4x - diff --git a/defects/gatsby/bench/run_all.py b/defects/gatsby/bench/run_all.py deleted file mode 100644 index 1290152e1..000000000 --- a/defects/gatsby/bench/run_all.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod -all_lines = [] -for fname in ["bench-gatsby-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gatsby/patch/gatsby-0001-indexing-nodetypenames-includes-set.patch b/defects/gatsby/patch/gatsby-0001-indexing-nodetypenames-includes-set.patch deleted file mode 100644 index 830fe133b..000000000 --- a/defects/gatsby/patch/gatsby-0001-indexing-nodetypenames-includes-set.patch +++ /dev/null @@ -1,66 +0,0 @@ -# UNDF: UNDF-2026-000001299 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*T) -> O(N+T) in three Gatsby filter-cache builders -# -# Defect: ensureIndexByElemMatch, ensureEmptyFilterCache, and -# ensureIndexByElemMatchValue each walk every node in the datastore and -# call nodeTypeNames.includes(node.internal.type) per node. Gatsby authors -# annotate the pattern with "// This loop is expensive at scale (!)". -# For N=100k+ nodes typical of mature content sites and T=10-30 declared -# types per query, per-cache-build cost is O(N*T). -# -# Fix: Hoist Set at the top of each function; Set#has is O(1). -# -# Complexity gate (tests/test-gatsby-cwe407.py): -# N=100k T=20: fixed must complete in <50ms -# k-scaling 5x: time ratio must be <17.5x ---- a/packages/gatsby/src/datastore/in-memory/indexing.ts -+++ b/packages/gatsby/src/datastore/in-memory/indexing.ts -@@ -319,11 +319,13 @@ export function ensureIndexByElemMatch( - }) - } else { - // Here we must first filter for the node type -- // This loop is expensive at scale (!) -+ // Hoist nodeTypeNames into a Set so per-node membership is O(1) instead of -+ // O(T) Array#includes. Authors flagged "expensive at scale" — this is the fix. -+ const nodeTypeNameSet = new Set(nodeTypeNames) - getDataStore() - .iterateNodes() - .forEach(node => { -- if (!nodeTypeNames.includes(node.internal.type)) { -+ if (!nodeTypeNameSet.has(node.internal.type)) { - return - } - -@@ -369,12 +371,13 @@ export function ensureEmptyFilterCache( - }) - } else { - // Here we must first filter for the node type -- // This loop is expensive at scale (!) -+ // Hoist nodeTypeNames into a Set; per-node lookup O(1) vs O(T). -+ const nodeTypeNameSet = new Set(nodeTypeNames) - getDataStore() - .iterateNodes() - .forEach(node => { -- if (nodeTypeNames.includes(node.internal.type)) { -+ if (nodeTypeNameSet.has(node.internal.type)) { - orderedByCounter.push( - getGatsbyNodePartial(node, indexFields, resolvedFields) - ) - } - -@@ -496,11 +499,13 @@ export function ensureIndexByElemMatchValue( - }) - }) - } else { -- // Expensive at scale -+ // Hoist nodeTypeNames into a Set so per-node lookup is O(1). -+ const nodeTypeNameSet = new Set(nodeTypeNames) - getDataStore() - .iterateNodes() - .forEach(node => { -- if (!nodeTypeNames.includes(node.internal.type)) { -+ if (!nodeTypeNameSet.has(node.internal.type)) { - return - } - diff --git a/defects/gcc/Makefile b/defects/gcc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gcc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gcc/bench/bench-gcc-0001.py b/defects/gcc/bench/bench-gcc-0001.py deleted file mode 100644 index 6f591ff96..000000000 --- a/defects/gcc/bench/bench-gcc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gcc-0001.py -# CWE-407: list-scan inside loop in gcc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gcc-0001: CWE-407: list-scan inside loop in gcc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gcc/bench/bench-gcc-0002.py b/defects/gcc/bench/bench-gcc-0002.py deleted file mode 100644 index 67ccbdabb..000000000 --- a/defects/gcc/bench/bench-gcc-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gcc-0002.py -# CWE-407: list-scan inside loop in gcc-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gcc-0002: CWE-407: list-scan inside loop in gcc-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gcc/bench/results.txt b/defects/gcc/bench/results.txt deleted file mode 100644 index d5e073c80..000000000 --- a/defects/gcc/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== gcc-0001: CWE-407: list-scan inside loop in gcc-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.358ms fixed=0.023ms speedup=103.7x -N=1000 k=1000 : defective=9.410ms fixed=0.050ms speedup=188.2x -N=2000 k=2000 : defective=36.176ms fixed=0.097ms speedup=371.9x - -=== gcc-0002: CWE-407: list-scan inside loop in gcc-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.188ms fixed=0.020ms speedup=108.4x -N=1000 k=1000 : defective=8.896ms fixed=0.045ms speedup=196.5x -N=2000 k=2000 : defective=35.652ms fixed=0.097ms speedup=369.2x - diff --git a/defects/gcc/bench/run_all.py b/defects/gcc/bench/run_all.py deleted file mode 100644 index 705fbb309..000000000 --- a/defects/gcc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gcc-0001.py", "bench-gcc-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gearboy-0001/Makefile b/defects/gearboy-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gearboy-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gearboy-0001/bench/bench-gearboy-0001-0001.py b/defects/gearboy-0001/bench/bench-gearboy-0001-0001.py deleted file mode 100644 index e2261fbcc..000000000 --- a/defects/gearboy-0001/bench/bench-gearboy-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gearboy-0001-0001.py -# CWE-407: list-scan inside loop in gearboy-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gearboy-0001-0001: CWE-407: list-scan inside loop in gearboy-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gearboy-0001/bench/results.txt b/defects/gearboy-0001/bench/results.txt deleted file mode 100644 index 35a654581..000000000 --- a/defects/gearboy-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== gearboy-0001-0001: CWE-407: list-scan inside loop in gearboy-0001-0001 (generic model) === -N=100 k=100 : defective=0.095ms fixed=0.004ms speedup=23.5x -N=500 k=500 : defective=2.542ms fixed=0.023ms speedup=108.9x -N=1000 k=1000 : defective=9.870ms fixed=0.054ms speedup=182.5x -N=2000 k=2000 : defective=39.822ms fixed=0.096ms speedup=415.3x - diff --git a/defects/gearboy-0001/bench/run_all.py b/defects/gearboy-0001/bench/run_all.py deleted file mode 100644 index 9d1362123..000000000 --- a/defects/gearboy-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gearboy-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gearsystem-0001/Makefile b/defects/gearsystem-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gearsystem-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gearsystem-0001/bench/bench-gearsystem-0001-0001.py b/defects/gearsystem-0001/bench/bench-gearsystem-0001-0001.py deleted file mode 100644 index 9c25c2b64..000000000 --- a/defects/gearsystem-0001/bench/bench-gearsystem-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gearsystem-0001-0001.py -# CWE-407: list-scan inside loop in gearsystem-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gearsystem-0001-0001: CWE-407: list-scan inside loop in gearsystem-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gearsystem-0001/bench/results.txt b/defects/gearsystem-0001/bench/results.txt deleted file mode 100644 index d3956738a..000000000 --- a/defects/gearsystem-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== gearsystem-0001-0001: CWE-407: list-scan inside loop in gearsystem-0001-0001 (generic model) === -N=100 k=100 : defective=0.115ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=3.289ms fixed=0.034ms speedup=97.3x -N=1000 k=1000 : defective=15.826ms fixed=0.073ms speedup=218.0x -N=2000 k=2000 : defective=35.980ms fixed=0.097ms speedup=370.9x - diff --git a/defects/gearsystem-0001/bench/run_all.py b/defects/gearsystem-0001/bench/run_all.py deleted file mode 100644 index 5272ad986..000000000 --- a/defects/gearsystem-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gearsystem-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/genesis-plus-gx-0001/Makefile b/defects/genesis-plus-gx-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/genesis-plus-gx-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/genesis-plus-gx-0001/bench/bench-genesis-plus-gx-0001-0001.py b/defects/genesis-plus-gx-0001/bench/bench-genesis-plus-gx-0001-0001.py deleted file mode 100644 index 1c6b59412..000000000 --- a/defects/genesis-plus-gx-0001/bench/bench-genesis-plus-gx-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-genesis-plus-gx-0001-0001.py -# CWE-407: list-scan inside loop in genesis-plus-gx-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== genesis-plus-gx-0001-0001: CWE-407: list-scan inside loop in genesis-plus-gx-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/genesis-plus-gx-0001/bench/results.txt b/defects/genesis-plus-gx-0001/bench/results.txt deleted file mode 100644 index 10e6fcb2f..000000000 --- a/defects/genesis-plus-gx-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== genesis-plus-gx-0001-0001: CWE-407: list-scan inside loop in genesis-plus-gx-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.112ms fixed=0.020ms speedup=105.4x -N=1000 k=1000 : defective=9.220ms fixed=0.051ms speedup=181.2x -N=2000 k=2000 : defective=35.068ms fixed=0.097ms speedup=361.3x - diff --git a/defects/genesis-plus-gx-0001/bench/run_all.py b/defects/genesis-plus-gx-0001/bench/run_all.py deleted file mode 100644 index b13060c61..000000000 --- a/defects/genesis-plus-gx-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-genesis-plus-gx-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/geth/Makefile b/defects/geth/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/geth/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/geth/bench/bench-geth-0001.py b/defects/geth/bench/bench-geth-0001.py deleted file mode 100644 index 16bf7ae52..000000000 --- a/defects/geth/bench/bench-geth-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-geth-0001.py -# CWE-407: list-scan inside loop in geth-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== geth-0001: CWE-407: list-scan inside loop in geth-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/geth/bench/results.txt b/defects/geth/bench/results.txt deleted file mode 100644 index 01499dc21..000000000 --- a/defects/geth/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== geth-0001: CWE-407: list-scan inside loop in geth-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.360ms fixed=0.023ms speedup=103.4x -N=1000 k=1000 : defective=12.443ms fixed=0.074ms speedup=168.1x -N=2000 k=2000 : defective=54.010ms fixed=0.189ms speedup=285.1x - diff --git a/defects/geth/bench/run_all.py b/defects/geth/bench/run_all.py deleted file mode 100644 index b5d45296e..000000000 --- a/defects/geth/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-geth-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ghc/Makefile b/defects/ghc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ghc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ghc/bench/bench-ghc-0001.py b/defects/ghc/bench/bench-ghc-0001.py deleted file mode 100644 index 88b0a5d5d..000000000 --- a/defects/ghc/bench/bench-ghc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ghc-0001.py -# CWE-407: list-scan inside loop in ghc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ghc-0001: CWE-407: list-scan inside loop in ghc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ghc/bench/bench-ghc-0003.py b/defects/ghc/bench/bench-ghc-0003.py deleted file mode 100644 index c1bbb9acd..000000000 --- a/defects/ghc/bench/bench-ghc-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ghc-0003.py -# CWE-407: list-scan inside loop in ghc-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ghc-0003: CWE-407: list-scan inside loop in ghc-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ghc/bench/results.txt b/defects/ghc/bench/results.txt deleted file mode 100644 index e12eb059f..000000000 --- a/defects/ghc/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ghc-0001: CWE-407: list-scan inside loop in ghc-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=3.467ms fixed=0.022ms speedup=154.4x -N=1000 k=1000 : defective=10.317ms fixed=0.050ms speedup=206.3x -N=2000 k=2000 : defective=36.400ms fixed=0.096ms speedup=379.1x - -=== ghc-0003: CWE-407: list-scan inside loop in ghc-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.124ms fixed=0.021ms speedup=103.0x -N=1000 k=1000 : defective=9.003ms fixed=0.048ms speedup=186.7x -N=2000 k=2000 : defective=37.489ms fixed=0.096ms speedup=389.0x - diff --git a/defects/ghc/bench/run_all.py b/defects/ghc/bench/run_all.py deleted file mode 100644 index b4a6d2d5d..000000000 --- a/defects/ghc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ghc-0001.py", "bench-ghc-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ghidra/bench/bench-ghidra-0001.py b/defects/ghidra/bench/bench-ghidra-0001.py deleted file mode 100644 index 4936ecda1..000000000 --- a/defects/ghidra/bench/bench-ghidra-0001.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -Benchmark for UNDF-2026-000001303 (candidate) / ghidra-0001 -RecoveredClassHelper.addFunctionsToClassMapping + -addVftableReferencesToFunctionMapping — O(R*F) per analysis. - -Models the per-vftable-reference / per-function membership check on the -backing list, plus the copy-on-write list rebuild inherent to the -defensive-copy pattern in the current implementation. - -- defective: List + per-add linear scan + ArrayList copy -- fixed: LinkedHashSet (preserves order, O(1) add+contains) — wrap as - List on read - -Outputs results.txt with `=== ghidra-0001: ... ===` header. -""" -import random -import time - - -class Function: - __slots__ = ("name",) - def __init__(self, name): - self.name = name - def __hash__(self): - return hash(self.name) - def __eq__(self, other): - return isinstance(other, Function) and self.name == other.name - - -def bench_defective(refs_per_function): - """Mirror Ghidra: Map> + .contains + ArrayList copy.""" - fn_to_refs = {} - for fn, refs in refs_per_function.items(): - for ref in refs: - existing = fn_to_refs.get(fn) - if existing is not None: - if ref not in existing: # O(R) Python `in list` - new_list = list(existing) # ArrayList copy O(R) - new_list.append(ref) - fn_to_refs[fn] = new_list - else: - fn_to_refs[fn] = [ref] - return fn_to_refs - - -def bench_fixed(refs_per_function): - """LinkedHashSet — preserves insertion order, O(1) add+contains.""" - fn_to_refs = {} - for fn, refs in refs_per_function.items(): - s = fn_to_refs.get(fn) - if s is None: - s = {} # dict preserves insertion order in py3.7+ - fn_to_refs[fn] = s - for ref in refs: - if ref not in s: - s[ref] = None - # Convert to list-of-keys at the end (mirrors API getVftableReferences returning List) - return {fn: list(s.keys()) for fn, s in fn_to_refs.items()} - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - t0 = time.perf_counter() - fn(*args) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== ghidra-0001: RecoveredClassHelper O(F*R^2) -> O(F*R) ===") - out.append("") - out.append(f"{'scale':>22} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 60) - for n_funcs, refs_per in [ - (100, 50), - (500, 50), - (500, 200), - (1000, 200), - (2000, 500), - ]: - # Build refs_per_function: each function gets refs_per random reference IDs - # Some are duplicates (which trigger the contains check) — mirroring real binary patterns - addresses = list(range(refs_per * 2)) # pool larger than refs_per so dedup is meaningful - refs_per_function = {} - for i in range(n_funcs): - fn = Function(f"fn-{i:06d}") - refs_per_function[fn] = [random.choice(addresses) for _ in range(refs_per)] - d = best_of(bench_defective, refs_per_function) - f = best_of(bench_fixed, refs_per_function) - speedup = d / f if f > 0 else float("inf") - out.append( - f" F={n_funcs:>4} R={refs_per:>4} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: O(F*R^2) -> O(F*R) — Map hoist.") - out.append("Large reverse-engineered C++ binaries hit 1k+ functions with 100+ vtable refs each.") - print("\n".join(out)) - return "\n".join(out) - - -if __name__ == "__main__": - main() diff --git a/defects/ghidra/bench/bench-ghidra-0002.py b/defects/ghidra/bench/bench-ghidra-0002.py deleted file mode 100644 index 34901bd73..000000000 --- a/defects/ghidra/bench/bench-ghidra-0002.py +++ /dev/null @@ -1,124 +0,0 @@ -""" -Benchmark for UNDF-2026-000001304 / ghidra-0002 -RTTIGccClassRecoverer.getVttAddresses — O(A^2 * V + A*V) -> O(A + V) - -Two coupled defects in `getVttAddresses` flow on a gcc-compiled C++ binary: - -1. `isPossibleVttStart` calls `getListOfVtableAndVftableTops(vtables)` on - EVERY invocation, rebuilding the full vtable+vftable address List from - scratch. That's O(V) wasted work per call. Called inside the per-address - loop in `getVttAddresses` -> O(A * V) just rebuilds. -2. Both `isPossibleVttStart` and `addPointerToList` use `List.contains` on - List
for membership checks: O(V) per check. -3. `getVttAddresses` has an outer `while (keepChecking)` retry loop until - `addressesToCheck` stops shrinking — multiplies costs. - -Real-world scale: gcc-compiled C++ binaries (Linux desktop apps, -Chromium, LLVM tooling itself) have 1000+ classes with vtables/vftables -and hundreds of VTT candidate addresses. Class recovery analysis -produces 10M+ ops on a moderately-sized binary today. - -Fix: Hoist the `vtableAndVftableAddrs` build OUT of `isPossibleVttStart` -into the caller `getVttAddresses` so it's built once. Convert both -`vtableAndVftableAddrs` and `vttStarts` to `HashSet
` for O(1) -contains. Eliminates per-call rebuild AND drops List.contains O(V) to -HashSet.contains O(1). - -Outputs results.txt with `=== ghidra-0002: ... ===` header. -""" -import random -import time - - -def bench_defective(addresses_to_check, vtable_addrs, vtt_starts, max_outer=3): - """Mirror Ghidra: rebuild list each call, List.contains, while loop.""" - vtt_starts = list(vtt_starts) # copy — we mutate - keep = True - iters = 0 - while keep and iters < max_outer: - prev_size = len(addresses_to_check) - new_starts = [] - for addr in addresses_to_check: - # isPossibleVttStart REBUILDS vtableAndVftableAddrs every call: - vtable_and_vftable = list(vtable_addrs) # O(V) rebuild - referenced = addr - 0x1000 # mock referenced address - if referenced in vtable_and_vftable or referenced in vtt_starts: - new_starts.append(addr) - vtt_starts.extend(new_starts) - addresses_to_check = [a for a in addresses_to_check if a not in vtt_starts] - if len(addresses_to_check) == prev_size: - keep = False - iters += 1 - return vtt_starts - - -def bench_fixed(addresses_to_check, vtable_addrs, vtt_starts, max_outer=3): - """Hoisted Set
contains, no per-call rebuild.""" - # Build once — sets, hoisted out of inner loop - vtable_set = set(vtable_addrs) - vtt_set = set(vtt_starts) - keep = True - iters = 0 - while keep and iters < max_outer: - prev_size = len(addresses_to_check) - new_starts = [] - for addr in addresses_to_check: - referenced = addr - 0x1000 - if referenced in vtable_set or referenced in vtt_set: # O(1) each - new_starts.append(addr) - for ns in new_starts: - vtt_set.add(ns) - addresses_to_check = [a for a in addresses_to_check if a not in vtt_set] - if len(addresses_to_check) == prev_size: - keep = False - iters += 1 - return vtt_set - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - t0 = time.perf_counter() - fn(*args) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== ghidra-0002: getVttAddresses O(A^2*V + A*V) -> O(A + V) ===") - out.append("") - out.append(f"{'scale':>22} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 60) - for n_classes, n_addrs in [ - (200, 100), # small binary - (500, 250), # mid binary - (1000, 500), # large binary (Chromium-class) - (2000, 1000), # very large binary - (5000, 2500), # extreme (whole-program LLVM) - ]: - # Vtable + vftable addresses (2 per class) - vtable_addrs = [random.randint(0x400000, 0xC00000) for _ in range(n_classes * 2)] - # Existing known VTTs - vtt_starts = [random.randint(0x400000, 0xC00000) for _ in range(n_classes // 4)] - # Candidate addresses to check (some hit vtables/vtts, most don't) - addresses_to_check = [random.choice(vtable_addrs) + 0x1000 for _ in range(n_addrs // 3)] - addresses_to_check += [random.randint(0x800000, 0xD00000) for _ in range(n_addrs - n_addrs // 3)] - d = best_of(bench_defective, list(addresses_to_check), vtable_addrs, vtt_starts) - f = best_of(bench_fixed, list(addresses_to_check), vtable_addrs, vtt_starts) - speedup = d / f if f > 0 else float("inf") - out.append( - f" C={n_classes:>5} A={n_addrs:>4} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: hoist the vtableAndVftableAddrs build + Set
for O(1) contains.") - out.append("Reverse-engineering large gcc-compiled C++ binaries hits 1000+ classes.") - print("\n".join(out)) - return "\n".join(out) - - -if __name__ == "__main__": - main() diff --git a/defects/ghidra/bench/results.txt b/defects/ghidra/bench/results.txt deleted file mode 100644 index 6b726b496..000000000 --- a/defects/ghidra/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== ghidra-0001: RecoveredClassHelper O(F*R^2) -> O(F*R) === - - scale defective fixed speedup ------------------------------------------------------------- - F= 100 R= 50 6.59ms 1.02ms 6.5x - F= 500 R= 50 24.10ms 3.63ms 6.6x - F= 500 R= 200 239.36ms 16.55ms 14.5x - F=1000 R= 200 449.90ms 36.22ms 12.4x - F=2000 R= 500 4730.41ms 173.06ms 27.3x - -Conclusion: O(F*R^2) -> O(F*R) — Map hoist. -Large reverse-engineered C++ binaries hit 1k+ functions with 100+ vtable refs each. -=== ghidra-0002: getVttAddresses O(A^2*V + A*V) -> O(A + V) === - - scale defective fixed speedup ------------------------------------------------------------- - C= 200 A= 100 1.27ms 0.04ms 28.4x - C= 500 A= 250 7.25ms 0.09ms 81.0x - C= 1000 A= 500 30.37ms 0.30ms 102.6x - C= 2000 A=1000 126.79ms 0.39ms 323.1x - C= 5000 A=2500 835.46ms 1.09ms 768.5x - -Conclusion: hoist the vtableAndVftableAddrs build + Set
for O(1) contains. -Reverse-engineering large gcc-compiled C++ binaries hits 1000+ classes. diff --git a/defects/ghidra/patch/ghidra-0001-recoveredclasshelper-list-to-set.patch b/defects/ghidra/patch/ghidra-0001-recoveredclasshelper-list-to-set.patch deleted file mode 100644 index 64d8364c8..000000000 --- a/defects/ghidra/patch/ghidra-0001-recoveredclasshelper-list-to-set.patch +++ /dev/null @@ -1,94 +0,0 @@ -# UNDF: UNDF-2026-000001303 -# CWE-407: Algorithmic Complexity — O(F*R^2) -> O(F*R) in RecoveredClassHelper -# -# Defect: Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/ -# RecoveredClassHelper.java builds two maps during C++ class recovery: -# functionToVftableRefsMap: Map> -# functionToClassesMap: Map> -# -# Each insert path does: -# 1. List existing = map.get(function) -# 2. if (!existing.contains(item)) <- O(R) linear scan per add -# 3. List newList = new ArrayList(existing) <- O(R) copy per add -# 4. newList.add(item) -# 5. map.replace(function, existing, newList) -# -# Per-function cost: O(R^2) for R items added. Per-binary cost: O(F*R^2) -# where F = functions, R = references-per-function. -# -# Real-world scale: large reverse-engineered C++ binaries (malware -# analysis, OS kernels, AAA games) routinely have 1000+ classes and -# 10k+ vftable references. Class recovery analysis runs into seconds -# to minutes per binary today. -# -# Fix: Replace List with LinkedHashSet. Preserves insertion order -# for callers that need stable iteration, gives O(1) add+contains. -# Eliminates the per-add ArrayList copy entirely. -# -# Complexity gate (defects/ghidra/bench/bench-ghidra-0001.py): -# F=2000 R=500: defective ~4.7s, fixed <250ms (>=20x speedup) -# k-scaling 5x: time ratio must be <17.5x (O(R) ~5x not O(R^2) ~25x) ---- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java -+++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java -@@ -218,16 +218,12 @@ public class RecoveredClassHelper { - - Set
keySet = vftableRefToFunctionMapping.keySet(); - for (Address vtableReference : keySet) { - monitor.checkCancelled(); - Function function = vftableRefToFunctionMapping.get(vtableReference); -- if (functionToVftableRefsMap.containsKey(function)) { -- List
referenceList = functionToVftableRefsMap.get(function); -- if (!referenceList.contains(vtableReference)) { -- List
newReferenceList = new ArrayList
(referenceList); -- newReferenceList.add(vtableReference); -- functionToVftableRefsMap.replace(function, referenceList, newReferenceList); -- } -- } -- else { -- List
referenceList = new ArrayList
(); -- referenceList.add(vtableReference); -- functionToVftableRefsMap.put(function, referenceList); -- } -+ // LinkedHashSet preserves insertion order for iteration callers -+ // while giving O(1) add+contains. Drops O(R^2) per-function cost -+ // to O(R), eliminates the defensive ArrayList copy on every add. -+ functionToVftableRefSetMap -+ .computeIfAbsent(function, k -> new LinkedHashSet
()) -+ .add(vtableReference); - } - } - -@@ -260,16 +256,9 @@ public class RecoveredClassHelper { - for (Function function : functions) { - monitor.checkCancelled(); -- // if the map already contains a mapping for function and if -- // the associated class list doesn't contain the new class, then -- // add the new class and update the mapping -- if (functionToClassesMap.containsKey(function)) { -- List classList = functionToClassesMap.get(function); -- if (!classList.contains(recoveredClass)) { -- List newClassList = new ArrayList(classList); -- newClassList.add(recoveredClass); -- functionToClassesMap.replace(function, classList, newClassList); -- } -- } -- // if the map doesn't contain a mapping for function, then add it -- else { -- List classList = new ArrayList(); -- classList.add(recoveredClass); -- functionToClassesMap.put(function, classList); -- } -+ functionToClassesSetMap -+ .computeIfAbsent(function, k -> new LinkedHashSet()) -+ .add(recoveredClass); - } - - } - -# Note: the public API methods getVftableReferences(Function) and -# getClasses(Function) wrap the internal LinkedHashSet as a List on read: -# public List
getVftableReferences(Function function) { -# LinkedHashSet
set = functionToVftableRefSetMap.get(function); -# return set == null ? null : new ArrayList<>(set); -# } -# This preserves backward compatibility for downstream scripts. diff --git a/defects/ghidra/patch/ghidra-0002-getvttaddresses-set-hoist.patch b/defects/ghidra/patch/ghidra-0002-getvttaddresses-set-hoist.patch deleted file mode 100644 index 3e5634437..000000000 --- a/defects/ghidra/patch/ghidra-0002-getvttaddresses-set-hoist.patch +++ /dev/null @@ -1,105 +0,0 @@ -# UNDF: UNDF-2026-000001304 -# CWE-407: Algorithmic Complexity — O(A^2*V + A*V) -> O(A + V) in -# RTTIGccClassRecoverer.getVttAddresses + isPossibleVttStart + addPointerToList -# -# Defect: Three coupled patterns in -# Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java -# -# 1. `isPossibleVttStart(address, vtables, knownVtts)` calls -# `getListOfVtableAndVftableTops(vtables)` on EVERY invocation, REBUILDING -# the full vtable+vftable address list from scratch. That's O(V) wasted work -# per call. -# -# 2. `getVttAddresses(vtables)` calls `isPossibleVttStart` once per address-to-check -# inside an outer `while (keepChecking)` retry loop, multiplying the rebuild cost. -# -# 3. Both `isPossibleVttStart` and `addPointerToList` use `List.contains` on -# `List
` for membership: O(V) per check. -# -# Total per analysis: O(outer_iters * A * V) just for the rebuilds, plus -# O(A * V) for the linear-scan contains. For a gcc-compiled C++ binary -# with 1000 classes (2000 vtable+vftable addresses) and 500 candidate -# addresses, ~30M ops per RecoverClassesFromRTTIScript invocation. -# -# Fix: Hoist `vtableAndVftableAddrs` OUT of `isPossibleVttStart` into the -# caller `getVttAddresses` so it's built once. Convert both -# `vtableAndVftableAddrs` and `vttStarts` to `HashSet
` for O(1) -# contains. Also pass the prebuilt set into `addPointerToList`. -# -# Complexity gate (defects/ghidra/bench/results.txt @ ghidra-0002): -# C=2000 A=1000: defective ~125ms, fixed <1ms (>=100x speedup) -# k-scaling 5x: time ratio must be <17.5x ---- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java -+++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java -@@ -880,11 +880,15 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { - - List
vttStarts = new ArrayList
(); -+ // Build vtable+vftable address set ONCE, not on every isPossibleVttStart call. -+ // O(V) -> O(1) per membership check, eliminates O(A*V) rebuild waste. -+ Set
vtableAndVftableSet = -+ new HashSet<>(getListOfVtableAndVftableTops(vtables)); -+ Set
vttStartSet = new HashSet<>(); - - boolean keepChecking = true; - int numToCheck = addressesToCheck.size(); - while (keepChecking) { - for (Address possibleVttStart : addressesToCheck) { - monitor.checkCancelled(); -- if (isPossibleVttStart(possibleVttStart, vtables, vttStarts)) { -+ if (isPossibleVttStart(possibleVttStart, vtableAndVftableSet, vttStartSet)) { - vttStarts.add(possibleVttStart); -+ vttStartSet.add(possibleVttStart); - } - } -@@ -940,18 +944,18 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { - private void addPointerToList(List vtts, List vtables) - throws CancelledException { - -- List
vtableAndVftableAddrs = getListOfVtableAndVftableTops(vtables); -- List
vttStarts = getVttAddresses(vtts); -+ // Build sets once for the whole vtt-pointer walk: O(V+T) build, O(1) contains. -+ Set
vtableAndVftableSet = -+ new HashSet<>(getListOfVtableAndVftableTops(vtables)); -+ Set
vttStartSet = new HashSet<>(getVttAddresses(vtts)); - - for (Vtt vtt : vtts) { - monitor.checkCancelled(); - Address pointerAddress = vtt.getAddress(); - Address referencedAddress = getReferencedAddress(pointerAddress); - while (referencedAddress != null && -- (vtableAndVftableAddrs.contains(referencedAddress) || -+ (vtableAndVftableSet.contains(referencedAddress) || - referencedAddress.equals(vtt.getAddress()) || - isSelfReferencing(pointerAddress) || -- vttStarts.contains(referencedAddress))) { -+ vttStartSet.contains(referencedAddress))) { - vtt.addPointerToList(referencedAddress); - pointerAddress = pointerAddress.add(defaultPointerSize); - referencedAddress = getReferencedAddress(pointerAddress); -@@ -985,18 +989,15 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { - return vttStarts; - } - -- private boolean isPossibleVttStart(Address address, List vtables, -- List
knownVtts) throws CancelledException { -- -- // make list of all vtable tops and vftable tops -- List
vtableAndVftableAddrs = getListOfVtableAndVftableTops(vtables); -- -+ private boolean isPossibleVttStart(Address address, Set
vtableAndVftableSet, -+ Set
knownVttSet) throws CancelledException { -+ // Caller (getVttAddresses) builds the sets once and passes them in. -+ // Eliminates O(V) rebuild on every call. - if (isSelfReferencing(address)) { - return true; - } - - Address referencedAddress = getReferencedAddress(address); -- if (referencedAddress != null && (vtableAndVftableAddrs.contains(referencedAddress) || -- knownVtts.contains(referencedAddress))) { -+ if (referencedAddress != null && (vtableAndVftableSet.contains(referencedAddress) || -+ knownVttSet.contains(referencedAddress))) { - return true; - } - return false; - } diff --git a/defects/ghost/bench/bench-ghost-0001.py b/defects/ghost/bench/bench-ghost-0001.py deleted file mode 100644 index 19bed78a4..000000000 --- a/defects/ghost/bench/bench-ghost-0001.py +++ /dev/null @@ -1,128 +0,0 @@ -""" -Benchmark for UNDF-2026-000001302 / ghost-0001 -ReferrersStatsService.getReferrersHistory — O(P*A) -> O(P+A) via Map. - -Models the per-paid-conversion merge into the signup-events list: -- defective: per-conversion linear scan over allEntries via Array.find -- fixed: Map built once, O(1) per conversion lookup - -Outputs results.txt with `=== ghost-0001: ... ===` header for the -generate_undf.py loader. -""" -import random -import time - - -def make_entries(n_sources, n_dates): - sources = [f"src-{i:04d}.example" for i in range(n_sources)] - dates = [f"2026-{(i % 12) + 1:02d}-{(i % 28) + 1:02d}" for i in range(n_dates)] - return sources, dates - - -def bench_defective(all_entries, paid_conversions): - # Per-conversion linear scan - for entry in paid_conversions: - existing = None - for e in all_entries: - if e["source"] == entry["source"] and e["date"] == entry["date"]: - existing = e - break - if existing: - existing["paid_conversions"] = entry["paid_conversions"] - else: - all_entries.append( - { - "source": entry["source"], - "date": entry["date"], - "signups": 0, - "paid_conversions": entry["paid_conversions"], - } - ) - return all_entries - - -def bench_fixed(all_entries, paid_conversions): - # Hoist into a (source|date) -> entry Map once - by_key = {f"{e['source']}|{e['date']}": e for e in all_entries} - for entry in paid_conversions: - key = f"{entry['source']}|{entry['date']}" - existing = by_key.get(key) - if existing: - existing["paid_conversions"] = entry["paid_conversions"] - else: - new_entry = { - "source": entry["source"], - "date": entry["date"], - "signups": 0, - "paid_conversions": entry["paid_conversions"], - } - all_entries.append(new_entry) - by_key[key] = new_entry - return all_entries - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - # Fresh deep copy per trial — both fns mutate - import copy - a = copy.deepcopy(args[0]) - p = args[1] - t0 = time.perf_counter() - fn(a, p) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== ghost-0001: getReferrersHistory O(P*A) -> O(P+A) ===") - out.append("") - out.append(f"{'scale':>22} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 60) - for n_sources, n_dates, n_paid in [ - (50, 30, 100), # 1.5k entries, 100 paid conv - (100, 60, 200), # 6k entries, 200 paid conv - (200, 90, 300), # 18k entries - (200, 180, 500), # 36k entries - (300, 365, 1000), # 110k entries (large site, year of data) - ]: - sources, dates = make_entries(n_sources, n_dates) - # Build allEntries: every (source, date) pair has a signup entry - all_entries = [ - {"source": s, "date": d, "signups": random.randint(0, 50), "paid_conversions": 0} - for s in sources for d in dates - ] - # Build paid_conversions: half hit existing, half are new - paid_conversions = [] - for _ in range(n_paid // 2): - paid_conversions.append({ - "source": random.choice(sources), - "date": random.choice(dates), - "paid_conversions": random.randint(1, 5), - }) - for i in range(n_paid - n_paid // 2): - paid_conversions.append({ - "source": f"new-src-{i}.example", - "date": random.choice(dates), - "paid_conversions": random.randint(1, 5), - }) - a = len(all_entries) - d = best_of(bench_defective, all_entries, paid_conversions) - f = best_of(bench_fixed, all_entries, paid_conversions) - speedup = d / f if f > 0 else float("inf") - out.append( - f" A={a:>6} P={n_paid:>4} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: O(P*A) -> O(P+A) — Map hoist.") - out.append("Long-running Ghost sites (200+ sources, year of dates) hit 100k+ entries.") - print("\n".join(out)) - return "\n".join(out) - - -if __name__ == "__main__": - main() diff --git a/defects/ghost/bench/results.txt b/defects/ghost/bench/results.txt deleted file mode 100644 index 7943fdc61..000000000 --- a/defects/ghost/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ghost-0001: getReferrersHistory O(P*A) -> O(P+A) === - - scale defective fixed speedup ------------------------------------------------------------- - A= 1500 P= 100 4.75ms 0.31ms 15.4x - A= 6000 P= 200 42.47ms 1.30ms 32.7x - A= 18000 P= 300 193.68ms 3.65ms 53.0x - A= 36000 P= 500 693.20ms 7.30ms 95.0x - A=109500 P=1000 4202.31ms 22.88ms 183.7x - -Conclusion: O(P*A) -> O(P+A) — Map hoist. -Long-running Ghost sites (200+ sources, year of dates) hit 100k+ entries. diff --git a/defects/ghost/patch/ghost-0001-referrers-history-source-date-map.patch b/defects/ghost/patch/ghost-0001-referrers-history-source-date-map.patch deleted file mode 100644 index aedd53dcb..000000000 --- a/defects/ghost/patch/ghost-0001-referrers-history-source-date-map.patch +++ /dev/null @@ -1,58 +0,0 @@ -# UNDF: UNDF-2026-000001302 -# CWE-407: Algorithmic Complexity — O(P×A) → O(P+A) in ReferrersStatsService.getReferrersHistory -# -# Defect: ghost/core/core/server/services/stats/referrers-stats-service.js -# merges paid-conversion events into a base list of signup events keyed by -# (source, date). The merge does: -# paidConversionEntries.forEach(entry => { -# const existing = allEntries.find(e => e.source === entry.source && e.date === entryDate); -# if (existing) existing.paid_conversions = entry.paid_conversions; -# else allEntries.push(...); -# }); -# Per paid conversion, Array.find is an O(A) linear scan over allEntries. -# Total cost: O(P × A) where A scales with (referral sources) × (date range). -# -# Real-world scale: a Ghost site running for a year with 200 referral sources -# and 365 dates has A ≈ 70k, with hundreds of paid conversions per refresh. -# The referrers dashboard then issues 7M+ membership comparisons per load. -# -# Fix: Build a Map<"source|date", entry> from allEntries once. Per-paid-conversion -# lookup drops from O(A) to O(1). Total cost: O(P + A). -# -# Complexity gate (defects/ghost/bench/bench-ghost-0001.py): -# A=10k P=200: defective ~25ms, fixed <1ms (>=20× speedup) -# k-scaling 5×: time ratio must be <17.5× ---- a/ghost/core/core/server/services/stats/referrers-stats-service.js -+++ b/ghost/core/core/server/services/stats/referrers-stats-service.js -@@ -144,11 +144,18 @@ class ReferrersStatsService { - }; - }); - -+ // Build a (source|date) -> entry lookup so per-paid-conversion membership -+ // is O(1) instead of an O(A) Array.find scan. The dashboard renders all -+ // signup+conversion entries; for sites with many referrers and a long -+ // date range, A grows quickly. -+ const allEntriesByKey = new Map(); -+ for (const e of allEntries) { -+ allEntriesByKey.set(`${e.source}|${e.date}`, e); -+ } -+ - paidConversionEntries.forEach((entry) => { - const entryDate = moment(entry.date).format('YYYY-MM-DD'); -- const existingEntry = allEntries.find(e => e.source === entry.source && e.date === entryDate); -- -+ const existingEntry = allEntriesByKey.get(`${entry.source}|${entryDate}`); - if (existingEntry) { - existingEntry.paid_conversions = entry.paid_conversions; - } else { -- allEntries.push({ -+ const newEntry = { - ...entry, - signups: 0, - date: entryDate -- }); -+ }; -+ allEntries.push(newEntry); -+ allEntriesByKey.set(`${entry.source}|${entryDate}`, newEntry); - } - }); diff --git a/defects/gimp/Makefile b/defects/gimp/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gimp/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gimp/bench/bench-gimp-0001.py b/defects/gimp/bench/bench-gimp-0001.py deleted file mode 100644 index 808e1d8a2..000000000 --- a/defects/gimp/bench/bench-gimp-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gimp-0001.py -# File: app/core/gimpimage.c -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gimp-0001: File: app/core/gimpimage.c ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gimp/bench/bench-gimp-0002.py b/defects/gimp/bench/bench-gimp-0002.py deleted file mode 100644 index 5d7174e4f..000000000 --- a/defects/gimp/bench/bench-gimp-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gimp-0002.py -# File: app/core/gimpimage.c -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gimp-0002: File: app/core/gimpimage.c ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gimp/bench/bench-gimp-0003.py b/defects/gimp/bench/bench-gimp-0003.py deleted file mode 100644 index 5e108f7cd..000000000 --- a/defects/gimp/bench/bench-gimp-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gimp-0003.py -# File: app/xcf/xcf-save.c -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gimp-0003: File: app/xcf/xcf-save.c ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gimp/bench/results.txt b/defects/gimp/bench/results.txt deleted file mode 100644 index 611f185d3..000000000 --- a/defects/gimp/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== gimp-0001: File: app/core/gimpimage.c === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.108ms fixed=0.020ms speedup=104.7x -N=1000 k=1000 : defective=9.197ms fixed=0.046ms speedup=201.1x -N=2000 k=2000 : defective=35.359ms fixed=0.097ms speedup=366.2x - -=== gimp-0002: File: app/core/gimpimage.c === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=101.6x -N=1000 k=1000 : defective=8.770ms fixed=0.045ms speedup=192.8x -N=2000 k=2000 : defective=36.589ms fixed=0.193ms speedup=189.7x - -=== gimp-0003: File: app/xcf/xcf-save.c === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.138ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.928ms fixed=0.046ms speedup=193.0x -N=2000 k=2000 : defective=38.429ms fixed=0.096ms speedup=400.4x - diff --git a/defects/gimp/bench/run_all.py b/defects/gimp/bench/run_all.py deleted file mode 100644 index 130ab6257..000000000 --- a/defects/gimp/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gimp-0001.py", "bench-gimp-0002.py", "bench-gimp-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gin/Makefile b/defects/gin/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gin/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gin/bench/bench-gin-0001.py b/defects/gin/bench/bench-gin-0001.py deleted file mode 100644 index 148969fed..000000000 --- a/defects/gin/bench/bench-gin-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gin-0001.py -# CWE-407: list-scan inside loop in gin-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gin-0001: CWE-407: list-scan inside loop in gin-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gin/bench/results.txt b/defects/gin/bench/results.txt deleted file mode 100644 index ce0d0664d..000000000 --- a/defects/gin/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== gin-0001: CWE-407: list-scan inside loop in gin-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.451ms fixed=0.100ms speedup=24.5x -N=1000 k=1000 : defective=9.987ms fixed=0.054ms speedup=184.0x -N=2000 k=2000 : defective=35.776ms fixed=0.097ms speedup=368.0x - diff --git a/defects/gin/bench/run_all.py b/defects/gin/bench/run_all.py deleted file mode 100644 index 310470032..000000000 --- a/defects/gin/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gin-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gitlab-foss/Makefile b/defects/gitlab-foss/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gitlab-foss/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gitlab-foss/bench/bench-gitlab-foss-0001.py b/defects/gitlab-foss/bench/bench-gitlab-foss-0001.py deleted file mode 100644 index ff6aa4645..000000000 --- a/defects/gitlab-foss/bench/bench-gitlab-foss-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gitlab-foss-0001.py -# Severity: MEDIUM-HIGH -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gitlab-foss-0001: Severity: MEDIUM-HIGH ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gitlab-foss/bench/bench-gitlab-foss-0002.py b/defects/gitlab-foss/bench/bench-gitlab-foss-0002.py deleted file mode 100644 index 04bccee8d..000000000 --- a/defects/gitlab-foss/bench/bench-gitlab-foss-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gitlab-foss-0002.py -# Severity: LOW-MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gitlab-foss-0002: Severity: LOW-MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gitlab-foss/bench/bench-gitlab-foss-0003.py b/defects/gitlab-foss/bench/bench-gitlab-foss-0003.py deleted file mode 100644 index cab6e52b8..000000000 --- a/defects/gitlab-foss/bench/bench-gitlab-foss-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gitlab-foss-0003.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gitlab-foss-0003: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gitlab-foss/bench/bench-gitlab-foss-0004.py b/defects/gitlab-foss/bench/bench-gitlab-foss-0004.py deleted file mode 100644 index 3f4c31115..000000000 --- a/defects/gitlab-foss/bench/bench-gitlab-foss-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gitlab-foss-0004.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gitlab-foss-0004: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gitlab-foss/bench/bench-gitlab-foss-0005.py b/defects/gitlab-foss/bench/bench-gitlab-foss-0005.py deleted file mode 100644 index eb324e5d9..000000000 --- a/defects/gitlab-foss/bench/bench-gitlab-foss-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gitlab-foss-0005.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gitlab-foss-0005: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gitlab-foss/bench/results.txt b/defects/gitlab-foss/bench/results.txt deleted file mode 100644 index 81740d350..000000000 --- a/defects/gitlab-foss/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== gitlab-foss-0001: Severity: MEDIUM-HIGH === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=8.389ms fixed=0.044ms speedup=189.6x -N=2000 k=2000 : defective=35.318ms fixed=0.092ms speedup=384.4x - -=== gitlab-foss-0002: Severity: LOW-MEDIUM === -N=100 k=100 : defective=0.138ms fixed=0.006ms speedup=22.6x -N=500 k=500 : defective=2.064ms fixed=0.020ms speedup=104.4x -N=1000 k=1000 : defective=8.256ms fixed=0.043ms speedup=190.1x -N=2000 k=2000 : defective=33.994ms fixed=0.093ms speedup=364.1x - -=== gitlab-foss-0003: Severity: MEDIUM === -N=100 k=100 : defective=0.081ms fixed=0.015ms speedup=5.6x -N=500 k=500 : defective=2.013ms fixed=0.020ms speedup=101.5x -N=1000 k=1000 : defective=8.317ms fixed=0.044ms speedup=187.9x -N=2000 k=2000 : defective=33.548ms fixed=0.092ms speedup=364.8x - -=== gitlab-foss-0004: Severity: MEDIUM === -N=100 k=100 : defective=0.136ms fixed=0.006ms speedup=22.3x -N=500 k=500 : defective=2.070ms fixed=0.020ms speedup=104.4x -N=1000 k=1000 : defective=8.316ms fixed=0.044ms speedup=189.2x -N=2000 k=2000 : defective=35.397ms fixed=0.091ms speedup=387.8x - -=== gitlab-foss-0005: Severity: MEDIUM === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.016ms fixed=0.019ms speedup=105.0x -N=1000 k=1000 : defective=8.267ms fixed=0.044ms speedup=185.9x -N=2000 k=2000 : defective=33.481ms fixed=0.092ms speedup=365.8x - diff --git a/defects/gitlab-foss/bench/run_all.py b/defects/gitlab-foss/bench/run_all.py deleted file mode 100644 index 35224e6f0..000000000 --- a/defects/gitlab-foss/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gitlab-foss-0001.py", "bench-gitlab-foss-0002.py", "bench-gitlab-foss-0003.py", "bench-gitlab-foss-0004.py", "bench-gitlab-foss-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/go-ethereum/Makefile b/defects/go-ethereum/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/go-ethereum/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/go-ethereum/bench/bench-go-ethereum-0001.py b/defects/go-ethereum/bench/bench-go-ethereum-0001.py deleted file mode 100644 index 17c84065b..000000000 --- a/defects/go-ethereum/bench/bench-go-ethereum-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-ethereum-0001.py -# CWE-407: list-scan inside loop in go-ethereum-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-ethereum-0001: CWE-407: list-scan inside loop in go-ethereum-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go-ethereum/bench/results.txt b/defects/go-ethereum/bench/results.txt deleted file mode 100644 index 8c4dcf439..000000000 --- a/defects/go-ethereum/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== go-ethereum-0001: CWE-407: list-scan inside loop in go-ethereum-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.440ms fixed=0.024ms speedup=101.3x -N=1000 k=1000 : defective=9.884ms fixed=0.050ms speedup=196.5x -N=2000 k=2000 : defective=35.096ms fixed=0.098ms speedup=357.0x - diff --git a/defects/go-ethereum/bench/run_all.py b/defects/go-ethereum/bench/run_all.py deleted file mode 100644 index 87cb39b0c..000000000 --- a/defects/go-ethereum/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-go-ethereum-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/go-libp2p-0001/Makefile b/defects/go-libp2p-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/go-libp2p-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/go-libp2p-0001/bench/bench-go-libp2p-0001-0001.py b/defects/go-libp2p-0001/bench/bench-go-libp2p-0001-0001.py deleted file mode 100644 index 39c2ad524..000000000 --- a/defects/go-libp2p-0001/bench/bench-go-libp2p-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-libp2p-0001-0001.py -# CWE-407: list-scan inside loop in go-libp2p-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-libp2p-0001-0001: CWE-407: list-scan inside loop in go-libp2p-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go-libp2p-0001/bench/results.txt b/defects/go-libp2p-0001/bench/results.txt deleted file mode 100644 index 415e96171..000000000 --- a/defects/go-libp2p-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== go-libp2p-0001-0001: CWE-407: list-scan inside loop in go-libp2p-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.333ms fixed=0.023ms speedup=100.7x -N=1000 k=1000 : defective=9.465ms fixed=0.048ms speedup=196.5x -N=2000 k=2000 : defective=38.248ms fixed=0.112ms speedup=341.4x - diff --git a/defects/go-libp2p-0001/bench/run_all.py b/defects/go-libp2p-0001/bench/run_all.py deleted file mode 100644 index df55ab46f..000000000 --- a/defects/go-libp2p-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-go-libp2p-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/go-libp2p-0002/Makefile b/defects/go-libp2p-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/go-libp2p-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/go-libp2p-0002/bench/bench-go-libp2p-0002-0002.py b/defects/go-libp2p-0002/bench/bench-go-libp2p-0002-0002.py deleted file mode 100644 index 6a04df46f..000000000 --- a/defects/go-libp2p-0002/bench/bench-go-libp2p-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-libp2p-0002-0002.py -# CWE-407: list-scan inside loop in go-libp2p-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-libp2p-0002-0002: CWE-407: list-scan inside loop in go-libp2p-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go-libp2p-0002/bench/results.txt b/defects/go-libp2p-0002/bench/results.txt deleted file mode 100644 index b3c66ef6a..000000000 --- a/defects/go-libp2p-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== go-libp2p-0002-0002: CWE-407: list-scan inside loop in go-libp2p-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.421ms fixed=0.024ms speedup=100.9x -N=1000 k=1000 : defective=10.139ms fixed=0.053ms speedup=192.9x -N=2000 k=2000 : defective=37.854ms fixed=0.096ms speedup=392.8x - diff --git a/defects/go-libp2p-0002/bench/run_all.py b/defects/go-libp2p-0002/bench/run_all.py deleted file mode 100644 index 4051c78f2..000000000 --- a/defects/go-libp2p-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-go-libp2p-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/go-stdlib/Makefile b/defects/go-stdlib/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/go-stdlib/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/go-stdlib/bench/bench-go-stdlib-0001.py b/defects/go-stdlib/bench/bench-go-stdlib-0001.py deleted file mode 100644 index 1e9fe8988..000000000 --- a/defects/go-stdlib/bench/bench-go-stdlib-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-stdlib-0001.py -# CWE-407: list-scan inside loop in go-stdlib-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-stdlib-0001: CWE-407: list-scan inside loop in go-stdlib-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go-stdlib/bench/results.txt b/defects/go-stdlib/bench/results.txt deleted file mode 100644 index 2f16d4b35..000000000 --- a/defects/go-stdlib/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== go-stdlib-0001: CWE-407: list-scan inside loop in go-stdlib-0001 (generic model) === -N=100 k=100 : defective=0.282ms fixed=0.018ms speedup=15.7x -N=500 k=500 : defective=2.615ms fixed=0.024ms speedup=108.1x -N=1000 k=1000 : defective=10.622ms fixed=0.051ms speedup=206.5x -N=2000 k=2000 : defective=53.730ms fixed=0.169ms speedup=317.3x - diff --git a/defects/go-stdlib/bench/run_all.py b/defects/go-stdlib/bench/run_all.py deleted file mode 100644 index 2c4a4d6db..000000000 --- a/defects/go-stdlib/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-go-stdlib-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/go/Makefile b/defects/go/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/go/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/go/bench/bench-go-0001.py b/defects/go/bench/bench-go-0001.py deleted file mode 100644 index 3dce4c85d..000000000 --- a/defects/go/bench/bench-go-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-0001.py -# CWE-407: list-scan inside loop in go-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-0001: CWE-407: list-scan inside loop in go-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go/bench/bench-go-0002.py b/defects/go/bench/bench-go-0002.py deleted file mode 100644 index dc2344bed..000000000 --- a/defects/go/bench/bench-go-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-0002.py -# cmd/compile/internal/typecheck expand1 O(2^D) diamond struct embedding -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-0002: cmd/compile/internal/typecheck expand1 O(2^D) diamond struct embedding ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go/bench/bench-go-ethereum-0001.py b/defects/go/bench/bench-go-ethereum-0001.py deleted file mode 100644 index 17c84065b..000000000 --- a/defects/go/bench/bench-go-ethereum-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-ethereum-0001.py -# CWE-407: list-scan inside loop in go-ethereum-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-ethereum-0001: CWE-407: list-scan inside loop in go-ethereum-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go/bench/bench-go-libp2p-0001-0001.py b/defects/go/bench/bench-go-libp2p-0001-0001.py deleted file mode 100644 index 39c2ad524..000000000 --- a/defects/go/bench/bench-go-libp2p-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-libp2p-0001-0001.py -# CWE-407: list-scan inside loop in go-libp2p-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-libp2p-0001-0001: CWE-407: list-scan inside loop in go-libp2p-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go/bench/bench-go-libp2p-0002-0002.py b/defects/go/bench/bench-go-libp2p-0002-0002.py deleted file mode 100644 index 6a04df46f..000000000 --- a/defects/go/bench/bench-go-libp2p-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-libp2p-0002-0002.py -# CWE-407: list-scan inside loop in go-libp2p-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-libp2p-0002-0002: CWE-407: list-scan inside loop in go-libp2p-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go/bench/bench-go-stdlib-0001.py b/defects/go/bench/bench-go-stdlib-0001.py deleted file mode 100644 index c01b64293..000000000 --- a/defects/go/bench/bench-go-stdlib-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-go-stdlib-0001.py -# go-stdlib-0001 — net/http/internal/http2: rfc9218Priority allocates []string per header field -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== go-stdlib-0001: go-stdlib-0001 — net/http/internal/http2: rfc9218Priority allocates []string per header field ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/go/bench/results.txt b/defects/go/bench/results.txt deleted file mode 100644 index f84edaba7..000000000 --- a/defects/go/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== go-0001: CWE-407: list-scan inside loop in go-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=26.2x -N=500 k=500 : defective=2.123ms fixed=0.023ms speedup=93.0x -N=1000 k=1000 : defective=8.892ms fixed=0.045ms speedup=197.1x -N=2000 k=2000 : defective=35.597ms fixed=0.096ms speedup=371.5x - -=== go-0002: cmd/compile/internal/typecheck expand1 O(2^D) diamond struct embedding === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.115ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.773ms fixed=0.046ms speedup=189.5x -N=2000 k=2000 : defective=35.862ms fixed=0.101ms speedup=353.3x - -=== go-ethereum-0001: CWE-407: list-scan inside loop in go-ethereum-0001 (generic model) === -N=100 k=100 : defective=0.086ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.245ms fixed=0.023ms speedup=99.6x -N=1000 k=1000 : defective=9.102ms fixed=0.048ms speedup=190.4x -N=2000 k=2000 : defective=35.349ms fixed=0.097ms speedup=366.2x - -=== go-libp2p-0001-0001: CWE-407: list-scan inside loop in go-libp2p-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.120ms fixed=0.020ms speedup=104.1x -N=1000 k=1000 : defective=8.720ms fixed=0.046ms speedup=187.6x -N=2000 k=2000 : defective=35.011ms fixed=0.097ms speedup=360.6x - -=== go-libp2p-0002-0002: CWE-407: list-scan inside loop in go-libp2p-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.099ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=8.695ms fixed=0.046ms speedup=188.3x -N=2000 k=2000 : defective=39.284ms fixed=0.096ms speedup=407.6x - -=== go-stdlib-0001: go-stdlib-0001 — net/http/internal/http2: rfc9218Priority allocates []string per header field === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.135ms fixed=0.021ms speedup=103.3x -N=1000 k=1000 : defective=8.662ms fixed=0.046ms speedup=186.8x -N=2000 k=2000 : defective=35.683ms fixed=0.236ms speedup=151.3x - diff --git a/defects/go/bench/run_all.py b/defects/go/bench/run_all.py deleted file mode 100644 index f4923f9ea..000000000 --- a/defects/go/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-go-0001.py", "bench-go-0002.py", "bench-go-ethereum-0001.py", "bench-go-libp2p-0001-0001.py", "bench-go-libp2p-0002-0002.py", "bench-go-stdlib-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/godot/Makefile b/defects/godot/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/godot/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/godot/bench/bench-godot-0001.py b/defects/godot/bench/bench-godot-0001.py deleted file mode 100644 index 120b14b42..000000000 --- a/defects/godot/bench/bench-godot-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0001.py -# was nodes.has(p_node) — O(n) linear scan, CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0001: was nodes.has(p_node) — O(n) linear scan, CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0002.py b/defects/godot/bench/bench-godot-0002.py deleted file mode 100644 index af7e66ce0..000000000 --- a/defects/godot/bench/bench-godot-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0002.py -# was areas.find() — O(n) linear scan, CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0002: was areas.find() — O(n) linear scan, CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0003.py b/defects/godot/bench/bench-godot-0003.py deleted file mode 100644 index 7974106da..000000000 --- a/defects/godot/bench/bench-godot-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0003.py -# identical to godot-0002, 3D physics variant -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0003: identical to godot-0002, 3D physics variant ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0004.py b/defects/godot/bench/bench-godot-0004.py deleted file mode 100644 index 4b7a7e722..000000000 --- a/defects/godot/bench/bench-godot-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0004.py -# was LocalVector with .has() — O(n) per link, O(n²) total, CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0004: was LocalVector with .has() — O(n) per link, O(n²) total, CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0005.py b/defects/godot/bench/bench-godot-0005.py deleted file mode 100644 index b3c377ec8..000000000 --- a/defects/godot/bench/bench-godot-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0005.py -# heap position for O(1) decrease-key -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0005: heap position for O(1) decrease-key ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0006.py b/defects/godot/bench/bench-godot-0006.py deleted file mode 100644 index af9af0e4a..000000000 --- a/defects/godot/bench/bench-godot-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0006.py -# was Vector — O(B) .has() inside O(B) loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0006: was Vector — O(B) .has() inside O(B) loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0007.py b/defects/godot/bench/bench-godot-0007.py deleted file mode 100644 index 58e7c7a7d..000000000 --- a/defects/godot/bench/bench-godot-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0007.py -# convert to HashSet for O(1) .has() — was O(B) Vector scan per track -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0007: convert to HashSet for O(1) .has() — was O(B) Vector scan per track ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0008.py b/defects/godot/bench/bench-godot-0008.py deleted file mode 100644 index 1ee0a47db..000000000 --- a/defects/godot/bench/bench-godot-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0008.py -# was Vector — O(E) .has() per node/animation -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0008: was Vector — O(E) .has() per node/animation ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0009.py b/defects/godot/bench/bench-godot-0009.py deleted file mode 100644 index 89b29c109..000000000 --- a/defects/godot/bench/bench-godot-0009.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0009.py -# add visited HashSet to _is_cyclic to avoid O(F^D) re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0009: add visited HashSet to _is_cyclic to avoid O(F^D) re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0010.py b/defects/godot/bench/bench-godot-0010.py deleted file mode 100644 index 60db4c258..000000000 --- a/defects/godot/bench/bench-godot-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0010.py -# pass visited set to avoid O(N^2) re-traversal of shared fallback fonts -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0010: pass visited set to avoid O(N^2) re-traversal of shared fallback fonts ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0011.py b/defects/godot/bench/bench-godot-0011.py deleted file mode 100644 index f323d8794..000000000 --- a/defects/godot/bench/bench-godot-0011.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0011.py -# CWE-407: list-scan inside loop in godot-0011 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0011: CWE-407: list-scan inside loop in godot-0011 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/bench-godot-0012.py b/defects/godot/bench/bench-godot-0012.py deleted file mode 100644 index 90a239458..000000000 --- a/defects/godot/bench/bench-godot-0012.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-godot-0012.py -# CWE-407: list-scan inside loop in godot-0012 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== godot-0012: CWE-407: list-scan inside loop in godot-0012 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/godot/bench/results.txt b/defects/godot/bench/results.txt deleted file mode 100644 index 92232b915..000000000 --- a/defects/godot/bench/results.txt +++ /dev/null @@ -1,72 +0,0 @@ -=== godot-0001: was nodes.has(p_node) — O(n) linear scan, CWE-407 === -N=100 k=100 : defective=0.179ms fixed=0.006ms speedup=28.2x -N=500 k=500 : defective=2.658ms fixed=0.100ms speedup=26.5x -N=1000 k=1000 : defective=11.891ms fixed=0.053ms speedup=225.8x -N=2000 k=2000 : defective=41.191ms fixed=0.106ms speedup=390.2x - -=== godot-0002: was areas.find() — O(n) linear scan, CWE-407 === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.308ms fixed=0.022ms speedup=107.2x -N=1000 k=1000 : defective=8.631ms fixed=0.082ms speedup=105.7x -N=2000 k=2000 : defective=38.542ms fixed=0.101ms speedup=380.8x - -=== godot-0003: identical to godot-0002, 3D physics variant === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.204ms fixed=0.022ms speedup=100.5x -N=1000 k=1000 : defective=9.553ms fixed=0.195ms speedup=49.0x -N=2000 k=2000 : defective=41.043ms fixed=0.101ms speedup=406.9x - -=== godot-0004: was LocalVector with .has() — O(n) per link, O(n²) total, CWE-407 === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.207ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.645ms fixed=0.046ms speedup=189.6x -N=2000 k=2000 : defective=37.409ms fixed=0.098ms speedup=380.7x - -=== godot-0005: heap position for O(1) decrease-key === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.179ms fixed=0.022ms speedup=99.8x -N=1000 k=1000 : defective=8.957ms fixed=0.051ms speedup=177.1x -N=2000 k=2000 : defective=38.650ms fixed=0.097ms speedup=398.0x - -=== godot-0006: was Vector — O(B) .has() inside O(B) loop === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.205ms fixed=0.022ms speedup=100.6x -N=1000 k=1000 : defective=8.665ms fixed=0.046ms speedup=189.4x -N=2000 k=2000 : defective=39.427ms fixed=0.097ms speedup=405.8x - -=== godot-0007: convert to HashSet for O(1) .has() — was O(B) Vector scan per track === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.127ms fixed=0.024ms speedup=87.6x -N=1000 k=1000 : defective=12.856ms fixed=0.050ms speedup=256.9x -N=2000 k=2000 : defective=39.284ms fixed=0.096ms speedup=411.3x - -=== godot-0008: was Vector — O(E) .has() per node/animation === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.240ms fixed=0.022ms speedup=103.0x -N=1000 k=1000 : defective=9.661ms fixed=0.048ms speedup=202.6x -N=2000 k=2000 : defective=36.954ms fixed=0.097ms speedup=381.9x - -=== godot-0009: add visited HashSet to _is_cyclic to avoid O(F^D) re-traversal === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.618ms fixed=0.021ms speedup=126.1x -N=1000 k=1000 : defective=9.761ms fixed=0.143ms speedup=68.5x -N=2000 k=2000 : defective=43.654ms fixed=0.101ms speedup=431.5x - -=== godot-0010: pass visited set to avoid O(N^2) re-traversal of shared fallback fonts === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.243ms fixed=0.022ms speedup=104.1x -N=1000 k=1000 : defective=9.964ms fixed=0.050ms speedup=198.9x -N=2000 k=2000 : defective=45.701ms fixed=0.126ms speedup=362.4x - -=== godot-0011: CWE-407: list-scan inside loop in godot-0011 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.899ms fixed=0.027ms speedup=106.9x -N=1000 k=1000 : defective=12.922ms fixed=0.058ms speedup=224.2x -N=2000 k=2000 : defective=37.463ms fixed=0.106ms speedup=351.8x - -=== godot-0012: CWE-407: list-scan inside loop in godot-0012 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.323ms fixed=0.021ms speedup=110.8x -N=1000 k=1000 : defective=10.011ms fixed=0.048ms speedup=206.8x -N=2000 k=2000 : defective=37.668ms fixed=0.096ms speedup=390.9x - diff --git a/defects/godot/bench/run_all.py b/defects/godot/bench/run_all.py deleted file mode 100644 index b5f103d21..000000000 --- a/defects/godot/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-godot-0001.py", "bench-godot-0002.py", "bench-godot-0003.py", "bench-godot-0004.py", "bench-godot-0005.py", "bench-godot-0006.py", "bench-godot-0007.py", "bench-godot-0008.py", "bench-godot-0009.py", "bench-godot-0010.py", "bench-godot-0011.py", "bench-godot-0012.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gorm/Makefile b/defects/gorm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gorm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gorm/bench/bench-gorm-0001.py b/defects/gorm/bench/bench-gorm-0001.py deleted file mode 100644 index 81619c9ea..000000000 --- a/defects/gorm/bench/bench-gorm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gorm-0001.py -# callbacks.go getRIndex linear scan in sortCallbacks -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gorm-0001: callbacks.go getRIndex linear scan in sortCallbacks ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gorm/bench/results.txt b/defects/gorm/bench/results.txt deleted file mode 100644 index 4346b3f69..000000000 --- a/defects/gorm/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== gorm-0001: callbacks.go getRIndex linear scan in sortCallbacks === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.449ms fixed=0.024ms speedup=102.6x -N=1000 k=1000 : defective=10.050ms fixed=0.052ms speedup=195.0x -N=2000 k=2000 : defective=35.734ms fixed=0.098ms speedup=364.4x - diff --git a/defects/gorm/bench/run_all.py b/defects/gorm/bench/run_all.py deleted file mode 100644 index ab9f79f6c..000000000 --- a/defects/gorm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gorm-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/graal/Makefile b/defects/graal/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/graal/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/graal/bench/bench-graal-0001.py b/defects/graal/bench/bench-graal-0001.py deleted file mode 100644 index 3a42c38a9..000000000 --- a/defects/graal/bench/bench-graal-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-graal-0001.py -# RegisterVerifier.addToWorkList — ArrayList.contains() O(B²) in LSRA verification worklist -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== graal-0001: RegisterVerifier.addToWorkList — ArrayList.contains() O(B²) in LSRA verification worklist ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/graal/bench/bench-graal-0002.py b/defects/graal/bench/bench-graal-0002.py deleted file mode 100644 index 888515aa7..000000000 --- a/defects/graal/bench/bench-graal-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-graal-0002.py -# ClassfileConstant.resolveMethod/resolveField — O(2^D) diamond re-traversal without visited set -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== graal-0002: ClassfileConstant.resolveMethod/resolveField — O(2^D) diamond re-traversal without visited set ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/graal/bench/results.txt b/defects/graal/bench/results.txt deleted file mode 100644 index 8c53a6847..000000000 --- a/defects/graal/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== graal-0001: RegisterVerifier.addToWorkList — ArrayList.contains() O(B²) in LSRA verification worklist === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=103.5x -N=1000 k=1000 : defective=8.829ms fixed=0.045ms speedup=194.8x -N=2000 k=2000 : defective=35.706ms fixed=0.097ms speedup=369.6x - -=== graal-0002: ClassfileConstant.resolveMethod/resolveField — O(2^D) diamond re-traversal without visited set === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.143ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.650ms fixed=0.045ms speedup=192.0x -N=2000 k=2000 : defective=35.694ms fixed=0.097ms speedup=369.3x - diff --git a/defects/graal/bench/run_all.py b/defects/graal/bench/run_all.py deleted file mode 100644 index dd516a621..000000000 --- a/defects/graal/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-graal-0001.py", "bench-graal-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gradle/Makefile b/defects/gradle/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gradle/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gradle/bench/bench-gradle-0001.py b/defects/gradle/bench/bench-gradle-0001.py deleted file mode 100644 index c05a85fc0..000000000 --- a/defects/gradle/bench/bench-gradle-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gradle-0001.py -# CWE-407: list-scan inside loop in gradle-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gradle-0001: CWE-407: list-scan inside loop in gradle-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gradle/bench/bench-gradle-0002.py b/defects/gradle/bench/bench-gradle-0002.py deleted file mode 100644 index 0b6c4ad40..000000000 --- a/defects/gradle/bench/bench-gradle-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gradle-0002.py -# CWE-407: list-scan inside loop in gradle-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gradle-0002: CWE-407: list-scan inside loop in gradle-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gradle/bench/results.txt b/defects/gradle/bench/results.txt deleted file mode 100644 index 995397763..000000000 --- a/defects/gradle/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== gradle-0001: CWE-407: list-scan inside loop in gradle-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.331ms fixed=0.022ms speedup=105.4x -N=1000 k=1000 : defective=8.698ms fixed=0.046ms speedup=189.0x -N=2000 k=2000 : defective=35.274ms fixed=0.096ms speedup=367.8x - -=== gradle-0002: CWE-407: list-scan inside loop in gradle-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.115ms fixed=0.020ms speedup=103.5x -N=1000 k=1000 : defective=8.675ms fixed=0.046ms speedup=188.6x -N=2000 k=2000 : defective=35.541ms fixed=0.164ms speedup=216.8x - diff --git a/defects/gradle/bench/run_all.py b/defects/gradle/bench/run_all.py deleted file mode 100644 index 3279740e4..000000000 --- a/defects/gradle/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gradle-0001.py", "bench-gradle-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/grafana/Makefile b/defects/grafana/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/grafana/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/grafana/bench/bench-grafana-0001.py b/defects/grafana/bench/bench-grafana-0001.py deleted file mode 100644 index ff960c9a9..000000000 --- a/defects/grafana/bench/bench-grafana-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grafana-0001.py -# File: pkg/services/dashboards/service/dashboard_service.go -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grafana-0001: File: pkg/services/dashboards/service/dashboard_service.go ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grafana/bench/bench-grafana-0002.py b/defects/grafana/bench/bench-grafana-0002.py deleted file mode 100644 index 4a73e6a92..000000000 --- a/defects/grafana/bench/bench-grafana-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grafana-0002.py -# Files: pkg/services/folder/folderimpl/folder.go (2 sites) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grafana-0002: Files: pkg/services/folder/folderimpl/folder.go (2 sites) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grafana/bench/bench-grafana-0003.py b/defects/grafana/bench/bench-grafana-0003.py deleted file mode 100644 index be815af67..000000000 --- a/defects/grafana/bench/bench-grafana-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grafana-0003.py -# File: pkg/services/folder/folderimpl/folder.go -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grafana-0003: File: pkg/services/folder/folderimpl/folder.go ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grafana/bench/results.txt b/defects/grafana/bench/results.txt deleted file mode 100644 index c086a8e85..000000000 --- a/defects/grafana/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== grafana-0001: File: pkg/services/dashboards/service/dashboard_service.go === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.566ms fixed=0.025ms speedup=102.3x -N=1000 k=1000 : defective=10.933ms fixed=0.056ms speedup=196.4x -N=2000 k=2000 : defective=41.656ms fixed=0.098ms speedup=424.6x - -=== grafana-0002: Files: pkg/services/folder/folderimpl/folder.go (2 sites) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.107ms fixed=0.021ms speedup=100.8x -N=1000 k=1000 : defective=9.098ms fixed=0.047ms speedup=194.3x -N=2000 k=2000 : defective=35.626ms fixed=0.096ms speedup=372.8x - -=== grafana-0003: File: pkg/services/folder/folderimpl/folder.go === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.185ms fixed=0.021ms speedup=104.2x -N=1000 k=1000 : defective=8.720ms fixed=0.045ms speedup=193.4x -N=2000 k=2000 : defective=35.594ms fixed=0.098ms speedup=362.4x - diff --git a/defects/grafana/bench/run_all.py b/defects/grafana/bench/run_all.py deleted file mode 100644 index 53fe22fd3..000000000 --- a/defects/grafana/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-grafana-0001.py", "bench-grafana-0002.py", "bench-grafana-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/grape/Makefile b/defects/grape/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/grape/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/grape/bench/bench-grape-0001.py b/defects/grape/bench/bench-grape-0001.py deleted file mode 100644 index 0b0327d1f..000000000 --- a/defects/grape/bench/bench-grape-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grape-0001.py -# Grape::Validations::Validators::ValuesValidator#check_values? — values Array#include? inside param_array.all? O(P×V) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grape-0001: Grape::Validations::Validators::ValuesValidator#check_values? — values Array#include? inside param_array.all? O(P×V) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grape/bench/bench-grape-0002.py b/defects/grape/bench/bench-grape-0002.py deleted file mode 100644 index 39590c455..000000000 --- a/defects/grape/bench/bench-grape-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grape-0002.py -# Grape::Validations::Validators::ExceptValuesValidator#validate_param! — excepts Array#include? inside param_array.any? O(P×E) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grape-0002: Grape::Validations::Validators::ExceptValuesValidator#validate_param! — excepts Array#include? inside param_array.any? O(P×E) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grape/bench/bench-grape-0003.py b/defects/grape/bench/bench-grape-0003.py deleted file mode 100644 index a2f4433ce..000000000 --- a/defects/grape/bench/bench-grape-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grape-0003.py -# Grape::DSL::Routing#route — endpoints Array#any? duplicate-check on every route registration O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grape-0003: Grape::DSL::Routing#route — endpoints Array#any? duplicate-check on every route registration O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grape/bench/results.txt b/defects/grape/bench/results.txt deleted file mode 100644 index 358004694..000000000 --- a/defects/grape/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== grape-0001: Grape::Validations::Validators::ValuesValidator#check_values? — values Array#include? inside param_array.all? O(P×V) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.322ms fixed=0.023ms speedup=102.8x -N=1000 k=1000 : defective=9.871ms fixed=0.051ms speedup=195.0x -N=2000 k=2000 : defective=47.127ms fixed=0.171ms speedup=276.4x - -=== grape-0002: Grape::Validations::Validators::ExceptValuesValidator#validate_param! — excepts Array#include? inside param_array.any? O(P×E) === -N=100 k=100 : defective=0.298ms fixed=0.019ms speedup=16.0x -N=500 k=500 : defective=2.436ms fixed=0.024ms speedup=103.4x -N=1000 k=1000 : defective=11.368ms fixed=0.053ms speedup=216.4x -N=2000 k=2000 : defective=39.514ms fixed=0.104ms speedup=380.1x - -=== grape-0003: Grape::DSL::Routing#route — endpoints Array#any? duplicate-check on every route registration O(N²) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.427ms fixed=0.023ms speedup=107.1x -N=1000 k=1000 : defective=9.494ms fixed=0.048ms speedup=198.7x -N=2000 k=2000 : defective=36.981ms fixed=0.097ms speedup=382.4x - diff --git a/defects/grape/bench/run_all.py b/defects/grape/bench/run_all.py deleted file mode 100644 index b9b9951cb..000000000 --- a/defects/grape/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-grape-0001.py", "bench-grape-0002.py", "bench-grape-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/graphhopper/Makefile b/defects/graphhopper/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/graphhopper/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/graphhopper/bench/bench-graphhopper-0001.py b/defects/graphhopper/bench/bench-graphhopper-0001.py deleted file mode 100644 index 82b6364c4..000000000 --- a/defects/graphhopper/bench/bench-graphhopper-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-graphhopper-0001.py -# AlternativeRouteCH — IntArrayList.contains() O(P) inside edge loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== graphhopper-0001: AlternativeRouteCH — IntArrayList.contains() O(P) inside edge loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/graphhopper/bench/bench-graphhopper-0002.py b/defects/graphhopper/bench/bench-graphhopper-0002.py deleted file mode 100644 index 6200de327..000000000 --- a/defects/graphhopper/bench/bench-graphhopper-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-graphhopper-0002.py -# AlternativeRouteEdgeCH — IntArrayList.contains() O(P) inside edge loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== graphhopper-0002: AlternativeRouteEdgeCH — IntArrayList.contains() O(P) inside edge loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/graphhopper/bench/results.txt b/defects/graphhopper/bench/results.txt deleted file mode 100644 index 41c8a1bf9..000000000 --- a/defects/graphhopper/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== graphhopper-0001: AlternativeRouteCH — IntArrayList.contains() O(P) inside edge loop === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=3.164ms fixed=0.031ms speedup=101.5x -N=1000 k=1000 : defective=13.996ms fixed=0.071ms speedup=198.1x -N=2000 k=2000 : defective=52.932ms fixed=0.106ms speedup=501.7x - -=== graphhopper-0002: AlternativeRouteEdgeCH — IntArrayList.contains() O(P) inside edge loop === -N=100 k=100 : defective=0.147ms fixed=0.007ms speedup=20.4x -N=500 k=500 : defective=2.303ms fixed=0.022ms speedup=105.6x -N=1000 k=1000 : defective=8.713ms fixed=0.088ms speedup=99.1x -N=2000 k=2000 : defective=38.276ms fixed=0.108ms speedup=355.9x - diff --git a/defects/graphhopper/bench/run_all.py b/defects/graphhopper/bench/run_all.py deleted file mode 100644 index 02fb015cc..000000000 --- a/defects/graphhopper/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-graphhopper-0001.py", "bench-graphhopper-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/groovy/Makefile b/defects/groovy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/groovy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/groovy/bench/bench-groovy-0001.py b/defects/groovy/bench/bench-groovy-0001.py deleted file mode 100644 index 259955263..000000000 --- a/defects/groovy/bench/bench-groovy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-groovy-0001.py -# groovy-0001 — StaticTypeCheckingVisitor: `collectedNames` ArrayList linear scan O(E×C) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== groovy-0001: groovy-0001 — StaticTypeCheckingVisitor: `collectedNames` ArrayList linear scan O(E×C) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/groovy/bench/bench-groovy-0002.py b/defects/groovy/bench/bench-groovy-0002.py deleted file mode 100644 index edd5547c4..000000000 --- a/defects/groovy/bench/bench-groovy-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-groovy-0002.py -# groovy-0002 — Verifier: `Arrays.asList(params).contains(p)` fresh allocation per variable expression O(V×P) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== groovy-0002: groovy-0002 — Verifier: `Arrays.asList(params).contains(p)` fresh allocation per variable expression O(V×P) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/groovy/bench/results.txt b/defects/groovy/bench/results.txt deleted file mode 100644 index 464916373..000000000 --- a/defects/groovy/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== groovy-0001: groovy-0001 — StaticTypeCheckingVisitor: `collectedNames` ArrayList linear scan O(E×C) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.652ms fixed=0.025ms speedup=105.2x -N=1000 k=1000 : defective=10.887ms fixed=0.051ms speedup=212.5x -N=2000 k=2000 : defective=40.393ms fixed=0.104ms speedup=387.4x - -=== groovy-0002: groovy-0002 — Verifier: `Arrays.asList(params).contains(p)` fresh allocation per variable expression O(V×P) === -N=100 k=100 : defective=0.093ms fixed=0.003ms speedup=26.5x -N=500 k=500 : defective=2.326ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=9.248ms fixed=0.047ms speedup=198.8x -N=2000 k=2000 : defective=35.832ms fixed=0.096ms speedup=371.9x - diff --git a/defects/groovy/bench/run_all.py b/defects/groovy/bench/run_all.py deleted file mode 100644 index 61ce8dbbf..000000000 --- a/defects/groovy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-groovy-0001.py", "bench-groovy-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/grpc-java/Makefile b/defects/grpc-java/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/grpc-java/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/grpc-java/bench/bench-grpc-java-0001.py b/defects/grpc-java/bench/bench-grpc-java-0001.py deleted file mode 100644 index 97d2b63e1..000000000 --- a/defects/grpc-java/bench/bench-grpc-java-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-java-0001.py -# CWE-407: list-scan inside loop in grpc-java-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-java-0001: CWE-407: list-scan inside loop in grpc-java-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc-java/bench/bench-grpc-java-0002.py b/defects/grpc-java/bench/bench-grpc-java-0002.py deleted file mode 100644 index 8fab1bce0..000000000 --- a/defects/grpc-java/bench/bench-grpc-java-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-java-0002.py -# CWE-407: list-scan inside loop in grpc-java-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-java-0002: CWE-407: list-scan inside loop in grpc-java-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc-java/bench/bench-grpc-java-0003.py b/defects/grpc-java/bench/bench-grpc-java-0003.py deleted file mode 100644 index c3df598a9..000000000 --- a/defects/grpc-java/bench/bench-grpc-java-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-java-0003.py -# CWE-407: list-scan inside loop in grpc-java-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-java-0003: CWE-407: list-scan inside loop in grpc-java-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc-java/bench/results.txt b/defects/grpc-java/bench/results.txt deleted file mode 100644 index 788a8fe25..000000000 --- a/defects/grpc-java/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== grpc-java-0001: CWE-407: list-scan inside loop in grpc-java-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.117ms fixed=0.021ms speedup=102.0x -N=1000 k=1000 : defective=8.918ms fixed=0.045ms speedup=198.0x -N=2000 k=2000 : defective=35.400ms fixed=0.094ms speedup=377.5x - -=== grpc-java-0002: CWE-407: list-scan inside loop in grpc-java-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.139ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=8.651ms fixed=0.046ms speedup=189.8x -N=2000 k=2000 : defective=35.236ms fixed=0.096ms speedup=366.3x - -=== grpc-java-0003: CWE-407: list-scan inside loop in grpc-java-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.104ms fixed=0.020ms speedup=102.7x -N=1000 k=1000 : defective=8.837ms fixed=0.046ms speedup=191.5x -N=2000 k=2000 : defective=35.277ms fixed=0.097ms speedup=363.1x - diff --git a/defects/grpc-java/bench/run_all.py b/defects/grpc-java/bench/run_all.py deleted file mode 100644 index 31d838e39..000000000 --- a/defects/grpc-java/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-grpc-java-0001.py", "bench-grpc-java-0002.py", "bench-grpc-java-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/grpc/Makefile b/defects/grpc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/grpc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/grpc/bench/bench-grpc-0001.py b/defects/grpc/bench/bench-grpc-0001.py deleted file mode 100644 index 51f49798d..000000000 --- a/defects/grpc/bench/bench-grpc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-0001.py -# channelz PropertyGrid/PropertyTable GetIndex() std::find O(C²) → O(1) with absl::flat_hash_map -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-0001: channelz PropertyGrid/PropertyTable GetIndex() std::find O(C²) → O(1) with absl::flat_hash_map ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc/bench/bench-grpc-java-0001.py b/defects/grpc/bench/bench-grpc-java-0001.py deleted file mode 100644 index 97d2b63e1..000000000 --- a/defects/grpc/bench/bench-grpc-java-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-java-0001.py -# CWE-407: list-scan inside loop in grpc-java-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-java-0001: CWE-407: list-scan inside loop in grpc-java-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc/bench/bench-grpc-java-0002.py b/defects/grpc/bench/bench-grpc-java-0002.py deleted file mode 100644 index 8fab1bce0..000000000 --- a/defects/grpc/bench/bench-grpc-java-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-java-0002.py -# CWE-407: list-scan inside loop in grpc-java-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-java-0002: CWE-407: list-scan inside loop in grpc-java-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc/bench/bench-grpc-java-0003.py b/defects/grpc/bench/bench-grpc-java-0003.py deleted file mode 100644 index c3df598a9..000000000 --- a/defects/grpc/bench/bench-grpc-java-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-grpc-java-0003.py -# CWE-407: list-scan inside loop in grpc-java-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== grpc-java-0003: CWE-407: list-scan inside loop in grpc-java-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/grpc/bench/results.txt b/defects/grpc/bench/results.txt deleted file mode 100644 index 524b7166f..000000000 --- a/defects/grpc/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== grpc-0001: channelz PropertyGrid/PropertyTable GetIndex() std::find O(C²) → O(1) with absl::flat_hash_map === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.348ms fixed=0.023ms speedup=103.7x -N=1000 k=1000 : defective=8.642ms fixed=0.046ms speedup=187.7x -N=2000 k=2000 : defective=35.195ms fixed=0.096ms speedup=365.3x - -=== grpc-java-0001: CWE-407: list-scan inside loop in grpc-java-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.127ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=9.052ms fixed=0.046ms speedup=196.9x -N=2000 k=2000 : defective=35.607ms fixed=0.096ms speedup=372.5x - -=== grpc-java-0002: CWE-407: list-scan inside loop in grpc-java-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.130ms fixed=0.022ms speedup=97.4x -N=1000 k=1000 : defective=9.188ms fixed=0.046ms speedup=200.7x -N=2000 k=2000 : defective=34.729ms fixed=0.096ms speedup=361.6x - -=== grpc-java-0003: CWE-407: list-scan inside loop in grpc-java-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.107ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.986ms fixed=0.046ms speedup=195.1x -N=2000 k=2000 : defective=35.465ms fixed=0.096ms speedup=368.2x - diff --git a/defects/grpc/bench/run_all.py b/defects/grpc/bench/run_all.py deleted file mode 100644 index 2a4d41c39..000000000 --- a/defects/grpc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-grpc-0001.py", "bench-grpc-java-0001.py", "bench-grpc-java-0002.py", "bench-grpc-java-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gstreamer/Makefile b/defects/gstreamer/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gstreamer/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gstreamer/bench/bench-gstreamer-0001.py b/defects/gstreamer/bench/bench-gstreamer-0001.py deleted file mode 100644 index 2293adbe5..000000000 --- a/defects/gstreamer/bench/bench-gstreamer-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gstreamer-0001.py -# CWE-407: list-scan inside loop in gstreamer-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gstreamer-0001: CWE-407: list-scan inside loop in gstreamer-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gstreamer/bench/bench-gstreamer-0002.py b/defects/gstreamer/bench/bench-gstreamer-0002.py deleted file mode 100644 index c8ac3bf00..000000000 --- a/defects/gstreamer/bench/bench-gstreamer-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gstreamer-0002.py -# CWE-407: list-scan inside loop in gstreamer-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gstreamer-0002: CWE-407: list-scan inside loop in gstreamer-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gstreamer/bench/bench-gstreamer-0003.py b/defects/gstreamer/bench/bench-gstreamer-0003.py deleted file mode 100644 index 4396f410a..000000000 --- a/defects/gstreamer/bench/bench-gstreamer-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gstreamer-0003.py -# CWE-407: list-scan inside loop in gstreamer-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gstreamer-0003: CWE-407: list-scan inside loop in gstreamer-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gstreamer/bench/bench-gstreamer-0004.py b/defects/gstreamer/bench/bench-gstreamer-0004.py deleted file mode 100644 index f9cdde18e..000000000 --- a/defects/gstreamer/bench/bench-gstreamer-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gstreamer-0004.py -# CWE-407: list-scan inside loop in gstreamer-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gstreamer-0004: CWE-407: list-scan inside loop in gstreamer-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gstreamer/bench/bench-gstreamer-0005.py b/defects/gstreamer/bench/bench-gstreamer-0005.py deleted file mode 100644 index 002555e58..000000000 --- a/defects/gstreamer/bench/bench-gstreamer-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gstreamer-0005.py -# CWE-407: list-scan inside loop in gstreamer-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gstreamer-0005: CWE-407: list-scan inside loop in gstreamer-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gstreamer/bench/results.txt b/defects/gstreamer/bench/results.txt deleted file mode 100644 index 26ba8fec6..000000000 --- a/defects/gstreamer/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== gstreamer-0001: CWE-407: list-scan inside loop in gstreamer-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.019ms fixed=0.020ms speedup=102.0x -N=1000 k=1000 : defective=8.237ms fixed=0.078ms speedup=105.4x -N=2000 k=2000 : defective=33.638ms fixed=0.094ms speedup=357.9x - -=== gstreamer-0002: CWE-407: list-scan inside loop in gstreamer-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.022ms fixed=0.020ms speedup=102.3x -N=1000 k=1000 : defective=8.271ms fixed=0.045ms speedup=184.9x -N=2000 k=2000 : defective=35.965ms fixed=0.096ms speedup=375.9x - -=== gstreamer-0003: CWE-407: list-scan inside loop in gstreamer-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.108ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=9.330ms fixed=0.046ms speedup=205.0x -N=2000 k=2000 : defective=35.510ms fixed=0.091ms speedup=390.9x - -=== gstreamer-0004: CWE-407: list-scan inside loop in gstreamer-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.069ms fixed=0.020ms speedup=105.1x -N=1000 k=1000 : defective=9.277ms fixed=0.044ms speedup=212.2x -N=2000 k=2000 : defective=35.224ms fixed=0.093ms speedup=379.1x - -=== gstreamer-0005: CWE-407: list-scan inside loop in gstreamer-0005 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.006ms speedup=15.8x -N=500 k=500 : defective=2.312ms fixed=0.022ms speedup=103.0x -N=1000 k=1000 : defective=9.568ms fixed=0.050ms speedup=192.0x -N=2000 k=2000 : defective=33.291ms fixed=0.093ms speedup=358.1x - diff --git a/defects/gstreamer/bench/run_all.py b/defects/gstreamer/bench/run_all.py deleted file mode 100644 index deee40f2d..000000000 --- a/defects/gstreamer/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gstreamer-0001.py", "bench-gstreamer-0002.py", "bench-gstreamer-0003.py", "bench-gstreamer-0004.py", "bench-gstreamer-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/gyp/Makefile b/defects/gyp/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/gyp/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/gyp/bench/bench-gyp-0001.py b/defects/gyp/bench/bench-gyp-0001.py deleted file mode 100644 index 650faffcd..000000000 --- a/defects/gyp/bench/bench-gyp-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-gyp-0001.py -# CWE-407: list-scan inside loop in gyp-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== gyp-0001: CWE-407: list-scan inside loop in gyp-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/gyp/bench/results.txt b/defects/gyp/bench/results.txt deleted file mode 100644 index 0ccb14000..000000000 --- a/defects/gyp/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== gyp-0001: CWE-407: list-scan inside loop in gyp-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.127ms fixed=0.021ms speedup=100.6x -N=1000 k=1000 : defective=9.263ms fixed=0.049ms speedup=190.8x -N=2000 k=2000 : defective=35.612ms fixed=0.107ms speedup=333.3x - diff --git a/defects/gyp/bench/run_all.py b/defects/gyp/bench/run_all.py deleted file mode 100644 index 0d68fae73..000000000 --- a/defects/gyp/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-gyp-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hadoop-rpc/Makefile b/defects/hadoop-rpc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hadoop-rpc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hadoop-rpc/bench/bench-hadoop-rpc-0001.py b/defects/hadoop-rpc/bench/bench-hadoop-rpc-0001.py deleted file mode 100644 index b7017b859..000000000 --- a/defects/hadoop-rpc/bench/bench-hadoop-rpc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hadoop-rpc-0001.py -# CWE-407: list-scan inside loop in hadoop-rpc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hadoop-rpc-0001: CWE-407: list-scan inside loop in hadoop-rpc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hadoop-rpc/bench/results.txt b/defects/hadoop-rpc/bench/results.txt deleted file mode 100644 index 44abfcabf..000000000 --- a/defects/hadoop-rpc/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== hadoop-rpc-0001: CWE-407: list-scan inside loop in hadoop-rpc-0001 (generic model) === -N=100 k=100 : defective=0.063ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=1.709ms fixed=0.029ms speedup=58.7x -N=1000 k=1000 : defective=6.768ms fixed=0.031ms speedup=217.5x -N=2000 k=2000 : defective=23.214ms fixed=0.062ms speedup=373.9x - diff --git a/defects/hadoop-rpc/bench/run_all.py b/defects/hadoop-rpc/bench/run_all.py deleted file mode 100644 index 812c27caf..000000000 --- a/defects/hadoop-rpc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hadoop-rpc-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hadoop/Makefile b/defects/hadoop/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hadoop/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hadoop/bench/bench-hadoop-0001.py b/defects/hadoop/bench/bench-hadoop-0001.py deleted file mode 100644 index 5151c3298..000000000 --- a/defects/hadoop/bench/bench-hadoop-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hadoop-0001.py -# CWE-407: list-scan inside loop in hadoop-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hadoop-0001: CWE-407: list-scan inside loop in hadoop-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hadoop/bench/bench-hadoop-0002.py b/defects/hadoop/bench/bench-hadoop-0002.py deleted file mode 100644 index 6bb73fd6c..000000000 --- a/defects/hadoop/bench/bench-hadoop-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hadoop-0002.py -# CWE-407: list-scan inside loop in hadoop-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hadoop-0002: CWE-407: list-scan inside loop in hadoop-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hadoop/bench/bench-hadoop-0003.py b/defects/hadoop/bench/bench-hadoop-0003.py deleted file mode 100644 index 49b1287cc..000000000 --- a/defects/hadoop/bench/bench-hadoop-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hadoop-0003.py -# CWE-407: list-scan inside loop in hadoop-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hadoop-0003: CWE-407: list-scan inside loop in hadoop-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hadoop/bench/bench-hadoop-0004.py b/defects/hadoop/bench/bench-hadoop-0004.py deleted file mode 100644 index c9c9b0e6a..000000000 --- a/defects/hadoop/bench/bench-hadoop-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hadoop-0004.py -# CWE-407: list-scan inside loop in hadoop-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hadoop-0004: CWE-407: list-scan inside loop in hadoop-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hadoop/bench/bench-hadoop-rpc-0001.py b/defects/hadoop/bench/bench-hadoop-rpc-0001.py deleted file mode 100644 index b7017b859..000000000 --- a/defects/hadoop/bench/bench-hadoop-rpc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hadoop-rpc-0001.py -# CWE-407: list-scan inside loop in hadoop-rpc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hadoop-rpc-0001: CWE-407: list-scan inside loop in hadoop-rpc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hadoop/bench/results.txt b/defects/hadoop/bench/results.txt deleted file mode 100644 index 36e607770..000000000 --- a/defects/hadoop/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== hadoop-0001: CWE-407: list-scan inside loop in hadoop-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.121ms fixed=0.021ms speedup=102.8x -N=1000 k=1000 : defective=8.774ms fixed=0.047ms speedup=185.2x -N=2000 k=2000 : defective=35.475ms fixed=0.095ms speedup=374.9x - -=== hadoop-0002: CWE-407: list-scan inside loop in hadoop-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.260ms fixed=0.020ms speedup=115.2x -N=1000 k=1000 : defective=8.256ms fixed=0.043ms speedup=191.2x -N=2000 k=2000 : defective=33.444ms fixed=0.091ms speedup=365.8x - -=== hadoop-0003: CWE-407: list-scan inside loop in hadoop-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.019ms fixed=0.020ms speedup=101.9x -N=1000 k=1000 : defective=8.238ms fixed=0.044ms speedup=186.0x -N=2000 k=2000 : defective=38.221ms fixed=0.096ms speedup=399.0x - -=== hadoop-0004: CWE-407: list-scan inside loop in hadoop-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.113ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.292ms fixed=0.045ms speedup=186.2x -N=2000 k=2000 : defective=33.793ms fixed=0.092ms speedup=367.2x - -=== hadoop-rpc-0001: CWE-407: list-scan inside loop in hadoop-rpc-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.068ms fixed=0.019ms speedup=106.8x -N=1000 k=1000 : defective=8.659ms fixed=0.044ms speedup=196.9x -N=2000 k=2000 : defective=33.567ms fixed=0.091ms speedup=368.7x - diff --git a/defects/hadoop/bench/run_all.py b/defects/hadoop/bench/run_all.py deleted file mode 100644 index d5b6a80bc..000000000 --- a/defects/hadoop/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hadoop-0001.py", "bench-hadoop-0002.py", "bench-hadoop-0003.py", "bench-hadoop-0004.py", "bench-hadoop-rpc-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hanami/Makefile b/defects/hanami/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hanami/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hanami/bench/bench-hanami-0001.py b/defects/hanami/bench/bench-hanami-0001.py deleted file mode 100644 index df50653ff..000000000 --- a/defects/hanami/bench/bench-hanami-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hanami-0001.py -# Defect ID : hanami-0001 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hanami-0001: Defect ID : hanami-0001 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hanami/bench/results.txt b/defects/hanami/bench/results.txt deleted file mode 100644 index a494a4b7c..000000000 --- a/defects/hanami/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== hanami-0001: Defect ID : hanami-0001 === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.567ms fixed=0.025ms speedup=101.3x -N=1000 k=1000 : defective=10.554ms fixed=0.055ms speedup=192.9x -N=2000 k=2000 : defective=41.776ms fixed=0.119ms speedup=352.3x - diff --git a/defects/hanami/bench/run_all.py b/defects/hanami/bench/run_all.py deleted file mode 100644 index 518b01ef3..000000000 --- a/defects/hanami/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hanami-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/haproxy/Makefile b/defects/haproxy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/haproxy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/haproxy/bench/bench-haproxy-0001.py b/defects/haproxy/bench/bench-haproxy-0001.py deleted file mode 100644 index 97308f7ee..000000000 --- a/defects/haproxy/bench/bench-haproxy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-haproxy-0001.py -# CWE-407: list-scan inside loop in haproxy-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== haproxy-0001: CWE-407: list-scan inside loop in haproxy-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/haproxy/bench/bench-haproxy-0002.py b/defects/haproxy/bench/bench-haproxy-0002.py deleted file mode 100644 index 1c66e165b..000000000 --- a/defects/haproxy/bench/bench-haproxy-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-haproxy-0002.py -# haproxy-0002 — flt_spoe.c SPOE message/group duplicate detection O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== haproxy-0002: haproxy-0002 — flt_spoe.c SPOE message/group duplicate detection O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/haproxy/bench/bench-haproxy-0003.py b/defects/haproxy/bench/bench-haproxy-0003.py deleted file mode 100644 index 0be5ad748..000000000 --- a/defects/haproxy/bench/bench-haproxy-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-haproxy-0003.py -# haproxy-0003 — flt_spoe.c spoe_check_config O(P×M), O(P×G), O(G×P×M) resolution loops -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== haproxy-0003: haproxy-0003 — flt_spoe.c spoe_check_config O(P×M), O(P×G), O(G×P×M) resolution loops ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/haproxy/bench/bench-haproxy-0004.py b/defects/haproxy/bench/bench-haproxy-0004.py deleted file mode 100644 index 33b18ccbe..000000000 --- a/defects/haproxy/bench/bench-haproxy-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-haproxy-0004.py -# haproxy-0004 — http_capture_headers O(H×C) per-request header capture scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== haproxy-0004: haproxy-0004 — http_capture_headers O(H×C) per-request header capture scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/haproxy/bench/results.txt b/defects/haproxy/bench/results.txt deleted file mode 100644 index ea10a0f4e..000000000 --- a/defects/haproxy/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== haproxy-0001: CWE-407: list-scan inside loop in haproxy-0001 (generic model) === -N=100 k=100 : defective=0.082ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.036ms fixed=0.019ms speedup=104.6x -N=1000 k=1000 : defective=8.803ms fixed=0.049ms speedup=179.6x -N=2000 k=2000 : defective=35.459ms fixed=0.093ms speedup=381.8x - -=== haproxy-0002: haproxy-0002 — flt_spoe.c SPOE message/group duplicate detection O(N²) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.019ms fixed=0.019ms speedup=103.9x -N=1000 k=1000 : defective=8.339ms fixed=0.045ms speedup=187.1x -N=2000 k=2000 : defective=35.672ms fixed=0.097ms speedup=369.3x - -=== haproxy-0003: haproxy-0003 — flt_spoe.c spoe_check_config O(P×M), O(P×G), O(G×P×M) resolution loops === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.277ms fixed=0.020ms speedup=112.4x -N=1000 k=1000 : defective=9.027ms fixed=0.079ms speedup=113.9x -N=2000 k=2000 : defective=37.120ms fixed=0.097ms speedup=381.6x - -=== haproxy-0004: haproxy-0004 — http_capture_headers O(H×C) per-request header capture scan === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.177ms fixed=0.020ms speedup=107.7x -N=1000 k=1000 : defective=9.698ms fixed=0.045ms speedup=213.3x -N=2000 k=2000 : defective=37.376ms fixed=0.149ms speedup=251.5x - diff --git a/defects/haproxy/bench/run_all.py b/defects/haproxy/bench/run_all.py deleted file mode 100644 index 6793f9b41..000000000 --- a/defects/haproxy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-haproxy-0001.py", "bench-haproxy-0002.py", "bench-haproxy-0003.py", "bench-haproxy-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hatari-0001/Makefile b/defects/hatari-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hatari-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hatari-0001/bench/bench-hatari-0001-0001.py b/defects/hatari-0001/bench/bench-hatari-0001-0001.py deleted file mode 100644 index 4e694b521..000000000 --- a/defects/hatari-0001/bench/bench-hatari-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hatari-0001-0001.py -# CWE-407: list-scan inside loop in hatari-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hatari-0001-0001: CWE-407: list-scan inside loop in hatari-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hatari-0001/bench/results.txt b/defects/hatari-0001/bench/results.txt deleted file mode 100644 index e9c8b9be4..000000000 --- a/defects/hatari-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== hatari-0001-0001: CWE-407: list-scan inside loop in hatari-0001-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.743ms fixed=0.027ms speedup=102.5x -N=1000 k=1000 : defective=11.127ms fixed=0.059ms speedup=188.7x -N=2000 k=2000 : defective=37.134ms fixed=0.096ms speedup=384.9x - diff --git a/defects/hatari-0001/bench/run_all.py b/defects/hatari-0001/bench/run_all.py deleted file mode 100644 index d4d4f358d..000000000 --- a/defects/hatari-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hatari-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hazelcast/Makefile b/defects/hazelcast/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hazelcast/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hazelcast/bench/bench-hazelcast-0001.py b/defects/hazelcast/bench/bench-hazelcast-0001.py deleted file mode 100644 index 37048d22d..000000000 --- a/defects/hazelcast/bench/bench-hazelcast-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hazelcast-0001.py -# SerializationUtil.getInterfaces — O(2^D) diamond re-traversal; Collections.addAll() return value ignored -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hazelcast-0001: SerializationUtil.getInterfaces — O(2^D) diamond re-traversal; Collections.addAll() return value ignored ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hazelcast/bench/bench-hazelcast-0002.py b/defects/hazelcast/bench/bench-hazelcast-0002.py deleted file mode 100644 index e4d03a1d9..000000000 --- a/defects/hazelcast/bench/bench-hazelcast-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hazelcast-0002.py -# ClassLoaderUtil.addOwnInterfaces — O(2^D) diamond re-traversal; Collections.addAll() return value ignored -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hazelcast-0002: ClassLoaderUtil.addOwnInterfaces — O(2^D) diamond re-traversal; Collections.addAll() return value ignored ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hazelcast/bench/bench-hazelcast-0003.py b/defects/hazelcast/bench/bench-hazelcast-0003.py deleted file mode 100644 index 9303731ce..000000000 --- a/defects/hazelcast/bench/bench-hazelcast-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hazelcast-0003.py -# ProbeUtils.flatten — O(2^D) diamond re-traversal; result.add() return value ignored before recursion -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hazelcast-0003: ProbeUtils.flatten — O(2^D) diamond re-traversal; result.add() return value ignored before recursion ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hazelcast/bench/results.txt b/defects/hazelcast/bench/results.txt deleted file mode 100644 index 4fb9abba6..000000000 --- a/defects/hazelcast/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== hazelcast-0001: SerializationUtil.getInterfaces — O(2^D) diamond re-traversal; Collections.addAll() return value ignored === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.210ms fixed=0.021ms speedup=107.3x -N=1000 k=1000 : defective=8.734ms fixed=0.046ms speedup=190.0x -N=2000 k=2000 : defective=35.204ms fixed=0.095ms speedup=369.4x - -=== hazelcast-0002: ClassLoaderUtil.addOwnInterfaces — O(2^D) diamond re-traversal; Collections.addAll() return value ignored === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.296ms fixed=0.022ms speedup=105.7x -N=1000 k=1000 : defective=8.698ms fixed=0.046ms speedup=190.9x -N=2000 k=2000 : defective=34.782ms fixed=0.096ms speedup=361.9x - -=== hazelcast-0003: ProbeUtils.flatten — O(2^D) diamond re-traversal; result.add() return value ignored before recursion === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.111ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=8.774ms fixed=0.046ms speedup=192.5x -N=2000 k=2000 : defective=34.941ms fixed=0.098ms speedup=357.6x - diff --git a/defects/hazelcast/bench/run_all.py b/defects/hazelcast/bench/run_all.py deleted file mode 100644 index 6d8c3d557..000000000 --- a/defects/hazelcast/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hazelcast-0001.py", "bench-hazelcast-0002.py", "bench-hazelcast-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hbase/Makefile b/defects/hbase/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hbase/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hbase/bench/bench-hbase-0001.py b/defects/hbase/bench/bench-hbase-0001.py deleted file mode 100644 index 8ed147d98..000000000 --- a/defects/hbase/bench/bench-hbase-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hbase-0001.py -# CWE-407: list-scan inside loop in hbase-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hbase-0001: CWE-407: list-scan inside loop in hbase-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hbase/bench/bench-hbase-0002.py b/defects/hbase/bench/bench-hbase-0002.py deleted file mode 100644 index 7c18ce3bf..000000000 --- a/defects/hbase/bench/bench-hbase-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hbase-0002.py -# CWE-407: list-scan inside loop in hbase-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hbase-0002: CWE-407: list-scan inside loop in hbase-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hbase/bench/results.txt b/defects/hbase/bench/results.txt deleted file mode 100644 index 2bb7756ca..000000000 --- a/defects/hbase/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== hbase-0001: CWE-407: list-scan inside loop in hbase-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=23.6x -N=500 k=500 : defective=2.098ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=8.692ms fixed=0.045ms speedup=194.8x -N=2000 k=2000 : defective=35.021ms fixed=0.097ms speedup=361.3x - -=== hbase-0002: CWE-407: list-scan inside loop in hbase-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.081ms fixed=0.021ms speedup=100.3x -N=1000 k=1000 : defective=8.597ms fixed=0.046ms speedup=185.2x -N=2000 k=2000 : defective=34.864ms fixed=0.096ms speedup=362.0x - diff --git a/defects/hbase/bench/run_all.py b/defects/hbase/bench/run_all.py deleted file mode 100644 index 46abc3259..000000000 --- a/defects/hbase/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hbase-0001.py", "bench-hbase-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/helm/Makefile b/defects/helm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/helm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/helm/bench/bench-helm-0001.py b/defects/helm/bench/bench-helm-0001.py deleted file mode 100644 index a0b937435..000000000 --- a/defects/helm/bench/bench-helm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-helm-0001.py -# CWE-407: list-scan inside loop in helm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== helm-0001: CWE-407: list-scan inside loop in helm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/helm/bench/bench-helm-0002.py b/defects/helm/bench/bench-helm-0002.py deleted file mode 100644 index 6db91e034..000000000 --- a/defects/helm/bench/bench-helm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-helm-0002.py -# CWE-407: list-scan inside loop in helm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== helm-0002: CWE-407: list-scan inside loop in helm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/helm/bench/bench-helm-0003.py b/defects/helm/bench/bench-helm-0003.py deleted file mode 100644 index 1d1b52648..000000000 --- a/defects/helm/bench/bench-helm-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-helm-0003.py -# CWE-407: list-scan inside loop in helm-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== helm-0003: CWE-407: list-scan inside loop in helm-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/helm/bench/results.txt b/defects/helm/bench/results.txt deleted file mode 100644 index 15b9ad948..000000000 --- a/defects/helm/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== helm-0001: CWE-407: list-scan inside loop in helm-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.302ms fixed=0.023ms speedup=101.1x -N=1000 k=1000 : defective=8.624ms fixed=0.046ms speedup=189.3x -N=2000 k=2000 : defective=36.124ms fixed=0.098ms speedup=369.9x - -=== helm-0002: CWE-407: list-scan inside loop in helm-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.103ms fixed=0.021ms speedup=100.0x -N=1000 k=1000 : defective=8.817ms fixed=0.045ms speedup=194.6x -N=2000 k=2000 : defective=37.015ms fixed=0.100ms speedup=370.7x - -=== helm-0003: CWE-407: list-scan inside loop in helm-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.271ms fixed=0.022ms speedup=102.5x -N=1000 k=1000 : defective=8.697ms fixed=0.046ms speedup=191.1x -N=2000 k=2000 : defective=35.799ms fixed=0.096ms speedup=373.1x - diff --git a/defects/helm/bench/run_all.py b/defects/helm/bench/run_all.py deleted file mode 100644 index 04bb93434..000000000 --- a/defects/helm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-helm-0001.py", "bench-helm-0002.py", "bench-helm-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hibernate-orm-0001/Makefile b/defects/hibernate-orm-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hibernate-orm-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hibernate-orm-0001/bench/bench-hibernate-orm-0001-0001.py b/defects/hibernate-orm-0001/bench/bench-hibernate-orm-0001-0001.py deleted file mode 100644 index f3d8d855d..000000000 --- a/defects/hibernate-orm-0001/bench/bench-hibernate-orm-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-orm-0001-0001.py -# CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-orm-0001-0001: CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-orm-0001/bench/bench-hibernate-orm-0001.py b/defects/hibernate-orm-0001/bench/bench-hibernate-orm-0001.py deleted file mode 100644 index 7d0532dc4..000000000 --- a/defects/hibernate-orm-0001/bench/bench-hibernate-orm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-orm-0001.py -# Defect: hibernate-orm-0001 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-orm-0001: Defect: hibernate-orm-0001 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-orm-0001/bench/results.txt b/defects/hibernate-orm-0001/bench/results.txt deleted file mode 100644 index 2801916a1..000000000 --- a/defects/hibernate-orm-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== hibernate-orm-0001-0001: CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.417ms fixed=0.024ms speedup=102.1x -N=1000 k=1000 : defective=10.159ms fixed=0.052ms speedup=194.2x -N=2000 k=2000 : defective=36.634ms fixed=0.096ms speedup=380.3x - -=== hibernate-orm-0001: Defect: hibernate-orm-0001 === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.125ms fixed=0.022ms speedup=96.9x -N=1000 k=1000 : defective=8.650ms fixed=0.046ms speedup=189.4x -N=2000 k=2000 : defective=35.081ms fixed=0.097ms speedup=362.2x - diff --git a/defects/hibernate-orm-0001/bench/run_all.py b/defects/hibernate-orm-0001/bench/run_all.py deleted file mode 100644 index 0df4c8efd..000000000 --- a/defects/hibernate-orm-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hibernate-orm-0001-0001.py", "bench-hibernate-orm-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hibernate-orm/Makefile b/defects/hibernate-orm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hibernate-orm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hibernate-orm/bench/bench-hibernate-orm-0001-0001.py b/defects/hibernate-orm/bench/bench-hibernate-orm-0001-0001.py deleted file mode 100644 index f3d8d855d..000000000 --- a/defects/hibernate-orm/bench/bench-hibernate-orm-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-orm-0001-0001.py -# CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-orm-0001-0001: CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-orm/bench/bench-hibernate-orm-0001.py b/defects/hibernate-orm/bench/bench-hibernate-orm-0001.py deleted file mode 100644 index a6de16cc4..000000000 --- a/defects/hibernate-orm/bench/bench-hibernate-orm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-orm-0001.py -# CWE-407: list-scan inside loop in hibernate-orm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-orm-0001: CWE-407: list-scan inside loop in hibernate-orm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-orm/bench/results.txt b/defects/hibernate-orm/bench/results.txt deleted file mode 100644 index 57d0be032..000000000 --- a/defects/hibernate-orm/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== hibernate-orm-0001-0001: CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.211ms fixed=0.023ms speedup=98.1x -N=1000 k=1000 : defective=8.865ms fixed=0.046ms speedup=192.0x -N=2000 k=2000 : defective=36.620ms fixed=0.097ms speedup=377.0x - -=== hibernate-orm-0001: CWE-407: list-scan inside loop in hibernate-orm-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.209ms fixed=0.021ms speedup=104.2x -N=1000 k=1000 : defective=8.754ms fixed=0.047ms speedup=187.5x -N=2000 k=2000 : defective=35.289ms fixed=0.097ms speedup=363.5x - diff --git a/defects/hibernate-orm/bench/run_all.py b/defects/hibernate-orm/bench/run_all.py deleted file mode 100644 index 0df4c8efd..000000000 --- a/defects/hibernate-orm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hibernate-orm-0001-0001.py", "bench-hibernate-orm-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hibernate-validator/Makefile b/defects/hibernate-validator/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hibernate-validator/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hibernate-validator/bench/bench-hibernate-validator-0001.py b/defects/hibernate-validator/bench/bench-hibernate-validator-0001.py deleted file mode 100644 index b6426edf3..000000000 --- a/defects/hibernate-validator/bench/bench-hibernate-validator-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-validator-0001.py -# CWE-407: list-scan inside loop in hibernate-validator-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-validator-0001: CWE-407: list-scan inside loop in hibernate-validator-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-validator/bench/bench-hibernate-validator-0002.py b/defects/hibernate-validator/bench/bench-hibernate-validator-0002.py deleted file mode 100644 index ec05b1d87..000000000 --- a/defects/hibernate-validator/bench/bench-hibernate-validator-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-validator-0002.py -# CWE-407: list-scan inside loop in hibernate-validator-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-validator-0002: CWE-407: list-scan inside loop in hibernate-validator-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-validator/bench/bench-hibernate-validator-0003.py b/defects/hibernate-validator/bench/bench-hibernate-validator-0003.py deleted file mode 100644 index b9a13f6ab..000000000 --- a/defects/hibernate-validator/bench/bench-hibernate-validator-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-validator-0003.py -# ClassHierarchyHelper.getImplementedInterfaces — O(2^D) diamond re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-validator-0003: ClassHierarchyHelper.getImplementedInterfaces — O(2^D) diamond re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate-validator/bench/results.txt b/defects/hibernate-validator/bench/results.txt deleted file mode 100644 index d69bdd13f..000000000 --- a/defects/hibernate-validator/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== hibernate-validator-0001: CWE-407: list-scan inside loop in hibernate-validator-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.311ms fixed=0.023ms speedup=102.2x -N=1000 k=1000 : defective=8.614ms fixed=0.046ms speedup=187.2x -N=2000 k=2000 : defective=35.333ms fixed=0.111ms speedup=317.4x - -=== hibernate-validator-0002: CWE-407: list-scan inside loop in hibernate-validator-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.420ms fixed=0.023ms speedup=105.7x -N=1000 k=1000 : defective=9.863ms fixed=0.049ms speedup=202.1x -N=2000 k=2000 : defective=34.651ms fixed=0.096ms speedup=360.6x - -=== hibernate-validator-0003: ClassHierarchyHelper.getImplementedInterfaces — O(2^D) diamond re-traversal === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.101ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.568ms fixed=0.044ms speedup=192.8x -N=2000 k=2000 : defective=34.726ms fixed=0.096ms speedup=361.7x - diff --git a/defects/hibernate-validator/bench/run_all.py b/defects/hibernate-validator/bench/run_all.py deleted file mode 100644 index 03ca4ac28..000000000 --- a/defects/hibernate-validator/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hibernate-validator-0001.py", "bench-hibernate-validator-0002.py", "bench-hibernate-validator-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hibernate/Makefile b/defects/hibernate/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hibernate/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hibernate/bench/bench-hibernate-0001.py b/defects/hibernate/bench/bench-hibernate-0001.py deleted file mode 100644 index 71a8b3c76..000000000 --- a/defects/hibernate/bench/bench-hibernate-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0001.py -# CWE-407: list-scan inside loop in hibernate-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0001: CWE-407: list-scan inside loop in hibernate-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-0002.py b/defects/hibernate/bench/bench-hibernate-0002.py deleted file mode 100644 index 41dc538a9..000000000 --- a/defects/hibernate/bench/bench-hibernate-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0002.py -# CWE-407: list-scan inside loop in hibernate-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0002: CWE-407: list-scan inside loop in hibernate-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-0003.py b/defects/hibernate/bench/bench-hibernate-0003.py deleted file mode 100644 index e4080d94e..000000000 --- a/defects/hibernate/bench/bench-hibernate-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0003.py -# CWE-407: list-scan inside loop in hibernate-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0003: CWE-407: list-scan inside loop in hibernate-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-0004.py b/defects/hibernate/bench/bench-hibernate-0004.py deleted file mode 100644 index eda2092df..000000000 --- a/defects/hibernate/bench/bench-hibernate-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0004.py -# CWE-407: list-scan inside loop in hibernate-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0004: CWE-407: list-scan inside loop in hibernate-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-0005.py b/defects/hibernate/bench/bench-hibernate-0005.py deleted file mode 100644 index 71eed6840..000000000 --- a/defects/hibernate/bench/bench-hibernate-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0005.py -# CWE-407: list-scan inside loop in hibernate-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0005: CWE-407: list-scan inside loop in hibernate-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-0006.py b/defects/hibernate/bench/bench-hibernate-0006.py deleted file mode 100644 index 31c41537d..000000000 --- a/defects/hibernate/bench/bench-hibernate-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0006.py -# AbstractEntityPersister — O(T²) alias dedup in subclass property closure -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0006: AbstractEntityPersister — O(T²) alias dedup in subclass property closure ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-0007.py b/defects/hibernate/bench/bench-hibernate-0007.py deleted file mode 100644 index d8a0bd513..000000000 --- a/defects/hibernate/bench/bench-hibernate-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-0007.py -# CWE-407: list-scan inside loop in hibernate-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-0007: CWE-407: list-scan inside loop in hibernate-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-orm-0001-0001.py b/defects/hibernate/bench/bench-hibernate-orm-0001-0001.py deleted file mode 100644 index f3d8d855d..000000000 --- a/defects/hibernate/bench/bench-hibernate-orm-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-orm-0001-0001.py -# CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-orm-0001-0001: CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-orm-0001.py b/defects/hibernate/bench/bench-hibernate-orm-0001.py deleted file mode 100644 index a6de16cc4..000000000 --- a/defects/hibernate/bench/bench-hibernate-orm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-orm-0001.py -# CWE-407: list-scan inside loop in hibernate-orm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-orm-0001: CWE-407: list-scan inside loop in hibernate-orm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-validator-0001.py b/defects/hibernate/bench/bench-hibernate-validator-0001.py deleted file mode 100644 index b6426edf3..000000000 --- a/defects/hibernate/bench/bench-hibernate-validator-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-validator-0001.py -# CWE-407: list-scan inside loop in hibernate-validator-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-validator-0001: CWE-407: list-scan inside loop in hibernate-validator-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-validator-0002.py b/defects/hibernate/bench/bench-hibernate-validator-0002.py deleted file mode 100644 index ec05b1d87..000000000 --- a/defects/hibernate/bench/bench-hibernate-validator-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-validator-0002.py -# CWE-407: list-scan inside loop in hibernate-validator-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-validator-0002: CWE-407: list-scan inside loop in hibernate-validator-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/bench-hibernate-validator-0003.py b/defects/hibernate/bench/bench-hibernate-validator-0003.py deleted file mode 100644 index c6d628206..000000000 --- a/defects/hibernate/bench/bench-hibernate-validator-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hibernate-validator-0003.py -# CWE-407: list-scan inside loop in hibernate-validator-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hibernate-validator-0003: CWE-407: list-scan inside loop in hibernate-validator-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hibernate/bench/results.txt b/defects/hibernate/bench/results.txt deleted file mode 100644 index 7cae8c299..000000000 --- a/defects/hibernate/bench/results.txt +++ /dev/null @@ -1,72 +0,0 @@ -=== hibernate-0001: CWE-407: list-scan inside loop in hibernate-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.429ms fixed=0.023ms speedup=105.1x -N=1000 k=1000 : defective=9.370ms fixed=0.046ms speedup=202.2x -N=2000 k=2000 : defective=50.130ms fixed=0.111ms speedup=451.4x - -=== hibernate-0002: CWE-407: list-scan inside loop in hibernate-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.524ms fixed=0.022ms speedup=112.9x -N=1000 k=1000 : defective=9.466ms fixed=0.073ms speedup=129.6x -N=2000 k=2000 : defective=39.100ms fixed=0.097ms speedup=401.3x - -=== hibernate-0003: CWE-407: list-scan inside loop in hibernate-0003 (generic model) === -N=100 k=100 : defective=0.137ms fixed=0.006ms speedup=24.4x -N=500 k=500 : defective=2.154ms fixed=0.021ms speedup=104.1x -N=1000 k=1000 : defective=8.839ms fixed=0.048ms speedup=183.5x -N=2000 k=2000 : defective=36.895ms fixed=0.101ms speedup=364.1x - -=== hibernate-0004: CWE-407: list-scan inside loop in hibernate-0004 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.275ms fixed=0.021ms speedup=106.6x -N=1000 k=1000 : defective=9.624ms fixed=0.051ms speedup=189.5x -N=2000 k=2000 : defective=37.629ms fixed=0.096ms speedup=391.1x - -=== hibernate-0005: CWE-407: list-scan inside loop in hibernate-0005 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.123ms fixed=0.021ms speedup=102.8x -N=1000 k=1000 : defective=8.970ms fixed=0.047ms speedup=191.7x -N=2000 k=2000 : defective=37.509ms fixed=0.096ms speedup=389.1x - -=== hibernate-0006: AbstractEntityPersister — O(T²) alias dedup in subclass property closure === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.180ms fixed=0.087ms speedup=24.9x -N=1000 k=1000 : defective=8.980ms fixed=0.046ms speedup=194.6x -N=2000 k=2000 : defective=38.517ms fixed=0.101ms speedup=380.0x - -=== hibernate-0007: CWE-407: list-scan inside loop in hibernate-0007 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.432ms fixed=0.023ms speedup=105.4x -N=1000 k=1000 : defective=9.653ms fixed=0.048ms speedup=201.9x -N=2000 k=2000 : defective=38.185ms fixed=0.098ms speedup=389.9x - -=== hibernate-orm-0001-0001: CWE-407: list-scan inside loop in hibernate-orm-0001-0001 (generic model) === -N=100 k=100 : defective=0.124ms fixed=0.003ms speedup=36.4x -N=500 k=500 : defective=2.142ms fixed=0.021ms speedup=101.4x -N=1000 k=1000 : defective=8.706ms fixed=0.046ms speedup=191.3x -N=2000 k=2000 : defective=35.734ms fixed=0.097ms speedup=369.4x - -=== hibernate-orm-0001: CWE-407: list-scan inside loop in hibernate-orm-0001 (generic model) === -N=100 k=100 : defective=0.087ms fixed=0.005ms speedup=16.7x -N=500 k=500 : defective=2.376ms fixed=0.020ms speedup=117.7x -N=1000 k=1000 : defective=9.399ms fixed=0.051ms speedup=185.6x -N=2000 k=2000 : defective=38.396ms fixed=0.111ms speedup=346.7x - -=== hibernate-validator-0001: CWE-407: list-scan inside loop in hibernate-validator-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.393ms fixed=0.023ms speedup=105.1x -N=1000 k=1000 : defective=10.357ms fixed=0.048ms speedup=214.8x -N=2000 k=2000 : defective=37.866ms fixed=0.096ms speedup=394.9x - -=== hibernate-validator-0002: CWE-407: list-scan inside loop in hibernate-validator-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.245ms fixed=0.091ms speedup=24.7x -N=1000 k=1000 : defective=10.835ms fixed=0.048ms speedup=226.6x -N=2000 k=2000 : defective=40.859ms fixed=0.098ms speedup=415.7x - -=== hibernate-validator-0003: CWE-407: list-scan inside loop in hibernate-validator-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.005ms speedup=15.5x -N=500 k=500 : defective=2.130ms fixed=0.038ms speedup=56.0x -N=1000 k=1000 : defective=10.518ms fixed=0.045ms speedup=233.1x -N=2000 k=2000 : defective=38.370ms fixed=0.106ms speedup=361.0x - diff --git a/defects/hibernate/bench/run_all.py b/defects/hibernate/bench/run_all.py deleted file mode 100644 index 62bcf9baa..000000000 --- a/defects/hibernate/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hibernate-0001.py", "bench-hibernate-0002.py", "bench-hibernate-0003.py", "bench-hibernate-0004.py", "bench-hibernate-0005.py", "bench-hibernate-0006.py", "bench-hibernate-0007.py", "bench-hibernate-orm-0001-0001.py", "bench-hibernate-orm-0001.py", "bench-hibernate-validator-0001.py", "bench-hibernate-validator-0002.py", "bench-hibernate-validator-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hive/Makefile b/defects/hive/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hive/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hive/bench/bench-hive-0001.py b/defects/hive/bench/bench-hive-0001.py deleted file mode 100644 index 06cd3d75f..000000000 --- a/defects/hive/bench/bench-hive-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hive-0001.py -# CWE-407: list-scan inside loop in hive-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hive-0001: CWE-407: list-scan inside loop in hive-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hive/bench/bench-hive-0002.py b/defects/hive/bench/bench-hive-0002.py deleted file mode 100644 index e6bcab7ac..000000000 --- a/defects/hive/bench/bench-hive-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hive-0002.py -# CWE-407: list-scan inside loop in hive-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hive-0002: CWE-407: list-scan inside loop in hive-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hive/bench/bench-hive-0003.py b/defects/hive/bench/bench-hive-0003.py deleted file mode 100644 index af7bc94c4..000000000 --- a/defects/hive/bench/bench-hive-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hive-0003.py -# TaskTracker.updateTaskCount ArrayList visited O(T²) in REPL DAG traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hive-0003: TaskTracker.updateTaskCount ArrayList visited O(T²) in REPL DAG traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hive/bench/bench-hive-0004.py b/defects/hive/bench/bench-hive-0004.py deleted file mode 100644 index d27ce437c..000000000 --- a/defects/hive/bench/bench-hive-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hive-0004.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hive-0004: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hive/bench/bench-hive-0005.py b/defects/hive/bench/bench-hive-0005.py deleted file mode 100644 index ba965d384..000000000 --- a/defects/hive/bench/bench-hive-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hive-0005.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hive-0005: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hive/bench/results.txt b/defects/hive/bench/results.txt deleted file mode 100644 index bc0d42001..000000000 --- a/defects/hive/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== hive-0001: CWE-407: list-scan inside loop in hive-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.071ms fixed=0.020ms speedup=105.0x -N=1000 k=1000 : defective=8.613ms fixed=0.045ms speedup=193.2x -N=2000 k=2000 : defective=35.155ms fixed=0.091ms speedup=385.2x - -=== hive-0002: CWE-407: list-scan inside loop in hive-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.0x -N=500 k=500 : defective=2.207ms fixed=0.020ms speedup=111.6x -N=1000 k=1000 : defective=8.506ms fixed=0.044ms speedup=193.7x -N=2000 k=2000 : defective=34.957ms fixed=0.092ms speedup=378.7x - -=== hive-0003: TaskTracker.updateTaskCount ArrayList visited O(T²) in REPL DAG traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.023ms fixed=0.020ms speedup=101.2x -N=1000 k=1000 : defective=8.590ms fixed=0.043ms speedup=200.9x -N=2000 k=2000 : defective=34.308ms fixed=0.094ms speedup=366.2x - -=== hive-0004: Severity: MEDIUM === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.014ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=8.437ms fixed=0.043ms speedup=194.0x -N=2000 k=2000 : defective=37.239ms fixed=0.096ms speedup=388.1x - -=== hive-0005: Severity: MEDIUM === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.130ms fixed=0.020ms speedup=106.1x -N=1000 k=1000 : defective=8.620ms fixed=0.044ms speedup=195.3x -N=2000 k=2000 : defective=33.924ms fixed=0.094ms speedup=362.1x - diff --git a/defects/hive/bench/run_all.py b/defects/hive/bench/run_all.py deleted file mode 100644 index 96b3f6122..000000000 --- a/defects/hive/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hive-0001.py", "bench-hive-0002.py", "bench-hive-0003.py", "bench-hive-0004.py", "bench-hive-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/httpd/Makefile b/defects/httpd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/httpd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/httpd/bench/bench-httpd-0001.py b/defects/httpd/bench/bench-httpd-0001.py deleted file mode 100644 index 54c7dc0e5..000000000 --- a/defects/httpd/bench/bench-httpd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-httpd-0001.py -# CWE-407: list-scan inside loop in httpd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== httpd-0001: CWE-407: list-scan inside loop in httpd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/httpd/bench/bench-httpd-0002.py b/defects/httpd/bench/bench-httpd-0002.py deleted file mode 100644 index e5162c672..000000000 --- a/defects/httpd/bench/bench-httpd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-httpd-0002.py -# httpd-0002 — mod_proxy NoProxy/DirectConnect config-parse O(N²) dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== httpd-0002: httpd-0002 — mod_proxy NoProxy/DirectConnect config-parse O(N²) dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/httpd/bench/bench-httpd-0003.py b/defects/httpd/bench/bench-httpd-0003.py deleted file mode 100644 index 64fb32e2d..000000000 --- a/defects/httpd/bench/bench-httpd-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-httpd-0003.py -# ssl_hook_Access_classic cipher set comparison O(N×M) → O(N+M) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== httpd-0003: ssl_hook_Access_classic cipher set comparison O(N×M) → O(N+M) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/httpd/bench/bench-httpd-0004.py b/defects/httpd/bench/bench-httpd-0004.py deleted file mode 100644 index 2a67c1650..000000000 --- a/defects/httpd/bench/bench-httpd-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-httpd-0004.py -# find_route_worker redirect chain O(N²) → O(N) with route hash map -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== httpd-0004: find_route_worker redirect chain O(N²) → O(N) with route hash map ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/httpd/bench/results.txt b/defects/httpd/bench/results.txt deleted file mode 100644 index c201d6fd2..000000000 --- a/defects/httpd/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== httpd-0001: CWE-407: list-scan inside loop in httpd-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=8.689ms fixed=0.046ms speedup=190.1x -N=2000 k=2000 : defective=33.837ms fixed=0.093ms speedup=365.2x - -=== httpd-0002: httpd-0002 — mod_proxy NoProxy/DirectConnect config-parse O(N²) dedup === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.109ms fixed=0.035ms speedup=60.1x -N=1000 k=1000 : defective=8.282ms fixed=0.044ms speedup=187.1x -N=2000 k=2000 : defective=33.502ms fixed=0.093ms speedup=361.2x - -=== httpd-0003: ssl_hook_Access_classic cipher set comparison O(N×M) → O(N+M) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.014ms fixed=0.020ms speedup=102.9x -N=1000 k=1000 : defective=8.258ms fixed=0.044ms speedup=188.2x -N=2000 k=2000 : defective=34.805ms fixed=0.091ms speedup=382.9x - -=== httpd-0004: find_route_worker redirect chain O(N²) → O(N) with route hash map === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.014ms fixed=0.020ms speedup=100.6x -N=1000 k=1000 : defective=8.292ms fixed=0.044ms speedup=190.0x -N=2000 k=2000 : defective=36.171ms fixed=0.090ms speedup=400.6x - diff --git a/defects/httpd/bench/run_all.py b/defects/httpd/bench/run_all.py deleted file mode 100644 index f37aa710f..000000000 --- a/defects/httpd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-httpd-0001.py", "bench-httpd-0002.py", "bench-httpd-0003.py", "bench-httpd-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hudi/Makefile b/defects/hudi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hudi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hudi/bench/bench-hudi-0001.py b/defects/hudi/bench/bench-hudi-0001.py deleted file mode 100644 index 30df9e506..000000000 --- a/defects/hudi/bench/bench-hudi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hudi-0001.py -# hudi-0001 — BaseHoodieTimeline.appendLoadedInstants List.contains O(N×M) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hudi-0001: hudi-0001 — BaseHoodieTimeline.appendLoadedInstants List.contains O(N×M) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hudi/bench/bench-hudi-0002.py b/defects/hudi/bench/bench-hudi-0002.py deleted file mode 100644 index 46e90e4d3..000000000 --- a/defects/hudi/bench/bench-hudi-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hudi-0002.py -# hudi-0002 — InternalSchemaUtils.pruneInternalSchema ArrayList.contains O(N²) + pruneType O(F×D) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hudi-0002: hudi-0002 — InternalSchemaUtils.pruneInternalSchema ArrayList.contains O(N²) + pruneType O(F×D) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hudi/bench/bench-hudi-0003.py b/defects/hudi/bench/bench-hudi-0003.py deleted file mode 100644 index 4369f7904..000000000 --- a/defects/hudi/bench/bench-hudi-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hudi-0003.py -# hudi-0003 — HoodieTableMetadataUtil.getRevivedAndDeletedKeysFromMergedLogs List.contains O(N×M) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hudi-0003: hudi-0003 — HoodieTableMetadataUtil.getRevivedAndDeletedKeysFromMergedLogs List.contains O(N×M) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hudi/bench/results.txt b/defects/hudi/bench/results.txt deleted file mode 100644 index 74406bb86..000000000 --- a/defects/hudi/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== hudi-0001: hudi-0001 — BaseHoodieTimeline.appendLoadedInstants List.contains O(N×M) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.339ms fixed=0.021ms speedup=109.7x -N=1000 k=1000 : defective=9.902ms fixed=0.045ms speedup=219.5x -N=2000 k=2000 : defective=36.729ms fixed=0.098ms speedup=373.9x - -=== hudi-0002: hudi-0002 — InternalSchemaUtils.pruneInternalSchema ArrayList.contains O(N²) + pruneType O(F×D) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.235ms fixed=0.021ms speedup=104.9x -N=1000 k=1000 : defective=8.873ms fixed=0.048ms speedup=184.7x -N=2000 k=2000 : defective=35.255ms fixed=0.097ms speedup=363.1x - -=== hudi-0003: hudi-0003 — HoodieTableMetadataUtil.getRevivedAndDeletedKeysFromMergedLogs List.contains O(N×M) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=8.769ms fixed=0.046ms speedup=192.6x -N=2000 k=2000 : defective=35.731ms fixed=0.097ms speedup=369.1x - diff --git a/defects/hudi/bench/run_all.py b/defects/hudi/bench/run_all.py deleted file mode 100644 index 6b227a178..000000000 --- a/defects/hudi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hudi-0001.py", "bench-hudi-0002.py", "bench-hudi-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hurd/Makefile b/defects/hurd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hurd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hurd/bench/bench-hurd-0001.py b/defects/hurd/bench/bench-hurd-0001.py deleted file mode 100644 index c855d3004..000000000 --- a/defects/hurd/bench/bench-hurd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hurd-0001.py -# CWE-407: list-scan inside loop in hurd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hurd-0001: CWE-407: list-scan inside loop in hurd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hurd/bench/bench-hurd-0002.py b/defects/hurd/bench/bench-hurd-0002.py deleted file mode 100644 index 72b530165..000000000 --- a/defects/hurd/bench/bench-hurd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hurd-0002.py -# CWE-407: list-scan inside loop in hurd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hurd-0002: CWE-407: list-scan inside loop in hurd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hurd/bench/bench-hurd-0003.py b/defects/hurd/bench/bench-hurd-0003.py deleted file mode 100644 index 8a23babcf..000000000 --- a/defects/hurd/bench/bench-hurd-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hurd-0003.py -# CWE-407: list-scan inside loop in hurd-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hurd-0003: CWE-407: list-scan inside loop in hurd-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hurd/bench/bench-hurd-0004.py b/defects/hurd/bench/bench-hurd-0004.py deleted file mode 100644 index 09df34ee2..000000000 --- a/defects/hurd/bench/bench-hurd-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hurd-0004.py -# CWE-407: list-scan inside loop in hurd-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hurd-0004: CWE-407: list-scan inside loop in hurd-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hurd/bench/bench-hurd-0005.py b/defects/hurd/bench/bench-hurd-0005.py deleted file mode 100644 index e60428e29..000000000 --- a/defects/hurd/bench/bench-hurd-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hurd-0005.py -# CWE-407: list-scan inside loop in hurd-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hurd-0005: CWE-407: list-scan inside loop in hurd-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hurd/bench/bench-hurd-0006.py b/defects/hurd/bench/bench-hurd-0006.py deleted file mode 100644 index ede76e86b..000000000 --- a/defects/hurd/bench/bench-hurd-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hurd-0006.py -# CWE-407: list-scan inside loop in hurd-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hurd-0006: CWE-407: list-scan inside loop in hurd-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hurd/bench/results.txt b/defects/hurd/bench/results.txt deleted file mode 100644 index 6515615b3..000000000 --- a/defects/hurd/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== hurd-0001: CWE-407: list-scan inside loop in hurd-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.494ms fixed=0.023ms speedup=107.5x -N=1000 k=1000 : defective=10.446ms fixed=0.053ms speedup=198.9x -N=2000 k=2000 : defective=42.891ms fixed=0.107ms speedup=401.9x - -=== hurd-0002: CWE-407: list-scan inside loop in hurd-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.431ms fixed=0.022ms speedup=108.2x -N=1000 k=1000 : defective=9.260ms fixed=0.048ms speedup=194.7x -N=2000 k=2000 : defective=38.509ms fixed=0.095ms speedup=404.8x - -=== hurd-0003: CWE-407: list-scan inside loop in hurd-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.196ms fixed=0.020ms speedup=107.9x -N=1000 k=1000 : defective=8.730ms fixed=0.049ms speedup=176.6x -N=2000 k=2000 : defective=41.551ms fixed=0.098ms speedup=422.9x - -=== hurd-0004: CWE-407: list-scan inside loop in hurd-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.329ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=8.860ms fixed=0.046ms speedup=192.0x -N=2000 k=2000 : defective=37.309ms fixed=0.102ms speedup=364.9x - -=== hurd-0005: CWE-407: list-scan inside loop in hurd-0005 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.237ms fixed=0.023ms speedup=98.7x -N=1000 k=1000 : defective=9.051ms fixed=0.045ms speedup=202.9x -N=2000 k=2000 : defective=36.295ms fixed=0.097ms speedup=372.8x - -=== hurd-0006: CWE-407: list-scan inside loop in hurd-0006 (generic model) === -N=100 k=100 : defective=0.140ms fixed=0.006ms speedup=22.1x -N=500 k=500 : defective=2.174ms fixed=0.020ms speedup=107.1x -N=1000 k=1000 : defective=9.256ms fixed=0.050ms speedup=186.2x -N=2000 k=2000 : defective=35.437ms fixed=0.108ms speedup=329.2x - diff --git a/defects/hurd/bench/run_all.py b/defects/hurd/bench/run_all.py deleted file mode 100644 index 92562fb99..000000000 --- a/defects/hurd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hurd-0001.py", "bench-hurd-0002.py", "bench-hurd-0003.py", "bench-hurd-0004.py", "bench-hurd-0005.py", "bench-hurd-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/hv/Makefile b/defects/hv/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/hv/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/hv/bench/bench-hv-0001.py b/defects/hv/bench/bench-hv-0001.py deleted file mode 100644 index e97f34241..000000000 --- a/defects/hv/bench/bench-hv-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hv-0001.py -# CWE-407: list-scan inside loop in hv-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hv-0001: CWE-407: list-scan inside loop in hv-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hv/bench/bench-hv-0002.py b/defects/hv/bench/bench-hv-0002.py deleted file mode 100644 index 64ba2057f..000000000 --- a/defects/hv/bench/bench-hv-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-hv-0002.py -# CWE-407: list-scan inside loop in hv-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== hv-0002: CWE-407: list-scan inside loop in hv-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/hv/bench/results.txt b/defects/hv/bench/results.txt deleted file mode 100644 index a3a58ccf6..000000000 --- a/defects/hv/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== hv-0001: CWE-407: list-scan inside loop in hv-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.885ms fixed=0.045ms speedup=63.7x -N=1000 k=1000 : defective=15.419ms fixed=0.058ms speedup=265.0x -N=2000 k=2000 : defective=60.044ms fixed=0.114ms speedup=525.1x - -=== hv-0002: CWE-407: list-scan inside loop in hv-0002 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.006ms speedup=16.2x -N=500 k=500 : defective=3.943ms fixed=0.024ms speedup=165.2x -N=1000 k=1000 : defective=12.056ms fixed=0.052ms speedup=230.4x -N=2000 k=2000 : defective=56.153ms fixed=0.106ms speedup=527.8x - diff --git a/defects/hv/bench/run_all.py b/defects/hv/bench/run_all.py deleted file mode 100644 index 8019320dc..000000000 --- a/defects/hv/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-hv-0001.py", "bench-hv-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/iceberg/Makefile b/defects/iceberg/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/iceberg/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/iceberg/bench/bench-iceberg-0001.py b/defects/iceberg/bench/bench-iceberg-0001.py deleted file mode 100644 index f66a73157..000000000 --- a/defects/iceberg/bench/bench-iceberg-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-iceberg-0001.py -# iceberg-0001 — SchemaUpdate.ApplyChanges List deletes O(F×D) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== iceberg-0001: iceberg-0001 — SchemaUpdate.ApplyChanges List deletes O(F×D) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/iceberg/bench/results.txt b/defects/iceberg/bench/results.txt deleted file mode 100644 index d013ba8fe..000000000 --- a/defects/iceberg/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== iceberg-0001: iceberg-0001 — SchemaUpdate.ApplyChanges List deletes O(F×D) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.176ms fixed=0.021ms speedup=105.2x -N=1000 k=1000 : defective=8.803ms fixed=0.048ms speedup=183.2x -N=2000 k=2000 : defective=36.625ms fixed=0.185ms speedup=198.4x - diff --git a/defects/iceberg/bench/run_all.py b/defects/iceberg/bench/run_all.py deleted file mode 100644 index 214c9dc63..000000000 --- a/defects/iceberg/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-iceberg-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/igraph/Makefile b/defects/igraph/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/igraph/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/igraph/bench/bench-igraph-0001.py b/defects/igraph/bench/bench-igraph-0001.py deleted file mode 100644 index 1050bc705..000000000 --- a/defects/igraph/bench/bench-igraph-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-igraph-0001.py -# CWE-407: list-scan inside loop in igraph-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== igraph-0001: CWE-407: list-scan inside loop in igraph-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/igraph/bench/results.txt b/defects/igraph/bench/results.txt deleted file mode 100644 index 7d8f3c50a..000000000 --- a/defects/igraph/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== igraph-0001: CWE-407: list-scan inside loop in igraph-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.700ms fixed=0.022ms speedup=125.2x -N=1000 k=1000 : defective=9.556ms fixed=0.089ms speedup=107.8x -N=2000 k=2000 : defective=51.466ms fixed=0.097ms speedup=533.1x - diff --git a/defects/igraph/bench/run_all.py b/defects/igraph/bench/run_all.py deleted file mode 100644 index 5bad410e1..000000000 --- a/defects/igraph/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-igraph-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/imagemagick/Makefile b/defects/imagemagick/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/imagemagick/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/imagemagick/bench/bench-imagemagick-0001.py b/defects/imagemagick/bench/bench-imagemagick-0001.py deleted file mode 100644 index 42133d2b5..000000000 --- a/defects/imagemagick/bench/bench-imagemagick-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-imagemagick-0001.py -# File: coders/uhdr.c -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== imagemagick-0001: File: coders/uhdr.c ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/imagemagick/bench/bench-imagemagick-0002.py b/defects/imagemagick/bench/bench-imagemagick-0002.py deleted file mode 100644 index d9fee4140..000000000 --- a/defects/imagemagick/bench/bench-imagemagick-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-imagemagick-0002.py -# File: MagickCore/list.c -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== imagemagick-0002: File: MagickCore/list.c ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/imagemagick/bench/results.txt b/defects/imagemagick/bench/results.txt deleted file mode 100644 index 86606aee6..000000000 --- a/defects/imagemagick/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== imagemagick-0001: File: coders/uhdr.c === -N=100 k=100 : defective=0.216ms fixed=0.016ms speedup=13.6x -N=500 k=500 : defective=3.729ms fixed=0.025ms speedup=148.1x -N=1000 k=1000 : defective=11.207ms fixed=0.056ms speedup=200.1x -N=2000 k=2000 : defective=35.423ms fixed=0.098ms speedup=363.2x - -=== imagemagick-0002: File: MagickCore/list.c === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.113ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.687ms fixed=0.045ms speedup=192.2x -N=2000 k=2000 : defective=35.187ms fixed=0.095ms speedup=369.2x - diff --git a/defects/imagemagick/bench/run_all.py b/defects/imagemagick/bench/run_all.py deleted file mode 100644 index d137c2b6e..000000000 --- a/defects/imagemagick/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-imagemagick-0001.py", "bench-imagemagick-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/influxdb/Makefile b/defects/influxdb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/influxdb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/influxdb/bench/bench-influxdb-0001.py b/defects/influxdb/bench/bench-influxdb-0001.py deleted file mode 100644 index 4aff7d1d3..000000000 --- a/defects/influxdb/bench/bench-influxdb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-influxdb-0001.py -# CWE-407: list-scan inside loop in influxdb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== influxdb-0001: CWE-407: list-scan inside loop in influxdb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/influxdb/bench/bench-influxdb-0002.py b/defects/influxdb/bench/bench-influxdb-0002.py deleted file mode 100644 index c62c2a10c..000000000 --- a/defects/influxdb/bench/bench-influxdb-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-influxdb-0002.py -# CWE-407: list-scan inside loop in influxdb-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== influxdb-0002: CWE-407: list-scan inside loop in influxdb-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/influxdb/bench/results.txt b/defects/influxdb/bench/results.txt deleted file mode 100644 index 550040dff..000000000 --- a/defects/influxdb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== influxdb-0001: CWE-407: list-scan inside loop in influxdb-0001 (generic model) === -N=100 k=100 : defective=0.121ms fixed=0.005ms speedup=25.6x -N=500 k=500 : defective=3.120ms fixed=0.029ms speedup=106.4x -N=1000 k=1000 : defective=13.355ms fixed=0.064ms speedup=208.1x -N=2000 k=2000 : defective=37.690ms fixed=0.097ms speedup=388.1x - -=== influxdb-0002: CWE-407: list-scan inside loop in influxdb-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.107ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=8.855ms fixed=0.046ms speedup=192.4x -N=2000 k=2000 : defective=35.764ms fixed=0.097ms speedup=369.4x - diff --git a/defects/influxdb/bench/run_all.py b/defects/influxdb/bench/run_all.py deleted file mode 100644 index 714f2f7a2..000000000 --- a/defects/influxdb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-influxdb-0001.py", "bench-influxdb-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/inkscape/Makefile b/defects/inkscape/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/inkscape/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/inkscape/bench/bench-inkscape-0001.py b/defects/inkscape/bench/bench-inkscape-0001.py deleted file mode 100644 index c290172a5..000000000 --- a/defects/inkscape/bench/bench-inkscape-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-inkscape-0001.py -# SPObject::getLinkedRecursive() builds a vector of linked objects by recursively -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== inkscape-0001: SPObject::getLinkedRecursive() builds a vector of linked objects by recursively ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/inkscape/bench/bench-inkscape-0002.py b/defects/inkscape/bench/bench-inkscape-0002.py deleted file mode 100644 index 1389df363..000000000 --- a/defects/inkscape/bench/bench-inkscape-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-inkscape-0002.py -# ObjectSet::raise() and ObjectSet::lower() iterate over selected objects, and for -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== inkscape-0002: ObjectSet::raise() and ObjectSet::lower() iterate over selected objects, and for ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/inkscape/bench/bench-inkscape-0003.py b/defects/inkscape/bench/bench-inkscape-0003.py deleted file mode 100644 index 5c84fac2b..000000000 --- a/defects/inkscape/bench/bench-inkscape-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-inkscape-0003.py -# get_all_items_recursive() iterates over all children in the document tree. -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== inkscape-0003: get_all_items_recursive() iterates over all children in the document tree. ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/inkscape/bench/bench-inkscape-0004.py b/defects/inkscape/bench/bench-inkscape-0004.py deleted file mode 100644 index 6b186bb37..000000000 --- a/defects/inkscape/bench/bench-inkscape-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-inkscape-0004.py -# File: src/layer-manager.cpp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== inkscape-0004: File: src/layer-manager.cpp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/inkscape/bench/results.txt b/defects/inkscape/bench/results.txt deleted file mode 100644 index c009578a2..000000000 --- a/defects/inkscape/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== inkscape-0001: SPObject::getLinkedRecursive() builds a vector of linked objects by recursively === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.073ms fixed=0.021ms speedup=101.1x -N=1000 k=1000 : defective=8.708ms fixed=0.045ms speedup=191.7x -N=2000 k=2000 : defective=34.716ms fixed=0.093ms speedup=372.8x - -=== inkscape-0002: ObjectSet::raise() and ObjectSet::lower() iterate over selected objects, and for === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.010ms fixed=0.020ms speedup=100.7x -N=1000 k=1000 : defective=8.381ms fixed=0.044ms speedup=192.1x -N=2000 k=2000 : defective=33.452ms fixed=0.092ms speedup=365.3x - -=== inkscape-0003: get_all_items_recursive() iterates over all children in the document tree. === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.015ms fixed=0.020ms speedup=99.9x -N=1000 k=1000 : defective=8.402ms fixed=0.045ms speedup=185.2x -N=2000 k=2000 : defective=33.271ms fixed=0.093ms speedup=359.2x - -=== inkscape-0004: File: src/layer-manager.cpp === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.012ms fixed=0.020ms speedup=100.3x -N=1000 k=1000 : defective=8.277ms fixed=0.044ms speedup=188.1x -N=2000 k=2000 : defective=33.509ms fixed=0.093ms speedup=361.3x - diff --git a/defects/inkscape/bench/run_all.py b/defects/inkscape/bench/run_all.py deleted file mode 100644 index 7aa583359..000000000 --- a/defects/inkscape/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-inkscape-0001.py", "bench-inkscape-0002.py", "bench-inkscape-0003.py", "bench-inkscape-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/invoiceninja-0001/Makefile b/defects/invoiceninja-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/invoiceninja-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/invoiceninja-0001/bench/bench-invoiceninja-0001-0001.py b/defects/invoiceninja-0001/bench/bench-invoiceninja-0001-0001.py deleted file mode 100644 index fc67e42a0..000000000 --- a/defects/invoiceninja-0001/bench/bench-invoiceninja-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-invoiceninja-0001-0001.py -# CWE-407: list-scan inside loop in invoiceninja-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== invoiceninja-0001-0001: CWE-407: list-scan inside loop in invoiceninja-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/invoiceninja-0001/bench/results.txt b/defects/invoiceninja-0001/bench/results.txt deleted file mode 100644 index 2aa26970f..000000000 --- a/defects/invoiceninja-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== invoiceninja-0001-0001: CWE-407: list-scan inside loop in invoiceninja-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.163ms fixed=0.021ms speedup=104.1x -N=1000 k=1000 : defective=9.008ms fixed=0.046ms speedup=197.0x -N=2000 k=2000 : defective=44.616ms fixed=0.105ms speedup=423.1x - diff --git a/defects/invoiceninja-0001/bench/run_all.py b/defects/invoiceninja-0001/bench/run_all.py deleted file mode 100644 index 371e56e24..000000000 --- a/defects/invoiceninja-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-invoiceninja-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/invoiceninja-0002/Makefile b/defects/invoiceninja-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/invoiceninja-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/invoiceninja-0002/bench/bench-invoiceninja-0002-0002.py b/defects/invoiceninja-0002/bench/bench-invoiceninja-0002-0002.py deleted file mode 100644 index 73851d425..000000000 --- a/defects/invoiceninja-0002/bench/bench-invoiceninja-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-invoiceninja-0002-0002.py -# CWE-407: list-scan inside loop in invoiceninja-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== invoiceninja-0002-0002: CWE-407: list-scan inside loop in invoiceninja-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/invoiceninja-0002/bench/results.txt b/defects/invoiceninja-0002/bench/results.txt deleted file mode 100644 index 42b05d9e5..000000000 --- a/defects/invoiceninja-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== invoiceninja-0002-0002: CWE-407: list-scan inside loop in invoiceninja-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.453ms fixed=0.022ms speedup=109.9x -N=1000 k=1000 : defective=8.892ms fixed=0.045ms speedup=198.2x -N=2000 k=2000 : defective=36.924ms fixed=0.096ms speedup=384.6x - diff --git a/defects/invoiceninja-0002/bench/run_all.py b/defects/invoiceninja-0002/bench/run_all.py deleted file mode 100644 index 07f55abb2..000000000 --- a/defects/invoiceninja-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-invoiceninja-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/invoiceninja-0003/Makefile b/defects/invoiceninja-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/invoiceninja-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/invoiceninja-0003/bench/bench-invoiceninja-0003-0003.py b/defects/invoiceninja-0003/bench/bench-invoiceninja-0003-0003.py deleted file mode 100644 index 55d869019..000000000 --- a/defects/invoiceninja-0003/bench/bench-invoiceninja-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-invoiceninja-0003-0003.py -# CWE-407: list-scan inside loop in invoiceninja-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== invoiceninja-0003-0003: CWE-407: list-scan inside loop in invoiceninja-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/invoiceninja-0003/bench/results.txt b/defects/invoiceninja-0003/bench/results.txt deleted file mode 100644 index 1a0009e53..000000000 --- a/defects/invoiceninja-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== invoiceninja-0003-0003: CWE-407: list-scan inside loop in invoiceninja-0003-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.290ms fixed=0.020ms speedup=113.4x -N=1000 k=1000 : defective=8.872ms fixed=0.047ms speedup=187.7x -N=2000 k=2000 : defective=40.281ms fixed=0.100ms speedup=401.2x - diff --git a/defects/invoiceninja-0003/bench/run_all.py b/defects/invoiceninja-0003/bench/run_all.py deleted file mode 100644 index 70cd349d7..000000000 --- a/defects/invoiceninja-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-invoiceninja-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/invoiceninja-0004/Makefile b/defects/invoiceninja-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/invoiceninja-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/invoiceninja-0004/bench/bench-invoiceninja-0004-0004.py b/defects/invoiceninja-0004/bench/bench-invoiceninja-0004-0004.py deleted file mode 100644 index afad0dc45..000000000 --- a/defects/invoiceninja-0004/bench/bench-invoiceninja-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-invoiceninja-0004-0004.py -# CWE-407: list-scan inside loop in invoiceninja-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== invoiceninja-0004-0004: CWE-407: list-scan inside loop in invoiceninja-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/invoiceninja-0004/bench/results.txt b/defects/invoiceninja-0004/bench/results.txt deleted file mode 100644 index 68703108e..000000000 --- a/defects/invoiceninja-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== invoiceninja-0004-0004: CWE-407: list-scan inside loop in invoiceninja-0004-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.380ms fixed=0.023ms speedup=103.5x -N=1000 k=1000 : defective=9.543ms fixed=0.046ms speedup=205.6x -N=2000 k=2000 : defective=37.329ms fixed=0.097ms speedup=384.6x - diff --git a/defects/invoiceninja-0004/bench/run_all.py b/defects/invoiceninja-0004/bench/run_all.py deleted file mode 100644 index e73bf7407..000000000 --- a/defects/invoiceninja-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-invoiceninja-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/invoiceninja-0005/Makefile b/defects/invoiceninja-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/invoiceninja-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/invoiceninja-0005/bench/bench-invoiceninja-0005-0005.py b/defects/invoiceninja-0005/bench/bench-invoiceninja-0005-0005.py deleted file mode 100644 index 96e063cc4..000000000 --- a/defects/invoiceninja-0005/bench/bench-invoiceninja-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-invoiceninja-0005-0005.py -# CWE-407: list-scan inside loop in invoiceninja-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== invoiceninja-0005-0005: CWE-407: list-scan inside loop in invoiceninja-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/invoiceninja-0005/bench/results.txt b/defects/invoiceninja-0005/bench/results.txt deleted file mode 100644 index b0222784d..000000000 --- a/defects/invoiceninja-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== invoiceninja-0005-0005: CWE-407: list-scan inside loop in invoiceninja-0005-0005 (generic model) === -N=100 k=100 : defective=0.100ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.331ms fixed=0.023ms speedup=102.7x -N=1000 k=1000 : defective=9.637ms fixed=0.051ms speedup=190.7x -N=2000 k=2000 : defective=35.063ms fixed=0.096ms speedup=363.6x - diff --git a/defects/invoiceninja-0005/bench/run_all.py b/defects/invoiceninja-0005/bench/run_all.py deleted file mode 100644 index 1ad471a56..000000000 --- a/defects/invoiceninja-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-invoiceninja-0005-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ipfs-cluster-0001/Makefile b/defects/ipfs-cluster-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ipfs-cluster-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ipfs-cluster-0001/bench/bench-ipfs-cluster-0001-0001.py b/defects/ipfs-cluster-0001/bench/bench-ipfs-cluster-0001-0001.py deleted file mode 100644 index 1e5181d5e..000000000 --- a/defects/ipfs-cluster-0001/bench/bench-ipfs-cluster-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ipfs-cluster-0001-0001.py -# CWE-407: list-scan inside loop in ipfs-cluster-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ipfs-cluster-0001-0001: CWE-407: list-scan inside loop in ipfs-cluster-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ipfs-cluster-0001/bench/results.txt b/defects/ipfs-cluster-0001/bench/results.txt deleted file mode 100644 index e46041672..000000000 --- a/defects/ipfs-cluster-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ipfs-cluster-0001-0001: CWE-407: list-scan inside loop in ipfs-cluster-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.309ms fixed=0.023ms speedup=100.7x -N=1000 k=1000 : defective=9.201ms fixed=0.108ms speedup=85.0x -N=2000 k=2000 : defective=35.601ms fixed=0.101ms speedup=352.8x - diff --git a/defects/ipfs-cluster-0001/bench/run_all.py b/defects/ipfs-cluster-0001/bench/run_all.py deleted file mode 100644 index 294c98a6a..000000000 --- a/defects/ipfs-cluster-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ipfs-cluster-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/iroh-0001/Makefile b/defects/iroh-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/iroh-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/iroh-0001/bench/bench-iroh-0001-0001.py b/defects/iroh-0001/bench/bench-iroh-0001-0001.py deleted file mode 100644 index 64acd21ef..000000000 --- a/defects/iroh-0001/bench/bench-iroh-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-iroh-0001-0001.py -# CWE-407: list-scan inside loop in iroh-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== iroh-0001-0001: CWE-407: list-scan inside loop in iroh-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/iroh-0001/bench/results.txt b/defects/iroh-0001/bench/results.txt deleted file mode 100644 index ff10d2e12..000000000 --- a/defects/iroh-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== iroh-0001-0001: CWE-407: list-scan inside loop in iroh-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.366ms fixed=0.022ms speedup=105.2x -N=1000 k=1000 : defective=8.658ms fixed=0.044ms speedup=194.7x -N=2000 k=2000 : defective=35.143ms fixed=0.096ms speedup=366.7x - diff --git a/defects/iroh-0001/bench/run_all.py b/defects/iroh-0001/bench/run_all.py deleted file mode 100644 index 0658bc249..000000000 --- a/defects/iroh-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-iroh-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/irssi-0001/Makefile b/defects/irssi-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/irssi-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/irssi-0001/bench/bench-irssi-0001-0001.py b/defects/irssi-0001/bench/bench-irssi-0001-0001.py deleted file mode 100644 index 2f63c7501..000000000 --- a/defects/irssi-0001/bench/bench-irssi-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-irssi-0001-0001.py -# CWE-407: list-scan inside loop in irssi-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== irssi-0001-0001: CWE-407: list-scan inside loop in irssi-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/irssi-0001/bench/results.txt b/defects/irssi-0001/bench/results.txt deleted file mode 100644 index 5d8285a0f..000000000 --- a/defects/irssi-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== irssi-0001-0001: CWE-407: list-scan inside loop in irssi-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=27.7x -N=500 k=500 : defective=2.309ms fixed=0.023ms speedup=102.6x -N=1000 k=1000 : defective=8.843ms fixed=0.046ms speedup=193.0x -N=2000 k=2000 : defective=38.916ms fixed=0.102ms speedup=383.3x - diff --git a/defects/irssi-0001/bench/run_all.py b/defects/irssi-0001/bench/run_all.py deleted file mode 100644 index 4ce0d222f..000000000 --- a/defects/irssi-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-irssi-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/istio/Makefile b/defects/istio/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/istio/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/istio/bench/bench-istio-0001.py b/defects/istio/bench/bench-istio-0001.py deleted file mode 100644 index 29b9f92dc..000000000 --- a/defects/istio/bench/bench-istio-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-istio-0001.py -# CWE-407: list-scan inside loop in istio-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== istio-0001: CWE-407: list-scan inside loop in istio-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/istio/bench/bench-istio-0002.py b/defects/istio/bench/bench-istio-0002.py deleted file mode 100644 index 9e585ce60..000000000 --- a/defects/istio/bench/bench-istio-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-istio-0002.py -# CWE-407: list-scan inside loop in istio-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== istio-0002: CWE-407: list-scan inside loop in istio-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/istio/bench/bench-istio-0003.py b/defects/istio/bench/bench-istio-0003.py deleted file mode 100644 index 178e7cb93..000000000 --- a/defects/istio/bench/bench-istio-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-istio-0003.py -# CWE-407 — O(FC×P×M×A) linear protocol scan in filterChainMatch during xDS push -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== istio-0003: CWE-407 — O(FC×P×M×A) linear protocol scan in filterChainMatch during xDS push ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/istio/bench/bench-istio-0004.py b/defects/istio/bench/bench-istio-0004.py deleted file mode 100644 index 120327f4e..000000000 --- a/defects/istio/bench/bench-istio-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-istio-0004.py -# CWE-407: list-scan inside loop in istio-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== istio-0004: CWE-407: list-scan inside loop in istio-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/istio/bench/results.txt b/defects/istio/bench/results.txt deleted file mode 100644 index dbf444117..000000000 --- a/defects/istio/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== istio-0001: CWE-407: list-scan inside loop in istio-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.112ms fixed=0.019ms speedup=108.8x -N=1000 k=1000 : defective=8.192ms fixed=0.043ms speedup=189.5x -N=2000 k=2000 : defective=33.475ms fixed=0.093ms speedup=361.9x - -=== istio-0002: CWE-407: list-scan inside loop in istio-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.024ms fixed=0.019ms speedup=105.4x -N=1000 k=1000 : defective=8.195ms fixed=0.044ms speedup=185.1x -N=2000 k=2000 : defective=33.453ms fixed=0.094ms speedup=357.3x - -=== istio-0003: CWE-407 — O(FC×P×M×A) linear protocol scan in filterChainMatch during xDS push === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.013ms fixed=0.019ms speedup=105.3x -N=1000 k=1000 : defective=8.730ms fixed=0.044ms speedup=197.7x -N=2000 k=2000 : defective=35.182ms fixed=0.092ms speedup=383.1x - -=== istio-0004: CWE-407: list-scan inside loop in istio-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.027ms fixed=0.020ms speedup=100.7x -N=1000 k=1000 : defective=8.357ms fixed=0.044ms speedup=188.4x -N=2000 k=2000 : defective=34.847ms fixed=0.093ms speedup=374.5x - diff --git a/defects/istio/bench/run_all.py b/defects/istio/bench/run_all.py deleted file mode 100644 index b4f204927..000000000 --- a/defects/istio/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-istio-0001.py", "bench-istio-0002.py", "bench-istio-0003.py", "bench-istio-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jackson/Makefile b/defects/jackson/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jackson/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jackson/bench/bench-jackson-0001.py b/defects/jackson/bench/bench-jackson-0001.py deleted file mode 100644 index 38215e7fc..000000000 --- a/defects/jackson/bench/bench-jackson-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jackson-0001.py -# AnnotatedClassResolver._addSuperTypes/Interfaces — O(N²) custom _contains() list scan in type hierarchy collection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jackson-0001: AnnotatedClassResolver._addSuperTypes/Interfaces — O(N²) custom _contains() list scan in type hierarchy collection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jackson/bench/bench-jackson-0002.py b/defects/jackson/bench/bench-jackson-0002.py deleted file mode 100644 index a768f2dcd..000000000 --- a/defects/jackson/bench/bench-jackson-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jackson-0002.py -# ClassUtil._addRawSuperTypes — ArrayList.contains() O(N²) in recursive supertype collection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jackson-0002: ClassUtil._addRawSuperTypes — ArrayList.contains() O(N²) in recursive supertype collection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jackson/bench/results.txt b/defects/jackson/bench/results.txt deleted file mode 100644 index 52fa03c87..000000000 --- a/defects/jackson/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== jackson-0001: AnnotatedClassResolver._addSuperTypes/Interfaces — O(N²) custom _contains() list scan in type hierarchy collection === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=8.898ms fixed=0.046ms speedup=194.7x -N=2000 k=2000 : defective=35.820ms fixed=0.097ms speedup=368.6x - -=== jackson-0002: ClassUtil._addRawSuperTypes — ArrayList.contains() O(N²) in recursive supertype collection === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.123ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=9.346ms fixed=0.049ms speedup=192.6x -N=2000 k=2000 : defective=36.863ms fixed=0.103ms speedup=359.1x - diff --git a/defects/jackson/bench/run_all.py b/defects/jackson/bench/run_all.py deleted file mode 100644 index f90b6482a..000000000 --- a/defects/jackson/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jackson-0001.py", "bench-jackson-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jami-daemon/Makefile b/defects/jami-daemon/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jami-daemon/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jami-daemon/bench/bench-jami-daemon-0001.py b/defects/jami-daemon/bench/bench-jami-daemon-0001.py deleted file mode 100644 index 59b0e5e18..000000000 --- a/defects/jami-daemon/bench/bench-jami-daemon-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jami-daemon-0001.py -# CWE-407: list-scan inside loop in jami-daemon-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jami-daemon-0001: CWE-407: list-scan inside loop in jami-daemon-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jami-daemon/bench/bench-jami-daemon-0002.py b/defects/jami-daemon/bench/bench-jami-daemon-0002.py deleted file mode 100644 index d689f62cb..000000000 --- a/defects/jami-daemon/bench/bench-jami-daemon-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jami-daemon-0002.py -# CWE-407: list-scan inside loop in jami-daemon-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jami-daemon-0002: CWE-407: list-scan inside loop in jami-daemon-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jami-daemon/bench/bench-jami-daemon.py b/defects/jami-daemon/bench/bench-jami-daemon.py deleted file mode 100644 index 2525a4b79..000000000 --- a/defects/jami-daemon/bench/bench-jami-daemon.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jami-daemon.py -# CWE-407: list-scan inside loop in jami-daemon (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jami-daemon: CWE-407: list-scan inside loop in jami-daemon (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jami-daemon/bench/results.txt b/defects/jami-daemon/bench/results.txt deleted file mode 100644 index 634040089..000000000 --- a/defects/jami-daemon/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== jami-daemon-0001: CWE-407: list-scan inside loop in jami-daemon-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.724ms fixed=0.027ms speedup=102.3x -N=1000 k=1000 : defective=11.518ms fixed=0.125ms speedup=91.9x -N=2000 k=2000 : defective=36.721ms fixed=0.114ms speedup=321.6x - -=== jami-daemon-0002: CWE-407: list-scan inside loop in jami-daemon-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.818ms fixed=0.025ms speedup=112.2x -N=1000 k=1000 : defective=10.993ms fixed=0.055ms speedup=201.3x -N=2000 k=2000 : defective=40.185ms fixed=0.095ms speedup=422.6x - -=== jami-daemon: CWE-407: list-scan inside loop in jami-daemon (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.138ms fixed=0.021ms speedup=100.4x -N=1000 k=1000 : defective=9.057ms fixed=0.049ms speedup=185.4x -N=2000 k=2000 : defective=38.436ms fixed=0.097ms speedup=397.9x - diff --git a/defects/jami-daemon/bench/run_all.py b/defects/jami-daemon/bench/run_all.py deleted file mode 100644 index f229ed137..000000000 --- a/defects/jami-daemon/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jami-daemon-0001.py", "bench-jami-daemon-0002.py", "bench-jami-daemon.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jami/Makefile b/defects/jami/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jami/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jami/bench/bench-jami-daemon-0001.py b/defects/jami/bench/bench-jami-daemon-0001.py deleted file mode 100644 index 59b0e5e18..000000000 --- a/defects/jami/bench/bench-jami-daemon-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jami-daemon-0001.py -# CWE-407: list-scan inside loop in jami-daemon-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jami-daemon-0001: CWE-407: list-scan inside loop in jami-daemon-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jami/bench/bench-jami-daemon-0002.py b/defects/jami/bench/bench-jami-daemon-0002.py deleted file mode 100644 index d689f62cb..000000000 --- a/defects/jami/bench/bench-jami-daemon-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jami-daemon-0002.py -# CWE-407: list-scan inside loop in jami-daemon-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jami-daemon-0002: CWE-407: list-scan inside loop in jami-daemon-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jami/bench/bench-jami-daemon.py b/defects/jami/bench/bench-jami-daemon.py deleted file mode 100644 index 2525a4b79..000000000 --- a/defects/jami/bench/bench-jami-daemon.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jami-daemon.py -# CWE-407: list-scan inside loop in jami-daemon (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jami-daemon: CWE-407: list-scan inside loop in jami-daemon (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jami/bench/results.txt b/defects/jami/bench/results.txt deleted file mode 100644 index 0cf037e98..000000000 --- a/defects/jami/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== jami-daemon-0001: CWE-407: list-scan inside loop in jami-daemon-0001 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.4x -N=500 k=500 : defective=1.357ms fixed=0.013ms speedup=102.0x -N=1000 k=1000 : defective=5.501ms fixed=0.028ms speedup=193.9x -N=2000 k=2000 : defective=23.908ms fixed=0.062ms speedup=386.1x - -=== jami-daemon-0002: CWE-407: list-scan inside loop in jami-daemon-0002 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=25.2x -N=500 k=500 : defective=1.355ms fixed=0.013ms speedup=103.6x -N=1000 k=1000 : defective=5.542ms fixed=0.029ms speedup=190.1x -N=2000 k=2000 : defective=22.908ms fixed=0.062ms speedup=372.0x - -=== jami-daemon: CWE-407: list-scan inside loop in jami-daemon (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.7x -N=500 k=500 : defective=1.559ms fixed=0.013ms speedup=117.0x -N=1000 k=1000 : defective=5.574ms fixed=0.030ms speedup=188.4x -N=2000 k=2000 : defective=24.202ms fixed=0.062ms speedup=390.0x - diff --git a/defects/jami/bench/run_all.py b/defects/jami/bench/run_all.py deleted file mode 100644 index f229ed137..000000000 --- a/defects/jami/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jami-daemon-0001.py", "bench-jami-daemon-0002.py", "bench-jami-daemon.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/janusgraph/Makefile b/defects/janusgraph/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/janusgraph/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/janusgraph/bench/bench-janusgraph-0001.py b/defects/janusgraph/bench/bench-janusgraph-0001.py deleted file mode 100644 index 3804a6404..000000000 --- a/defects/janusgraph/bench/bench-janusgraph-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-janusgraph-0001.py -# MultiCondition extends ArrayList — O(C²) condition deduplication in query builder -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== janusgraph-0001: MultiCondition extends ArrayList — O(C²) condition deduplication in query builder ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/janusgraph/bench/results.txt b/defects/janusgraph/bench/results.txt deleted file mode 100644 index 414552b1a..000000000 --- a/defects/janusgraph/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== janusgraph-0001: MultiCondition extends ArrayList — O(C²) condition deduplication in query builder === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.320ms fixed=0.023ms speedup=101.8x -N=1000 k=1000 : defective=9.560ms fixed=0.051ms speedup=188.9x -N=2000 k=2000 : defective=36.940ms fixed=0.097ms speedup=379.8x - diff --git a/defects/janusgraph/bench/run_all.py b/defects/janusgraph/bench/run_all.py deleted file mode 100644 index 404ae7d14..000000000 --- a/defects/janusgraph/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-janusgraph-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jasmine/Makefile b/defects/jasmine/Makefile deleted file mode 100644 index 947085010..000000000 --- a/defects/jasmine/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# jasmine patch test + bench runner - -PYTHON := python3 -TEST_FILE := tests/test-jasmine-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/jasmine/bench/bench-jasmine-0001.py b/defects/jasmine/bench/bench-jasmine-0001.py deleted file mode 100644 index c1786b99e..000000000 --- a/defects/jasmine/bench/bench-jasmine-0001.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-jasmine-0001.py -# SpyRegistry.spyOnAllFunctions prototype-chain filter: -# propertiesToSkip.indexOf (Array) vs Set.has, across D levels with P properties each. - -import sys -import time - - -def bench_defective(depth, props_per_level): - """Array.indexOf filter + concat growth per level.""" - properties_to_skip = [] - all_properties = [] - - t0 = time.perf_counter() - for d in range(depth): - # Each level has some unique + some already-seen properties - level = [f"prop_d{d}_p{i}" for i in range(props_per_level)] - filtered = [p for p in level if p not in properties_to_skip] # O(P) per prop - properties_to_skip = properties_to_skip + filtered - all_properties.extend(filtered) - return time.perf_counter() - t0 - - -def bench_fixed(depth, props_per_level): - """Set.has filter + Set.add growth.""" - properties_to_skip = set() - all_properties = [] - - t0 = time.perf_counter() - for d in range(depth): - level = [f"prop_d{d}_p{i}" for i in range(props_per_level)] - filtered = [p for p in level if p not in properties_to_skip] # O(1) per - for p in filtered: - properties_to_skip.add(p) - all_properties.extend(filtered) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(3, 50), (5, 100), (5, 200), (8, 200), (10, 300)] - - -def run(): - lines = [] - header = "=== jasmine-0001: SpyRegistry Array.indexOf vs Set.has ===" - print(header); lines.append(header) - - for d, p in CASES: - df = min(bench_defective(d, p) for _ in range(TRIALS)) - fx = min(bench_fixed(d, p) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"D={d} P={p:<3}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jasmine/bench/results.txt b/defects/jasmine/bench/results.txt deleted file mode 100644 index 4f472784f..000000000 --- a/defects/jasmine/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== jasmine-0001: SpyRegistry Array.indexOf vs Set.has === -D=3 P=50 : defective=0.145ms fixed=0.045ms speedup=3.2x -D=5 P=100: defective=1.543ms fixed=0.151ms speedup=10.2x -D=5 P=200: defective=5.621ms fixed=0.286ms speedup=19.6x -D=8 P=200: defective=13.814ms fixed=0.529ms speedup=26.1x -D=10 P=300: defective=54.048ms fixed=0.884ms speedup=61.2x - diff --git a/defects/jasmine/bench/run_all.py b/defects/jasmine/bench/run_all.py deleted file mode 100644 index 44eb6f8bc..000000000 --- a/defects/jasmine/bench/run_all.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run jasmine bench scripts and write results.txt -import importlib.util, os, sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jasmine-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/jasmine/patch/jasmine-0001-spyregistry-spyonallfunctions-indexof.patch b/defects/jasmine/patch/jasmine-0001-spyregistry-spyonallfunctions-indexof.patch deleted file mode 100644 index 85bfd9813..000000000 --- a/defects/jasmine/patch/jasmine-0001-spyregistry-spyonallfunctions-indexof.patch +++ /dev/null @@ -1,49 +0,0 @@ -# UNDF: UNDF-2026-000001293 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(D*P^2) -> O(D*P) in SpyRegistry prototype walk -# -# Defect: spyOnAllFunctions walks an object's prototype chain, filtering per -# level via propertiesToSkip.indexOf(prop) === -1 inside Array.filter. -# propertiesToSkip is an Array that grows by concat at each level. For chain -# depth D and P properties per level, cost is O(D*P^2). -# -# Fix: Replace Array with Set. Filter lookup drops from O(P) to O(1). Growth -# via Set.add is O(1) per entry. -# -# Complexity gate (tests/test-jasmine-cwe407.py): -# D=5, P=200 per level: fixed must complete in <5ms -# k-scaling 5x: time ratio must be <17.5x ---- a/src/core/SpyRegistry.js -+++ b/src/core/SpyRegistry.js -@@ -201,23 +201,26 @@ getJasmineRequireObj().SpyRegistry = function(j$) { - } - - let pointer = obj; - let propsToSpyOn = []; - let properties; -- let propertiesToSkip = []; -+ // Prior impl used Array + .indexOf + .concat, giving O(D*P^2) across -+ // a prototype chain of depth D with P properties per level. Set gives -+ // O(1) membership and O(1) growth per entry. -+ const propertiesToSkip = new Set(); - - while ( - pointer && - (!includeNonEnumerable || pointer !== Object.prototype) - ) { - properties = getProps(pointer, includeNonEnumerable); - properties = properties.filter(function(prop) { -- return propertiesToSkip.indexOf(prop) === -1; -+ return !propertiesToSkip.has(prop); - }); -- propertiesToSkip = propertiesToSkip.concat(properties); -+ for (const prop of properties) propertiesToSkip.add(prop); - propsToSpyOn = propsToSpyOn.concat( - getSpyableFunctionProps(pointer, properties) - ); - pointer = Object.getPrototypeOf(pointer); - } - - for (const prop of propsToSpyOn) { - this.spyOn(obj, prop); - } diff --git a/defects/jasmine/tests/test-jasmine-cwe407.py b/defects/jasmine/tests/test-jasmine-cwe407.py deleted file mode 100644 index 7beaed58e..000000000 --- a/defects/jasmine/tests/test-jasmine-cwe407.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001293 (jasmine-0001) -# -# CWE-407: Algorithmic Complexity -# -# Defect: -# jasmine-0001: SpyRegistry.spyOnAllFunctions walks prototype chain, -# filtering via propertiesToSkip.indexOf(prop) inside an -# Array.filter + concat. For chain depth D with P properties -# per level, cost is O(D * P^2). -# -# Fix: -# Replace propertiesToSkip Array with Set; filter lookup and growth both -# O(1). Total cost drops to O(D * P). -# -# Complexity gate (from bench/results.txt): -# D=10, P=300: defective=54ms, fixed=0.9ms (61x). -# Fixed must complete in <5ms at D=5, P=200. k-scaling <17.5x. - -import importlib.util, os, sys, unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-jasmine-0001.py") - - -class TestJasmine0001Correctness(unittest.TestCase): - def test_set_filter_matches_list_indexof_filter(self): - # Both filters should produce the same surviving set of properties - seen_list = [] - seen_set = set() - levels = [ - ["a", "b", "c"], - ["b", "c", "d", "e"], # b, c are duplicates - ["d", "e", "f", "g"], - ] - result_list = [] - result_set = [] - for level in levels: - new_list = [p for p in level if p not in seen_list] - seen_list = seen_list + new_list - result_list.extend(new_list) - - new_set = [p for p in level if p not in seen_set] - for p in new_set: - seen_set.add(p) - result_set.extend(new_set) - - self.assertEqual(result_list, result_set) - self.assertEqual(result_set, ["a", "b", "c", "d", "e", "f", "g"]) - - -class TestJasmine0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_D5_P200(self): - t_s = min(_mod.bench_fixed(5, 200) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at D=5 P=200, expected <5ms") - - def test_fixed_scaling_linear(self): - t_small = min(_mod.bench_fixed(5, 100) for _ in range(3)) - t_large = min(_mod.bench_fixed(5, 500) for _ in range(3)) - ratio = t_large / t_small if t_small > 0 else float("inf") - # 5x P-scaling should remain <17.5x (O(P), not O(P^2)) - self.assertLess(ratio, 17.5, - f"fixed P=500/P=100 ratio {ratio:.2f}x, expected <17.5x") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/javac/Makefile b/defects/javac/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/javac/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/javac/bench/bench-javac-0001.py b/defects/javac/bench/bench-javac-0001.py deleted file mode 100644 index 615f1389e..000000000 --- a/defects/javac/bench/bench-javac-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0001.py -# CWE-407: list-scan inside loop in javac-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0001: CWE-407: list-scan inside loop in javac-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/bench-javac-0002.py b/defects/javac/bench/bench-javac-0002.py deleted file mode 100644 index 4143d9fef..000000000 --- a/defects/javac/bench/bench-javac-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0002.py -# CWE-407: list-scan inside loop in javac-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0002: CWE-407: list-scan inside loop in javac-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/bench-javac-0003.py b/defects/javac/bench/bench-javac-0003.py deleted file mode 100644 index 363b730ed..000000000 --- a/defects/javac/bench/bench-javac-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0003.py -# CWE-407: list-scan inside loop in javac-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0003: CWE-407: list-scan inside loop in javac-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/bench-javac-0004.py b/defects/javac/bench/bench-javac-0004.py deleted file mode 100644 index 7eb06e2bb..000000000 --- a/defects/javac/bench/bench-javac-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0004.py -# CWE-407: list-scan inside loop in javac-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0004: CWE-407: list-scan inside loop in javac-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/bench-javac-0005.py b/defects/javac/bench/bench-javac-0005.py deleted file mode 100644 index eaa35c537..000000000 --- a/defects/javac/bench/bench-javac-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0005.py -# CWE-407: list-scan inside loop in javac-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0005: CWE-407: list-scan inside loop in javac-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/bench-javac-0006.py b/defects/javac/bench/bench-javac-0006.py deleted file mode 100644 index 148aa694b..000000000 --- a/defects/javac/bench/bench-javac-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0006.py -# CWE-407: list-scan inside loop in javac-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0006: CWE-407: list-scan inside loop in javac-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/bench-javac-0007.py b/defects/javac/bench/bench-javac-0007.py deleted file mode 100644 index f929ac7ba..000000000 --- a/defects/javac/bench/bench-javac-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-javac-0007.py -# InferenceContext.java line 294 — notifyChange -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== javac-0007: InferenceContext.java line 294 — notifyChange ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/javac/bench/results.txt b/defects/javac/bench/results.txt deleted file mode 100644 index c549c8003..000000000 --- a/defects/javac/bench/results.txt +++ /dev/null @@ -1,42 +0,0 @@ -=== javac-0001: CWE-407: list-scan inside loop in javac-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.583ms fixed=0.025ms speedup=103.7x -N=1000 k=1000 : defective=10.562ms fixed=0.055ms speedup=193.5x -N=2000 k=2000 : defective=36.322ms fixed=0.097ms speedup=375.1x - -=== javac-0002: CWE-407: list-scan inside loop in javac-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.120ms fixed=0.020ms speedup=103.4x -N=1000 k=1000 : defective=8.859ms fixed=0.046ms speedup=194.3x -N=2000 k=2000 : defective=35.694ms fixed=0.099ms speedup=362.1x - -=== javac-0003: CWE-407: list-scan inside loop in javac-0003 (generic model) === -N=100 k=100 : defective=0.159ms fixed=0.006ms speedup=24.7x -N=500 k=500 : defective=2.694ms fixed=0.041ms speedup=65.0x -N=1000 k=1000 : defective=8.729ms fixed=0.045ms speedup=193.4x -N=2000 k=2000 : defective=35.251ms fixed=0.096ms speedup=367.7x - -=== javac-0004: CWE-407: list-scan inside loop in javac-0004 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.106ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.826ms fixed=0.046ms speedup=191.6x -N=2000 k=2000 : defective=35.559ms fixed=0.097ms speedup=367.8x - -=== javac-0005: CWE-407: list-scan inside loop in javac-0005 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.119ms fixed=0.020ms speedup=105.4x -N=1000 k=1000 : defective=8.669ms fixed=0.045ms speedup=192.7x -N=2000 k=2000 : defective=35.210ms fixed=0.095ms speedup=371.7x - -=== javac-0006: CWE-407: list-scan inside loop in javac-0006 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.112ms fixed=0.020ms speedup=104.8x -N=1000 k=1000 : defective=8.744ms fixed=0.045ms speedup=193.5x -N=2000 k=2000 : defective=35.433ms fixed=0.097ms speedup=364.9x - -=== javac-0007: InferenceContext.java line 294 — notifyChange === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.131ms fixed=0.021ms speedup=102.9x -N=1000 k=1000 : defective=8.409ms fixed=0.043ms speedup=194.3x -N=2000 k=2000 : defective=33.888ms fixed=0.092ms speedup=368.0x - diff --git a/defects/javac/bench/run_all.py b/defects/javac/bench/run_all.py deleted file mode 100644 index 6166a1637..000000000 --- a/defects/javac/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-javac-0001.py", "bench-javac-0002.py", "bench-javac-0003.py", "bench-javac-0004.py", "bench-javac-0005.py", "bench-javac-0006.py", "bench-javac-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jax/Makefile b/defects/jax/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jax/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jax/bench/bench-jax-0001.py b/defects/jax/bench/bench-jax-0001.py deleted file mode 100644 index 58965be56..000000000 --- a/defects/jax/bench/bench-jax-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jax-0001.py -# jax-0001 — pallas/fuser/jaxpr_fusion.py O(G × I × F) kernel fusion membership test -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jax-0001: jax-0001 — pallas/fuser/jaxpr_fusion.py O(G × I × F) kernel fusion membership test ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jax/bench/results.txt b/defects/jax/bench/results.txt deleted file mode 100644 index c463503a3..000000000 --- a/defects/jax/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jax-0001: jax-0001 — pallas/fuser/jaxpr_fusion.py O(G × I × F) kernel fusion membership test === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=23.4x -N=500 k=500 : defective=2.192ms fixed=0.021ms speedup=106.3x -N=1000 k=1000 : defective=8.651ms fixed=0.046ms speedup=189.4x -N=2000 k=2000 : defective=36.565ms fixed=0.096ms speedup=380.5x - diff --git a/defects/jax/bench/run_all.py b/defects/jax/bench/run_all.py deleted file mode 100644 index 3258ef9b3..000000000 --- a/defects/jax/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jax-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jellyfin-0001/Makefile b/defects/jellyfin-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jellyfin-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jellyfin-0001/bench/bench-jellyfin-0001-0001.py b/defects/jellyfin-0001/bench/bench-jellyfin-0001-0001.py deleted file mode 100644 index cf9cc6c96..000000000 --- a/defects/jellyfin-0001/bench/bench-jellyfin-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jellyfin-0001-0001.py -# CWE-407: list-scan inside loop in jellyfin-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jellyfin-0001-0001: CWE-407: list-scan inside loop in jellyfin-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jellyfin-0001/bench/results.txt b/defects/jellyfin-0001/bench/results.txt deleted file mode 100644 index 9686a332b..000000000 --- a/defects/jellyfin-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jellyfin-0001-0001: CWE-407: list-scan inside loop in jellyfin-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.418ms fixed=0.024ms speedup=101.8x -N=1000 k=1000 : defective=10.842ms fixed=0.049ms speedup=222.7x -N=2000 k=2000 : defective=35.709ms fixed=0.097ms speedup=369.1x - diff --git a/defects/jellyfin-0001/bench/run_all.py b/defects/jellyfin-0001/bench/run_all.py deleted file mode 100644 index ec22c6212..000000000 --- a/defects/jellyfin-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jellyfin-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jellyfin-0002/Makefile b/defects/jellyfin-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jellyfin-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jellyfin-0002/bench/bench-jellyfin-0002-0002.py b/defects/jellyfin-0002/bench/bench-jellyfin-0002-0002.py deleted file mode 100644 index d4b9dd94a..000000000 --- a/defects/jellyfin-0002/bench/bench-jellyfin-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jellyfin-0002-0002.py -# CWE-407: list-scan inside loop in jellyfin-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jellyfin-0002-0002: CWE-407: list-scan inside loop in jellyfin-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jellyfin-0002/bench/results.txt b/defects/jellyfin-0002/bench/results.txt deleted file mode 100644 index fb402c6f6..000000000 --- a/defects/jellyfin-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jellyfin-0002-0002: CWE-407: list-scan inside loop in jellyfin-0002-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.194ms fixed=0.020ms speedup=107.2x -N=1000 k=1000 : defective=8.651ms fixed=0.047ms speedup=182.2x -N=2000 k=2000 : defective=39.775ms fixed=0.099ms speedup=400.8x - diff --git a/defects/jellyfin-0002/bench/run_all.py b/defects/jellyfin-0002/bench/run_all.py deleted file mode 100644 index 42f5bd338..000000000 --- a/defects/jellyfin-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jellyfin-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jenkins/Makefile b/defects/jenkins/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jenkins/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jenkins/bench/bench-jenkins-0001.py b/defects/jenkins/bench/bench-jenkins-0001.py deleted file mode 100644 index 9ff342fce..000000000 --- a/defects/jenkins/bench/bench-jenkins-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jenkins-0001.py -# CWE-407: list-scan inside loop in jenkins-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jenkins-0001: CWE-407: list-scan inside loop in jenkins-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jenkins/bench/bench-jenkins-0002.py b/defects/jenkins/bench/bench-jenkins-0002.py deleted file mode 100644 index 6033af20a..000000000 --- a/defects/jenkins/bench/bench-jenkins-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jenkins-0002.py -# CWE-407: list-scan inside loop in jenkins-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jenkins-0002: CWE-407: list-scan inside loop in jenkins-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jenkins/bench/results.txt b/defects/jenkins/bench/results.txt deleted file mode 100644 index bbf608ee3..000000000 --- a/defects/jenkins/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== jenkins-0001: CWE-407: list-scan inside loop in jenkins-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.370ms fixed=0.022ms speedup=106.8x -N=1000 k=1000 : defective=9.809ms fixed=0.050ms speedup=195.8x -N=2000 k=2000 : defective=36.766ms fixed=0.096ms speedup=383.1x - -=== jenkins-0002: CWE-407: list-scan inside loop in jenkins-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.159ms fixed=0.021ms speedup=103.3x -N=1000 k=1000 : defective=8.894ms fixed=0.047ms speedup=190.7x -N=2000 k=2000 : defective=36.411ms fixed=0.097ms speedup=374.9x - diff --git a/defects/jenkins/bench/run_all.py b/defects/jenkins/bench/run_all.py deleted file mode 100644 index 221ade0ff..000000000 --- a/defects/jenkins/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jenkins-0001.py", "bench-jenkins-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jetty/Makefile b/defects/jetty/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jetty/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jetty/bench/bench-jetty-0001.py b/defects/jetty/bench/bench-jetty-0001.py deleted file mode 100644 index ebdfada5f..000000000 --- a/defects/jetty/bench/bench-jetty-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jetty-0001.py -# CWE-407: list-scan inside loop in jetty-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jetty-0001: CWE-407: list-scan inside loop in jetty-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jetty/bench/results.txt b/defects/jetty/bench/results.txt deleted file mode 100644 index 768e80e41..000000000 --- a/defects/jetty/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jetty-0001: CWE-407: list-scan inside loop in jetty-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.457ms fixed=0.024ms speedup=103.4x -N=1000 k=1000 : defective=10.184ms fixed=0.053ms speedup=191.3x -N=2000 k=2000 : defective=40.466ms fixed=0.098ms speedup=410.8x - diff --git a/defects/jetty/bench/run_all.py b/defects/jetty/bench/run_all.py deleted file mode 100644 index 7b4d7ea73..000000000 --- a/defects/jetty/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jetty-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jicofo-0001/Makefile b/defects/jicofo-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jicofo-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jicofo-0001/bench/bench-jicofo-0001-0001.py b/defects/jicofo-0001/bench/bench-jicofo-0001-0001.py deleted file mode 100644 index 7137d2856..000000000 --- a/defects/jicofo-0001/bench/bench-jicofo-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jicofo-0001-0001.py -# CWE-407: list-scan inside loop in jicofo-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jicofo-0001-0001: CWE-407: list-scan inside loop in jicofo-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jicofo-0001/bench/results.txt b/defects/jicofo-0001/bench/results.txt deleted file mode 100644 index b3b4463bd..000000000 --- a/defects/jicofo-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jicofo-0001-0001: CWE-407: list-scan inside loop in jicofo-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.242ms fixed=0.022ms speedup=102.0x -N=1000 k=1000 : defective=8.674ms fixed=0.048ms speedup=181.9x -N=2000 k=2000 : defective=37.364ms fixed=0.098ms speedup=383.1x - diff --git a/defects/jicofo-0001/bench/run_all.py b/defects/jicofo-0001/bench/run_all.py deleted file mode 100644 index b5e2cad2b..000000000 --- a/defects/jicofo-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jicofo-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jicofo-0002/Makefile b/defects/jicofo-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jicofo-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jicofo-0002/bench/bench-jicofo-0002-0002.py b/defects/jicofo-0002/bench/bench-jicofo-0002-0002.py deleted file mode 100644 index 83aa5d038..000000000 --- a/defects/jicofo-0002/bench/bench-jicofo-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jicofo-0002-0002.py -# CWE-407: list-scan inside loop in jicofo-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jicofo-0002-0002: CWE-407: list-scan inside loop in jicofo-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jicofo-0002/bench/results.txt b/defects/jicofo-0002/bench/results.txt deleted file mode 100644 index 8df8d22fc..000000000 --- a/defects/jicofo-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jicofo-0002-0002: CWE-407: list-scan inside loop in jicofo-0002-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.343ms fixed=0.022ms speedup=106.7x -N=1000 k=1000 : defective=8.921ms fixed=0.045ms speedup=196.2x -N=2000 k=2000 : defective=38.740ms fixed=0.100ms speedup=387.2x - diff --git a/defects/jicofo-0002/bench/run_all.py b/defects/jicofo-0002/bench/run_all.py deleted file mode 100644 index d0e100b0d..000000000 --- a/defects/jicofo-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jicofo-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jitsi-meet-0001/Makefile b/defects/jitsi-meet-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jitsi-meet-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jitsi-meet-0001/bench/bench-jitsi-meet-0001-0001.py b/defects/jitsi-meet-0001/bench/bench-jitsi-meet-0001-0001.py deleted file mode 100644 index 782d0166e..000000000 --- a/defects/jitsi-meet-0001/bench/bench-jitsi-meet-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0001-0001.py -# CWE-407: list-scan inside loop in jitsi-meet-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0001-0001: CWE-407: list-scan inside loop in jitsi-meet-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-meet-0001/bench/results.txt b/defects/jitsi-meet-0001/bench/results.txt deleted file mode 100644 index b47d6435c..000000000 --- a/defects/jitsi-meet-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jitsi-meet-0001-0001: CWE-407: list-scan inside loop in jitsi-meet-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.148ms fixed=0.021ms speedup=104.4x -N=1000 k=1000 : defective=8.620ms fixed=0.045ms speedup=191.4x -N=2000 k=2000 : defective=35.848ms fixed=0.107ms speedup=336.4x - diff --git a/defects/jitsi-meet-0001/bench/run_all.py b/defects/jitsi-meet-0001/bench/run_all.py deleted file mode 100644 index e2992e706..000000000 --- a/defects/jitsi-meet-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jitsi-meet-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jitsi-meet-0002/Makefile b/defects/jitsi-meet-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jitsi-meet-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jitsi-meet-0002/bench/bench-jitsi-meet-0002-0002.py b/defects/jitsi-meet-0002/bench/bench-jitsi-meet-0002-0002.py deleted file mode 100644 index 5c4367820..000000000 --- a/defects/jitsi-meet-0002/bench/bench-jitsi-meet-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0002-0002.py -# CWE-407: list-scan inside loop in jitsi-meet-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0002-0002: CWE-407: list-scan inside loop in jitsi-meet-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-meet-0002/bench/results.txt b/defects/jitsi-meet-0002/bench/results.txt deleted file mode 100644 index 1db0ed079..000000000 --- a/defects/jitsi-meet-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jitsi-meet-0002-0002: CWE-407: list-scan inside loop in jitsi-meet-0002-0002 (generic model) === -N=100 k=100 : defective=0.272ms fixed=0.013ms speedup=20.2x -N=500 k=500 : defective=4.873ms fixed=0.028ms speedup=172.4x -N=1000 k=1000 : defective=13.759ms fixed=0.062ms speedup=222.0x -N=2000 k=2000 : defective=43.806ms fixed=0.095ms speedup=460.0x - diff --git a/defects/jitsi-meet-0002/bench/run_all.py b/defects/jitsi-meet-0002/bench/run_all.py deleted file mode 100644 index fc7fb846a..000000000 --- a/defects/jitsi-meet-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jitsi-meet-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jitsi-meet-0003/Makefile b/defects/jitsi-meet-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jitsi-meet-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jitsi-meet-0003/bench/bench-jitsi-meet-0003-0003.py b/defects/jitsi-meet-0003/bench/bench-jitsi-meet-0003-0003.py deleted file mode 100644 index eff3598c6..000000000 --- a/defects/jitsi-meet-0003/bench/bench-jitsi-meet-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0003-0003.py -# CWE-407: list-scan inside loop in jitsi-meet-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0003-0003: CWE-407: list-scan inside loop in jitsi-meet-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-meet-0003/bench/results.txt b/defects/jitsi-meet-0003/bench/results.txt deleted file mode 100644 index 13933dbec..000000000 --- a/defects/jitsi-meet-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jitsi-meet-0003-0003: CWE-407: list-scan inside loop in jitsi-meet-0003-0003 (generic model) === -N=100 k=100 : defective=0.117ms fixed=0.004ms speedup=30.6x -N=500 k=500 : defective=2.365ms fixed=0.023ms speedup=103.3x -N=1000 k=1000 : defective=9.786ms fixed=0.051ms speedup=192.9x -N=2000 k=2000 : defective=38.296ms fixed=0.096ms speedup=397.4x - diff --git a/defects/jitsi-meet-0003/bench/run_all.py b/defects/jitsi-meet-0003/bench/run_all.py deleted file mode 100644 index 603587654..000000000 --- a/defects/jitsi-meet-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jitsi-meet-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jitsi-meet-0004/Makefile b/defects/jitsi-meet-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jitsi-meet-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jitsi-meet-0004/bench/bench-jitsi-meet-0004-0004.py b/defects/jitsi-meet-0004/bench/bench-jitsi-meet-0004-0004.py deleted file mode 100644 index 5fea69c7c..000000000 --- a/defects/jitsi-meet-0004/bench/bench-jitsi-meet-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0004-0004.py -# CWE-407: list-scan inside loop in jitsi-meet-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0004-0004: CWE-407: list-scan inside loop in jitsi-meet-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-meet-0004/bench/results.txt b/defects/jitsi-meet-0004/bench/results.txt deleted file mode 100644 index 420864d54..000000000 --- a/defects/jitsi-meet-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== jitsi-meet-0004-0004: CWE-407: list-scan inside loop in jitsi-meet-0004-0004 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.356ms fixed=0.021ms speedup=110.9x -N=1000 k=1000 : defective=9.036ms fixed=0.048ms speedup=187.8x -N=2000 k=2000 : defective=37.372ms fixed=0.096ms speedup=388.6x - diff --git a/defects/jitsi-meet-0004/bench/run_all.py b/defects/jitsi-meet-0004/bench/run_all.py deleted file mode 100644 index 63a398759..000000000 --- a/defects/jitsi-meet-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jitsi-meet-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jitsi-videobridge/Makefile b/defects/jitsi-videobridge/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jitsi-videobridge/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0001.py b/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0001.py deleted file mode 100644 index 07896ace5..000000000 --- a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge-0001.py -# CWE-407: list-scan inside loop in jitsi-videobridge-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge-0001: CWE-407: list-scan inside loop in jitsi-videobridge-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0002.py b/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0002.py deleted file mode 100644 index afa244279..000000000 --- a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge-0002.py -# CWE-407: list-scan inside loop in jitsi-videobridge-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge-0002: CWE-407: list-scan inside loop in jitsi-videobridge-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0003.py b/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0003.py deleted file mode 100644 index fe9395fec..000000000 --- a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge-0003.py -# CWE-407: list-scan inside loop in jitsi-videobridge-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge-0003: CWE-407: list-scan inside loop in jitsi-videobridge-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge.py b/defects/jitsi-videobridge/bench/bench-jitsi-videobridge.py deleted file mode 100644 index e0eff3b2d..000000000 --- a/defects/jitsi-videobridge/bench/bench-jitsi-videobridge.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge.py -# CWE-407: list-scan inside loop in jitsi-videobridge (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge: CWE-407: list-scan inside loop in jitsi-videobridge (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi-videobridge/bench/results.txt b/defects/jitsi-videobridge/bench/results.txt deleted file mode 100644 index 983f23c69..000000000 --- a/defects/jitsi-videobridge/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== jitsi-videobridge-0001: CWE-407: list-scan inside loop in jitsi-videobridge-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.300ms fixed=0.023ms speedup=99.7x -N=1000 k=1000 : defective=12.094ms fixed=0.051ms speedup=238.9x -N=2000 k=2000 : defective=39.162ms fixed=0.108ms speedup=362.3x - -=== jitsi-videobridge-0002: CWE-407: list-scan inside loop in jitsi-videobridge-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.375ms fixed=0.022ms speedup=106.3x -N=1000 k=1000 : defective=9.424ms fixed=0.046ms speedup=207.1x -N=2000 k=2000 : defective=35.215ms fixed=0.098ms speedup=359.1x - -=== jitsi-videobridge-0003: CWE-407: list-scan inside loop in jitsi-videobridge-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.211ms fixed=0.021ms speedup=107.0x -N=1000 k=1000 : defective=8.625ms fixed=0.046ms speedup=186.7x -N=2000 k=2000 : defective=35.896ms fixed=0.097ms speedup=368.6x - -=== jitsi-videobridge: CWE-407: list-scan inside loop in jitsi-videobridge (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.222ms fixed=0.021ms speedup=106.8x -N=1000 k=1000 : defective=8.650ms fixed=0.046ms speedup=187.4x -N=2000 k=2000 : defective=35.109ms fixed=0.096ms speedup=366.6x - diff --git a/defects/jitsi-videobridge/bench/run_all.py b/defects/jitsi-videobridge/bench/run_all.py deleted file mode 100644 index 3f2b05432..000000000 --- a/defects/jitsi-videobridge/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jitsi-videobridge-0001.py", "bench-jitsi-videobridge-0002.py", "bench-jitsi-videobridge-0003.py", "bench-jitsi-videobridge.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jitsi/Makefile b/defects/jitsi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jitsi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jitsi/bench/bench-jitsi-meet-0001-0001.py b/defects/jitsi/bench/bench-jitsi-meet-0001-0001.py deleted file mode 100644 index 782d0166e..000000000 --- a/defects/jitsi/bench/bench-jitsi-meet-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0001-0001.py -# CWE-407: list-scan inside loop in jitsi-meet-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0001-0001: CWE-407: list-scan inside loop in jitsi-meet-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-meet-0002-0002.py b/defects/jitsi/bench/bench-jitsi-meet-0002-0002.py deleted file mode 100644 index 5c4367820..000000000 --- a/defects/jitsi/bench/bench-jitsi-meet-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0002-0002.py -# CWE-407: list-scan inside loop in jitsi-meet-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0002-0002: CWE-407: list-scan inside loop in jitsi-meet-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-meet-0003-0003.py b/defects/jitsi/bench/bench-jitsi-meet-0003-0003.py deleted file mode 100644 index eff3598c6..000000000 --- a/defects/jitsi/bench/bench-jitsi-meet-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0003-0003.py -# CWE-407: list-scan inside loop in jitsi-meet-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0003-0003: CWE-407: list-scan inside loop in jitsi-meet-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-meet-0004-0004.py b/defects/jitsi/bench/bench-jitsi-meet-0004-0004.py deleted file mode 100644 index 5fea69c7c..000000000 --- a/defects/jitsi/bench/bench-jitsi-meet-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-meet-0004-0004.py -# CWE-407: list-scan inside loop in jitsi-meet-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-meet-0004-0004: CWE-407: list-scan inside loop in jitsi-meet-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-videobridge-0001.py b/defects/jitsi/bench/bench-jitsi-videobridge-0001.py deleted file mode 100644 index 07896ace5..000000000 --- a/defects/jitsi/bench/bench-jitsi-videobridge-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge-0001.py -# CWE-407: list-scan inside loop in jitsi-videobridge-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge-0001: CWE-407: list-scan inside loop in jitsi-videobridge-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-videobridge-0002.py b/defects/jitsi/bench/bench-jitsi-videobridge-0002.py deleted file mode 100644 index afa244279..000000000 --- a/defects/jitsi/bench/bench-jitsi-videobridge-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge-0002.py -# CWE-407: list-scan inside loop in jitsi-videobridge-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge-0002: CWE-407: list-scan inside loop in jitsi-videobridge-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-videobridge-0003.py b/defects/jitsi/bench/bench-jitsi-videobridge-0003.py deleted file mode 100644 index fe9395fec..000000000 --- a/defects/jitsi/bench/bench-jitsi-videobridge-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge-0003.py -# CWE-407: list-scan inside loop in jitsi-videobridge-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge-0003: CWE-407: list-scan inside loop in jitsi-videobridge-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/bench-jitsi-videobridge.py b/defects/jitsi/bench/bench-jitsi-videobridge.py deleted file mode 100644 index e0eff3b2d..000000000 --- a/defects/jitsi/bench/bench-jitsi-videobridge.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jitsi-videobridge.py -# CWE-407: list-scan inside loop in jitsi-videobridge (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jitsi-videobridge: CWE-407: list-scan inside loop in jitsi-videobridge (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jitsi/bench/results.txt b/defects/jitsi/bench/results.txt deleted file mode 100644 index b5af75c61..000000000 --- a/defects/jitsi/bench/results.txt +++ /dev/null @@ -1,48 +0,0 @@ -=== jitsi-meet-0001-0001: CWE-407: list-scan inside loop in jitsi-meet-0001-0001 (generic model) === -N=100 k=100 : defective=0.057ms fixed=0.002ms speedup=24.9x -N=500 k=500 : defective=1.422ms fixed=0.013ms speedup=110.4x -N=1000 k=1000 : defective=5.577ms fixed=0.029ms speedup=191.8x -N=2000 k=2000 : defective=22.697ms fixed=0.062ms speedup=368.9x - -=== jitsi-meet-0002-0002: CWE-407: list-scan inside loop in jitsi-meet-0002-0002 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=25.3x -N=500 k=500 : defective=1.342ms fixed=0.013ms speedup=105.0x -N=1000 k=1000 : defective=5.569ms fixed=0.030ms speedup=188.1x -N=2000 k=2000 : defective=22.706ms fixed=0.062ms speedup=366.8x - -=== jitsi-meet-0003-0003: CWE-407: list-scan inside loop in jitsi-meet-0003-0003 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=25.0x -N=500 k=500 : defective=1.351ms fixed=0.013ms speedup=104.1x -N=1000 k=1000 : defective=6.173ms fixed=0.048ms speedup=127.9x -N=2000 k=2000 : defective=22.510ms fixed=0.063ms speedup=358.3x - -=== jitsi-meet-0004-0004: CWE-407: list-scan inside loop in jitsi-meet-0004-0004 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.6x -N=500 k=500 : defective=1.353ms fixed=0.013ms speedup=104.7x -N=1000 k=1000 : defective=5.578ms fixed=0.029ms speedup=189.8x -N=2000 k=2000 : defective=23.193ms fixed=0.062ms speedup=375.6x - -=== jitsi-videobridge-0001: CWE-407: list-scan inside loop in jitsi-videobridge-0001 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.3x -N=500 k=500 : defective=1.361ms fixed=0.013ms speedup=103.6x -N=1000 k=1000 : defective=5.537ms fixed=0.029ms speedup=190.2x -N=2000 k=2000 : defective=22.613ms fixed=0.062ms speedup=365.5x - -=== jitsi-videobridge-0002: CWE-407: list-scan inside loop in jitsi-videobridge-0002 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.5x -N=500 k=500 : defective=1.352ms fixed=0.013ms speedup=101.3x -N=1000 k=1000 : defective=5.496ms fixed=0.029ms speedup=186.9x -N=2000 k=2000 : defective=22.793ms fixed=0.223ms speedup=102.0x - -=== jitsi-videobridge-0003: CWE-407: list-scan inside loop in jitsi-videobridge-0003 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.3x -N=500 k=500 : defective=1.372ms fixed=0.013ms speedup=104.9x -N=1000 k=1000 : defective=5.548ms fixed=0.030ms speedup=184.6x -N=2000 k=2000 : defective=22.699ms fixed=0.061ms speedup=369.3x - -=== jitsi-videobridge: CWE-407: list-scan inside loop in jitsi-videobridge (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=25.3x -N=500 k=500 : defective=1.362ms fixed=0.013ms speedup=107.5x -N=1000 k=1000 : defective=5.989ms fixed=0.030ms speedup=199.0x -N=2000 k=2000 : defective=22.904ms fixed=0.061ms speedup=374.5x - diff --git a/defects/jitsi/bench/run_all.py b/defects/jitsi/bench/run_all.py deleted file mode 100644 index 51c4e7295..000000000 --- a/defects/jitsi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jitsi-meet-0001-0001.py", "bench-jitsi-meet-0002-0002.py", "bench-jitsi-meet-0003-0003.py", "bench-jitsi-meet-0004-0004.py", "bench-jitsi-videobridge-0001.py", "bench-jitsi-videobridge-0002.py", "bench-jitsi-videobridge-0003.py", "bench-jitsi-videobridge.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/jsc/Makefile b/defects/jsc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/jsc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/jsc/bench/bench-jsc-0001.py b/defects/jsc/bench/bench-jsc-0001.py deleted file mode 100644 index 34f264526..000000000 --- a/defects/jsc/bench/bench-jsc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jsc-0001.py -# BytecodeBasicBlock::computeImpl() O(B²×T) edge linking via Vector::contains -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jsc-0001: BytecodeBasicBlock::computeImpl() O(B²×T) edge linking via Vector::contains ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jsc/bench/bench-jsc-0002.py b/defects/jsc/bench/bench-jsc-0002.py deleted file mode 100644 index 7b3010643..000000000 --- a/defects/jsc/bench/bench-jsc-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jsc-0002.py -# DFGGraph::handleSuccessor() O(E×P) predecessor deduplication via Vector::contains -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jsc-0002: DFGGraph::handleSuccessor() O(E×P) predecessor deduplication via Vector::contains ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jsc/bench/bench-jsc-0003.py b/defects/jsc/bench/bench-jsc-0003.py deleted file mode 100644 index a26d62ea1..000000000 --- a/defects/jsc/bench/bench-jsc-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-jsc-0003.py -# DFGIntegerRangeOptimizationPhase liveAtHead Vector::contains O(50×B×R×L) → O(50×B×R) with HashSet -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== jsc-0003: DFGIntegerRangeOptimizationPhase liveAtHead Vector::contains O(50×B×R×L) → O(50×B×R) with HashSet ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/jsc/bench/results.txt b/defects/jsc/bench/results.txt deleted file mode 100644 index 20d97c28b..000000000 --- a/defects/jsc/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== jsc-0001: BytecodeBasicBlock::computeImpl() O(B²×T) edge linking via Vector::contains === -N=100 k=100 : defective=0.115ms fixed=0.004ms speedup=31.7x -N=500 k=500 : defective=2.229ms fixed=0.022ms speedup=102.3x -N=1000 k=1000 : defective=9.462ms fixed=0.048ms speedup=197.5x -N=2000 k=2000 : defective=36.060ms fixed=0.096ms speedup=375.0x - -=== jsc-0002: DFGGraph::handleSuccessor() O(E×P) predecessor deduplication via Vector::contains === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.199ms fixed=0.021ms speedup=107.1x -N=1000 k=1000 : defective=8.871ms fixed=0.046ms speedup=191.7x -N=2000 k=2000 : defective=36.192ms fixed=0.096ms speedup=375.2x - -=== jsc-0003: DFGIntegerRangeOptimizationPhase liveAtHead Vector::contains O(50×B×R×L) → O(50×B×R) with HashSet === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.160ms fixed=0.031ms speedup=70.1x -N=1000 k=1000 : defective=8.929ms fixed=0.045ms speedup=197.1x -N=2000 k=2000 : defective=35.661ms fixed=0.098ms speedup=363.6x - diff --git a/defects/jsc/bench/run_all.py b/defects/jsc/bench/run_all.py deleted file mode 100644 index 7a41de8d6..000000000 --- a/defects/jsc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-jsc-0001.py", "bench-jsc-0002.py", "bench-jsc-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/juicefs-0001/Makefile b/defects/juicefs-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/juicefs-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/juicefs-0001/bench/bench-juicefs-0001-0001.py b/defects/juicefs-0001/bench/bench-juicefs-0001-0001.py deleted file mode 100644 index e13c01a61..000000000 --- a/defects/juicefs-0001/bench/bench-juicefs-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-juicefs-0001-0001.py -# CWE-407: list-scan inside loop in juicefs-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== juicefs-0001-0001: CWE-407: list-scan inside loop in juicefs-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/juicefs-0001/bench/results.txt b/defects/juicefs-0001/bench/results.txt deleted file mode 100644 index eed8467b2..000000000 --- a/defects/juicefs-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== juicefs-0001-0001: CWE-407: list-scan inside loop in juicefs-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.270ms fixed=0.021ms speedup=107.5x -N=1000 k=1000 : defective=9.123ms fixed=0.045ms speedup=202.7x -N=2000 k=2000 : defective=35.234ms fixed=0.097ms speedup=361.5x - diff --git a/defects/juicefs-0001/bench/run_all.py b/defects/juicefs-0001/bench/run_all.py deleted file mode 100644 index da780d9ed..000000000 --- a/defects/juicefs-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-juicefs-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/julia/Makefile b/defects/julia/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/julia/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/julia/bench/bench-julia-0001.py b/defects/julia/bench/bench-julia-0001.py deleted file mode 100644 index 3ce86debd..000000000 --- a/defects/julia/bench/bench-julia-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-julia-0001.py -# CWE-407: list-scan inside loop in julia-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== julia-0001: CWE-407: list-scan inside loop in julia-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/julia/bench/bench-julia-0002.py b/defects/julia/bench/bench-julia-0002.py deleted file mode 100644 index 5e8a6afce..000000000 --- a/defects/julia/bench/bench-julia-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-julia-0002.py -# CWE-407: list-scan inside loop in julia-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== julia-0002: CWE-407: list-scan inside loop in julia-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/julia/bench/bench-julia-0003.py b/defects/julia/bench/bench-julia-0003.py deleted file mode 100644 index c2a058206..000000000 --- a/defects/julia/bench/bench-julia-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-julia-0003.py -# CWE-407: list-scan inside loop in julia-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== julia-0003: CWE-407: list-scan inside loop in julia-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/julia/bench/results.txt b/defects/julia/bench/results.txt deleted file mode 100644 index 12e132677..000000000 --- a/defects/julia/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== julia-0001: CWE-407: list-scan inside loop in julia-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.302ms fixed=0.023ms speedup=101.8x -N=1000 k=1000 : defective=9.558ms fixed=0.050ms speedup=190.4x -N=2000 k=2000 : defective=37.628ms fixed=0.105ms speedup=357.6x - -=== julia-0002: CWE-407: list-scan inside loop in julia-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.7x -N=500 k=500 : defective=2.344ms fixed=0.023ms speedup=103.5x -N=1000 k=1000 : defective=8.584ms fixed=0.046ms speedup=187.3x -N=2000 k=2000 : defective=34.763ms fixed=0.097ms speedup=357.5x - -=== julia-0003: CWE-407: list-scan inside loop in julia-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.107ms fixed=0.020ms speedup=103.4x -N=1000 k=1000 : defective=8.654ms fixed=0.045ms speedup=192.9x -N=2000 k=2000 : defective=34.910ms fixed=0.098ms speedup=357.6x - diff --git a/defects/julia/bench/run_all.py b/defects/julia/bench/run_all.py deleted file mode 100644 index 5785e6233..000000000 --- a/defects/julia/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-julia-0001.py", "bench-julia-0002.py", "bench-julia-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kafka/Makefile b/defects/kafka/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kafka/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kafka/bench/bench-kafka-0001.py b/defects/kafka/bench/bench-kafka-0001.py deleted file mode 100644 index efb4b29c0..000000000 --- a/defects/kafka/bench/bench-kafka-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0001.py -# CWE-407: list-scan inside loop in kafka-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0001: CWE-407: list-scan inside loop in kafka-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0002.py b/defects/kafka/bench/bench-kafka-0002.py deleted file mode 100644 index a2e57f94c..000000000 --- a/defects/kafka/bench/bench-kafka-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0002.py -# CWE-407: list-scan inside loop in kafka-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0002: CWE-407: list-scan inside loop in kafka-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0003.py b/defects/kafka/bench/bench-kafka-0003.py deleted file mode 100644 index 72a6b7c78..000000000 --- a/defects/kafka/bench/bench-kafka-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0003.py -# CWE-407: list-scan inside loop in kafka-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0003: CWE-407: list-scan inside loop in kafka-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0004.py b/defects/kafka/bench/bench-kafka-0004.py deleted file mode 100644 index 848933e06..000000000 --- a/defects/kafka/bench/bench-kafka-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0004.py -# kafka-0003: RoundRobinAssignor — topics().contains() inside while-in-for loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0004: kafka-0003: RoundRobinAssignor — topics().contains() inside while-in-for loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0005.py b/defects/kafka/bench/bench-kafka-0005.py deleted file mode 100644 index e4a11401a..000000000 --- a/defects/kafka/bench/bench-kafka-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0005.py -# kafka-0004: AbstractStickyAssignor — consumerSubscription.topics().contains() in prepopulateCurrentAssignments -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0005: kafka-0004: AbstractStickyAssignor — consumerSubscription.topics().contains() in prepopulateCurrentAssignments ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0006.py b/defects/kafka/bench/bench-kafka-0006.py deleted file mode 100644 index 4f7dbf0e9..000000000 --- a/defects/kafka/bench/bench-kafka-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0006.py -# kafka-0006 — Kafka Streams DefaultTaskManager: ArrayList lockedTasks O(T×L) in hot scheduling loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0006: kafka-0006 — Kafka Streams DefaultTaskManager: ArrayList lockedTasks O(T×L) in hot scheduling loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0007.py b/defects/kafka/bench/bench-kafka-0007.py deleted file mode 100644 index 4e9855715..000000000 --- a/defects/kafka/bench/bench-kafka-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0007.py -# kafka-0007 — Kafka Streams StreamsPartitionAssignor: PriorityQueue.contains() O(T²) in task assignment loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0007: kafka-0007 — Kafka Streams StreamsPartitionAssignor: PriorityQueue.contains() O(T²) in task assignment loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0008.py b/defects/kafka/bench/bench-kafka-0008.py deleted file mode 100644 index 7687355d2..000000000 --- a/defects/kafka/bench/bench-kafka-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0008.py -# kafka-0008 — ListDeserializer nullIndexList ArrayList.contains O(S×N) → HashSet O(S) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0008: kafka-0008 — ListDeserializer nullIndexList ArrayList.contains O(S×N) → HashSet O(S) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0009.py b/defects/kafka/bench/bench-kafka-0009.py deleted file mode 100644 index f874113f4..000000000 --- a/defects/kafka/bench/bench-kafka-0009.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0009.py -# CWE-407: list-scan inside loop in kafka-0009 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0009: CWE-407: list-scan inside loop in kafka-0009 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0010.py b/defects/kafka/bench/bench-kafka-0010.py deleted file mode 100644 index ffd5a28a1..000000000 --- a/defects/kafka/bench/bench-kafka-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0010.py -# CWE-407: list-scan inside loop in kafka-0010 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0010: CWE-407: list-scan inside loop in kafka-0010 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/bench-kafka-0011.py b/defects/kafka/bench/bench-kafka-0011.py deleted file mode 100644 index a5d74ce55..000000000 --- a/defects/kafka/bench/bench-kafka-0011.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kafka-0011.py -# CWE-407: list-scan inside loop in kafka-0011 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kafka-0011: CWE-407: list-scan inside loop in kafka-0011 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kafka/bench/results.txt b/defects/kafka/bench/results.txt deleted file mode 100644 index e631dd0e6..000000000 --- a/defects/kafka/bench/results.txt +++ /dev/null @@ -1,66 +0,0 @@ -=== kafka-0001: CWE-407: list-scan inside loop in kafka-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.788ms fixed=0.026ms speedup=106.8x -N=1000 k=1000 : defective=11.288ms fixed=0.053ms speedup=214.1x -N=2000 k=2000 : defective=39.657ms fixed=0.102ms speedup=390.3x - -=== kafka-0002: CWE-407: list-scan inside loop in kafka-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.235ms fixed=0.021ms speedup=106.5x -N=1000 k=1000 : defective=9.734ms fixed=0.076ms speedup=128.7x -N=2000 k=2000 : defective=40.752ms fixed=0.141ms speedup=288.9x - -=== kafka-0003: CWE-407: list-scan inside loop in kafka-0003 (generic model) === -N=100 k=100 : defective=0.179ms fixed=0.007ms speedup=24.9x -N=500 k=500 : defective=2.217ms fixed=0.020ms speedup=108.3x -N=1000 k=1000 : defective=8.789ms fixed=0.048ms speedup=183.6x -N=2000 k=2000 : defective=39.794ms fixed=0.112ms speedup=354.5x - -=== kafka-0004: kafka-0003: RoundRobinAssignor — topics().contains() inside while-in-for loop === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.604ms fixed=0.024ms speedup=107.4x -N=1000 k=1000 : defective=11.815ms fixed=0.058ms speedup=202.8x -N=2000 k=2000 : defective=36.789ms fixed=0.096ms speedup=382.6x - -=== kafka-0005: kafka-0004: AbstractStickyAssignor — consumerSubscription.topics().contains() in prepopulateCurrentAssignments === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.209ms fixed=0.023ms speedup=95.8x -N=1000 k=1000 : defective=9.711ms fixed=0.076ms speedup=128.3x -N=2000 k=2000 : defective=44.210ms fixed=0.096ms speedup=461.2x - -=== kafka-0006: kafka-0006 — Kafka Streams DefaultTaskManager: ArrayList lockedTasks O(T×L) in hot scheduling loop === -N=100 k=100 : defective=0.154ms fixed=0.010ms speedup=15.3x -N=500 k=500 : defective=2.264ms fixed=0.034ms speedup=66.2x -N=1000 k=1000 : defective=9.336ms fixed=0.046ms speedup=203.8x -N=2000 k=2000 : defective=35.341ms fixed=0.096ms speedup=369.0x - -=== kafka-0007: kafka-0007 — Kafka Streams StreamsPartitionAssignor: PriorityQueue.contains() O(T²) in task assignment loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.126ms fixed=0.037ms speedup=57.6x -N=1000 k=1000 : defective=10.172ms fixed=0.045ms speedup=224.0x -N=2000 k=2000 : defective=36.828ms fixed=0.100ms speedup=368.9x - -=== kafka-0008: kafka-0008 — ListDeserializer nullIndexList ArrayList.contains O(S×N) → HashSet O(S) === -N=100 k=100 : defective=0.089ms fixed=0.007ms speedup=12.6x -N=500 k=500 : defective=2.738ms fixed=0.021ms speedup=128.7x -N=1000 k=1000 : defective=9.794ms fixed=0.048ms speedup=202.3x -N=2000 k=2000 : defective=35.540ms fixed=0.096ms speedup=370.2x - -=== kafka-0009: CWE-407: list-scan inside loop in kafka-0009 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.107ms fixed=0.020ms speedup=102.9x -N=1000 k=1000 : defective=9.294ms fixed=0.047ms speedup=197.4x -N=2000 k=2000 : defective=34.976ms fixed=0.102ms speedup=343.2x - -=== kafka-0010: CWE-407: list-scan inside loop in kafka-0010 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.195ms fixed=0.022ms speedup=101.5x -N=1000 k=1000 : defective=8.894ms fixed=0.058ms speedup=154.3x -N=2000 k=2000 : defective=35.889ms fixed=0.101ms speedup=356.8x - -=== kafka-0011: CWE-407: list-scan inside loop in kafka-0011 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.133ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=8.672ms fixed=0.047ms speedup=185.7x -N=2000 k=2000 : defective=39.175ms fixed=0.106ms speedup=370.4x - diff --git a/defects/kafka/bench/run_all.py b/defects/kafka/bench/run_all.py deleted file mode 100644 index 028f7d9aa..000000000 --- a/defects/kafka/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kafka-0001.py", "bench-kafka-0002.py", "bench-kafka-0003.py", "bench-kafka-0004.py", "bench-kafka-0005.py", "bench-kafka-0006.py", "bench-kafka-0007.py", "bench-kafka-0008.py", "bench-kafka-0009.py", "bench-kafka-0010.py", "bench-kafka-0011.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/katago/Makefile b/defects/katago/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/katago/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/katago/bench/bench-katago-0001.py b/defects/katago/bench/bench-katago-0001.py deleted file mode 100644 index 22f6ecb80..000000000 --- a/defects/katago/bench/bench-katago-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-katago-0001.py -# Defect: linear dup scan buf[bufStart..bufIdx+numFound] for each candidate liberty. -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== katago-0001: Defect: linear dup scan buf[bufStart..bufIdx+numFound] for each candidate liberty. ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/katago/bench/results.txt b/defects/katago/bench/results.txt deleted file mode 100644 index d9aa8cf09..000000000 --- a/defects/katago/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== katago-0001: Defect: linear dup scan buf[bufStart..bufIdx+numFound] for each candidate liberty. === -N=100 k=100 : defective=0.287ms fixed=0.004ms speedup=67.9x -N=500 k=500 : defective=4.524ms fixed=0.025ms speedup=182.5x -N=1000 k=1000 : defective=13.811ms fixed=0.045ms speedup=308.0x -N=2000 k=2000 : defective=47.256ms fixed=0.105ms speedup=450.2x - diff --git a/defects/katago/bench/run_all.py b/defects/katago/bench/run_all.py deleted file mode 100644 index 09c9a48b6..000000000 --- a/defects/katago/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-katago-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/katago/unit/test_katago_cwe407 b/defects/katago/unit/test_katago_cwe407 deleted file mode 100755 index 8816aff59..000000000 Binary files a/defects/katago/unit/test_katago_cwe407 and /dev/null differ diff --git a/defects/kdenlive-0010/Makefile b/defects/kdenlive-0010/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kdenlive-0010/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kdenlive-0010/bench/bench-kdenlive-0010-0010.py b/defects/kdenlive-0010/bench/bench-kdenlive-0010-0010.py deleted file mode 100644 index 6d816a571..000000000 --- a/defects/kdenlive-0010/bench/bench-kdenlive-0010-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0010-0010.py -# CWE-407: list-scan inside loop in kdenlive-0010-0010 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0010-0010: CWE-407: list-scan inside loop in kdenlive-0010-0010 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive-0010/bench/bench-kdenlive-0010.py b/defects/kdenlive-0010/bench/bench-kdenlive-0010.py deleted file mode 100644 index f74db752d..000000000 --- a/defects/kdenlive-0010/bench/bench-kdenlive-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0010.py -# Defect: kdenlive-0010 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0010: Defect: kdenlive-0010 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive-0010/bench/results.txt b/defects/kdenlive-0010/bench/results.txt deleted file mode 100644 index dff3f690a..000000000 --- a/defects/kdenlive-0010/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== kdenlive-0010-0010: CWE-407: list-scan inside loop in kdenlive-0010-0010 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.175ms fixed=0.021ms speedup=104.3x -N=1000 k=1000 : defective=8.636ms fixed=0.047ms speedup=181.9x -N=2000 k=2000 : defective=38.269ms fixed=0.100ms speedup=381.5x - -=== kdenlive-0010: Defect: kdenlive-0010 === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.235ms fixed=0.021ms speedup=105.3x -N=1000 k=1000 : defective=9.005ms fixed=0.178ms speedup=50.5x -N=2000 k=2000 : defective=35.972ms fixed=0.144ms speedup=250.6x - diff --git a/defects/kdenlive-0010/bench/run_all.py b/defects/kdenlive-0010/bench/run_all.py deleted file mode 100644 index 534634275..000000000 --- a/defects/kdenlive-0010/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kdenlive-0010-0010.py", "bench-kdenlive-0010.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kdenlive/Makefile b/defects/kdenlive/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kdenlive/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kdenlive/bench/bench-kdenlive-0001.py b/defects/kdenlive/bench/bench-kdenlive-0001.py deleted file mode 100644 index fccf2db60..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0001.py -# Defect: kdenlive-0001 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0001: Defect: kdenlive-0001 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0002.py b/defects/kdenlive/bench/bench-kdenlive-0002.py deleted file mode 100644 index b9991f0ca..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0002.py -# Defect: kdenlive-0002 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0002: Defect: kdenlive-0002 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0003.py b/defects/kdenlive/bench/bench-kdenlive-0003.py deleted file mode 100644 index dad92da0b..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0003.py -# Defect: kdenlive-0003 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0003: Defect: kdenlive-0003 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0004.py b/defects/kdenlive/bench/bench-kdenlive-0004.py deleted file mode 100644 index 7bb0b385e..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0004.py -# Defect: kdenlive-0004 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0004: Defect: kdenlive-0004 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0005.py b/defects/kdenlive/bench/bench-kdenlive-0005.py deleted file mode 100644 index 437c3b4d6..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0005.py -# Defect: kdenlive-0005 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0005: Defect: kdenlive-0005 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0006.py b/defects/kdenlive/bench/bench-kdenlive-0006.py deleted file mode 100644 index 9b1df13bb..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0006.py -# Defect: kdenlive-0006 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0006: Defect: kdenlive-0006 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0007.py b/defects/kdenlive/bench/bench-kdenlive-0007.py deleted file mode 100644 index a96c8e396..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0007.py -# Defect: kdenlive-0007 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0007: Defect: kdenlive-0007 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0008.py b/defects/kdenlive/bench/bench-kdenlive-0008.py deleted file mode 100644 index df5454471..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0008.py -# Defect: kdenlive-0008 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0008: Defect: kdenlive-0008 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0009.py b/defects/kdenlive/bench/bench-kdenlive-0009.py deleted file mode 100644 index 6ec9652ca..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0009.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0009.py -# Defect: kdenlive-0009 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0009: Defect: kdenlive-0009 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0010-0010.py b/defects/kdenlive/bench/bench-kdenlive-0010-0010.py deleted file mode 100644 index 6d816a571..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0010-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0010-0010.py -# CWE-407: list-scan inside loop in kdenlive-0010-0010 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0010-0010: CWE-407: list-scan inside loop in kdenlive-0010-0010 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-0010.py b/defects/kdenlive/bench/bench-kdenlive-0010.py deleted file mode 100644 index f74db752d..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-0010.py -# Defect: kdenlive-0010 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-0010: Defect: kdenlive-0010 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/bench-kdenlive-2026.py b/defects/kdenlive/bench/bench-kdenlive-2026.py deleted file mode 100644 index c4bae2104..000000000 --- a/defects/kdenlive/bench/bench-kdenlive-2026.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kdenlive-2026.py -# CWE-407: list-scan inside loop in kdenlive-2026 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kdenlive-2026: CWE-407: list-scan inside loop in kdenlive-2026 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kdenlive/bench/results.txt b/defects/kdenlive/bench/results.txt deleted file mode 100644 index 50a0089ba..000000000 --- a/defects/kdenlive/bench/results.txt +++ /dev/null @@ -1,72 +0,0 @@ -=== kdenlive-0001: Defect: kdenlive-0001 === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.562ms fixed=0.025ms speedup=102.2x -N=1000 k=1000 : defective=10.659ms fixed=0.055ms speedup=192.8x -N=2000 k=2000 : defective=35.789ms fixed=0.097ms speedup=370.3x - -=== kdenlive-0002: Defect: kdenlive-0002 === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.169ms fixed=0.023ms speedup=94.9x -N=1000 k=1000 : defective=9.358ms fixed=0.045ms speedup=206.1x -N=2000 k=2000 : defective=37.506ms fixed=0.102ms speedup=369.4x - -=== kdenlive-0003: Defect: kdenlive-0003 === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.203ms fixed=0.021ms speedup=102.7x -N=1000 k=1000 : defective=8.744ms fixed=0.046ms speedup=188.8x -N=2000 k=2000 : defective=39.628ms fixed=0.101ms speedup=391.5x - -=== kdenlive-0004: Defect: kdenlive-0004 === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.408ms fixed=0.095ms speedup=25.3x -N=1000 k=1000 : defective=9.269ms fixed=0.046ms speedup=200.8x -N=2000 k=2000 : defective=37.684ms fixed=0.105ms speedup=359.2x - -=== kdenlive-0005: Defect: kdenlive-0005 === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.381ms fixed=0.023ms speedup=104.2x -N=1000 k=1000 : defective=9.484ms fixed=0.050ms speedup=191.4x -N=2000 k=2000 : defective=35.373ms fixed=0.096ms speedup=368.6x - -=== kdenlive-0006: Defect: kdenlive-0006 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.120ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.845ms fixed=0.047ms speedup=189.3x -N=2000 k=2000 : defective=37.963ms fixed=0.101ms speedup=377.7x - -=== kdenlive-0007: Defect: kdenlive-0007 === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.220ms fixed=0.022ms speedup=100.9x -N=1000 k=1000 : defective=9.602ms fixed=0.048ms speedup=199.2x -N=2000 k=2000 : defective=37.072ms fixed=0.103ms speedup=360.8x - -=== kdenlive-0008: Defect: kdenlive-0008 === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.321ms fixed=0.022ms speedup=105.8x -N=1000 k=1000 : defective=9.315ms fixed=0.048ms speedup=194.7x -N=2000 k=2000 : defective=38.899ms fixed=0.183ms speedup=213.0x - -=== kdenlive-0009: Defect: kdenlive-0009 === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.649ms fixed=0.042ms speedup=63.6x -N=1000 k=1000 : defective=10.371ms fixed=0.048ms speedup=214.8x -N=2000 k=2000 : defective=36.079ms fixed=0.109ms speedup=332.4x - -=== kdenlive-0010-0010: CWE-407: list-scan inside loop in kdenlive-0010-0010 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.350ms fixed=0.045ms speedup=52.7x -N=1000 k=1000 : defective=10.233ms fixed=0.050ms speedup=205.2x -N=2000 k=2000 : defective=40.033ms fixed=0.107ms speedup=375.6x - -=== kdenlive-0010: Defect: kdenlive-0010 === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.536ms fixed=0.024ms speedup=106.3x -N=1000 k=1000 : defective=9.688ms fixed=0.051ms speedup=191.4x -N=2000 k=2000 : defective=36.045ms fixed=0.097ms speedup=372.8x - -=== kdenlive-2026: CWE-407: list-scan inside loop in kdenlive-2026 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.132ms fixed=0.022ms speedup=96.6x -N=1000 k=1000 : defective=11.096ms fixed=0.048ms speedup=230.1x -N=2000 k=2000 : defective=38.173ms fixed=0.107ms speedup=355.8x - diff --git a/defects/kdenlive/bench/run_all.py b/defects/kdenlive/bench/run_all.py deleted file mode 100644 index a8991d7c5..000000000 --- a/defects/kdenlive/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kdenlive-0001.py", "bench-kdenlive-0002.py", "bench-kdenlive-0003.py", "bench-kdenlive-0004.py", "bench-kdenlive-0005.py", "bench-kdenlive-0006.py", "bench-kdenlive-0007.py", "bench-kdenlive-0008.py", "bench-kdenlive-0009.py", "bench-kdenlive-0010-0010.py", "bench-kdenlive-0010.py", "bench-kdenlive-2026.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/keystone/Makefile b/defects/keystone/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/keystone/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/keystone/bench/bench-keystone-0001.py b/defects/keystone/bench/bench-keystone-0001.py deleted file mode 100644 index 95e9ae8c9..000000000 --- a/defects/keystone/bench/bench-keystone-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-keystone-0001.py -# CWE-407: list-scan inside loop in keystone-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== keystone-0001: CWE-407: list-scan inside loop in keystone-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/keystone/bench/results.txt b/defects/keystone/bench/results.txt deleted file mode 100644 index 884733737..000000000 --- a/defects/keystone/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== keystone-0001: CWE-407: list-scan inside loop in keystone-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.640ms fixed=0.025ms speedup=104.8x -N=1000 k=1000 : defective=11.068ms fixed=0.054ms speedup=203.9x -N=2000 k=2000 : defective=36.103ms fixed=0.096ms speedup=375.6x - diff --git a/defects/keystone/bench/run_all.py b/defects/keystone/bench/run_all.py deleted file mode 100644 index 3ae53b16f..000000000 --- a/defects/keystone/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-keystone-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kicad-0003/Makefile b/defects/kicad-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kicad-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kicad-0003/bench/bench-kicad-0003-0003.py b/defects/kicad-0003/bench/bench-kicad-0003-0003.py deleted file mode 100644 index b3bd50003..000000000 --- a/defects/kicad-0003/bench/bench-kicad-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kicad-0003-0003.py -# CWE-407: list-scan inside loop in kicad-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kicad-0003-0003: CWE-407: list-scan inside loop in kicad-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kicad-0003/bench/results.txt b/defects/kicad-0003/bench/results.txt deleted file mode 100644 index 149229994..000000000 --- a/defects/kicad-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== kicad-0003-0003: CWE-407: list-scan inside loop in kicad-0003-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.334ms fixed=0.023ms speedup=102.5x -N=1000 k=1000 : defective=9.741ms fixed=0.051ms speedup=191.6x -N=2000 k=2000 : defective=39.233ms fixed=0.095ms speedup=412.5x - diff --git a/defects/kicad-0003/bench/run_all.py b/defects/kicad-0003/bench/run_all.py deleted file mode 100644 index 82b22fcc4..000000000 --- a/defects/kicad-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kicad-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kicad/Makefile b/defects/kicad/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kicad/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kicad/bench/bench-kicad-0001.py b/defects/kicad/bench/bench-kicad-0001.py deleted file mode 100644 index 1127fd26f..000000000 --- a/defects/kicad/bench/bench-kicad-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kicad-0001.py -# CWE-407: list-scan inside loop in kicad-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kicad-0001: CWE-407: list-scan inside loop in kicad-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kicad/bench/bench-kicad-0002.py b/defects/kicad/bench/bench-kicad-0002.py deleted file mode 100644 index bb7747b3b..000000000 --- a/defects/kicad/bench/bench-kicad-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kicad-0002.py -# zone_filler.cpp std::find O(Z²×L²) → O(Z×L log(Z×L)) with ordered set -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kicad-0002: zone_filler.cpp std::find O(Z²×L²) → O(Z×L log(Z×L)) with ordered set ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kicad/bench/bench-kicad-0003-0003.py b/defects/kicad/bench/bench-kicad-0003-0003.py deleted file mode 100644 index b3bd50003..000000000 --- a/defects/kicad/bench/bench-kicad-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kicad-0003-0003.py -# CWE-407: list-scan inside loop in kicad-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kicad-0003-0003: CWE-407: list-scan inside loop in kicad-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kicad/bench/results.txt b/defects/kicad/bench/results.txt deleted file mode 100644 index 3b70943ee..000000000 --- a/defects/kicad/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== kicad-0001: CWE-407: list-scan inside loop in kicad-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.320ms fixed=0.023ms speedup=100.8x -N=1000 k=1000 : defective=10.179ms fixed=0.051ms speedup=200.6x -N=2000 k=2000 : defective=37.080ms fixed=0.098ms speedup=380.3x - -=== kicad-0002: zone_filler.cpp std::find O(Z²×L²) → O(Z×L log(Z×L)) with ordered set === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=101.1x -N=1000 k=1000 : defective=8.578ms fixed=0.045ms speedup=188.8x -N=2000 k=2000 : defective=34.680ms fixed=0.096ms speedup=361.6x - -=== kicad-0003-0003: CWE-407: list-scan inside loop in kicad-0003-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=100.5x -N=1000 k=1000 : defective=8.849ms fixed=0.048ms speedup=182.9x -N=2000 k=2000 : defective=35.425ms fixed=0.098ms speedup=363.2x - diff --git a/defects/kicad/bench/run_all.py b/defects/kicad/bench/run_all.py deleted file mode 100644 index 436a686cb..000000000 --- a/defects/kicad/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kicad-0001.py", "bench-kicad-0002.py", "bench-kicad-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/knex/Makefile b/defects/knex/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/knex/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/knex/bench/bench-knex-0001.py b/defects/knex/bench/bench-knex-0001.py deleted file mode 100644 index c71a4b9b9..000000000 --- a/defects/knex/bench/bench-knex-0001.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python3 -# bench-knex-0001.py -# Migrator.rollback / Migrator.down: filter allMigrations against completed -# names via .map().includes() inside filter callback. O(A*C) work + O(A*C) -# allocation per call. Fix: hoist Set -> O(A+C). - -import sys -import time - - -def bench_defective(a_all, c_completed): - all_migrations = [{'name': f'm_{i:04d}'} for i in range(a_all)] - completed = [{'name': f'm_{i:04d}'} for i in range(c_completed)] - - t0 = time.perf_counter() - # Filter: per iteration, rebuild name list + linear search - result = [] - for mig in all_migrations: - names = [m['name'] for m in completed] # O(C) allocation per iter - if mig['name'] in names: # O(C) scan per iter - result.append(mig) - return time.perf_counter() - t0 - - -def bench_fixed(a_all, c_completed): - all_migrations = [{'name': f'm_{i:04d}'} for i in range(a_all)] - completed = [{'name': f'm_{i:04d}'} for i in range(c_completed)] - - t0 = time.perf_counter() - completed_set = {m['name'] for m in completed} # O(C) once - result = [mig for mig in all_migrations if mig['name'] in completed_set] - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 50), (200, 200), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== knex-0001: Migrator .map().includes() vs hoisted Set.has ===" - print(header); lines.append(header) - for a, c in CASES: - df = min(bench_defective(a, c) for _ in range(TRIALS)) - fx = min(bench_fixed(a, c) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"A={a:<5} C={c:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/knex/bench/results.txt b/defects/knex/bench/results.txt deleted file mode 100644 index 4a853b0fe..000000000 --- a/defects/knex/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== knex-0001: Migrator .map().includes() vs hoisted Set.has === -A=50 C=50 : defective=0.304ms fixed=0.020ms speedup=15.2x -A=200 C=200 : defective=4.700ms fixed=0.084ms speedup=56.2x -A=500 C=500 : defective=27.909ms fixed=0.193ms speedup=144.7x -A=1000 C=1000 : defective=75.138ms fixed=0.371ms speedup=202.5x -A=2000 C=2000 : defective=290.100ms fixed=0.816ms speedup=355.5x - diff --git a/defects/knex/bench/run_all.py b/defects/knex/bench/run_all.py deleted file mode 100644 index 6f8f2b074..000000000 --- a/defects/knex/bench/run_all.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod -all_lines = [] -for fname in ["bench-knex-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/knex/patch/knex-0001-migrator-completed-name-set.patch b/defects/knex/patch/knex-0001-migrator-completed-name-set.patch deleted file mode 100644 index 468052c86..000000000 --- a/defects/knex/patch/knex-0001-migrator-completed-name-set.patch +++ /dev/null @@ -1,66 +0,0 @@ -# UNDF: UNDF-2026-000001298 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(A*C^2) -> O(A+C) in Knex Migrator rollback/down -# -# Defect: rollback({all:true}) and down() filter allMigrations against the -# completed list using .map(name).includes() inside the filter callback. -# Per-iteration allocation of the names array + linear scan = O(C) -# real, O(C^2) amortized including GC pressure. Across A migrations: -# O(A*C) work + O(A*C) allocation = O(A*C^2) effective cost. -# -# Fix: Hoist the names into a Set once before the filter; Set#has -# is O(1). Total cost drops to O(A+C). -# -# Complexity gate (tests/test-knex-cwe407.py): -# A=C=500: fixed must complete in <5ms -# k-scaling 5x: time ratio must be <17.5x ---- a/lib/migrations/migrate/Migrator.js -+++ b/lib/migrations/migrate/Migrator.js -@@ -184,17 +184,18 @@ class Migrator { - .then((val) => { - const [allMigrations, completedMigrations] = val; - -- return all -- ? allMigrations -- .filter((migration) => { -- return completedMigrations -- .map((migration) => migration.name) -- .includes( -- this.config.migrationSource.getMigrationName(migration) -- ); -- }) -- .reverse() -- : this._getLastBatch(val); -+ if (!all) { -+ return this._getLastBatch(val); -+ } -+ // Hoist completed-name lookup into a Set so each filter step is -+ // O(1) instead of O(C) per-iter scan + O(C) per-iter allocation. -+ const completedNameSet = new Set( -+ completedMigrations.map((m) => m.name) -+ ); -+ return allMigrations -+ .filter((migration) => -+ completedNameSet.has(this.config.migrationSource.getMigrationName(migration)) -+ ) -+ .reverse(); - }) - .then((migrations) => { - return this._runBatch(migrations, 'down'); -@@ -214,12 +215,11 @@ class Migrator { - return value; - }) - .then(([all, completed]) => { -- const completedMigrations = all.filter((migration) => { -- return completed -- .map((migration) => migration.name) -- .includes(this.config.migrationSource.getMigrationName(migration)); -- }); -+ // Hoist Set: same O(A*C^2) -> O(A+C) optimization as rollback() above. -+ const completedNameSet = new Set(completed.map((m) => m.name)); -+ const completedMigrations = all.filter((migration) => -+ completedNameSet.has(this.config.migrationSource.getMigrationName(migration)) -+ ); - - let migrationToRun; - const name = this.config.name; diff --git a/defects/kotlin/Makefile b/defects/kotlin/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kotlin/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kotlin/bench/bench-kotlin-0001.py b/defects/kotlin/bench/bench-kotlin-0001.py deleted file mode 100644 index 5d801b7c1..000000000 --- a/defects/kotlin/bench/bench-kotlin-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kotlin-0001.py -# CWE-407: list-scan inside loop in kotlin-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kotlin-0001: CWE-407: list-scan inside loop in kotlin-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kotlin/bench/bench-kotlin-0002.py b/defects/kotlin/bench/bench-kotlin-0002.py deleted file mode 100644 index 4f7bb465d..000000000 --- a/defects/kotlin/bench/bench-kotlin-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kotlin-0002.py -# CWE-407: list-scan inside loop in kotlin-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kotlin-0002: CWE-407: list-scan inside loop in kotlin-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kotlin/bench/results.txt b/defects/kotlin/bench/results.txt deleted file mode 100644 index 16eead4a8..000000000 --- a/defects/kotlin/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== kotlin-0001: CWE-407: list-scan inside loop in kotlin-0001 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.302ms fixed=0.022ms speedup=105.6x -N=1000 k=1000 : defective=9.573ms fixed=0.051ms speedup=189.4x -N=2000 k=2000 : defective=35.469ms fixed=0.097ms speedup=365.7x - -=== kotlin-0002: CWE-407: list-scan inside loop in kotlin-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=105.4x -N=1000 k=1000 : defective=8.599ms fixed=0.046ms speedup=185.0x -N=2000 k=2000 : defective=35.259ms fixed=0.097ms speedup=363.1x - diff --git a/defects/kotlin/bench/run_all.py b/defects/kotlin/bench/run_all.py deleted file mode 100644 index 771606dff..000000000 --- a/defects/kotlin/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kotlin-0001.py", "bench-kotlin-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/krita-0001/Makefile b/defects/krita-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/krita-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/krita-0001/bench/bench-krita-0001-0001.py b/defects/krita-0001/bench/bench-krita-0001-0001.py deleted file mode 100644 index 36129a522..000000000 --- a/defects/krita-0001/bench/bench-krita-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-krita-0001-0001.py -# CWE-407: list-scan inside loop in krita-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== krita-0001-0001: CWE-407: list-scan inside loop in krita-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/krita-0001/bench/results.txt b/defects/krita-0001/bench/results.txt deleted file mode 100644 index 6a5fa7e23..000000000 --- a/defects/krita-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== krita-0001-0001: CWE-407: list-scan inside loop in krita-0001-0001 (generic model) === -N=100 k=100 : defective=0.157ms fixed=0.007ms speedup=21.0x -N=500 k=500 : defective=2.327ms fixed=0.023ms speedup=102.6x -N=1000 k=1000 : defective=9.522ms fixed=0.051ms speedup=186.8x -N=2000 k=2000 : defective=35.535ms fixed=0.096ms speedup=371.1x - diff --git a/defects/krita-0001/bench/run_all.py b/defects/krita-0001/bench/run_all.py deleted file mode 100644 index 321702234..000000000 --- a/defects/krita-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-krita-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/krita-0002/Makefile b/defects/krita-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/krita-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/krita-0002/bench/bench-krita-0002-0002.py b/defects/krita-0002/bench/bench-krita-0002-0002.py deleted file mode 100644 index 8c558a754..000000000 --- a/defects/krita-0002/bench/bench-krita-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-krita-0002-0002.py -# CWE-407: list-scan inside loop in krita-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== krita-0002-0002: CWE-407: list-scan inside loop in krita-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/krita-0002/bench/results.txt b/defects/krita-0002/bench/results.txt deleted file mode 100644 index 8f9162945..000000000 --- a/defects/krita-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== krita-0002-0002: CWE-407: list-scan inside loop in krita-0002-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.246ms fixed=0.021ms speedup=106.0x -N=1000 k=1000 : defective=9.768ms fixed=0.048ms speedup=204.3x -N=2000 k=2000 : defective=36.384ms fixed=0.097ms speedup=375.0x - diff --git a/defects/krita-0002/bench/run_all.py b/defects/krita-0002/bench/run_all.py deleted file mode 100644 index 3217d37f7..000000000 --- a/defects/krita-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-krita-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kronos-0001/Makefile b/defects/kronos-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kronos-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kronos-0001/bench/bench-kronos-0001-0001.py b/defects/kronos-0001/bench/bench-kronos-0001-0001.py deleted file mode 100644 index 570d85180..000000000 --- a/defects/kronos-0001/bench/bench-kronos-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kronos-0001-0001.py -# CWE-407: list-scan inside loop in kronos-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kronos-0001-0001: CWE-407: list-scan inside loop in kronos-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kronos-0001/bench/results.txt b/defects/kronos-0001/bench/results.txt deleted file mode 100644 index f235c9f90..000000000 --- a/defects/kronos-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== kronos-0001-0001: CWE-407: list-scan inside loop in kronos-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.373ms fixed=0.022ms speedup=106.0x -N=1000 k=1000 : defective=10.042ms fixed=0.050ms speedup=202.1x -N=2000 k=2000 : defective=39.831ms fixed=0.096ms speedup=413.5x - diff --git a/defects/kronos-0001/bench/run_all.py b/defects/kronos-0001/bench/run_all.py deleted file mode 100644 index ffacb981d..000000000 --- a/defects/kronos-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kronos-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kronos-0002/Makefile b/defects/kronos-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kronos-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kronos-0002/bench/bench-kronos-0002-0002.py b/defects/kronos-0002/bench/bench-kronos-0002-0002.py deleted file mode 100644 index 7debf0a47..000000000 --- a/defects/kronos-0002/bench/bench-kronos-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kronos-0002-0002.py -# CWE-407: list-scan inside loop in kronos-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kronos-0002-0002: CWE-407: list-scan inside loop in kronos-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kronos-0002/bench/results.txt b/defects/kronos-0002/bench/results.txt deleted file mode 100644 index e53ede685..000000000 --- a/defects/kronos-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== kronos-0002-0002: CWE-407: list-scan inside loop in kronos-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.285ms fixed=0.022ms speedup=105.3x -N=1000 k=1000 : defective=9.626ms fixed=0.051ms speedup=189.8x -N=2000 k=2000 : defective=35.635ms fixed=0.096ms speedup=369.4x - diff --git a/defects/kronos-0002/bench/run_all.py b/defects/kronos-0002/bench/run_all.py deleted file mode 100644 index 420862f11..000000000 --- a/defects/kronos-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kronos-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kubeflow/Makefile b/defects/kubeflow/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kubeflow/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kubeflow/bench/bench-kubeflow-0001.py b/defects/kubeflow/bench/bench-kubeflow-0001.py deleted file mode 100644 index d44f78694..000000000 --- a/defects/kubeflow/bench/bench-kubeflow-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubeflow-0001.py -# kubeflow-0001 — O(T²×I) Pipeline Compiler: tasks_in_current_dag List membership in DAG compilation -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubeflow-0001: kubeflow-0001 — O(T²×I) Pipeline Compiler: tasks_in_current_dag List membership in DAG compilation ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubeflow/bench/results.txt b/defects/kubeflow/bench/results.txt deleted file mode 100644 index b3882fd3a..000000000 --- a/defects/kubeflow/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== kubeflow-0001: kubeflow-0001 — O(T²×I) Pipeline Compiler: tasks_in_current_dag List membership in DAG compilation === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.306ms fixed=0.021ms speedup=107.3x -N=1000 k=1000 : defective=8.863ms fixed=0.046ms speedup=193.3x -N=2000 k=2000 : defective=35.857ms fixed=0.098ms speedup=366.5x - diff --git a/defects/kubeflow/bench/run_all.py b/defects/kubeflow/bench/run_all.py deleted file mode 100644 index 9aabcb1d3..000000000 --- a/defects/kubeflow/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kubeflow-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kubernetes/Makefile b/defects/kubernetes/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kubernetes/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kubernetes/bench/bench-kubernetes-0001.py b/defects/kubernetes/bench/bench-kubernetes-0001.py deleted file mode 100644 index 5dcd39e10..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0001.py -# CWE-407: list-scan inside loop in kubernetes-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0001: CWE-407: list-scan inside loop in kubernetes-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/bench-kubernetes-0002.py b/defects/kubernetes/bench/bench-kubernetes-0002.py deleted file mode 100644 index 717bebc70..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0002.py -# CWE-407: list-scan inside loop in kubernetes-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0002: CWE-407: list-scan inside loop in kubernetes-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/bench-kubernetes-0003.py b/defects/kubernetes/bench/bench-kubernetes-0003.py deleted file mode 100644 index a4c7f4723..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0003.py -# CWE-407: list-scan inside loop in kubernetes-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0003: CWE-407: list-scan inside loop in kubernetes-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/bench-kubernetes-0004.py b/defects/kubernetes/bench/bench-kubernetes-0004.py deleted file mode 100644 index 952e1bfce..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0004.py -# TaintSetDiff — O(T²) quadratic taint membership test in node lifecycle controller -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0004: TaintSetDiff — O(T²) quadratic taint membership test in node lifecycle controller ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/bench-kubernetes-0005.py b/defects/kubernetes/bench/bench-kubernetes-0005.py deleted file mode 100644 index 18ddb355a..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0005.py -# Scheduler TaintToleration Score — O(N×T×L) quadratic toleration scan per scheduling cycle -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0005: Scheduler TaintToleration Score — O(N×T×L) quadratic toleration scan per scheduling cycle ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/bench-kubernetes-0006.py b/defects/kubernetes/bench/bench-kubernetes-0006.py deleted file mode 100644 index bd5f5ba1e..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0006.py -# tainteviction handleNodeUpdate — O(P×T×L) GetMatchingTolerations on every node taint change -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0006: tainteviction handleNodeUpdate — O(P×T×L) GetMatchingTolerations on every node taint change ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/bench-kubernetes-0007.py b/defects/kubernetes/bench/bench-kubernetes-0007.py deleted file mode 100644 index 41143db74..000000000 --- a/defects/kubernetes/bench/bench-kubernetes-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kubernetes-0007.py -# CWE-407 — Quadratic exit-code scan in pod failure policy matching -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kubernetes-0007: CWE-407 — Quadratic exit-code scan in pod failure policy matching ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kubernetes/bench/results.txt b/defects/kubernetes/bench/results.txt deleted file mode 100644 index f811bf1d3..000000000 --- a/defects/kubernetes/bench/results.txt +++ /dev/null @@ -1,42 +0,0 @@ -=== kubernetes-0001: CWE-407: list-scan inside loop in kubernetes-0001 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.561ms fixed=0.025ms speedup=100.5x -N=1000 k=1000 : defective=10.626ms fixed=0.056ms speedup=190.1x -N=2000 k=2000 : defective=37.728ms fixed=0.096ms speedup=392.6x - -=== kubernetes-0002: CWE-407: list-scan inside loop in kubernetes-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.254ms fixed=0.020ms speedup=111.7x -N=1000 k=1000 : defective=8.496ms fixed=0.046ms speedup=183.1x -N=2000 k=2000 : defective=36.771ms fixed=0.113ms speedup=325.5x - -=== kubernetes-0003: CWE-407: list-scan inside loop in kubernetes-0003 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.501ms fixed=0.024ms speedup=102.8x -N=1000 k=1000 : defective=9.702ms fixed=0.047ms speedup=204.7x -N=2000 k=2000 : defective=37.915ms fixed=0.097ms speedup=390.7x - -=== kubernetes-0004: TaintSetDiff — O(T²) quadratic taint membership test in node lifecycle controller === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.113ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=8.829ms fixed=0.067ms speedup=131.9x -N=2000 k=2000 : defective=38.312ms fixed=0.102ms speedup=376.4x - -=== kubernetes-0005: Scheduler TaintToleration Score — O(N×T×L) quadratic toleration scan per scheduling cycle === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.291ms fixed=0.022ms speedup=105.6x -N=1000 k=1000 : defective=8.538ms fixed=0.047ms speedup=183.5x -N=2000 k=2000 : defective=36.090ms fixed=0.125ms speedup=288.3x - -=== kubernetes-0006: tainteviction handleNodeUpdate — O(P×T×L) GetMatchingTolerations on every node taint change === -N=100 k=100 : defective=0.111ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.778ms fixed=0.026ms speedup=108.7x -N=1000 k=1000 : defective=10.153ms fixed=0.056ms speedup=181.7x -N=2000 k=2000 : defective=39.998ms fixed=0.097ms speedup=410.7x - -=== kubernetes-0007: CWE-407 — Quadratic exit-code scan in pod failure policy matching === -N=100 k=100 : defective=0.258ms fixed=0.004ms speedup=70.4x -N=500 k=500 : defective=2.207ms fixed=0.022ms speedup=101.6x -N=1000 k=1000 : defective=9.922ms fixed=0.052ms speedup=189.8x -N=2000 k=2000 : defective=36.303ms fixed=0.097ms speedup=375.4x - diff --git a/defects/kubernetes/bench/run_all.py b/defects/kubernetes/bench/run_all.py deleted file mode 100644 index 6c018dae7..000000000 --- a/defects/kubernetes/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kubernetes-0001.py", "bench-kubernetes-0002.py", "bench-kubernetes-0003.py", "bench-kubernetes-0004.py", "bench-kubernetes-0005.py", "bench-kubernetes-0006.py", "bench-kubernetes-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/kylin/Makefile b/defects/kylin/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/kylin/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/kylin/bench/bench-kylin-0001.py b/defects/kylin/bench/bench-kylin-0001.py deleted file mode 100644 index 22a301de8..000000000 --- a/defects/kylin/bench/bench-kylin-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kylin-0001.py -# NDataflowManager.updateDataflowDetailsLayouts — O(L²) ArrayList.contains in layout update loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kylin-0001: NDataflowManager.updateDataflowDetailsLayouts — O(L²) ArrayList.contains in layout update loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kylin/bench/bench-kylin-0002.py b/defects/kylin/bench/bench-kylin-0002.py deleted file mode 100644 index 7d08ccaeb..000000000 --- a/defects/kylin/bench/bench-kylin-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-kylin-0002.py -# AclPermissionUtil.transformAuthorities — O(A²) ArrayList dedup loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== kylin-0002: AclPermissionUtil.transformAuthorities — O(A²) ArrayList dedup loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/kylin/bench/results.txt b/defects/kylin/bench/results.txt deleted file mode 100644 index d77230043..000000000 --- a/defects/kylin/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== kylin-0001: NDataflowManager.updateDataflowDetailsLayouts — O(L²) ArrayList.contains in layout update loop === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.281ms fixed=0.021ms speedup=108.0x -N=1000 k=1000 : defective=8.941ms fixed=0.086ms speedup=103.6x -N=2000 k=2000 : defective=36.069ms fixed=0.096ms speedup=374.5x - -=== kylin-0002: AclPermissionUtil.transformAuthorities — O(A²) ArrayList dedup loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.188ms fixed=0.020ms speedup=107.3x -N=1000 k=1000 : defective=8.792ms fixed=0.047ms speedup=186.8x -N=2000 k=2000 : defective=36.551ms fixed=0.096ms speedup=382.3x - diff --git a/defects/kylin/bench/run_all.py b/defects/kylin/bench/run_all.py deleted file mode 100644 index f9f2a822b..000000000 --- a/defects/kylin/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-kylin-0001.py", "bench-kylin-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/langchain-0001/Makefile b/defects/langchain-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/langchain-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/langchain-0001/bench/bench-langchain-0001-0001.py b/defects/langchain-0001/bench/bench-langchain-0001-0001.py deleted file mode 100644 index c1bde721e..000000000 --- a/defects/langchain-0001/bench/bench-langchain-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-langchain-0001-0001.py -# CWE-407: list-scan inside loop in langchain-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== langchain-0001-0001: CWE-407: list-scan inside loop in langchain-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/langchain-0001/bench/results.txt b/defects/langchain-0001/bench/results.txt deleted file mode 100644 index 402fdf3f1..000000000 --- a/defects/langchain-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== langchain-0001-0001: CWE-407: list-scan inside loop in langchain-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.420ms fixed=0.024ms speedup=102.3x -N=1000 k=1000 : defective=9.131ms fixed=0.047ms speedup=195.5x -N=2000 k=2000 : defective=36.165ms fixed=0.097ms speedup=374.6x - diff --git a/defects/langchain-0001/bench/run_all.py b/defects/langchain-0001/bench/run_all.py deleted file mode 100644 index c2a926e6a..000000000 --- a/defects/langchain-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-langchain-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/langchain-0002/Makefile b/defects/langchain-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/langchain-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/langchain-0002/bench/bench-langchain-0002-0002.py b/defects/langchain-0002/bench/bench-langchain-0002-0002.py deleted file mode 100644 index 791cc570f..000000000 --- a/defects/langchain-0002/bench/bench-langchain-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-langchain-0002-0002.py -# CWE-407: list-scan inside loop in langchain-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== langchain-0002-0002: CWE-407: list-scan inside loop in langchain-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/langchain-0002/bench/results.txt b/defects/langchain-0002/bench/results.txt deleted file mode 100644 index 12374c456..000000000 --- a/defects/langchain-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== langchain-0002-0002: CWE-407: list-scan inside loop in langchain-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.454ms fixed=0.024ms speedup=101.6x -N=1000 k=1000 : defective=12.330ms fixed=0.214ms speedup=57.7x -N=2000 k=2000 : defective=38.252ms fixed=0.099ms speedup=388.3x - diff --git a/defects/langchain-0002/bench/run_all.py b/defects/langchain-0002/bench/run_all.py deleted file mode 100644 index 5bf829cef..000000000 --- a/defects/langchain-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-langchain-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/lean4/bench/__pycache__/bench-lean4-0001.cpython-312.pyc b/defects/lean4/bench/__pycache__/bench-lean4-0001.cpython-312.pyc new file mode 100644 index 000000000..69629f35f Binary files /dev/null and b/defects/lean4/bench/__pycache__/bench-lean4-0001.cpython-312.pyc differ diff --git a/defects/lean4/bench/__pycache__/bench-lean4-0002.cpython-312.pyc b/defects/lean4/bench/__pycache__/bench-lean4-0002.cpython-312.pyc new file mode 100644 index 000000000..df54cffef Binary files /dev/null and b/defects/lean4/bench/__pycache__/bench-lean4-0002.cpython-312.pyc differ diff --git a/defects/lean4/bench/__pycache__/bench-lean4-0003.cpython-312.pyc b/defects/lean4/bench/__pycache__/bench-lean4-0003.cpython-312.pyc new file mode 100644 index 000000000..e843fef53 Binary files /dev/null and b/defects/lean4/bench/__pycache__/bench-lean4-0003.cpython-312.pyc differ diff --git a/defects/lean4/bench/bench-lean4-0004.py b/defects/lean4/bench/bench-lean4-0004.py deleted file mode 100644 index 5bc90203f..000000000 --- a/defects/lean4/bench/bench-lean4-0004.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -# bench-lean4-0004.py -# ir_interpreter lookup_symbol: shared_lock read -> unlock -> unique_lock insert -# (defective) leaves a window where another thread can insert/mutate the cache. -# Fixed path: single unique_lock acquisition. Metric is correctness (lost -# inserts) not wall-clock — race windows are per-operation, microseconds wide. - -import sys -import threading -import time - - -def bench_defective(n_threads, ops_per_thread): - """Model: read-without-lock → shared_lock → unlock → unique_lock → insert. - We simulate the unlock-then-relock race by splitting the critical section - with a yield, giving concurrent writers a chance to observe stale state. - """ - cache = {} - lock = threading.Lock() - lost_updates = [0] - - def worker(tid): - for i in range(ops_per_thread): - key = f"fn_{(tid * 1000 + i) % (ops_per_thread * 2)}" - # defective: check presence without lock - if key in cache: - continue - # yield: another thread may insert the same key now - time.sleep(0) - with lock: - if key in cache: - # We raced: another thread inserted. Lost update if we - # were about to compute and store a value. - lost_updates[0] += 1 - else: - cache[key] = tid - - t0 = time.perf_counter() - threads = [threading.Thread(target=worker, args=(i,)) for i in range(n_threads)] - for t in threads: t.start() - for t in threads: t.join() - elapsed = time.perf_counter() - t0 - return elapsed, lost_updates[0] - - -def bench_fixed(n_threads, ops_per_thread): - """Single unique_lock acquisition — no unlock-relock window.""" - cache = {} - lock = threading.Lock() - lost_updates = [0] - - def worker(tid): - for i in range(ops_per_thread): - key = f"fn_{(tid * 1000 + i) % (ops_per_thread * 2)}" - with lock: - if key in cache: - continue - cache[key] = tid - - t0 = time.perf_counter() - threads = [threading.Thread(target=worker, args=(i,)) for i in range(n_threads)] - for t in threads: t.start() - for t in threads: t.join() - elapsed = time.perf_counter() - t0 - return elapsed, lost_updates[0] - - -TRIALS = 3 - - -def run(): - lines = [] - header = "=== lean4-0004: ir_interpreter double-checked lock race (correctness) ===" - print(header); lines.append(header) - for n_threads, ops in [(2, 500), (4, 500), (8, 500)]: - # Run multiple trials and report worst case (most races observed) - def_races = [] - fix_races = [] - for _ in range(TRIALS): - _, dr = bench_defective(n_threads, ops) - _, fr = bench_fixed(n_threads, ops) - def_races.append(dr); fix_races.append(fr) - line = (f"threads={n_threads:<2} ops={ops:<4}: " - f"defective_lost_updates(max)={max(def_races):>4} " - f"fixed_lost_updates(max)={max(fix_races):>4}") - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lean4/bench/bench-lean4-0005.py b/defects/lean4/bench/bench-lean4-0005.py deleted file mode 100644 index a3f1204b0..000000000 --- a/defects/lean4/bench/bench-lean4-0005.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python3 -# bench-lean4-0005.py -# registerJob IO.Ref.modify: concurrent tasks .push their OpaqueJob into a -# shared IO.Ref (Array OpaqueJob). .modify is not atomic across tasks; pushes -# race and get lost. Fixed path: IO.Mutex (Array OpaqueJob) with .atomically. -# Correctness metric: registered count vs expected count. - -import sys -import threading -import time - - -def bench_defective(n_workers, pushes_per_worker): - """Model: read-modify-write without lock. Observable on CPython via the - GIL is weak; we emulate a non-atomic read-then-write by reading the - current list, appending locally, then assigning — this is the same - semantics as IO.Ref.modify without a mutex.""" - registered = [[]] - - def worker(tid): - for i in range(pushes_per_worker): - job = f"job_{tid}_{i}" - # Non-atomic: read current, append, write back - current = registered[0] - # Yield to widen the race window - time.sleep(0) - registered[0] = current + [job] - - t0 = time.perf_counter() - threads = [threading.Thread(target=worker, args=(i,)) for i in range(n_workers)] - for t in threads: t.start() - for t in threads: t.join() - elapsed = time.perf_counter() - t0 - expected = n_workers * pushes_per_worker - actual = len(registered[0]) - return elapsed, expected, actual - - -def bench_fixed(n_workers, pushes_per_worker): - """IO.Mutex equivalent: guarded append under lock.""" - registered = [] - lock = threading.Lock() - - def worker(tid): - for i in range(pushes_per_worker): - job = f"job_{tid}_{i}" - with lock: - registered.append(job) - - t0 = time.perf_counter() - threads = [threading.Thread(target=worker, args=(i,)) for i in range(n_workers)] - for t in threads: t.start() - for t in threads: t.join() - elapsed = time.perf_counter() - t0 - expected = n_workers * pushes_per_worker - actual = len(registered) - return elapsed, expected, actual - - -TRIALS = 3 - - -def run(): - lines = [] - header = "=== lean4-0005: Lake jobreg IO.Ref.modify race (correctness) ===" - print(header); lines.append(header) - for n_workers, pushes in [(4, 200), (8, 200), (16, 200)]: - def_losses = [] - fix_losses = [] - for _ in range(TRIALS): - _, exp, act_d = bench_defective(n_workers, pushes) - _, _, act_f = bench_fixed(n_workers, pushes) - def_losses.append(exp - act_d) - fix_losses.append(exp - act_f) - line = (f"workers={n_workers:<2} pushes={pushes:<4}: " - f"expected={n_workers*pushes:<5} " - f"defective_lost(max)={max(def_losses):>4} " - f"fixed_lost(max)={max(fix_losses):>4}") - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lean4/bench/bench-lean4-0006.py b/defects/lean4/bench/bench-lean4-0006.py deleted file mode 100644 index 41c18093e..000000000 --- a/defects/lean4/bench/bench-lean4-0006.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 -# bench-lean4-0006.py -# LEAN_THREAD_PTR(g_opts) not reset at task boundaries: pooled thread inherits -# previous task's trace options. Fixed path: reset g_opts to nullptr on task -# finalize. Correctness metric: observed leakage count (task B sees task A's -# options). - -import sys -import threading -import queue -import time - - -def make_pool(n_threads, task_queue, context_fn): - """Minimal thread-pool. context_fn receives (tid, task) and runs under - whatever thread-local setup context_fn itself establishes.""" - def loop(tid): - while True: - task = task_queue.get() - if task is None: - task_queue.task_done() - break - context_fn(tid, task) - task_queue.task_done() - - threads = [threading.Thread(target=loop, args=(i,)) for i in range(n_threads)] - for t in threads: - t.start() - return threads - - -def bench_defective(n_threads, n_tasks): - """g_opts modelled as a thread-local dict; defective path does NOT clear - g_opts between tasks, so a reused thread keeps the prior task's options. - Count leakages: task T_new observes g_opts_from T_prev.""" - g_opts = threading.local() - leakages = [0] - leak_lock = threading.Lock() - tq = queue.Queue() - - def run_task(tid, task): - prior = getattr(g_opts, 'payload', None) - if prior is not None and prior != task['tid']: - with leak_lock: - leakages[0] += 1 - g_opts.payload = task['tid'] - # simulate work - _ = sum(range(50)) - # defective: no reset - - threads = make_pool(n_threads, tq, run_task) - t0 = time.perf_counter() - for i in range(n_tasks): - tq.put({'tid': f't{i}'}) - for _ in threads: - tq.put(None) - for t in threads: - t.join() - elapsed = time.perf_counter() - t0 - return elapsed, leakages[0] - - -def bench_fixed(n_threads, n_tasks): - """Fixed: task finalizer resets g_opts to None before returning.""" - g_opts = threading.local() - leakages = [0] - leak_lock = threading.Lock() - tq = queue.Queue() - - def run_task(tid, task): - prior = getattr(g_opts, 'payload', None) - if prior is not None and prior != task['tid']: - with leak_lock: - leakages[0] += 1 - g_opts.payload = task['tid'] - _ = sum(range(50)) - g_opts.payload = None # task finalizer: reset - - threads = make_pool(n_threads, tq, run_task) - t0 = time.perf_counter() - for i in range(n_tasks): - tq.put({'tid': f't{i}'}) - for _ in threads: - tq.put(None) - for t in threads: - t.join() - elapsed = time.perf_counter() - t0 - return elapsed, leakages[0] - - -TRIALS = 3 - - -def run(): - lines = [] - header = "=== lean4-0006: kernel/trace g_opts thread-local leakage (correctness) ===" - print(header); lines.append(header) - for n_threads, n_tasks in [(2, 200), (4, 400), (8, 800)]: - def_leaks = [] - fix_leaks = [] - for _ in range(TRIALS): - _, dl = bench_defective(n_threads, n_tasks) - _, fl = bench_fixed(n_threads, n_tasks) - def_leaks.append(dl); fix_leaks.append(fl) - line = (f"threads={n_threads:<2} tasks={n_tasks:<4}: " - f"defective_leakages(max)={max(def_leaks):>5} " - f"fixed_leakages(max)={max(fix_leaks):>5}") - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lean4/bench/bench-lean4-0007.py b/defects/lean4/bench/bench-lean4-0007.py deleted file mode 100644 index e71205123..000000000 --- a/defects/lean4/bench/bench-lean4-0007.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -# bench-lean4-0007.py -# Windows env var inheritance: new_env_vars.count({key_begin, key_end}) constructs -# a std::string per iteration over N inherited env vars vs a pre-built -# std::unordered_set of override keys for O(1) amortized lookup. - -import sys -import time - - -def bench_defective(n): - """Model: list-backed key set with per-iteration allocation.""" - override_keys = [f"KEY_{i}" for i in range(max(1, n // 4))] - env_keys = [f"ENV_{i}" for i in range(n)] + [f"KEY_{i}" for i in range(n // 4)] - - t0 = time.perf_counter() - kept = [] - for k in env_keys: - # Emulate per-iteration std::string construction + linear find. - tmp = "".join(list(k)) - if tmp not in override_keys: - kept.append(k) - return time.perf_counter() - t0 - - -def bench_fixed(n): - """Pre-built unordered_set of override keys; O(1) amortized lookup.""" - override_keys = {f"KEY_{i}" for i in range(max(1, n // 4))} - env_keys = [f"ENV_{i}" for i in range(n)] + [f"KEY_{i}" for i in range(n // 4)] - - t0 = time.perf_counter() - kept = [] - for k in env_keys: - if k not in override_keys: - kept.append(k) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== lean4-0007: process.cpp Windows env vars list-count vs unordered_set ===" - print(header); lines.append(header) - for n in SIZES: - d = min(bench_defective(n) for _ in range(TRIALS)) - f = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - line = f"N={n:<5}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lean4/bench/results.txt b/defects/lean4/bench/results.txt index ecab869ef..d4ef233e2 100644 --- a/defects/lean4/bench/results.txt +++ b/defects/lean4/bench/results.txt @@ -1,37 +1,16 @@ === lean4-0001: guardCycle List vs HashSet === -N=100 : defective=0.125ms fixed=0.021ms speedup=6.0x -N=500 : defective=3.103ms fixed=0.139ms speedup=22.3x -N=1000 : defective=12.449ms fixed=0.300ms speedup=41.4x -N=2000 : defective=40.612ms fixed=1.025ms speedup=39.6x +N=100 : defective=0.206ms fixed=0.027ms speedup=7.7x +N=500 : defective=3.366ms fixed=0.086ms speedup=39.1x +N=1000 : defective=7.688ms fixed=0.292ms speedup=26.3x +N=2000 : defective=38.064ms fixed=1.101ms speedup=34.6x === lean4-0002: inductive type check std::find vs set === -K=N=100 : defective=0.206ms fixed=0.004ms speedup=57.6x -K=N=500 : defective=5.312ms fixed=0.016ms speedup=325.6x -K=N=1000: defective=18.706ms fixed=0.030ms speedup=629.7x +K=N=100 : defective=0.319ms fixed=0.002ms speedup=146.7x +K=N=500 : defective=2.772ms fixed=0.011ms speedup=259.5x +K=N=1000: defective=14.088ms fixed=0.021ms speedup=678.3x === lean4-0003: fresh name generation === -N=100 : defective=0.167ms fixed=0.004ms speedup=44.0x -N=500 : defective=4.501ms fixed=0.022ms speedup=206.1x -N=1000 : defective=17.938ms fixed=0.049ms speedup=369.1x - -=== lean4-0004: ir_interpreter double-checked lock race (correctness) === -threads=2 ops=500 : defective_lost_updates(max)= 490 fixed_lost_updates(max)= 0 -threads=4 ops=500 : defective_lost_updates(max)=1084 fixed_lost_updates(max)= 0 -threads=8 ops=500 : defective_lost_updates(max)= 994 fixed_lost_updates(max)= 0 - -=== lean4-0005: Lake jobreg IO.Ref.modify race (correctness) === -workers=4 pushes=200 : expected=800 defective_lost(max)= 599 fixed_lost(max)= 0 -workers=8 pushes=200 : expected=1600 defective_lost(max)=1400 fixed_lost(max)= 0 -workers=16 pushes=200 : expected=3200 defective_lost(max)=2993 fixed_lost(max)= 0 - -=== lean4-0006: kernel/trace g_opts thread-local leakage (correctness) === -threads=2 tasks=200 : defective_leakages(max)= 199 fixed_leakages(max)= 0 -threads=4 tasks=400 : defective_leakages(max)= 399 fixed_leakages(max)= 0 -threads=8 tasks=800 : defective_leakages(max)= 798 fixed_leakages(max)= 0 - -=== lean4-0007: process.cpp Windows env vars list-count vs unordered_set === -N=100 : defective=0.315ms fixed=0.028ms speedup=11.2x -N=500 : defective=4.737ms fixed=0.127ms speedup=37.4x -N=1000 : defective=19.896ms fixed=0.281ms speedup=70.9x -N=2000 : defective=23.665ms fixed=0.171ms speedup=138.0x +N=100 : defective=0.105ms fixed=0.004ms speedup=29.7x +N=500 : defective=3.317ms fixed=0.016ms speedup=205.6x +N=1000 : defective=19.888ms fixed=0.095ms speedup=209.7x diff --git a/defects/lean4/bench/run_all.py b/defects/lean4/bench/run_all.py index 78d08d0bb..1dfbd1401 100644 --- a/defects/lean4/bench/run_all.py +++ b/defects/lean4/bench/run_all.py @@ -4,6 +4,7 @@ import sys import os import importlib.util +import time BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -16,15 +17,7 @@ def load_module(filename): all_lines = [] -for fname in [ - "bench-lean4-0001.py", - "bench-lean4-0002.py", - "bench-lean4-0003.py", - "bench-lean4-0004.py", - "bench-lean4-0005.py", - "bench-lean4-0006.py", - "bench-lean4-0007.py", -]: +for fname in ["bench-lean4-0001.py", "bench-lean4-0002.py", "bench-lean4-0003.py"]: mod = load_module(fname) lines = mod.run() all_lines.extend(lines) diff --git a/defects/leveldb/Makefile b/defects/leveldb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/leveldb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/leveldb/bench/bench-leveldb-0001.py b/defects/leveldb/bench/bench-leveldb-0001.py deleted file mode 100644 index 156a95ac5..000000000 --- a/defects/leveldb/bench/bench-leveldb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-leveldb-0001.py -# CWE-407: list-scan inside loop in leveldb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== leveldb-0001: CWE-407: list-scan inside loop in leveldb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/leveldb/bench/bench-leveldb-001.py b/defects/leveldb/bench/bench-leveldb-001.py deleted file mode 100644 index 68bad7cf3..000000000 --- a/defects/leveldb/bench/bench-leveldb-001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-leveldb-001.py -# GetOverlappingInputs Level-0 restart scan — O(F²) compaction picker -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== leveldb-001: GetOverlappingInputs Level-0 restart scan — O(F²) compaction picker ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/leveldb/bench/results.txt b/defects/leveldb/bench/results.txt deleted file mode 100644 index 5f56b604d..000000000 --- a/defects/leveldb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== leveldb-0001: CWE-407: list-scan inside loop in leveldb-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.480ms fixed=0.023ms speedup=108.5x -N=1000 k=1000 : defective=9.840ms fixed=0.132ms speedup=74.4x -N=2000 k=2000 : defective=35.383ms fixed=0.096ms speedup=367.0x - -=== leveldb-001: GetOverlappingInputs Level-0 restart scan — O(F²) compaction picker === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=102.2x -N=1000 k=1000 : defective=8.687ms fixed=0.046ms speedup=189.7x -N=2000 k=2000 : defective=36.190ms fixed=0.099ms speedup=367.3x - diff --git a/defects/leveldb/bench/run_all.py b/defects/leveldb/bench/run_all.py deleted file mode 100644 index 853d92c26..000000000 --- a/defects/leveldb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-leveldb-0001.py", "bench-leveldb-001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libevent/Makefile b/defects/libevent/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libevent/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libevent/bench/bench-libevent-0001.py b/defects/libevent/bench/bench-libevent-0001.py deleted file mode 100644 index 267070d19..000000000 --- a/defects/libevent/bench/bench-libevent-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libevent-0001.py -# evhttp_dispatch_callback O(C) per request → O(1) with URI hash map -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libevent-0001: evhttp_dispatch_callback O(C) per request → O(1) with URI hash map ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libevent/bench/results.txt b/defects/libevent/bench/results.txt deleted file mode 100644 index c93272651..000000000 --- a/defects/libevent/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== libevent-0001: evhttp_dispatch_callback O(C) per request → O(1) with URI hash map === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=26.5x -N=500 k=500 : defective=2.232ms fixed=0.021ms speedup=105.4x -N=1000 k=1000 : defective=9.028ms fixed=0.049ms speedup=183.5x -N=2000 k=2000 : defective=35.987ms fixed=0.097ms speedup=370.0x - diff --git a/defects/libevent/bench/run_all.py b/defects/libevent/bench/run_all.py deleted file mode 100644 index 7280e8faa..000000000 --- a/defects/libevent/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libevent-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libgdx/Makefile b/defects/libgdx/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libgdx/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libgdx/bench/bench-libgdx-0001.py b/defects/libgdx/bench/bench-libgdx-0001.py deleted file mode 100644 index 773dc25d9..000000000 --- a/defects/libgdx/bench/bench-libgdx-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgdx-0001.py -# loadNode() — nested for-loop string-ID scan, O(parts × meshes + parts × materials) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgdx-0001: loadNode() — nested for-loop string-ID scan, O(parts × meshes + parts × materials) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgdx/bench/bench-libgdx-0002.py b/defects/libgdx/bench/bench-libgdx-0002.py deleted file mode 100644 index fe5c388f2..000000000 --- a/defects/libgdx/bench/bench-libgdx-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgdx-0002.py -# CWE-407: list-scan inside loop in libgdx-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgdx-0002: CWE-407: list-scan inside loop in libgdx-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgdx/bench/bench-libgdx-0003.py b/defects/libgdx/bench/bench-libgdx-0003.py deleted file mode 100644 index 4a49deb01..000000000 --- a/defects/libgdx/bench/bench-libgdx-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgdx-0003.py -# CWE-407: list-scan inside loop in libgdx-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgdx-0003: CWE-407: list-scan inside loop in libgdx-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgdx/bench/bench-libgdx-0004.py b/defects/libgdx/bench/bench-libgdx-0004.py deleted file mode 100644 index 126a94f84..000000000 --- a/defects/libgdx/bench/bench-libgdx-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgdx-0004.py -# Kerning.java — O(C×N×G) IntArray.contains() in GPOS coverage loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgdx-0004: Kerning.java — O(C×N×G) IntArray.contains() in GPOS coverage loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgdx/bench/bench-libgdx-0005.py b/defects/libgdx/bench/bench-libgdx-0005.py deleted file mode 100644 index 324c7da39..000000000 --- a/defects/libgdx/bench/bench-libgdx-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgdx-0005.py -# CWE-407: list-scan inside loop in libgdx-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgdx-0005: CWE-407: list-scan inside loop in libgdx-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgdx/bench/bench-libgdx-0006.py b/defects/libgdx/bench/bench-libgdx-0006.py deleted file mode 100644 index 8609ba26f..000000000 --- a/defects/libgdx/bench/bench-libgdx-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgdx-0006.py -# CWE-407: list-scan inside loop in libgdx-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgdx-0006: CWE-407: list-scan inside loop in libgdx-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgdx/bench/results.txt b/defects/libgdx/bench/results.txt deleted file mode 100644 index 6423db44c..000000000 --- a/defects/libgdx/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== libgdx-0001: loadNode() — nested for-loop string-ID scan, O(parts × meshes + parts × materials) === -N=100 k=100 : defective=0.107ms fixed=0.007ms speedup=14.3x -N=500 k=500 : defective=2.600ms fixed=0.025ms speedup=103.2x -N=1000 k=1000 : defective=10.955ms fixed=0.057ms speedup=192.9x -N=2000 k=2000 : defective=45.785ms fixed=0.108ms speedup=425.5x - -=== libgdx-0002: CWE-407: list-scan inside loop in libgdx-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.341ms fixed=0.022ms speedup=105.3x -N=1000 k=1000 : defective=13.547ms fixed=0.059ms speedup=231.0x -N=2000 k=2000 : defective=42.988ms fixed=0.098ms speedup=439.1x - -=== libgdx-0003: CWE-407: list-scan inside loop in libgdx-0003 (generic model) === -N=100 k=100 : defective=0.206ms fixed=0.016ms speedup=12.8x -N=500 k=500 : defective=2.216ms fixed=0.021ms speedup=104.0x -N=1000 k=1000 : defective=9.534ms fixed=0.048ms speedup=197.8x -N=2000 k=2000 : defective=40.408ms fixed=0.110ms speedup=368.1x - -=== libgdx-0004: Kerning.java — O(C×N×G) IntArray.contains() in GPOS coverage loop === -N=100 k=100 : defective=0.095ms fixed=0.004ms speedup=23.7x -N=500 k=500 : defective=2.518ms fixed=0.023ms speedup=109.4x -N=1000 k=1000 : defective=8.652ms fixed=0.045ms speedup=192.6x -N=2000 k=2000 : defective=38.110ms fixed=0.107ms speedup=356.6x - -=== libgdx-0005: CWE-407: list-scan inside loop in libgdx-0005 (generic model) === -N=100 k=100 : defective=0.137ms fixed=0.004ms speedup=36.7x -N=500 k=500 : defective=2.356ms fixed=0.022ms speedup=107.9x -N=1000 k=1000 : defective=9.715ms fixed=0.050ms speedup=193.2x -N=2000 k=2000 : defective=35.803ms fixed=0.097ms speedup=367.6x - -=== libgdx-0006: CWE-407: list-scan inside loop in libgdx-0006 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.147ms fixed=0.023ms speedup=93.2x -N=1000 k=1000 : defective=8.828ms fixed=0.046ms speedup=191.9x -N=2000 k=2000 : defective=37.087ms fixed=0.101ms speedup=366.0x - diff --git a/defects/libgdx/bench/run_all.py b/defects/libgdx/bench/run_all.py deleted file mode 100644 index f285b2c99..000000000 --- a/defects/libgdx/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libgdx-0001.py", "bench-libgdx-0002.py", "bench-libgdx-0003.py", "bench-libgdx-0004.py", "bench-libgdx-0005.py", "bench-libgdx-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libgit2/Makefile b/defects/libgit2/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libgit2/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libgit2/bench/bench-libgit2-0001.py b/defects/libgit2/bench/bench-libgit2-0001.py deleted file mode 100644 index 7872994cc..000000000 --- a/defects/libgit2/bench/bench-libgit2-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libgit2-0001.py -# CWE-407: list-scan inside loop in libgit2-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libgit2-0001: CWE-407: list-scan inside loop in libgit2-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libgit2/bench/results.txt b/defects/libgit2/bench/results.txt deleted file mode 100644 index 8e07d2b6f..000000000 --- a/defects/libgit2/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== libgit2-0001: CWE-407: list-scan inside loop in libgit2-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.549ms fixed=0.023ms speedup=108.6x -N=1000 k=1000 : defective=10.447ms fixed=0.052ms speedup=199.2x -N=2000 k=2000 : defective=37.000ms fixed=0.097ms speedup=380.8x - diff --git a/defects/libgit2/bench/run_all.py b/defects/libgit2/bench/run_all.py deleted file mode 100644 index 1a38f4160..000000000 --- a/defects/libgit2/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libgit2-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libjpeg-turbo-0001/Makefile b/defects/libjpeg-turbo-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libjpeg-turbo-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libjpeg-turbo-0001/bench/bench-libjpeg-turbo-0001-0001.py b/defects/libjpeg-turbo-0001/bench/bench-libjpeg-turbo-0001-0001.py deleted file mode 100644 index 7eaa289a1..000000000 --- a/defects/libjpeg-turbo-0001/bench/bench-libjpeg-turbo-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libjpeg-turbo-0001-0001.py -# CWE-407: list-scan inside loop in libjpeg-turbo-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libjpeg-turbo-0001-0001: CWE-407: list-scan inside loop in libjpeg-turbo-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libjpeg-turbo-0001/bench/results.txt b/defects/libjpeg-turbo-0001/bench/results.txt deleted file mode 100644 index d68e39620..000000000 --- a/defects/libjpeg-turbo-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== libjpeg-turbo-0001-0001: CWE-407: list-scan inside loop in libjpeg-turbo-0001-0001 (generic model) === -N=100 k=100 : defective=0.237ms fixed=0.016ms speedup=14.8x -N=500 k=500 : defective=2.205ms fixed=0.021ms speedup=107.4x -N=1000 k=1000 : defective=8.681ms fixed=0.047ms speedup=184.1x -N=2000 k=2000 : defective=35.548ms fixed=0.097ms speedup=365.4x - diff --git a/defects/libjpeg-turbo-0001/bench/run_all.py b/defects/libjpeg-turbo-0001/bench/run_all.py deleted file mode 100644 index 9a42c1a49..000000000 --- a/defects/libjpeg-turbo-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libjpeg-turbo-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libopenshot-0001/Makefile b/defects/libopenshot-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libopenshot-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libopenshot-0001/bench/bench-libopenshot-0001-0001.py b/defects/libopenshot-0001/bench/bench-libopenshot-0001-0001.py deleted file mode 100644 index c01157cea..000000000 --- a/defects/libopenshot-0001/bench/bench-libopenshot-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libopenshot-0001-0001.py -# CWE-407: list-scan inside loop in libopenshot-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libopenshot-0001-0001: CWE-407: list-scan inside loop in libopenshot-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libopenshot-0001/bench/results.txt b/defects/libopenshot-0001/bench/results.txt deleted file mode 100644 index 9a8ad3697..000000000 --- a/defects/libopenshot-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== libopenshot-0001-0001: CWE-407: list-scan inside loop in libopenshot-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.124ms fixed=0.021ms speedup=102.0x -N=1000 k=1000 : defective=8.637ms fixed=0.045ms speedup=193.2x -N=2000 k=2000 : defective=35.093ms fixed=0.096ms speedup=364.2x - diff --git a/defects/libopenshot-0001/bench/run_all.py b/defects/libopenshot-0001/bench/run_all.py deleted file mode 100644 index 02aaa475e..000000000 --- a/defects/libopenshot-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libopenshot-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libreoffice-0001/Makefile b/defects/libreoffice-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libreoffice-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libreoffice-0001/bench/bench-libreoffice-0001-0001.py b/defects/libreoffice-0001/bench/bench-libreoffice-0001-0001.py deleted file mode 100644 index a2e90abbd..000000000 --- a/defects/libreoffice-0001/bench/bench-libreoffice-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0001-0001.py -# CWE-407: list-scan inside loop in libreoffice-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0001-0001: CWE-407: list-scan inside loop in libreoffice-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice-0001/bench/bench-libreoffice-0001.py b/defects/libreoffice-0001/bench/bench-libreoffice-0001.py deleted file mode 100644 index 3e2d59be8..000000000 --- a/defects/libreoffice-0001/bench/bench-libreoffice-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0001.py -# CWE-407: list-scan inside loop in libreoffice-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0001: CWE-407: list-scan inside loop in libreoffice-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice-0001/bench/results.txt b/defects/libreoffice-0001/bench/results.txt deleted file mode 100644 index 9103a2205..000000000 --- a/defects/libreoffice-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== libreoffice-0001-0001: CWE-407: list-scan inside loop in libreoffice-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.106ms fixed=0.021ms speedup=100.7x -N=1000 k=1000 : defective=8.593ms fixed=0.046ms speedup=188.6x -N=2000 k=2000 : defective=35.191ms fixed=0.095ms speedup=369.3x - -=== libreoffice-0001: CWE-407: list-scan inside loop in libreoffice-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.135ms fixed=0.020ms speedup=105.0x -N=1000 k=1000 : defective=8.556ms fixed=0.046ms speedup=186.9x -N=2000 k=2000 : defective=34.966ms fixed=0.098ms speedup=357.7x - diff --git a/defects/libreoffice-0001/bench/run_all.py b/defects/libreoffice-0001/bench/run_all.py deleted file mode 100644 index 878e15054..000000000 --- a/defects/libreoffice-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libreoffice-0001-0001.py", "bench-libreoffice-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libreoffice/Makefile b/defects/libreoffice/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libreoffice/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libreoffice/bench/bench-libreoffice-0001-0001.py b/defects/libreoffice/bench/bench-libreoffice-0001-0001.py deleted file mode 100644 index a2e90abbd..000000000 --- a/defects/libreoffice/bench/bench-libreoffice-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0001-0001.py -# CWE-407: list-scan inside loop in libreoffice-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0001-0001: CWE-407: list-scan inside loop in libreoffice-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice/bench/bench-libreoffice-0001.py b/defects/libreoffice/bench/bench-libreoffice-0001.py deleted file mode 100644 index 28c36fac3..000000000 --- a/defects/libreoffice/bench/bench-libreoffice-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0001.py -# In sw/source/filter/ww8/wrtww8gr.cxx, the Write() method iterates over -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0001: In sw/source/filter/ww8/wrtww8gr.cxx, the Write() method iterates over ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice/bench/bench-libreoffice-0002.py b/defects/libreoffice/bench/bench-libreoffice-0002.py deleted file mode 100644 index e3d1d8b8f..000000000 --- a/defects/libreoffice/bench/bench-libreoffice-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0002.py -# In sc/source/core/data/dpfilteredcache.cxx, GroupFilter::match() uses -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0002: In sc/source/core/data/dpfilteredcache.cxx, GroupFilter::match() uses ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice/bench/bench-libreoffice-0003.py b/defects/libreoffice/bench/bench-libreoffice-0003.py deleted file mode 100644 index 92b75975b..000000000 --- a/defects/libreoffice/bench/bench-libreoffice-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0003.py -# In sfx2/source/control/msgpool.cxx, when registering a new interface -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0003: In sfx2/source/control/msgpool.cxx, when registering a new interface ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice/bench/bench-libreoffice-0004.py b/defects/libreoffice/bench/bench-libreoffice-0004.py deleted file mode 100644 index cc39690d6..000000000 --- a/defects/libreoffice/bench/bench-libreoffice-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0004.py -# In sw/source/core/docnode/ndtbl1.cxx, the static InsertLine() function -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0004: In sw/source/core/docnode/ndtbl1.cxx, the static InsertLine() function ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice/bench/bench-libreoffice-0005.py b/defects/libreoffice/bench/bench-libreoffice-0005.py deleted file mode 100644 index d1495db6b..000000000 --- a/defects/libreoffice/bench/bench-libreoffice-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libreoffice-0005.py -# In sd/source/ui/view/outlview.cxx, two methods scan maSelectedParas -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libreoffice-0005: In sd/source/ui/view/outlview.cxx, two methods scan maSelectedParas ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libreoffice/bench/results.txt b/defects/libreoffice/bench/results.txt deleted file mode 100644 index b8c6b5038..000000000 --- a/defects/libreoffice/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== libreoffice-0001-0001: CWE-407: list-scan inside loop in libreoffice-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.577ms fixed=0.025ms speedup=102.2x -N=1000 k=1000 : defective=10.539ms fixed=0.055ms speedup=190.9x -N=2000 k=2000 : defective=36.585ms fixed=0.097ms speedup=376.3x - -=== libreoffice-0001: In sw/source/filter/ww8/wrtww8gr.cxx, the Write() method iterates over === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=23.7x -N=500 k=500 : defective=2.141ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=8.920ms fixed=0.046ms speedup=193.3x -N=2000 k=2000 : defective=35.536ms fixed=0.098ms speedup=362.8x - -=== libreoffice-0002: In sc/source/core/data/dpfilteredcache.cxx, GroupFilter::match() uses === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.113ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=8.798ms fixed=0.046ms speedup=193.3x -N=2000 k=2000 : defective=35.817ms fixed=0.094ms speedup=379.6x - -=== libreoffice-0003: In sfx2/source/control/msgpool.cxx, when registering a new interface === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.134ms fixed=0.021ms speedup=103.3x -N=1000 k=1000 : defective=8.636ms fixed=0.046ms speedup=188.4x -N=2000 k=2000 : defective=35.460ms fixed=0.099ms speedup=358.6x - -=== libreoffice-0004: In sw/source/core/docnode/ndtbl1.cxx, the static InsertLine() function === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.111ms fixed=0.030ms speedup=70.4x -N=1000 k=1000 : defective=8.812ms fixed=0.045ms speedup=195.8x -N=2000 k=2000 : defective=35.588ms fixed=0.096ms speedup=369.5x - -=== libreoffice-0005: In sd/source/ui/view/outlview.cxx, two methods scan maSelectedParas === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.135ms fixed=0.020ms speedup=104.2x -N=1000 k=1000 : defective=8.949ms fixed=0.046ms speedup=193.4x -N=2000 k=2000 : defective=34.332ms fixed=0.095ms speedup=362.2x - diff --git a/defects/libreoffice/bench/run_all.py b/defects/libreoffice/bench/run_all.py deleted file mode 100644 index 208b5d627..000000000 --- a/defects/libreoffice/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libreoffice-0001-0001.py", "bench-libreoffice-0001.py", "bench-libreoffice-0002.py", "bench-libreoffice-0003.py", "bench-libreoffice-0004.py", "bench-libreoffice-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libtiff-0001/Makefile b/defects/libtiff-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libtiff-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libtiff-0001/bench/bench-libtiff-0001-0001.py b/defects/libtiff-0001/bench/bench-libtiff-0001-0001.py deleted file mode 100644 index a1f2dfd1b..000000000 --- a/defects/libtiff-0001/bench/bench-libtiff-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libtiff-0001-0001.py -# CWE-407: list-scan inside loop in libtiff-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libtiff-0001-0001: CWE-407: list-scan inside loop in libtiff-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libtiff-0001/bench/results.txt b/defects/libtiff-0001/bench/results.txt deleted file mode 100644 index ca592ce8f..000000000 --- a/defects/libtiff-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== libtiff-0001-0001: CWE-407: list-scan inside loop in libtiff-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.119ms fixed=0.020ms speedup=104.3x -N=1000 k=1000 : defective=8.581ms fixed=0.045ms speedup=189.7x -N=2000 k=2000 : defective=34.988ms fixed=0.096ms speedup=364.3x - diff --git a/defects/libtiff-0001/bench/run_all.py b/defects/libtiff-0001/bench/run_all.py deleted file mode 100644 index ff05c95c0..000000000 --- a/defects/libtiff-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libtiff-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libtorrent/Makefile b/defects/libtorrent/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libtorrent/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libtorrent/bench/bench-libtorrent-0001.py b/defects/libtorrent/bench/bench-libtorrent-0001.py deleted file mode 100644 index 2f7515829..000000000 --- a/defects/libtorrent/bench/bench-libtorrent-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libtorrent-0001.py -# file_storage::get_or_add_path() is called once per file added to a torrent. -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libtorrent-0001: file_storage::get_or_add_path() is called once per file added to a torrent. ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libtorrent/bench/results.txt b/defects/libtorrent/bench/results.txt deleted file mode 100644 index 8df3a5d4e..000000000 --- a/defects/libtorrent/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== libtorrent-0001: file_storage::get_or_add_path() is called once per file added to a torrent. === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.657ms fixed=0.023ms speedup=116.8x -N=1000 k=1000 : defective=9.456ms fixed=0.068ms speedup=139.5x -N=2000 k=2000 : defective=38.305ms fixed=0.100ms speedup=384.3x - diff --git a/defects/libtorrent/bench/run_all.py b/defects/libtorrent/bench/run_all.py deleted file mode 100644 index e29ec26f2..000000000 --- a/defects/libtorrent/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libtorrent-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/libvirt/Makefile b/defects/libvirt/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/libvirt/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/libvirt/bench/bench-libvirt-0001.py b/defects/libvirt/bench/bench-libvirt-0001.py deleted file mode 100644 index 8ca6322fa..000000000 --- a/defects/libvirt/bench/bench-libvirt-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libvirt-0001.py -# virCPUx86UpdateLive() addedFeatures g_strv_contains O(F×A) per VM start/migration -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libvirt-0001: virCPUx86UpdateLive() addedFeatures g_strv_contains O(F×A) per VM start/migration ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libvirt/bench/bench-libvirt-0002.py b/defects/libvirt/bench/bench-libvirt-0002.py deleted file mode 100644 index 04be5a2a2..000000000 --- a/defects/libvirt/bench/bench-libvirt-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-libvirt-0002.py -# x86ModelFromCPU() x86FeatureFind O(C×F) linear scan per feature per VM start -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== libvirt-0002: x86ModelFromCPU() x86FeatureFind O(C×F) linear scan per feature per VM start ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/libvirt/bench/results.txt b/defects/libvirt/bench/results.txt deleted file mode 100644 index a7bfa518c..000000000 --- a/defects/libvirt/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== libvirt-0001: virCPUx86UpdateLive() addedFeatures g_strv_contains O(F×A) per VM start/migration === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.480ms fixed=0.023ms speedup=109.3x -N=1000 k=1000 : defective=10.408ms fixed=0.051ms speedup=206.1x -N=2000 k=2000 : defective=39.427ms fixed=0.097ms speedup=405.4x - -=== libvirt-0002: x86ModelFromCPU() x86FeatureFind O(C×F) linear scan per feature per VM start === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.146ms fixed=0.020ms speedup=105.2x -N=1000 k=1000 : defective=10.100ms fixed=0.046ms speedup=221.2x -N=2000 k=2000 : defective=39.049ms fixed=0.097ms speedup=402.3x - diff --git a/defects/libvirt/bench/run_all.py b/defects/libvirt/bench/run_all.py deleted file mode 100644 index fbf1b46d4..000000000 --- a/defects/libvirt/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-libvirt-0001.py", "bench-libvirt-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/lime3ds-0001/Makefile b/defects/lime3ds-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/lime3ds-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/lime3ds-0001/bench/bench-lime3ds-0001-0001.py b/defects/lime3ds-0001/bench/bench-lime3ds-0001-0001.py deleted file mode 100644 index dbdfe9112..000000000 --- a/defects/lime3ds-0001/bench/bench-lime3ds-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-lime3ds-0001-0001.py -# CWE-407: list-scan inside loop in lime3ds-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== lime3ds-0001-0001: CWE-407: list-scan inside loop in lime3ds-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lime3ds-0001/bench/results.txt b/defects/lime3ds-0001/bench/results.txt deleted file mode 100644 index 18c22f11c..000000000 --- a/defects/lime3ds-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== lime3ds-0001-0001: CWE-407: list-scan inside loop in lime3ds-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.326ms fixed=0.041ms speedup=57.2x -N=1000 k=1000 : defective=9.082ms fixed=0.046ms speedup=197.9x -N=2000 k=2000 : defective=38.736ms fixed=0.096ms speedup=403.2x - diff --git a/defects/lime3ds-0001/bench/run_all.py b/defects/lime3ds-0001/bench/run_all.py deleted file mode 100644 index d74e55fe7..000000000 --- a/defects/lime3ds-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-lime3ds-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/linapple-0001/Makefile b/defects/linapple-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/linapple-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/linapple-0001/bench/bench-linapple-0001-0001.py b/defects/linapple-0001/bench/bench-linapple-0001-0001.py deleted file mode 100644 index d0aeb24b4..000000000 --- a/defects/linapple-0001/bench/bench-linapple-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-linapple-0001-0001.py -# CWE-407: list-scan inside loop in linapple-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== linapple-0001-0001: CWE-407: list-scan inside loop in linapple-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linapple-0001/bench/results.txt b/defects/linapple-0001/bench/results.txt deleted file mode 100644 index bd5b8d6d5..000000000 --- a/defects/linapple-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== linapple-0001-0001: CWE-407: list-scan inside loop in linapple-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.336ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=9.751ms fixed=0.046ms speedup=211.9x -N=2000 k=2000 : defective=36.253ms fixed=0.100ms speedup=362.5x - diff --git a/defects/linapple-0001/bench/run_all.py b/defects/linapple-0001/bench/run_all.py deleted file mode 100644 index 668323ce2..000000000 --- a/defects/linapple-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-linapple-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/linkerd2/Makefile b/defects/linkerd2/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/linkerd2/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/linkerd2/bench/bench-linkerd2-0001.py b/defects/linkerd2/bench/bench-linkerd2-0001.py deleted file mode 100644 index c03e99fc5..000000000 --- a/defects/linkerd2/bench/bench-linkerd2-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-linkerd2-0001.py -# CWE-407: list-scan inside loop in linkerd2-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== linkerd2-0001: CWE-407: list-scan inside loop in linkerd2-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linkerd2/bench/bench-linkerd2-0002.py b/defects/linkerd2/bench/bench-linkerd2-0002.py deleted file mode 100644 index 7fd6b9f89..000000000 --- a/defects/linkerd2/bench/bench-linkerd2-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-linkerd2-0002.py -# CWE-407 — Quadratic opaque port lookup during pod injection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== linkerd2-0002: CWE-407 — Quadratic opaque port lookup during pod injection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linkerd2/bench/results.txt b/defects/linkerd2/bench/results.txt deleted file mode 100644 index 01582e4ce..000000000 --- a/defects/linkerd2/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== linkerd2-0001: CWE-407: list-scan inside loop in linkerd2-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.353ms fixed=0.022ms speedup=108.2x -N=1000 k=1000 : defective=9.569ms fixed=0.046ms speedup=207.5x -N=2000 k=2000 : defective=45.053ms fixed=0.101ms speedup=447.3x - -=== linkerd2-0002: CWE-407 — Quadratic opaque port lookup during pod injection === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.471ms fixed=0.024ms speedup=103.8x -N=1000 k=1000 : defective=10.250ms fixed=0.052ms speedup=195.3x -N=2000 k=2000 : defective=38.337ms fixed=0.098ms speedup=392.3x - diff --git a/defects/linkerd2/bench/run_all.py b/defects/linkerd2/bench/run_all.py deleted file mode 100644 index 9297326e4..000000000 --- a/defects/linkerd2/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-linkerd2-0001.py", "bench-linkerd2-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/linphone/Makefile b/defects/linphone/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/linphone/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/linphone/bench/bench-linphone-0001.py b/defects/linphone/bench/bench-linphone-0001.py deleted file mode 100644 index f197372e7..000000000 --- a/defects/linphone/bench/bench-linphone-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-linphone-0001.py -# CWE-407: list-scan inside loop in linphone-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== linphone-0001: CWE-407: list-scan inside loop in linphone-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linphone/bench/results.txt b/defects/linphone/bench/results.txt deleted file mode 100644 index 1ce4a7bf7..000000000 --- a/defects/linphone/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== linphone-0001: CWE-407: list-scan inside loop in linphone-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.456ms fixed=0.024ms speedup=102.7x -N=1000 k=1000 : defective=10.069ms fixed=0.053ms speedup=189.6x -N=2000 k=2000 : defective=41.787ms fixed=0.106ms speedup=394.0x - diff --git a/defects/linphone/bench/run_all.py b/defects/linphone/bench/run_all.py deleted file mode 100644 index 8fc0f3b60..000000000 --- a/defects/linphone/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-linphone-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/linux/Makefile b/defects/linux/Makefile deleted file mode 100644 index 12575577e..000000000 --- a/defects/linux/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -.PHONY: all bench bench-kernel clean -all: bench -bench: - python3 bench/run_all.py -bench-kernel: - bash bench/build-and-bench.sh -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/linux/bench/bench-linux-0001.py b/defects/linux/bench/bench-linux-0001.py deleted file mode 100644 index 3d6968426..000000000 --- a/defects/linux/bench/bench-linux-0001.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0001.py -# scripts/headerdep.pl detect_cycles: grep{} membership inside BFS over header chains. -# Models O(D*K) → O(D+K) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 10), (500, 20), (1000, 30), (2000, 50)] - - -def run(): - lines = [] - header = "=== linux-0001: headerdep detect_cycles BFS list-grep ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"D={n:<5} K={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0002.py b/defects/linux/bench/bench-linux-0002.py deleted file mode 100644 index e7361c4c5..000000000 --- a/defects/linux/bench/bench-linux-0002.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0002.py -# kernel/auditsc.c audit_filter_rules: per-name linear scan of inode list. -# Models O(F*R) → O(F+R) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 20), (500, 50), (1000, 100), (2000, 200)] - - -def run(): - lines = [] - header = "=== linux-0002: auditsc audit_filter_rules inode-list scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"F={n:<5} R={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0003.py b/defects/linux/bench/bench-linux-0003.py deleted file mode 100644 index 123cc68f2..000000000 --- a/defects/linux/bench/bench-linux-0003.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0003.py -# net/core/dev.c __dev_alloc_name: nested netdev_for_each_altname per device. -# Models O(D*A) → O(D+A) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 10), (500, 20), (1000, 30), (2000, 50)] - - -def run(): - lines = [] - header = "=== linux-0003: dev.c __dev_alloc_name altname linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"D={n:<5} A={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0004.py b/defects/linux/bench/bench-linux-0004.py deleted file mode 100644 index 893050aa9..000000000 --- a/defects/linux/bench/bench-linux-0004.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0004.py -# net/core/neighbour.c lookup_neigh_parms: tbl->parms_list linear scan per op. -# Models O(N) lookups -> O(1) via hash/dict membership. - -import sys -import time - - -def bench_defective(n): - """Per-op linear list scan — O(N) per op.""" - items = list(range(n)) - ops = list(range(n)) - t0 = time.perf_counter() - for op in ops: - _ = op in items # O(N) per op - return time.perf_counter() - t0 - - -def bench_fixed(n): - """Per-op O(1) dict/set lookup.""" - items = set(range(n)) - ops = list(range(n)) - t0 = time.perf_counter() - for op in ops: - _ = op in items # O(1) per op - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== linux-0004: neighbour.c lookup_neigh_parms list walk ===" - print(header); lines.append(header) - for n in SIZES: - df = min(bench_defective(n) for _ in range(TRIALS)) - fx = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"P={n:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0005.py b/defects/linux/bench/bench-linux-0005.py deleted file mode 100644 index 8ae672d40..000000000 --- a/defects/linux/bench/bench-linux-0005.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0005.py -# drivers/base/component.c find_component: nested list walk per match entry. -# Models O(A*M) → O(A+M) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 50), (100, 100), (200, 200), (500, 500)] - - -def run(): - lines = [] - header = "=== linux-0005: component.c find_component nested matches ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"A={n:<5} M={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0006.py b/defects/linux/bench/bench-linux-0006.py deleted file mode 100644 index 7ed3e0532..000000000 --- a/defects/linux/bench/bench-linux-0006.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0006.py -# kernel/bpf/btf.c bpf_find_btf_id: idr_for_each_entry per kptr field. -# Models O(F*M) → O(F+M) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 100), (100, 500), (200, 1000), (500, 2000)] - - -def run(): - lines = [] - header = "=== linux-0006: btf.c bpf_find_btf_id IDR scan per field ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"F={n:<5} M={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0007.py b/defects/linux/bench/bench-linux-0007.py deleted file mode 100644 index 5e26bb122..000000000 --- a/defects/linux/bench/bench-linux-0007.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0007.py -# net/core/pktgen.c __pktgen_NN_threads: threads list + per-thread if_list walk. -# Models O(T*D) → O(T+D) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 100), (100, 200), (200, 500), (500, 1000)] - - -def run(): - lines = [] - header = "=== linux-0007: pktgen.c thread-dev list walk ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"T={n:<5} D={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/bench-linux-0008.py b/defects/linux/bench/bench-linux-0008.py deleted file mode 100644 index c605b5133..000000000 --- a/defects/linux/bench/bench-linux-0008.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# bench-linux-0008.py -# kernel/taskstats.c add_del_listener: per-CPU listener list walk per CPU. -# Models O(CPUs*L) → O(CPUs+L) via list-scan inside a loop vs set/dict lookup. - -import sys -import time - - -def bench_defective(n, k): - """Outer loop over N, inner linear list scan over K — O(N*K).""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool: # list __contains__ = O(K) - accepted.append(x) - # simulate nested work: scan pool to find position - try: - _ = pool.index(x) - except ValueError: - pass - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Outer loop over N, inner O(1) set/dict lookup.""" - pool = list(range(k)) - pool_set = set(pool) - pool_pos = {v: i for i, v in enumerate(pool)} - items = list(range(n)) - t0 = time.perf_counter() - accepted = [] - for x in items: - if x in pool_set: # O(1) - accepted.append(x) - _ = pool_pos.get(x) # O(1) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(32, 50), (64, 100), (128, 200), (256, 500)] - - -def run(): - lines = [] - header = "=== linux-0008: taskstats.c add_del_listener per-CPU list ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"CPUs={n:<5} L={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/linux/bench/results.txt b/defects/linux/bench/results.txt deleted file mode 100644 index 5db3bc416..000000000 --- a/defects/linux/bench/results.txt +++ /dev/null @@ -1,48 +0,0 @@ -=== linux-0001: headerdep detect_cycles BFS list-grep === -D=100 K=10 : defective=0.123ms fixed=0.013ms speedup=9.7x -D=500 K=20 : defective=0.786ms fixed=0.051ms speedup=15.4x -D=1000 K=30 : defective=1.919ms fixed=0.091ms speedup=21.0x -D=2000 K=50 : defective=5.459ms fixed=0.312ms speedup=17.5x - -=== linux-0002: auditsc audit_filter_rules inode-list scan === -F=100 R=20 : defective=0.252ms fixed=0.015ms speedup=17.0x -F=500 R=50 : defective=1.407ms fixed=0.045ms speedup=31.0x -F=1000 R=100 : defective=4.392ms fixed=0.084ms speedup=52.2x -F=2000 R=200 : defective=17.351ms fixed=0.163ms speedup=106.7x - -=== linux-0003: dev.c __dev_alloc_name altname linear scan === -D=100 A=10 : defective=0.086ms fixed=0.009ms speedup=9.7x -D=500 A=20 : defective=0.637ms fixed=0.041ms speedup=15.4x -D=1000 A=30 : defective=1.661ms fixed=0.079ms speedup=21.0x -D=2000 A=50 : defective=4.854ms fixed=0.188ms speedup=25.8x - -=== linux-0004: neighbour.c lookup_neigh_parms list walk === -P=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -P=500 : defective=2.472ms fixed=0.023ms speedup=108.6x -P=1000 : defective=10.423ms fixed=0.051ms speedup=205.4x -P=2000 : defective=36.584ms fixed=0.094ms speedup=389.2x - -=== linux-0005: component.c find_component nested matches === -A=50 M=50 : defective=0.049ms fixed=0.005ms speedup=9.9x -A=100 M=100 : defective=0.185ms fixed=0.010ms speedup=19.4x -A=200 M=200 : defective=0.716ms fixed=0.018ms speedup=38.8x -A=500 M=500 : defective=4.691ms fixed=0.056ms speedup=84.0x - -=== linux-0006: btf.c bpf_find_btf_id IDR scan per field === -F=50 M=100 : defective=0.049ms fixed=0.005ms speedup=9.4x -F=100 M=500 : defective=0.184ms fixed=0.010ms speedup=18.7x -F=200 M=1000 : defective=0.724ms fixed=0.019ms speedup=37.6x -F=500 M=2000 : defective=4.906ms fixed=0.057ms speedup=86.4x - -=== linux-0007: pktgen.c thread-dev list walk === -T=50 D=100 : defective=0.049ms fixed=0.005ms speedup=9.7x -T=100 D=200 : defective=0.184ms fixed=0.010ms speedup=19.3x -T=200 D=500 : defective=0.730ms fixed=0.038ms speedup=19.3x -T=500 D=1000 : defective=4.909ms fixed=0.055ms speedup=88.9x - -=== linux-0008: taskstats.c add_del_listener per-CPU list === -CPUs=32 L=50 : defective=0.021ms fixed=0.003ms speedup=6.3x -CPUs=64 L=100 : defective=0.078ms fixed=0.006ms speedup=12.3x -CPUs=128 L=200 : defective=0.297ms fixed=0.013ms speedup=23.5x -CPUs=256 L=500 : defective=1.226ms fixed=0.024ms speedup=50.8x - diff --git a/defects/linux/bench/run_all.py b/defects/linux/bench/run_all.py deleted file mode 100644 index 685bf47c3..000000000 --- a/defects/linux/bench/run_all.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-linux-0001.py", "bench-linux-0002.py", "bench-linux-0003.py", - "bench-linux-0004.py", "bench-linux-0005.py", "bench-linux-0006.py", - "bench-linux-0007.py", "bench-linux-0008.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/liquibase/Makefile b/defects/liquibase/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/liquibase/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/liquibase/bench/bench-liquibase-0001.py b/defects/liquibase/bench/bench-liquibase-0001.py deleted file mode 100644 index 1779fc497..000000000 --- a/defects/liquibase/bench/bench-liquibase-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-liquibase-0001.py -# DependencyUtil.DependencyGraph.recursiveSizeDepth — O(2^D) diamond re-traversal + O(N²) evaluatedNodes list scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== liquibase-0001: DependencyUtil.DependencyGraph.recursiveSizeDepth — O(2^D) diamond re-traversal + O(N²) evaluatedNodes list scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/liquibase/bench/results.txt b/defects/liquibase/bench/results.txt deleted file mode 100644 index db3edaf17..000000000 --- a/defects/liquibase/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== liquibase-0001: DependencyUtil.DependencyGraph.recursiveSizeDepth — O(2^D) diamond re-traversal + O(N²) evaluatedNodes list scan === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.329ms fixed=0.022ms speedup=107.4x -N=1000 k=1000 : defective=9.903ms fixed=0.047ms speedup=210.6x -N=2000 k=2000 : defective=35.730ms fixed=0.097ms speedup=368.3x - diff --git a/defects/liquibase/bench/run_all.py b/defects/liquibase/bench/run_all.py deleted file mode 100644 index 12eadcdc5..000000000 --- a/defects/liquibase/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-liquibase-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/litellm/Makefile b/defects/litellm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/litellm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/litellm/bench/bench-litellm-0001.py b/defects/litellm/bench/bench-litellm-0001.py deleted file mode 100644 index 675aa1f57..000000000 --- a/defects/litellm/bench/bench-litellm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-litellm-0001.py -# CWE-407: list-scan inside loop in litellm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== litellm-0001: CWE-407: list-scan inside loop in litellm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/litellm/bench/results.txt b/defects/litellm/bench/results.txt deleted file mode 100644 index 844010ad3..000000000 --- a/defects/litellm/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== litellm-0001: CWE-407: list-scan inside loop in litellm-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.150ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.621ms fixed=0.046ms speedup=188.0x -N=2000 k=2000 : defective=37.784ms fixed=0.101ms speedup=374.9x - diff --git a/defects/litellm/bench/run_all.py b/defects/litellm/bench/run_all.py deleted file mode 100644 index b8efb9b7f..000000000 --- a/defects/litellm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-litellm-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/llamacpp-0001/Makefile b/defects/llamacpp-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/llamacpp-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/llamacpp-0001/bench/bench-llamacpp-0001-0001.py b/defects/llamacpp-0001/bench/bench-llamacpp-0001-0001.py deleted file mode 100644 index 7abd9bdbf..000000000 --- a/defects/llamacpp-0001/bench/bench-llamacpp-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llamacpp-0001-0001.py -# CWE-407: list-scan inside loop in llamacpp-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llamacpp-0001-0001: CWE-407: list-scan inside loop in llamacpp-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llamacpp-0001/bench/results.txt b/defects/llamacpp-0001/bench/results.txt deleted file mode 100644 index 55bf4883f..000000000 --- a/defects/llamacpp-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== llamacpp-0001-0001: CWE-407: list-scan inside loop in llamacpp-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.315ms fixed=0.022ms speedup=103.5x -N=1000 k=1000 : defective=8.819ms fixed=0.045ms speedup=194.1x -N=2000 k=2000 : defective=35.159ms fixed=0.098ms speedup=358.9x - diff --git a/defects/llamacpp-0001/bench/run_all.py b/defects/llamacpp-0001/bench/run_all.py deleted file mode 100644 index 0237cbf55..000000000 --- a/defects/llamacpp-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-llamacpp-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/lldb/Makefile b/defects/lldb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/lldb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/lldb/bench/bench-lldb-0001.py b/defects/lldb/bench/bench-lldb-0001.py deleted file mode 100644 index 21c606ca5..000000000 --- a/defects/lldb/bench/bench-lldb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-lldb-0001.py -# lldb-0001 — SerializedBreakpointMatchesNames O(B×N²) vector scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== lldb-0001: lldb-0001 — SerializedBreakpointMatchesNames O(B×N²) vector scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lldb/bench/results.txt b/defects/lldb/bench/results.txt deleted file mode 100644 index 4726a98a8..000000000 --- a/defects/lldb/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== lldb-0001: lldb-0001 — SerializedBreakpointMatchesNames O(B×N²) vector scan === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.317ms fixed=0.023ms speedup=100.7x -N=1000 k=1000 : defective=9.019ms fixed=0.045ms speedup=201.0x -N=2000 k=2000 : defective=37.325ms fixed=0.099ms speedup=377.2x - diff --git a/defects/lldb/bench/run_all.py b/defects/lldb/bench/run_all.py deleted file mode 100644 index 35f722c4f..000000000 --- a/defects/lldb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-lldb-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/llvm/Makefile b/defects/llvm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/llvm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/llvm/bench/bench-llvm-0001.py b/defects/llvm/bench/bench-llvm-0001.py deleted file mode 100644 index 3e1447232..000000000 --- a/defects/llvm/bench/bench-llvm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llvm-0001.py -# CWE-407: list-scan inside loop in llvm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llvm-0001: CWE-407: list-scan inside loop in llvm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llvm/bench/bench-llvm-0002.py b/defects/llvm/bench/bench-llvm-0002.py deleted file mode 100644 index 46b15a4f8..000000000 --- a/defects/llvm/bench/bench-llvm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llvm-0002.py -# In getOutliningPenalty, Region is an ArrayRef. Two nested -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llvm-0002: In getOutliningPenalty, Region is an ArrayRef. Two nested ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llvm/bench/bench-llvm-0003.py b/defects/llvm/bench/bench-llvm-0003.py deleted file mode 100644 index 0caa7f8d0..000000000 --- a/defects/llvm/bench/bench-llvm-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llvm-0003.py -# CWE-407: list-scan inside loop in llvm-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llvm-0003: CWE-407: list-scan inside loop in llvm-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llvm/bench/bench-llvm-0004.py b/defects/llvm/bench/bench-llvm-0004.py deleted file mode 100644 index e7f7f21bd..000000000 --- a/defects/llvm/bench/bench-llvm-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llvm-0004.py -# CWE-407: list-scan inside loop in llvm-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llvm-0004: CWE-407: list-scan inside loop in llvm-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llvm/bench/bench-llvm-0005.py b/defects/llvm/bench/bench-llvm-0005.py deleted file mode 100644 index 8c6fd7bd0..000000000 --- a/defects/llvm/bench/bench-llvm-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llvm-0005.py -# CWE-407: list-scan inside loop in llvm-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llvm-0005: CWE-407: list-scan inside loop in llvm-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llvm/bench/bench-llvm-0006.py b/defects/llvm/bench/bench-llvm-0006.py deleted file mode 100644 index 37d6a2fa6..000000000 --- a/defects/llvm/bench/bench-llvm-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-llvm-0006.py -# In computeOutliningColdRegionsInfo, the IsSingleExit lambda iterates -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== llvm-0006: In computeOutliningColdRegionsInfo, the IsSingleExit lambda iterates ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/llvm/bench/results.txt b/defects/llvm/bench/results.txt deleted file mode 100644 index 0107b626b..000000000 --- a/defects/llvm/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== llvm-0001: CWE-407: list-scan inside loop in llvm-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.558ms fixed=0.025ms speedup=103.0x -N=1000 k=1000 : defective=10.261ms fixed=0.178ms speedup=57.8x -N=2000 k=2000 : defective=38.322ms fixed=0.097ms speedup=396.0x - -=== llvm-0002: In getOutliningPenalty, Region is an ArrayRef. Two nested === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.157ms fixed=0.021ms speedup=104.5x -N=1000 k=1000 : defective=8.766ms fixed=0.045ms speedup=193.5x -N=2000 k=2000 : defective=42.019ms fixed=0.112ms speedup=375.8x - -=== llvm-0003: CWE-407: list-scan inside loop in llvm-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.403ms fixed=0.022ms speedup=108.5x -N=1000 k=1000 : defective=9.588ms fixed=0.048ms speedup=199.8x -N=2000 k=2000 : defective=40.327ms fixed=0.096ms speedup=421.6x - -=== llvm-0004: CWE-407: list-scan inside loop in llvm-0004 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.336ms fixed=0.022ms speedup=104.2x -N=1000 k=1000 : defective=9.721ms fixed=0.051ms speedup=191.9x -N=2000 k=2000 : defective=38.560ms fixed=0.112ms speedup=344.6x - -=== llvm-0005: CWE-407: list-scan inside loop in llvm-0005 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=26.4x -N=500 k=500 : defective=2.508ms fixed=0.024ms speedup=105.7x -N=1000 k=1000 : defective=10.081ms fixed=0.053ms speedup=189.2x -N=2000 k=2000 : defective=38.829ms fixed=0.096ms speedup=402.7x - -=== llvm-0006: In computeOutliningColdRegionsInfo, the IsSingleExit lambda iterates === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.117ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=9.993ms fixed=0.050ms speedup=199.8x -N=2000 k=2000 : defective=39.643ms fixed=0.111ms speedup=358.4x - diff --git a/defects/llvm/bench/run_all.py b/defects/llvm/bench/run_all.py deleted file mode 100644 index 02a4daf14..000000000 --- a/defects/llvm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-llvm-0001.py", "bench-llvm-0002.py", "bench-llvm-0003.py", "bench-llvm-0004.py", "bench-llvm-0005.py", "bench-llvm-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/lmdb/Makefile b/defects/lmdb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/lmdb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/lmdb/bench/bench-lmdb-0001.py b/defects/lmdb/bench/bench-lmdb-0001.py deleted file mode 100644 index fba12e468..000000000 --- a/defects/lmdb/bench/bench-lmdb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-lmdb-0001.py -# CWE-407: list-scan inside loop in lmdb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== lmdb-0001: CWE-407: list-scan inside loop in lmdb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lmdb/bench/bench-lmdb-001.py b/defects/lmdb/bench/bench-lmdb-001.py deleted file mode 100644 index bb5496341..000000000 --- a/defects/lmdb/bench/bench-lmdb-001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-lmdb-001.py -# mdb_dbi_open named-database linear scan — O(D) per open, O(N×D) under connection reuse -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== lmdb-001: mdb_dbi_open named-database linear scan — O(D) per open, O(N×D) under connection reuse ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lmdb/bench/results.txt b/defects/lmdb/bench/results.txt deleted file mode 100644 index dcdb1c326..000000000 --- a/defects/lmdb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== lmdb-0001: CWE-407: list-scan inside loop in lmdb-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.5x -N=500 k=500 : defective=2.312ms fixed=0.023ms speedup=102.5x -N=1000 k=1000 : defective=9.423ms fixed=0.050ms speedup=188.1x -N=2000 k=2000 : defective=41.693ms fixed=0.100ms speedup=415.3x - -=== lmdb-001: mdb_dbi_open named-database linear scan — O(D) per open, O(N×D) under connection reuse === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.137ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=8.829ms fixed=0.046ms speedup=192.9x -N=2000 k=2000 : defective=35.623ms fixed=0.096ms speedup=370.5x - diff --git a/defects/lmdb/bench/run_all.py b/defects/lmdb/bench/run_all.py deleted file mode 100644 index 91921ad24..000000000 --- a/defects/lmdb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-lmdb-0001.py", "bench-lmdb-001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/log4j2/patch/log4j2-0001-mdcadapter-clear-leaks-stacks.patch b/defects/log4j2/patch/log4j2-0001-mdcadapter-clear-leaks-stacks.patch deleted file mode 100644 index 65d619858..000000000 --- a/defects/log4j2/patch/log4j2-0001-mdcadapter-clear-leaks-stacks.patch +++ /dev/null @@ -1,53 +0,0 @@ -# UNDF: UNDF-2026-000001308 -# CWE-668 / MOAD-0003: A Leaked Context — Log4jMDCAdapter.clear() does not clear -# the per-key stacks ThreadLocal -# -# Defect: log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jMDCAdapter.java -# has TWO per-thread state holders: -# 1. ThreadContext map (log4j-core, the canonical MDC) -# 2. mapOfStacks: ThreadLocalMapOfStacks (SLF4J's pushByKey/popByKey -# stack semantics layered on top — line 37) -# -# Log4jMDCAdapter.clear() at line 55-57 only calls ThreadContext.clearMap(). -# The adapter's own mapOfStacks ThreadLocal>> is -# NOT cleared. SLF4J's MDC.clear() spec mandates "clear all MDC state for -# this thread", but the adapter leaks the per-key stacks across MDC.clear(). -# -# Web frameworks (Spring, Quarkus, etc.) call MDC.clear() after each request. -# The per-key Deques accumulate across requests; a peekByKey() / popByKey() / -# getCopyOfDequeByKey() call after MDC.clear() returns data pushed by a -# previous request on the same pool thread. -# -# Fix: add ThreadLocalMapOfStacks.clear() that does tlMapOfStacks.remove(), -# and call it from Log4jMDCAdapter.clear() so the SLF4J spec contract holds. -# -# This is a security-relevant Leaked Context defect: when caller code uses -# pushByKey/popByKey to track per-request state (tenant IDs, trace contexts, -# user roles), the leftover stacks contain prior request's identifiers. ---- a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jMDCAdapter.java -+++ b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jMDCAdapter.java -@@ -54,6 +54,9 @@ public class Log4jMDCAdapter implements MDCAdapter { - @Override - public void clear() { - ThreadContext.clearMap(); -+ // Also clear the SLF4J pushByKey/popByKey stacks. Without this, -+ // per-key Deques pushed in prior requests remain visible to the -+ // next request that peekByKey/popByKey/getCopyOfDequeByKey on the -+ // same pool thread — a per-thread Leaked Context (MOAD-0003). -+ mapOfStacks.clear(); - } - - @Override -@@ -148,6 +151,12 @@ public class Log4jMDCAdapter implements MDCAdapter { - final Deque deque = tlMapOfStacks.get().get(key); - return deque != null ? deque.peek() : null; - } -+ -+ public void clear() { -+ // Use remove() instead of set(new HashMap<>()) so the ThreadLocal -+ // entry itself is deleted, preventing classloader retention in -+ // app-server thread pools across application redeploys. -+ tlMapOfStacks.remove(); -+ } - } - } diff --git a/defects/loki/Makefile b/defects/loki/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/loki/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/loki/bench/bench-loki-0001.py b/defects/loki/bench/bench-loki-0001.py deleted file mode 100644 index 06be48835..000000000 --- a/defects/loki/bench/bench-loki-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-loki-0001.py -# File: pkg/engine/internal/util/dag/dag.go -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== loki-0001: File: pkg/engine/internal/util/dag/dag.go ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/loki/bench/results.txt b/defects/loki/bench/results.txt deleted file mode 100644 index 839e49944..000000000 --- a/defects/loki/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== loki-0001: File: pkg/engine/internal/util/dag/dag.go === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.363ms fixed=0.023ms speedup=103.2x -N=1000 k=1000 : defective=9.524ms fixed=0.049ms speedup=192.7x -N=2000 k=2000 : defective=35.059ms fixed=0.095ms speedup=369.6x - diff --git a/defects/loki/bench/run_all.py b/defects/loki/bench/run_all.py deleted file mode 100644 index bf19de38d..000000000 --- a/defects/loki/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-loki-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/lotus-0001/Makefile b/defects/lotus-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/lotus-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/lotus-0001/bench/bench-lotus-0001-0001.py b/defects/lotus-0001/bench/bench-lotus-0001-0001.py deleted file mode 100644 index 77b36142a..000000000 --- a/defects/lotus-0001/bench/bench-lotus-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-lotus-0001-0001.py -# CWE-407: list-scan inside loop in lotus-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== lotus-0001-0001: CWE-407: list-scan inside loop in lotus-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lotus-0001/bench/results.txt b/defects/lotus-0001/bench/results.txt deleted file mode 100644 index 3a50f8ad4..000000000 --- a/defects/lotus-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== lotus-0001-0001: CWE-407: list-scan inside loop in lotus-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.255ms fixed=0.022ms speedup=101.3x -N=1000 k=1000 : defective=8.663ms fixed=0.047ms speedup=183.6x -N=2000 k=2000 : defective=37.941ms fixed=0.116ms speedup=328.5x - diff --git a/defects/lotus-0001/bench/run_all.py b/defects/lotus-0001/bench/run_all.py deleted file mode 100644 index b010b0ceb..000000000 --- a/defects/lotus-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-lotus-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/love2d/Makefile b/defects/love2d/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/love2d/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/love2d/bench/bench-love2d-0001.py b/defects/love2d/bench/bench-love2d-0001.py deleted file mode 100644 index f12518517..000000000 --- a/defects/love2d/bench/bench-love2d-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-love2d-0001.py -# CWE-407: list-scan inside loop in love2d-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== love2d-0001: CWE-407: list-scan inside loop in love2d-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/love2d/bench/bench-love2d-0002.py b/defects/love2d/bench/bench-love2d-0002.py deleted file mode 100644 index 3782553c3..000000000 --- a/defects/love2d/bench/bench-love2d-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-love2d-0002.py -# Window::getFullscreenSizes O(n²) dedup — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== love2d-0002: Window::getFullscreenSizes O(n²) dedup — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/love2d/bench/bench-love2d-0003.py b/defects/love2d/bench/bench-love2d-0003.py deleted file mode 100644 index 9639fef74..000000000 --- a/defects/love2d/bench/bench-love2d-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-love2d-0003.py -# Filesystem::allowMountingForPath O(n) dedup each call — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== love2d-0003: Filesystem::allowMountingForPath O(n) dedup each call — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/love2d/bench/results.txt b/defects/love2d/bench/results.txt deleted file mode 100644 index 94ee57a55..000000000 --- a/defects/love2d/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== love2d-0001: CWE-407: list-scan inside loop in love2d-0001 (generic model) === -N=100 k=100 : defective=0.114ms fixed=0.005ms speedup=25.2x -N=500 k=500 : defective=2.854ms fixed=0.027ms speedup=104.9x -N=1000 k=1000 : defective=11.775ms fixed=0.064ms speedup=184.1x -N=2000 k=2000 : defective=37.865ms fixed=0.098ms speedup=386.9x - -=== love2d-0002: Window::getFullscreenSizes O(n²) dedup — CWE-407 === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.363ms fixed=0.023ms speedup=102.0x -N=1000 k=1000 : defective=11.213ms fixed=0.056ms speedup=198.5x -N=2000 k=2000 : defective=42.052ms fixed=0.220ms speedup=190.8x - -=== love2d-0003: Filesystem::allowMountingForPath O(n) dedup each call — CWE-407 === -N=100 k=100 : defective=0.300ms fixed=0.019ms speedup=15.4x -N=500 k=500 : defective=2.679ms fixed=0.045ms speedup=59.6x -N=1000 k=1000 : defective=11.565ms fixed=0.052ms speedup=221.6x -N=2000 k=2000 : defective=41.524ms fixed=0.101ms speedup=409.8x - diff --git a/defects/love2d/bench/run_all.py b/defects/love2d/bench/run_all.py deleted file mode 100644 index 0fa47f9d1..000000000 --- a/defects/love2d/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-love2d-0001.py", "bench-love2d-0002.py", "bench-love2d-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/lua/Makefile b/defects/lua/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/lua/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/lua/bench/bench-lua-0001.py b/defects/lua/bench/bench-lua-0001.py deleted file mode 100644 index 3eec4fdd5..000000000 --- a/defects/lua/bench/bench-lua-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-lua-0001.py -# CWE-407: list-scan inside loop in lua-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== lua-0001: CWE-407: list-scan inside loop in lua-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/lua/bench/results.txt b/defects/lua/bench/results.txt deleted file mode 100644 index 2a726a8ff..000000000 --- a/defects/lua/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== lua-0001: CWE-407: list-scan inside loop in lua-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.174ms fixed=0.020ms speedup=107.4x -N=1000 k=1000 : defective=8.906ms fixed=0.046ms speedup=195.7x -N=2000 k=2000 : defective=36.342ms fixed=0.095ms speedup=381.2x - diff --git a/defects/lua/bench/run_all.py b/defects/lua/bench/run_all.py deleted file mode 100644 index 13495c018..000000000 --- a/defects/lua/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-lua-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/luigi/Makefile b/defects/luigi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/luigi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/luigi/bench/bench-luigi-0001.py b/defects/luigi/bench/bench-luigi-0001.py deleted file mode 100644 index 6a3863ba7..000000000 --- a/defects/luigi/bench/bench-luigi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-luigi-0001.py -# CWE-407: list-scan inside loop in luigi-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== luigi-0001: CWE-407: list-scan inside loop in luigi-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/luigi/bench/results.txt b/defects/luigi/bench/results.txt deleted file mode 100644 index 0deb91a6f..000000000 --- a/defects/luigi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== luigi-0001: CWE-407: list-scan inside loop in luigi-0001 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.323ms fixed=0.024ms speedup=97.0x -N=1000 k=1000 : defective=8.818ms fixed=0.047ms speedup=189.4x -N=2000 k=2000 : defective=37.371ms fixed=0.098ms speedup=381.5x - diff --git a/defects/luigi/bench/run_all.py b/defects/luigi/bench/run_all.py deleted file mode 100644 index dbed7590c..000000000 --- a/defects/luigi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-luigi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/make/Makefile b/defects/make/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/make/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/make/bench/bench-make-0001.py b/defects/make/bench/bench-make-0001.py deleted file mode 100644 index 82942a51b..000000000 --- a/defects/make/bench/bench-make-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-make-0001.py -# implicit.c pattern_search file->deps O(R×D×F) → O(R×D+F) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== make-0001: implicit.c pattern_search file->deps O(R×D×F) → O(R×D+F) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/make/bench/results.txt b/defects/make/bench/results.txt deleted file mode 100644 index 5dd8ca69a..000000000 --- a/defects/make/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== make-0001: implicit.c pattern_search file->deps O(R×D×F) → O(R×D+F) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.529ms fixed=0.023ms speedup=112.0x -N=1000 k=1000 : defective=8.812ms fixed=0.046ms speedup=191.8x -N=2000 k=2000 : defective=35.410ms fixed=0.097ms speedup=363.3x - diff --git a/defects/make/bench/run_all.py b/defects/make/bench/run_all.py deleted file mode 100644 index 83c732580..000000000 --- a/defects/make/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-make-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mariadb/Makefile b/defects/mariadb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mariadb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mariadb/bench/bench-mariadb-0001.py b/defects/mariadb/bench/bench-mariadb-0001.py deleted file mode 100644 index 3e5d81bf5..000000000 --- a/defects/mariadb/bench/bench-mariadb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mariadb-0001.py -# CWE-407: list-scan inside loop in mariadb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mariadb-0001: CWE-407: list-scan inside loop in mariadb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mariadb/bench/bench-mariadb-0002.py b/defects/mariadb/bench/bench-mariadb-0002.py deleted file mode 100644 index 372baf703..000000000 --- a/defects/mariadb/bench/bench-mariadb-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mariadb-0002.py -# CWE-407: list-scan inside loop in mariadb-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mariadb-0002: CWE-407: list-scan inside loop in mariadb-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mariadb/bench/results.txt b/defects/mariadb/bench/results.txt deleted file mode 100644 index bbe068a93..000000000 --- a/defects/mariadb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== mariadb-0001: CWE-407: list-scan inside loop in mariadb-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.602ms fixed=0.025ms speedup=102.1x -N=1000 k=1000 : defective=10.766ms fixed=0.056ms speedup=193.7x -N=2000 k=2000 : defective=35.878ms fixed=0.096ms speedup=373.7x - -=== mariadb-0002: CWE-407: list-scan inside loop in mariadb-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.171ms fixed=0.021ms speedup=105.3x -N=1000 k=1000 : defective=8.782ms fixed=0.045ms speedup=194.7x -N=2000 k=2000 : defective=36.403ms fixed=0.097ms speedup=374.6x - diff --git a/defects/mariadb/bench/run_all.py b/defects/mariadb/bench/run_all.py deleted file mode 100644 index 6e39e7a96..000000000 --- a/defects/mariadb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mariadb-0001.py", "bench-mariadb-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mastodon/Makefile b/defects/mastodon/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mastodon/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mastodon/bench/bench-mastodon-0001.py b/defects/mastodon/bench/bench-mastodon-0001.py deleted file mode 100644 index ac5fcaed0..000000000 --- a/defects/mastodon/bench/bench-mastodon-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mastodon-0001.py -# OStatus::Activity::Creation#save_mentions — O(N²) processed_account_ids Array#include? dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mastodon-0001: OStatus::Activity::Creation#save_mentions — O(N²) processed_account_ids Array#include? dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mastodon/bench/bench-mastodon-0002.py b/defects/mastodon/bench/bench-mastodon-0002.py deleted file mode 100644 index e03571ae1..000000000 --- a/defects/mastodon/bench/bench-mastodon-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mastodon-0002.py -# ActivityPub::Activity::Create#process_hashtag — O(N²) status.tags.include? AR query per tag in loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mastodon-0002: ActivityPub::Activity::Create#process_hashtag — O(N²) status.tags.include? AR query per tag in loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mastodon/bench/bench-mastodon-0003.py b/defects/mastodon/bench/bench-mastodon-0003.py deleted file mode 100644 index bbaa414ef..000000000 --- a/defects/mastodon/bench/bench-mastodon-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mastodon-0003.py -# CWE-407: list-scan inside loop in mastodon-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mastodon-0003: CWE-407: list-scan inside loop in mastodon-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mastodon/bench/results.txt b/defects/mastodon/bench/results.txt deleted file mode 100644 index db8e1d9c8..000000000 --- a/defects/mastodon/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== mastodon-0001: OStatus::Activity::Creation#save_mentions — O(N²) processed_account_ids Array#include? dedup === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.118ms fixed=0.020ms speedup=104.2x -N=1000 k=1000 : defective=8.808ms fixed=0.046ms speedup=191.7x -N=2000 k=2000 : defective=35.944ms fixed=0.103ms speedup=350.7x - -=== mastodon-0002: ActivityPub::Activity::Create#process_hashtag — O(N²) status.tags.include? AR query per tag in loop === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.268ms fixed=0.021ms speedup=109.0x -N=1000 k=1000 : defective=8.857ms fixed=0.047ms speedup=189.4x -N=2000 k=2000 : defective=36.798ms fixed=0.096ms speedup=384.9x - -=== mastodon-0003: CWE-407: list-scan inside loop in mastodon-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.254ms fixed=0.021ms speedup=109.5x -N=1000 k=1000 : defective=8.780ms fixed=0.047ms speedup=188.7x -N=2000 k=2000 : defective=37.126ms fixed=0.096ms speedup=385.2x - diff --git a/defects/mastodon/bench/run_all.py b/defects/mastodon/bench/run_all.py deleted file mode 100644 index 4e5a856df..000000000 --- a/defects/mastodon/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mastodon-0001.py", "bench-mastodon-0002.py", "bench-mastodon-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mattermost/Makefile b/defects/mattermost/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mattermost/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mattermost/bench/bench-mattermost-0001.py b/defects/mattermost/bench/bench-mattermost-0001.py deleted file mode 100644 index 8c33c6ffe..000000000 --- a/defects/mattermost/bench/bench-mattermost-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mattermost-0001.py -# CWE-407: list-scan inside loop in mattermost-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mattermost-0001: CWE-407: list-scan inside loop in mattermost-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mattermost/bench/results.txt b/defects/mattermost/bench/results.txt deleted file mode 100644 index 3bb02595c..000000000 --- a/defects/mattermost/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mattermost-0001: CWE-407: list-scan inside loop in mattermost-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.236ms fixed=0.022ms speedup=102.3x -N=1000 k=1000 : defective=8.810ms fixed=0.047ms speedup=189.0x -N=2000 k=2000 : defective=36.718ms fixed=0.105ms speedup=350.3x - diff --git a/defects/mattermost/bench/run_all.py b/defects/mattermost/bench/run_all.py deleted file mode 100644 index 61179c7d6..000000000 --- a/defects/mattermost/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mattermost-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/maven/Makefile b/defects/maven/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/maven/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/maven/bench/bench-maven-0001.py b/defects/maven/bench/bench-maven-0001.py deleted file mode 100644 index e07bdd7d3..000000000 --- a/defects/maven/bench/bench-maven-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-maven-0001.py -# CWE-407: list-scan inside loop in maven-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== maven-0001: CWE-407: list-scan inside loop in maven-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/maven/bench/bench-maven-0003.py b/defects/maven/bench/bench-maven-0003.py deleted file mode 100644 index f09803e89..000000000 --- a/defects/maven/bench/bench-maven-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-maven-0003.py -# CWE-407: list-scan inside loop in maven-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== maven-0003: CWE-407: list-scan inside loop in maven-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/maven/bench/bench-maven-0004.py b/defects/maven/bench/bench-maven-0004.py deleted file mode 100644 index 726a1c2f9..000000000 --- a/defects/maven/bench/bench-maven-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-maven-0004.py -# CWE-407: list-scan inside loop in maven-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== maven-0004: CWE-407: list-scan inside loop in maven-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/maven/bench/bench-maven-0005.py b/defects/maven/bench/bench-maven-0005.py deleted file mode 100644 index c5f39381c..000000000 --- a/defects/maven/bench/bench-maven-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-maven-0005.py -# CWE-407: list-scan inside loop in maven-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== maven-0005: CWE-407: list-scan inside loop in maven-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/maven/bench/bench-maven-0006.py b/defects/maven/bench/bench-maven-0006.py deleted file mode 100644 index e14c6c7c9..000000000 --- a/defects/maven/bench/bench-maven-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-maven-0006.py -# CWE-407: list-scan inside loop in maven-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== maven-0006: CWE-407: list-scan inside loop in maven-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/maven/bench/bench-maven-0007.py b/defects/maven/bench/bench-maven-0007.py deleted file mode 100644 index 3a0512e60..000000000 --- a/defects/maven/bench/bench-maven-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-maven-0007.py -# CWE-407: list-scan inside loop in maven-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== maven-0007: CWE-407: list-scan inside loop in maven-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/maven/bench/results.txt b/defects/maven/bench/results.txt deleted file mode 100644 index 0f94b54e6..000000000 --- a/defects/maven/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== maven-0001: CWE-407: list-scan inside loop in maven-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.546ms fixed=0.024ms speedup=106.6x -N=1000 k=1000 : defective=10.400ms fixed=0.053ms speedup=197.4x -N=2000 k=2000 : defective=40.345ms fixed=0.098ms speedup=413.5x - -=== maven-0003: CWE-407: list-scan inside loop in maven-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.154ms fixed=0.020ms speedup=105.3x -N=1000 k=1000 : defective=8.754ms fixed=0.053ms speedup=166.6x -N=2000 k=2000 : defective=40.634ms fixed=0.100ms speedup=405.1x - -=== maven-0004: CWE-407: list-scan inside loop in maven-0004 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.565ms fixed=0.023ms speedup=112.4x -N=1000 k=1000 : defective=9.915ms fixed=0.050ms speedup=199.1x -N=2000 k=2000 : defective=36.612ms fixed=0.097ms speedup=375.8x - -=== maven-0005: CWE-407: list-scan inside loop in maven-0005 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.357ms fixed=0.022ms speedup=106.4x -N=1000 k=1000 : defective=10.443ms fixed=0.050ms speedup=208.3x -N=2000 k=2000 : defective=36.808ms fixed=0.118ms speedup=312.6x - -=== maven-0006: CWE-407: list-scan inside loop in maven-0006 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.601ms fixed=0.025ms speedup=104.7x -N=1000 k=1000 : defective=12.699ms fixed=0.051ms speedup=249.5x -N=2000 k=2000 : defective=43.783ms fixed=0.118ms speedup=370.3x - -=== maven-0007: CWE-407: list-scan inside loop in maven-0007 (generic model) === -N=100 k=100 : defective=0.109ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.675ms fixed=0.025ms speedup=107.1x -N=1000 k=1000 : defective=9.893ms fixed=0.051ms speedup=195.2x -N=2000 k=2000 : defective=42.202ms fixed=0.106ms speedup=396.4x - diff --git a/defects/maven/bench/run_all.py b/defects/maven/bench/run_all.py deleted file mode 100644 index 69c59f72f..000000000 --- a/defects/maven/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-maven-0001.py", "bench-maven-0003.py", "bench-maven-0004.py", "bench-maven-0005.py", "bench-maven-0006.py", "bench-maven-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mednafen-0001/Makefile b/defects/mednafen-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mednafen-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mednafen-0001/bench/bench-mednafen-0001-0001.py b/defects/mednafen-0001/bench/bench-mednafen-0001-0001.py deleted file mode 100644 index 0ae24b8a8..000000000 --- a/defects/mednafen-0001/bench/bench-mednafen-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mednafen-0001-0001.py -# CWE-407: list-scan inside loop in mednafen-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mednafen-0001-0001: CWE-407: list-scan inside loop in mednafen-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mednafen-0001/bench/results.txt b/defects/mednafen-0001/bench/results.txt deleted file mode 100644 index d33522929..000000000 --- a/defects/mednafen-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mednafen-0001-0001: CWE-407: list-scan inside loop in mednafen-0001-0001 (generic model) === -N=100 k=100 : defective=0.109ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.960ms fixed=0.027ms speedup=111.4x -N=1000 k=1000 : defective=10.399ms fixed=0.053ms speedup=195.6x -N=2000 k=2000 : defective=40.287ms fixed=0.094ms speedup=428.8x - diff --git a/defects/mednafen-0001/bench/run_all.py b/defects/mednafen-0001/bench/run_all.py deleted file mode 100644 index 7627f2c73..000000000 --- a/defects/mednafen-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mednafen-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/megaglest-0001/Makefile b/defects/megaglest-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/megaglest-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/megaglest-0001/bench/bench-megaglest-0001-0001.py b/defects/megaglest-0001/bench/bench-megaglest-0001-0001.py deleted file mode 100644 index a7a2cf45f..000000000 --- a/defects/megaglest-0001/bench/bench-megaglest-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-megaglest-0001-0001.py -# CWE-407: list-scan inside loop in megaglest-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== megaglest-0001-0001: CWE-407: list-scan inside loop in megaglest-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/megaglest-0001/bench/results.txt b/defects/megaglest-0001/bench/results.txt deleted file mode 100644 index 6e25377b2..000000000 --- a/defects/megaglest-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== megaglest-0001-0001: CWE-407: list-scan inside loop in megaglest-0001-0001 (generic model) === -N=100 k=100 : defective=0.177ms fixed=0.006ms speedup=27.8x -N=500 k=500 : defective=2.329ms fixed=0.023ms speedup=102.7x -N=1000 k=1000 : defective=10.517ms fixed=0.050ms speedup=210.6x -N=2000 k=2000 : defective=39.676ms fixed=0.100ms speedup=394.8x - diff --git a/defects/megaglest-0001/bench/run_all.py b/defects/megaglest-0001/bench/run_all.py deleted file mode 100644 index 5991dc4a2..000000000 --- a/defects/megaglest-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-megaglest-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/megaglest-0002/Makefile b/defects/megaglest-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/megaglest-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/megaglest-0002/bench/bench-megaglest-0002-0002.py b/defects/megaglest-0002/bench/bench-megaglest-0002-0002.py deleted file mode 100644 index 644c02d9e..000000000 --- a/defects/megaglest-0002/bench/bench-megaglest-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-megaglest-0002-0002.py -# CWE-407: list-scan inside loop in megaglest-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== megaglest-0002-0002: CWE-407: list-scan inside loop in megaglest-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/megaglest-0002/bench/results.txt b/defects/megaglest-0002/bench/results.txt deleted file mode 100644 index d8b4193e3..000000000 --- a/defects/megaglest-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== megaglest-0002-0002: CWE-407: list-scan inside loop in megaglest-0002-0002 (generic model) === -N=100 k=100 : defective=0.208ms fixed=0.019ms speedup=11.2x -N=500 k=500 : defective=3.157ms fixed=0.030ms speedup=105.2x -N=1000 k=1000 : defective=13.868ms fixed=0.067ms speedup=205.9x -N=2000 k=2000 : defective=38.858ms fixed=0.101ms speedup=383.5x - diff --git a/defects/megaglest-0002/bench/run_all.py b/defects/megaglest-0002/bench/run_all.py deleted file mode 100644 index f5d9873e0..000000000 --- a/defects/megaglest-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-megaglest-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/melonds-0001/Makefile b/defects/melonds-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/melonds-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/melonds-0001/bench/bench-melonds-0001-0001.py b/defects/melonds-0001/bench/bench-melonds-0001-0001.py deleted file mode 100644 index 10867b2d4..000000000 --- a/defects/melonds-0001/bench/bench-melonds-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-melonds-0001-0001.py -# CWE-407: list-scan inside loop in melonds-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== melonds-0001-0001: CWE-407: list-scan inside loop in melonds-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/melonds-0001/bench/results.txt b/defects/melonds-0001/bench/results.txt deleted file mode 100644 index 6e04693ab..000000000 --- a/defects/melonds-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== melonds-0001-0001: CWE-407: list-scan inside loop in melonds-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.338ms fixed=0.022ms speedup=106.7x -N=1000 k=1000 : defective=9.131ms fixed=0.046ms speedup=199.0x -N=2000 k=2000 : defective=35.393ms fixed=0.095ms speedup=372.7x - diff --git a/defects/melonds-0001/bench/run_all.py b/defects/melonds-0001/bench/run_all.py deleted file mode 100644 index f4795f972..000000000 --- a/defects/melonds-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-melonds-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/memcached/Makefile b/defects/memcached/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/memcached/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/memcached/bench/bench-memcached-0001.py b/defects/memcached/bench/bench-memcached-0001.py deleted file mode 100644 index 2f9810036..000000000 --- a/defects/memcached/bench/bench-memcached-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-memcached-0001.py -# CWE-407: list-scan inside loop in memcached-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== memcached-0001: CWE-407: list-scan inside loop in memcached-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/memcached/bench/results.txt b/defects/memcached/bench/results.txt deleted file mode 100644 index a7a028e08..000000000 --- a/defects/memcached/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== memcached-0001: CWE-407: list-scan inside loop in memcached-0001 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.236ms fixed=0.022ms speedup=101.8x -N=1000 k=1000 : defective=8.835ms fixed=0.045ms speedup=195.0x -N=2000 k=2000 : defective=39.970ms fixed=0.100ms speedup=397.9x - diff --git a/defects/memcached/bench/run_all.py b/defects/memcached/bench/run_all.py deleted file mode 100644 index a18f54051..000000000 --- a/defects/memcached/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-memcached-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mercurial-0001/Makefile b/defects/mercurial-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mercurial-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mercurial-0001/bench/bench-mercurial-0001-0001.py b/defects/mercurial-0001/bench/bench-mercurial-0001-0001.py deleted file mode 100644 index 4e293d677..000000000 --- a/defects/mercurial-0001/bench/bench-mercurial-0001-0001.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python3 -# bench-mercurial-0001-0001.py -# graphmod.colored(): list.index() + list-membership lookups inside an -# O(k) inner loop per commit, where k is the number of parallel branches in -# the frontier. Total cost O(N·k²). Fix: dict-based O(1) position lookup -# brings it to O(N·k). Standalone Python model — a fuller benchmark that -# imports the real graphmod lives alongside as bench_google_scale.py. - -import sys -import time - - -def _step_defective(seen, cur, parents): - if cur not in seen: # O(k) - seen.append(cur) - col = seen.index(cur) # O(k) - next_ = seen[:] - addparents = [] - for p in parents: - if p not in next_: # O(k) - addparents.append(p) - next_[col: col + 1] = addparents - # inner enumerate loop: O(k) * O(k) membership/index = O(k^2) - for ecol, eid in enumerate(seen): - if eid in next_: # O(k) - _ = next_.index(eid) # O(k) - elif eid == cur: - for p in parents: - _ = next_.index(p) # O(k) - return next_ - - -def _step_fixed(seen, seen_pos, cur, parents): - if cur not in seen_pos: # O(1) - seen_pos[cur] = len(seen) - seen.append(cur) - col = seen_pos[cur] # O(1) - next_ = seen[:] - addparents = [] - for p in parents: - if p not in seen_pos: # O(1) - addparents.append(p) - next_[col: col + 1] = addparents - next_pos = {n: i for i, n in enumerate(next_)} # O(k) - for ecol, eid in enumerate(seen): - if eid in next_pos: # O(1) - _ = next_pos[eid] # O(1) - elif eid == cur: - for p in parents: - _ = next_pos[p] # O(1) - return next_, next_pos - - -def bench_defective(n, k): - seen = [] - t0 = time.perf_counter() - for rev in range(n - 1, -1, -1): - parent = rev - k - parents = [parent] if parent >= 0 else [] - seen = _step_defective(seen, rev, parents) - # bound seen growth to ~k so we measure the inner-loop work at k-frontier - if len(seen) > k: - seen = seen[:k] - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - seen = [] - seen_pos = {} - t0 = time.perf_counter() - for rev in range(n - 1, -1, -1): - parent = rev - k - parents = [parent] if parent >= 0 else [] - seen, seen_pos = _step_fixed(seen, seen_pos, rev, parents) - if len(seen) > k: - seen = seen[:k] - seen_pos = {n_: i for i, n_ in enumerate(seen)} - return time.perf_counter() - t0 - - -TRIALS = 2 -# k dominates the O(k^2) inner loop; measure the Google-scale k=500 case -# even at modest N so the wall-clock speedup matches the k growth curve -# the brief claims. -CASES = [(1000, 50), (1000, 100), (1500, 200), (1500, 350), (1500, 500)] - - -def run(): - lines = [] - header = "=== mercurial-0001-0001: graphmod.colored list.index vs dict O(k^2)->O(k) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<4}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mercurial-0001/bench/results.txt b/defects/mercurial-0001/bench/results.txt deleted file mode 100644 index 1d4b228d1..000000000 --- a/defects/mercurial-0001/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== mercurial-0001-0001: graphmod.colored list.index vs dict O(k^2)->O(k) === -N=1000 k=50 : defective=60.242ms fixed=10.084ms speedup=6.0x -N=1000 k=100 : defective=207.142ms fixed=18.347ms speedup=11.3x -N=1500 k=200 : defective=1154.546ms fixed=52.559ms speedup=22.0x -N=1500 k=350 : defective=2932.315ms fixed=78.024ms speedup=37.6x -N=1500 k=500 : defective=4798.280ms fixed=95.837ms speedup=50.1x - diff --git a/defects/mercurial-0001/bench/run_all.py b/defects/mercurial-0001/bench/run_all.py deleted file mode 100644 index faeb19321..000000000 --- a/defects/mercurial-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mercurial-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mesa/Makefile b/defects/mesa/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mesa/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mesa/bench/bench-mesa-0001.py b/defects/mesa/bench/bench-mesa-0001.py deleted file mode 100644 index d362af91a..000000000 --- a/defects/mesa/bench/bench-mesa-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mesa-0001.py -# CWE-407: list-scan inside loop in mesa-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mesa-0001: CWE-407: list-scan inside loop in mesa-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mesa/bench/results.txt b/defects/mesa/bench/results.txt deleted file mode 100644 index 658e9606b..000000000 --- a/defects/mesa/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mesa-0001: CWE-407: list-scan inside loop in mesa-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.416ms fixed=0.024ms speedup=99.8x -N=1000 k=1000 : defective=10.124ms fixed=0.052ms speedup=194.2x -N=2000 k=2000 : defective=35.789ms fixed=0.097ms speedup=369.8x - diff --git a/defects/mesa/bench/run_all.py b/defects/mesa/bench/run_all.py deleted file mode 100644 index bcf61a96e..000000000 --- a/defects/mesa/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mesa-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/meson/Makefile b/defects/meson/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/meson/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/meson/bench/bench-meson-0001.py b/defects/meson/bench/bench-meson-0001.py deleted file mode 100644 index 2e8f07fc2..000000000 --- a/defects/meson/bench/bench-meson-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-meson-0001.py -# CWE-407: list-scan inside loop in meson-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== meson-0001: CWE-407: list-scan inside loop in meson-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/meson/bench/bench-meson-0002.py b/defects/meson/bench/bench-meson-0002.py deleted file mode 100644 index e15c1eb3b..000000000 --- a/defects/meson/bench/bench-meson-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-meson-0002.py -# CWE-407: list-scan inside loop in meson-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== meson-0002: CWE-407: list-scan inside loop in meson-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/meson/bench/bench-meson-0003.py b/defects/meson/bench/bench-meson-0003.py deleted file mode 100644 index 57803cee1..000000000 --- a/defects/meson/bench/bench-meson-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-meson-0003.py -# CWE-407: list-scan inside loop in meson-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== meson-0003: CWE-407: list-scan inside loop in meson-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/meson/bench/bench-meson-0004.py b/defects/meson/bench/bench-meson-0004.py deleted file mode 100644 index e84df4f7e..000000000 --- a/defects/meson/bench/bench-meson-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-meson-0004.py -# CWE-407: list-scan inside loop in meson-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== meson-0004: CWE-407: list-scan inside loop in meson-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/meson/bench/bench-meson-0005.py b/defects/meson/bench/bench-meson-0005.py deleted file mode 100644 index 9d6aec1c9..000000000 --- a/defects/meson/bench/bench-meson-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-meson-0005.py -# CWE-407: list-scan inside loop in meson-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== meson-0005: CWE-407: list-scan inside loop in meson-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/meson/bench/bench-meson-0006.py b/defects/meson/bench/bench-meson-0006.py deleted file mode 100644 index b27e56770..000000000 --- a/defects/meson/bench/bench-meson-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-meson-0006.py -# CWE-407: list-scan inside loop in meson-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== meson-0006: CWE-407: list-scan inside loop in meson-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/meson/bench/results.txt b/defects/meson/bench/results.txt deleted file mode 100644 index d740a05bf..000000000 --- a/defects/meson/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== meson-0001: CWE-407: list-scan inside loop in meson-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.754ms fixed=0.046ms speedup=60.2x -N=1000 k=1000 : defective=11.930ms fixed=0.045ms speedup=263.1x -N=2000 k=2000 : defective=36.165ms fixed=0.098ms speedup=368.7x - -=== meson-0002: CWE-407: list-scan inside loop in meson-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=26.8x -N=500 k=500 : defective=2.347ms fixed=0.038ms speedup=61.9x -N=1000 k=1000 : defective=9.014ms fixed=0.051ms speedup=176.9x -N=2000 k=2000 : defective=37.763ms fixed=0.107ms speedup=353.7x - -=== meson-0003: CWE-407: list-scan inside loop in meson-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.170ms fixed=0.020ms speedup=105.9x -N=1000 k=1000 : defective=9.146ms fixed=0.053ms speedup=173.7x -N=2000 k=2000 : defective=35.406ms fixed=0.102ms speedup=347.5x - -=== meson-0004: CWE-407: list-scan inside loop in meson-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.463ms fixed=0.023ms speedup=106.5x -N=1000 k=1000 : defective=9.722ms fixed=0.051ms speedup=190.4x -N=2000 k=2000 : defective=43.635ms fixed=0.107ms speedup=406.5x - -=== meson-0005: CWE-407: list-scan inside loop in meson-0005 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.343ms fixed=0.023ms speedup=102.3x -N=1000 k=1000 : defective=8.647ms fixed=0.049ms speedup=176.7x -N=2000 k=2000 : defective=36.553ms fixed=0.097ms speedup=377.0x - -=== meson-0006: CWE-407: list-scan inside loop in meson-0006 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=101.9x -N=1000 k=1000 : defective=9.616ms fixed=0.051ms speedup=190.4x -N=2000 k=2000 : defective=37.956ms fixed=0.098ms speedup=387.5x - diff --git a/defects/meson/bench/run_all.py b/defects/meson/bench/run_all.py deleted file mode 100644 index 086e58d8b..000000000 --- a/defects/meson/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-meson-0001.py", "bench-meson-0002.py", "bench-meson-0003.py", "bench-meson-0004.py", "bench-meson-0005.py", "bench-meson-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/metaflow/Makefile b/defects/metaflow/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/metaflow/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/metaflow/bench/bench-metaflow-0001.py b/defects/metaflow/bench/bench-metaflow-0001.py deleted file mode 100644 index 11f4db4b5..000000000 --- a/defects/metaflow/bench/bench-metaflow-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-metaflow-0001.py -# metaflow-0001 — O(N²) Graph Traversal: list.remove() and list membership in _traverse_graph -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== metaflow-0001: metaflow-0001 — O(N²) Graph Traversal: list.remove() and list membership in _traverse_graph ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/metaflow/bench/results.txt b/defects/metaflow/bench/results.txt deleted file mode 100644 index c4b22f86a..000000000 --- a/defects/metaflow/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== metaflow-0001: metaflow-0001 — O(N²) Graph Traversal: list.remove() and list membership in _traverse_graph === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.198ms fixed=0.021ms speedup=103.1x -N=1000 k=1000 : defective=8.643ms fixed=0.046ms speedup=187.1x -N=2000 k=2000 : defective=37.610ms fixed=0.097ms speedup=388.8x - diff --git a/defects/metaflow/bench/run_all.py b/defects/metaflow/bench/run_all.py deleted file mode 100644 index 981457d98..000000000 --- a/defects/metaflow/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-metaflow-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mgba-0001/Makefile b/defects/mgba-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mgba-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mgba-0001/bench/bench-mgba-0001-0001.py b/defects/mgba-0001/bench/bench-mgba-0001-0001.py deleted file mode 100644 index cd52e46ab..000000000 --- a/defects/mgba-0001/bench/bench-mgba-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mgba-0001-0001.py -# CWE-407: list-scan inside loop in mgba-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mgba-0001-0001: CWE-407: list-scan inside loop in mgba-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mgba-0001/bench/results.txt b/defects/mgba-0001/bench/results.txt deleted file mode 100644 index 698e658ef..000000000 --- a/defects/mgba-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mgba-0001-0001: CWE-407: list-scan inside loop in mgba-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.295ms fixed=0.022ms speedup=103.4x -N=1000 k=1000 : defective=8.668ms fixed=0.045ms speedup=192.1x -N=2000 k=2000 : defective=35.048ms fixed=0.105ms speedup=334.2x - diff --git a/defects/mgba-0001/bench/run_all.py b/defects/mgba-0001/bench/run_all.py deleted file mode 100644 index b69a3c90d..000000000 --- a/defects/mgba-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mgba-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/micronaut-core/Makefile b/defects/micronaut-core/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/micronaut-core/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/micronaut-core/bench/bench-micronaut-core-0001.py b/defects/micronaut-core/bench/bench-micronaut-core-0001.py deleted file mode 100644 index 1cfd0353e..000000000 --- a/defects/micronaut-core/bench/bench-micronaut-core-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-core-0001.py -# CWE-407: list-scan inside loop in micronaut-core-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-core-0001: CWE-407: list-scan inside loop in micronaut-core-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut-core/bench/bench-micronaut-core-0002.py b/defects/micronaut-core/bench/bench-micronaut-core-0002.py deleted file mode 100644 index 5a036eafc..000000000 --- a/defects/micronaut-core/bench/bench-micronaut-core-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-core-0002.py -# CWE-407: list-scan inside loop in micronaut-core-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-core-0002: CWE-407: list-scan inside loop in micronaut-core-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut-core/bench/results.txt b/defects/micronaut-core/bench/results.txt deleted file mode 100644 index e55d6ebe5..000000000 --- a/defects/micronaut-core/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== micronaut-core-0001: CWE-407: list-scan inside loop in micronaut-core-0001 (generic model) === -N=100 k=100 : defective=0.111ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.748ms fixed=0.027ms speedup=103.6x -N=1000 k=1000 : defective=10.067ms fixed=0.126ms speedup=79.8x -N=2000 k=2000 : defective=42.534ms fixed=0.106ms speedup=400.3x - -=== micronaut-core-0002: CWE-407: list-scan inside loop in micronaut-core-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.325ms fixed=0.023ms speedup=101.9x -N=1000 k=1000 : defective=9.654ms fixed=0.050ms speedup=194.9x -N=2000 k=2000 : defective=37.545ms fixed=0.112ms speedup=336.6x - diff --git a/defects/micronaut-core/bench/run_all.py b/defects/micronaut-core/bench/run_all.py deleted file mode 100644 index 29db7174c..000000000 --- a/defects/micronaut-core/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-micronaut-core-0001.py", "bench-micronaut-core-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/micronaut/Makefile b/defects/micronaut/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/micronaut/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/micronaut/bench/bench-micronaut-0001.py b/defects/micronaut/bench/bench-micronaut-0001.py deleted file mode 100644 index 08ba9b521..000000000 --- a/defects/micronaut/bench/bench-micronaut-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0001.py -# ClassUtils — O(H²) hierarchy.contains in resolveHierarchy loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0001: ClassUtils — O(H²) hierarchy.contains in resolveHierarchy loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-0002.py b/defects/micronaut/bench/bench-micronaut-0002.py deleted file mode 100644 index a1be54536..000000000 --- a/defects/micronaut/bench/bench-micronaut-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0002.py -# MutableAnnotationMetadata — O(P×L) annotationList.contains in loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0002: MutableAnnotationMetadata — O(P×L) annotationList.contains in loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-0003.py b/defects/micronaut/bench/bench-micronaut-0003.py deleted file mode 100644 index b945cc078..000000000 --- a/defects/micronaut/bench/bench-micronaut-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0003.py -# EnvironmentPropertySource — O(E×N) includes/excludes.contains in env loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0003: EnvironmentPropertySource — O(E×N) includes/excludes.contains in env loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-0004.py b/defects/micronaut/bench/bench-micronaut-0004.py deleted file mode 100644 index e8b4a9742..000000000 --- a/defects/micronaut/bench/bench-micronaut-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0004.py -# AbstractAnnotationMetadataBuilder.processAnnotation — O(2^D) diamond recursion in meta-annotation traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0004: AbstractAnnotationMetadataBuilder.processAnnotation — O(2^D) diamond recursion in meta-annotation traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-0005.py b/defects/micronaut/bench/bench-micronaut-0005.py deleted file mode 100644 index c88406a6b..000000000 --- a/defects/micronaut/bench/bench-micronaut-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0005.py -# NativeElementsHelper.populateTypeHierarchy — O(2^D) diamond hierarchy re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0005: NativeElementsHelper.populateTypeHierarchy — O(2^D) diamond hierarchy re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-0006.py b/defects/micronaut/bench/bench-micronaut-0006.py deleted file mode 100644 index 7476b412b..000000000 --- a/defects/micronaut/bench/bench-micronaut-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0006.py -# GenericUtils.populateTypeArgumentsForInterfaces — O(2^D) diamond re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0006: GenericUtils.populateTypeArgumentsForInterfaces — O(2^D) diamond re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-0007.py b/defects/micronaut/bench/bench-micronaut-0007.py deleted file mode 100644 index 93c0cde73..000000000 --- a/defects/micronaut/bench/bench-micronaut-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-0007.py -# SuperclassAwareTypeVisitor.getInterfaces — O(2^D) diamond interface re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-0007: SuperclassAwareTypeVisitor.getInterfaces — O(2^D) diamond interface re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-core-0001.py b/defects/micronaut/bench/bench-micronaut-core-0001.py deleted file mode 100644 index 1cfd0353e..000000000 --- a/defects/micronaut/bench/bench-micronaut-core-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-core-0001.py -# CWE-407: list-scan inside loop in micronaut-core-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-core-0001: CWE-407: list-scan inside loop in micronaut-core-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/bench-micronaut-core-0002.py b/defects/micronaut/bench/bench-micronaut-core-0002.py deleted file mode 100644 index 5a036eafc..000000000 --- a/defects/micronaut/bench/bench-micronaut-core-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-micronaut-core-0002.py -# CWE-407: list-scan inside loop in micronaut-core-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== micronaut-core-0002: CWE-407: list-scan inside loop in micronaut-core-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/micronaut/bench/results.txt b/defects/micronaut/bench/results.txt deleted file mode 100644 index d6ef92dc8..000000000 --- a/defects/micronaut/bench/results.txt +++ /dev/null @@ -1,54 +0,0 @@ -=== micronaut-0001: ClassUtils — O(H²) hierarchy.contains in resolveHierarchy loop === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.575ms fixed=0.025ms speedup=103.2x -N=1000 k=1000 : defective=10.162ms fixed=0.095ms speedup=107.0x -N=2000 k=2000 : defective=41.773ms fixed=0.104ms speedup=401.5x - -=== micronaut-0002: MutableAnnotationMetadata — O(P×L) annotationList.contains in loop === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.211ms fixed=0.021ms speedup=107.4x -N=1000 k=1000 : defective=8.920ms fixed=0.046ms speedup=195.6x -N=2000 k=2000 : defective=34.865ms fixed=0.108ms speedup=322.5x - -=== micronaut-0003: EnvironmentPropertySource — O(E×N) includes/excludes.contains in env loop === -N=100 k=100 : defective=0.090ms fixed=0.004ms speedup=23.2x -N=500 k=500 : defective=2.305ms fixed=0.022ms speedup=106.4x -N=1000 k=1000 : defective=8.618ms fixed=0.045ms speedup=192.0x -N=2000 k=2000 : defective=37.340ms fixed=0.108ms speedup=345.5x - -=== micronaut-0004: AbstractAnnotationMetadataBuilder.processAnnotation — O(2^D) diamond recursion in meta-annotation traversal === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=22.9x -N=500 k=500 : defective=2.368ms fixed=0.022ms speedup=105.4x -N=1000 k=1000 : defective=9.470ms fixed=0.047ms speedup=199.7x -N=2000 k=2000 : defective=38.410ms fixed=0.111ms speedup=346.4x - -=== micronaut-0005: NativeElementsHelper.populateTypeHierarchy — O(2^D) diamond hierarchy re-traversal === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.424ms fixed=0.023ms speedup=103.5x -N=1000 k=1000 : defective=9.423ms fixed=0.048ms speedup=195.8x -N=2000 k=2000 : defective=38.809ms fixed=0.101ms speedup=384.8x - -=== micronaut-0006: GenericUtils.populateTypeArgumentsForInterfaces — O(2^D) diamond re-traversal === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.214ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=9.675ms fixed=0.050ms speedup=193.2x -N=2000 k=2000 : defective=42.465ms fixed=0.106ms speedup=400.9x - -=== micronaut-0007: SuperclassAwareTypeVisitor.getInterfaces — O(2^D) diamond interface re-traversal === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.369ms fixed=0.036ms speedup=66.2x -N=1000 k=1000 : defective=22.890ms fixed=0.249ms speedup=92.0x -N=2000 k=2000 : defective=45.978ms fixed=0.110ms speedup=418.2x - -=== micronaut-core-0001: CWE-407: list-scan inside loop in micronaut-core-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.507ms fixed=0.024ms speedup=105.3x -N=1000 k=1000 : defective=10.210ms fixed=0.053ms speedup=192.0x -N=2000 k=2000 : defective=37.369ms fixed=0.098ms speedup=381.6x - -=== micronaut-core-0002: CWE-407: list-scan inside loop in micronaut-core-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.111ms fixed=0.020ms speedup=103.7x -N=1000 k=1000 : defective=9.016ms fixed=0.046ms speedup=198.1x -N=2000 k=2000 : defective=36.066ms fixed=0.098ms speedup=369.0x - diff --git a/defects/micronaut/bench/run_all.py b/defects/micronaut/bench/run_all.py deleted file mode 100644 index 768aed1d7..000000000 --- a/defects/micronaut/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-micronaut-0001.py", "bench-micronaut-0002.py", "bench-micronaut-0003.py", "bench-micronaut-0004.py", "bench-micronaut-0005.py", "bench-micronaut-0006.py", "bench-micronaut-0007.py", "bench-micronaut-core-0001.py", "bench-micronaut-core-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minecraft/Makefile b/defects/minecraft/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minecraft/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minecraft/bench/bench-minecraft-0001.py b/defects/minecraft/bench/bench-minecraft-0001.py deleted file mode 100644 index fc3c0a12f..000000000 --- a/defects/minecraft/bench/bench-minecraft-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minecraft-0001.py -# CWE-407: list-scan inside loop in minecraft-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minecraft-0001: CWE-407: list-scan inside loop in minecraft-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minecraft/bench/bench-minecraft-0002.py b/defects/minecraft/bench/bench-minecraft-0002.py deleted file mode 100644 index cceef6377..000000000 --- a/defects/minecraft/bench/bench-minecraft-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minecraft-0002.py -# CWE-407: list-scan inside loop in minecraft-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minecraft-0002: CWE-407: list-scan inside loop in minecraft-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minecraft/bench/bench-minecraft-0003.py b/defects/minecraft/bench/bench-minecraft-0003.py deleted file mode 100644 index ee4dc6fb1..000000000 --- a/defects/minecraft/bench/bench-minecraft-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minecraft-0003.py -# CWE-407: list-scan inside loop in minecraft-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minecraft-0003: CWE-407: list-scan inside loop in minecraft-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minecraft/bench/bench-minecraft-0004.py b/defects/minecraft/bench/bench-minecraft-0004.py deleted file mode 100644 index 18f0605f5..000000000 --- a/defects/minecraft/bench/bench-minecraft-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minecraft-0004.py -# CWE-407: list-scan inside loop in minecraft-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minecraft-0004: CWE-407: list-scan inside loop in minecraft-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minecraft/bench/results.txt b/defects/minecraft/bench/results.txt deleted file mode 100644 index 61de8f4af..000000000 --- a/defects/minecraft/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== minecraft-0001: CWE-407: list-scan inside loop in minecraft-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.090ms fixed=0.020ms speedup=106.3x -N=1000 k=1000 : defective=8.281ms fixed=0.043ms speedup=190.9x -N=2000 k=2000 : defective=33.844ms fixed=0.098ms speedup=344.2x - -=== minecraft-0002: CWE-407: list-scan inside loop in minecraft-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.122ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.726ms fixed=0.046ms speedup=190.7x -N=2000 k=2000 : defective=33.826ms fixed=0.093ms speedup=364.1x - -=== minecraft-0003: CWE-407: list-scan inside loop in minecraft-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.015ms fixed=0.020ms speedup=102.6x -N=1000 k=1000 : defective=8.315ms fixed=0.044ms speedup=188.0x -N=2000 k=2000 : defective=33.613ms fixed=0.094ms speedup=359.1x - -=== minecraft-0004: CWE-407: list-scan inside loop in minecraft-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.013ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=8.356ms fixed=0.043ms speedup=192.5x -N=2000 k=2000 : defective=33.803ms fixed=0.092ms speedup=367.0x - diff --git a/defects/minecraft/bench/run_all.py b/defects/minecraft/bench/run_all.py deleted file mode 100644 index ca81e3ebf..000000000 --- a/defects/minecraft/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minecraft-0001.py", "bench-minecraft-0002.py", "bench-minecraft-0003.py", "bench-minecraft-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minetest-0001/Makefile b/defects/minetest-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minetest-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minetest-0001/bench/bench-minetest-0001-0001.py b/defects/minetest-0001/bench/bench-minetest-0001-0001.py deleted file mode 100644 index cce1a413f..000000000 --- a/defects/minetest-0001/bench/bench-minetest-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minetest-0001-0001.py -# CWE-407: list-scan inside loop in minetest-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minetest-0001-0001: CWE-407: list-scan inside loop in minetest-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minetest-0001/bench/results.txt b/defects/minetest-0001/bench/results.txt deleted file mode 100644 index 248b511d6..000000000 --- a/defects/minetest-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== minetest-0001-0001: CWE-407: list-scan inside loop in minetest-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.559ms fixed=0.025ms speedup=103.0x -N=1000 k=1000 : defective=10.971ms fixed=0.055ms speedup=199.9x -N=2000 k=2000 : defective=37.029ms fixed=0.096ms speedup=385.9x - diff --git a/defects/minetest-0001/bench/run_all.py b/defects/minetest-0001/bench/run_all.py deleted file mode 100644 index ea7812efa..000000000 --- a/defects/minetest-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minetest-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minetest-0002/Makefile b/defects/minetest-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minetest-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minetest-0002/bench/bench-minetest-0002-0002.py b/defects/minetest-0002/bench/bench-minetest-0002-0002.py deleted file mode 100644 index ef5f21357..000000000 --- a/defects/minetest-0002/bench/bench-minetest-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minetest-0002-0002.py -# CWE-407: list-scan inside loop in minetest-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minetest-0002-0002: CWE-407: list-scan inside loop in minetest-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minetest-0002/bench/results.txt b/defects/minetest-0002/bench/results.txt deleted file mode 100644 index 1157856ba..000000000 --- a/defects/minetest-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== minetest-0002-0002: CWE-407: list-scan inside loop in minetest-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.332ms fixed=0.024ms speedup=99.2x -N=1000 k=1000 : defective=9.997ms fixed=0.051ms speedup=197.8x -N=2000 k=2000 : defective=37.972ms fixed=0.104ms speedup=365.1x - diff --git a/defects/minetest-0002/bench/run_all.py b/defects/minetest-0002/bench/run_all.py deleted file mode 100644 index b0be14c0f..000000000 --- a/defects/minetest-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minetest-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minetest-0003/Makefile b/defects/minetest-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minetest-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minetest-0003/bench/bench-minetest-0003-0003.py b/defects/minetest-0003/bench/bench-minetest-0003-0003.py deleted file mode 100644 index 8bb95a615..000000000 --- a/defects/minetest-0003/bench/bench-minetest-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minetest-0003-0003.py -# CWE-407: list-scan inside loop in minetest-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minetest-0003-0003: CWE-407: list-scan inside loop in minetest-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minetest-0003/bench/results.txt b/defects/minetest-0003/bench/results.txt deleted file mode 100644 index 259457656..000000000 --- a/defects/minetest-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== minetest-0003-0003: CWE-407: list-scan inside loop in minetest-0003-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.017ms speedup=5.5x -N=500 k=500 : defective=2.314ms fixed=0.022ms speedup=103.5x -N=1000 k=1000 : defective=9.432ms fixed=0.049ms speedup=192.0x -N=2000 k=2000 : defective=37.118ms fixed=0.095ms speedup=388.9x - diff --git a/defects/minetest-0003/bench/run_all.py b/defects/minetest-0003/bench/run_all.py deleted file mode 100644 index a9dd6c823..000000000 --- a/defects/minetest-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minetest-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minetest-0004/Makefile b/defects/minetest-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minetest-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minetest-0004/bench/bench-minetest-0004-0004.py b/defects/minetest-0004/bench/bench-minetest-0004-0004.py deleted file mode 100644 index cc901a3d2..000000000 --- a/defects/minetest-0004/bench/bench-minetest-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minetest-0004-0004.py -# CWE-407: list-scan inside loop in minetest-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minetest-0004-0004: CWE-407: list-scan inside loop in minetest-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minetest-0004/bench/results.txt b/defects/minetest-0004/bench/results.txt deleted file mode 100644 index 4df8b5fe0..000000000 --- a/defects/minetest-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== minetest-0004-0004: CWE-407: list-scan inside loop in minetest-0004-0004 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.988ms fixed=0.034ms speedup=86.8x -N=1000 k=1000 : defective=14.659ms fixed=0.075ms speedup=194.5x -N=2000 k=2000 : defective=39.482ms fixed=0.108ms speedup=367.1x - diff --git a/defects/minetest-0004/bench/run_all.py b/defects/minetest-0004/bench/run_all.py deleted file mode 100644 index 4bf45af97..000000000 --- a/defects/minetest-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minetest-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minetest-0005/Makefile b/defects/minetest-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minetest-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minetest-0005/bench/bench-minetest-0005-0005.py b/defects/minetest-0005/bench/bench-minetest-0005-0005.py deleted file mode 100644 index 10263eeab..000000000 --- a/defects/minetest-0005/bench/bench-minetest-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minetest-0005-0005.py -# CWE-407: list-scan inside loop in minetest-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== minetest-0005-0005: CWE-407: list-scan inside loop in minetest-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minetest-0005/bench/results.txt b/defects/minetest-0005/bench/results.txt deleted file mode 100644 index 6ec68bce9..000000000 --- a/defects/minetest-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== minetest-0005-0005: CWE-407: list-scan inside loop in minetest-0005-0005 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.603ms fixed=0.025ms speedup=103.9x -N=1000 k=1000 : defective=11.122ms fixed=0.201ms speedup=55.4x -N=2000 k=2000 : defective=44.307ms fixed=0.110ms speedup=403.1x - diff --git a/defects/minetest-0005/bench/run_all.py b/defects/minetest-0005/bench/run_all.py deleted file mode 100644 index ca68b3cee..000000000 --- a/defects/minetest-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minetest-0005-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/minio/Makefile b/defects/minio/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/minio/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/minio/bench/bench-minio-0001.py b/defects/minio/bench/bench-minio-0001.py deleted file mode 100644 index 7483fca20..000000000 --- a/defects/minio/bench/bench-minio-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minio-0001.py -# healingTracker.isHealed() uses slices.Contains(HealedBuckets, bucket) → O(B×H) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== minio-0001: healingTracker.isHealed() uses slices.Contains(HealedBuckets, bucket) → O(B×H) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minio/bench/bench-minio-0002.py b/defects/minio/bench/bench-minio-0002.py deleted file mode 100644 index 5689c0c9a..000000000 --- a/defects/minio/bench/bench-minio-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minio-0002.py -# isBucketDecommissioned() uses slices.Contains(DecommissionedBuckets, bucket) → O(P×D) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== minio-0002: isBucketDecommissioned() uses slices.Contains(DecommissionedBuckets, bucket) → O(P×D) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minio/bench/bench-minio-0003.py b/defects/minio/bench/bench-minio-0003.py deleted file mode 100644 index c0868e704..000000000 --- a/defects/minio/bench/bench-minio-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-minio-0003.py -# isGroupDescEqual/isUserInfoEqual use slices.Contains in loop → O(M²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== minio-0003: isGroupDescEqual/isUserInfoEqual use slices.Contains in loop → O(M²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/minio/bench/results.txt b/defects/minio/bench/results.txt deleted file mode 100644 index a6b626242..000000000 --- a/defects/minio/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== minio-0001: healingTracker.isHealed() uses slices.Contains(HealedBuckets, bucket) → O(B×H) === -N=500 k=500 : defective=3.382ms fixed=0.033ms speedup=102.6x -N=2000 k=2000 : defective=35.141ms fixed=0.090ms speedup=391.1x -N=5000 k=5000 : defective=222.380ms fixed=0.231ms speedup=961.4x -N=10000 k=10000: defective=905.321ms fixed=0.466ms speedup=1940.9x - -=== minio-0002: isBucketDecommissioned() uses slices.Contains(DecommissionedBuckets, bucket) → O(P×D) === -N=500 k=500 : defective=1.946ms fixed=0.019ms speedup=101.7x -N=2000 k=2000 : defective=34.774ms fixed=0.094ms speedup=371.1x -N=5000 k=5000 : defective=211.920ms fixed=0.225ms speedup=940.8x -N=10000 k=10000: defective=895.486ms fixed=0.474ms speedup=1889.0x - -=== minio-0003: isGroupDescEqual/isUserInfoEqual use slices.Contains in loop → O(M²) === -N=500 k=500 : defective=2.039ms fixed=0.020ms speedup=101.1x -N=2000 k=2000 : defective=33.922ms fixed=0.093ms speedup=366.2x -N=5000 k=5000 : defective=212.604ms fixed=0.240ms speedup=886.6x -N=10000 k=10000: defective=893.662ms fixed=0.453ms speedup=1973.6x - diff --git a/defects/minio/bench/run_all.py b/defects/minio/bench/run_all.py deleted file mode 100644 index 89031866a..000000000 --- a/defects/minio/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-minio-0001.py", "bench-minio-0002.py", "bench-minio-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/moby/Makefile b/defects/moby/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/moby/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/moby/bench/bench-moby-0001.py b/defects/moby/bench/bench-moby-0001.py deleted file mode 100644 index 117b1d5ab..000000000 --- a/defects/moby/bench/bench-moby-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-moby-0001.py -# CWE-407: list-scan inside loop in moby-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== moby-0001: CWE-407: list-scan inside loop in moby-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/moby/bench/bench-moby-0002.py b/defects/moby/bench/bench-moby-0002.py deleted file mode 100644 index e97e90941..000000000 --- a/defects/moby/bench/bench-moby-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-moby-0002.py -# Defect: moby-0002 — NetworkDB.networkNodes []string O(N²) node membership scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== moby-0002: Defect: moby-0002 — NetworkDB.networkNodes []string O(N²) node membership scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/moby/bench/results.txt b/defects/moby/bench/results.txt deleted file mode 100644 index 4ad89652c..000000000 --- a/defects/moby/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== moby-0001: CWE-407: list-scan inside loop in moby-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.371ms fixed=0.023ms speedup=102.9x -N=1000 k=1000 : defective=9.943ms fixed=0.050ms speedup=199.9x -N=2000 k=2000 : defective=37.864ms fixed=0.101ms speedup=375.1x - -=== moby-0002: Defect: moby-0002 — NetworkDB.networkNodes []string O(N²) node membership scan === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.260ms fixed=0.021ms speedup=110.1x -N=1000 k=1000 : defective=8.853ms fixed=0.046ms speedup=193.1x -N=2000 k=2000 : defective=37.230ms fixed=0.095ms speedup=390.7x - diff --git a/defects/moby/bench/run_all.py b/defects/moby/bench/run_all.py deleted file mode 100644 index 6cbbd79e5..000000000 --- a/defects/moby/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-moby-0001.py", "bench-moby-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mongo/Makefile b/defects/mongo/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mongo/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mongo/bench/bench-mongo-0001.py b/defects/mongo/bench/bench-mongo-0001.py deleted file mode 100644 index 1dfa649cd..000000000 --- a/defects/mongo/bench/bench-mongo-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mongo-0001.py -# CWE-407: list-scan inside loop in mongo-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mongo-0001: CWE-407: list-scan inside loop in mongo-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mongo/bench/bench-mongo-0002.py b/defects/mongo/bench/bench-mongo-0002.py deleted file mode 100644 index e8ae1588d..000000000 --- a/defects/mongo/bench/bench-mongo-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mongo-0002.py -# CWE-407: list-scan inside loop in mongo-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mongo-0002: CWE-407: list-scan inside loop in mongo-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mongo/bench/results.txt b/defects/mongo/bench/results.txt deleted file mode 100644 index 37b9a786b..000000000 --- a/defects/mongo/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== mongo-0001: CWE-407: list-scan inside loop in mongo-0001 (generic model) === -N=100 k=100 : defective=0.112ms fixed=0.008ms speedup=14.8x -N=500 k=500 : defective=2.861ms fixed=0.022ms speedup=130.0x -N=1000 k=1000 : defective=10.904ms fixed=0.046ms speedup=235.3x -N=2000 k=2000 : defective=37.261ms fixed=0.096ms speedup=386.2x - -=== mongo-0002: CWE-407: list-scan inside loop in mongo-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.729ms fixed=0.021ms speedup=132.8x -N=1000 k=1000 : defective=9.788ms fixed=0.046ms speedup=214.2x -N=2000 k=2000 : defective=43.169ms fixed=0.112ms speedup=385.4x - diff --git a/defects/mongo/bench/run_all.py b/defects/mongo/bench/run_all.py deleted file mode 100644 index 64fe8cbc9..000000000 --- a/defects/mongo/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mongo-0001.py", "bench-mongo-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mongodb/Makefile b/defects/mongodb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mongodb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mongodb/bench/bench-mongodb-0001.py b/defects/mongodb/bench/bench-mongodb-0001.py deleted file mode 100644 index bd722e75f..000000000 --- a/defects/mongodb/bench/bench-mongodb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mongodb-0001.py -# CWE-407: list-scan inside loop in mongodb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mongodb-0001: CWE-407: list-scan inside loop in mongodb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mongodb/bench/bench-mongodb-0008.py b/defects/mongodb/bench/bench-mongodb-0008.py deleted file mode 100644 index 58ad2cd24..000000000 --- a/defects/mongodb/bench/bench-mongodb-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mongodb-0008.py -# mongodb-0002: TagSet.containsAll ArrayList O(D²) per server-selection call -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mongodb-0008: mongodb-0002: TagSet.containsAll ArrayList O(D²) per server-selection call ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mongodb/bench/results.txt b/defects/mongodb/bench/results.txt deleted file mode 100644 index ea9b5bdb9..000000000 --- a/defects/mongodb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== mongodb-0001: CWE-407: list-scan inside loop in mongodb-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.495ms fixed=0.023ms speedup=109.7x -N=1000 k=1000 : defective=9.742ms fixed=0.046ms speedup=211.4x -N=2000 k=2000 : defective=37.412ms fixed=0.099ms speedup=377.8x - -=== mongodb-0008: mongodb-0002: TagSet.containsAll ArrayList O(D²) per server-selection call === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=102.6x -N=1000 k=1000 : defective=8.941ms fixed=0.045ms speedup=199.4x -N=2000 k=2000 : defective=35.873ms fixed=0.097ms speedup=371.1x - diff --git a/defects/mongodb/bench/run_all.py b/defects/mongodb/bench/run_all.py deleted file mode 100644 index 199aaa8c4..000000000 --- a/defects/mongodb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mongodb-0001.py", "bench-mongodb-0008.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/monogame-0001/Makefile b/defects/monogame-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/monogame-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/monogame-0001/bench/bench-monogame-0001-0001.py b/defects/monogame-0001/bench/bench-monogame-0001-0001.py deleted file mode 100644 index 1ac3be317..000000000 --- a/defects/monogame-0001/bench/bench-monogame-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-monogame-0001-0001.py -# CWE-407: list-scan inside loop in monogame-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== monogame-0001-0001: CWE-407: list-scan inside loop in monogame-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/monogame-0001/bench/results.txt b/defects/monogame-0001/bench/results.txt deleted file mode 100644 index 4d7d25054..000000000 --- a/defects/monogame-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== monogame-0001-0001: CWE-407: list-scan inside loop in monogame-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.575ms fixed=0.024ms speedup=107.3x -N=1000 k=1000 : defective=9.098ms fixed=0.045ms speedup=201.5x -N=2000 k=2000 : defective=36.884ms fixed=0.101ms speedup=364.8x - diff --git a/defects/monogame-0001/bench/run_all.py b/defects/monogame-0001/bench/run_all.py deleted file mode 100644 index ad6f527f7..000000000 --- a/defects/monogame-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-monogame-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/monogame-0002/Makefile b/defects/monogame-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/monogame-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/monogame-0002/bench/bench-monogame-0002-0002.py b/defects/monogame-0002/bench/bench-monogame-0002-0002.py deleted file mode 100644 index 8fcba07ae..000000000 --- a/defects/monogame-0002/bench/bench-monogame-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-monogame-0002-0002.py -# CWE-407: list-scan inside loop in monogame-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== monogame-0002-0002: CWE-407: list-scan inside loop in monogame-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/monogame-0002/bench/results.txt b/defects/monogame-0002/bench/results.txt deleted file mode 100644 index 0dac6953e..000000000 --- a/defects/monogame-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== monogame-0002-0002: CWE-407: list-scan inside loop in monogame-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.279ms fixed=0.023ms speedup=100.9x -N=1000 k=1000 : defective=8.893ms fixed=0.045ms speedup=197.0x -N=2000 k=2000 : defective=35.916ms fixed=0.096ms speedup=372.8x - diff --git a/defects/monogame-0002/bench/run_all.py b/defects/monogame-0002/bench/run_all.py deleted file mode 100644 index 7a8827e05..000000000 --- a/defects/monogame-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-monogame-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/monogame-0003/Makefile b/defects/monogame-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/monogame-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/monogame-0003/bench/bench-monogame-0003-0003.py b/defects/monogame-0003/bench/bench-monogame-0003-0003.py deleted file mode 100644 index 332ee5037..000000000 --- a/defects/monogame-0003/bench/bench-monogame-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-monogame-0003-0003.py -# CWE-407: list-scan inside loop in monogame-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== monogame-0003-0003: CWE-407: list-scan inside loop in monogame-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/monogame-0003/bench/results.txt b/defects/monogame-0003/bench/results.txt deleted file mode 100644 index b763de854..000000000 --- a/defects/monogame-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== monogame-0003-0003: CWE-407: list-scan inside loop in monogame-0003-0003 (generic model) === -N=100 k=100 : defective=0.267ms fixed=0.016ms speedup=16.9x -N=500 k=500 : defective=2.365ms fixed=0.022ms speedup=109.9x -N=1000 k=1000 : defective=9.170ms fixed=0.047ms speedup=197.0x -N=2000 k=2000 : defective=35.913ms fixed=0.097ms speedup=371.1x - diff --git a/defects/monogame-0003/bench/run_all.py b/defects/monogame-0003/bench/run_all.py deleted file mode 100644 index c27c90f20..000000000 --- a/defects/monogame-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-monogame-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mpich/Makefile b/defects/mpich/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mpich/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mpich/bench/bench-mpich-0001.py b/defects/mpich/bench/bench-mpich-0001.py deleted file mode 100644 index 2abcbd9da..000000000 --- a/defects/mpich/bench/bench-mpich-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mpich-0001.py -# CWE-407: list-scan inside loop in mpich-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== mpich-0001: CWE-407: list-scan inside loop in mpich-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mpich/bench/results.txt b/defects/mpich/bench/results.txt deleted file mode 100644 index c3d4adb96..000000000 --- a/defects/mpich/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mpich-0001: CWE-407: list-scan inside loop in mpich-0001 (generic model) === -N=500 k=500 : defective=1.932ms fixed=0.019ms speedup=100.8x -N=2000 k=2000 : defective=31.885ms fixed=0.090ms speedup=353.1x -N=5000 k=5000 : defective=232.866ms fixed=0.227ms speedup=1027.1x -N=10000 k=10000: defective=848.279ms fixed=0.470ms speedup=1804.1x - diff --git a/defects/mpich/bench/run_all.py b/defects/mpich/bench/run_all.py deleted file mode 100644 index 722f68c10..000000000 --- a/defects/mpich/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mpich-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mupen64plus-0001/Makefile b/defects/mupen64plus-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mupen64plus-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mupen64plus-0001/bench/bench-mupen64plus-0001-0001.py b/defects/mupen64plus-0001/bench/bench-mupen64plus-0001-0001.py deleted file mode 100644 index 7413d640e..000000000 --- a/defects/mupen64plus-0001/bench/bench-mupen64plus-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mupen64plus-0001-0001.py -# CWE-407: list-scan inside loop in mupen64plus-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mupen64plus-0001-0001: CWE-407: list-scan inside loop in mupen64plus-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mupen64plus-0001/bench/results.txt b/defects/mupen64plus-0001/bench/results.txt deleted file mode 100644 index 24b3d6b8d..000000000 --- a/defects/mupen64plus-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mupen64plus-0001-0001: CWE-407: list-scan inside loop in mupen64plus-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.209ms fixed=0.022ms speedup=101.7x -N=1000 k=1000 : defective=9.233ms fixed=0.048ms speedup=191.9x -N=2000 k=2000 : defective=35.042ms fixed=0.096ms speedup=364.6x - diff --git a/defects/mupen64plus-0001/bench/run_all.py b/defects/mupen64plus-0001/bench/run_all.py deleted file mode 100644 index 5cdc97c4c..000000000 --- a/defects/mupen64plus-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mupen64plus-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/musescore-0001/Makefile b/defects/musescore-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/musescore-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/musescore-0001/bench/bench-musescore-0001-0001.py b/defects/musescore-0001/bench/bench-musescore-0001-0001.py deleted file mode 100644 index 12318febf..000000000 --- a/defects/musescore-0001/bench/bench-musescore-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-musescore-0001-0001.py -# CWE-407: list-scan inside loop in musescore-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== musescore-0001-0001: CWE-407: list-scan inside loop in musescore-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/musescore-0001/bench/results.txt b/defects/musescore-0001/bench/results.txt deleted file mode 100644 index d12f21277..000000000 --- a/defects/musescore-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== musescore-0001-0001: CWE-407: list-scan inside loop in musescore-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.447ms fixed=0.024ms speedup=101.9x -N=1000 k=1000 : defective=11.635ms fixed=0.053ms speedup=218.7x -N=2000 k=2000 : defective=36.917ms fixed=0.096ms speedup=385.3x - diff --git a/defects/musescore-0001/bench/run_all.py b/defects/musescore-0001/bench/run_all.py deleted file mode 100644 index 53e68c47e..000000000 --- a/defects/musescore-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-musescore-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/musescore-0002/Makefile b/defects/musescore-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/musescore-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/musescore-0002/bench/bench-musescore-0002-0002.py b/defects/musescore-0002/bench/bench-musescore-0002-0002.py deleted file mode 100644 index 9eb16bed0..000000000 --- a/defects/musescore-0002/bench/bench-musescore-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-musescore-0002-0002.py -# CWE-407: list-scan inside loop in musescore-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== musescore-0002-0002: CWE-407: list-scan inside loop in musescore-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/musescore-0002/bench/results.txt b/defects/musescore-0002/bench/results.txt deleted file mode 100644 index b520ed3bb..000000000 --- a/defects/musescore-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== musescore-0002-0002: CWE-407: list-scan inside loop in musescore-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.361ms fixed=0.022ms speedup=105.3x -N=1000 k=1000 : defective=9.663ms fixed=0.051ms speedup=189.7x -N=2000 k=2000 : defective=35.421ms fixed=0.095ms speedup=371.4x - diff --git a/defects/musescore-0002/bench/run_all.py b/defects/musescore-0002/bench/run_all.py deleted file mode 100644 index d612beee5..000000000 --- a/defects/musescore-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-musescore-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mybatis/Makefile b/defects/mybatis/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mybatis/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mybatis/bench/bench-mybatis-0001.py b/defects/mybatis/bench/bench-mybatis-0001.py deleted file mode 100644 index 2c09adb2c..000000000 --- a/defects/mybatis/bench/bench-mybatis-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mybatis-0001.py -# CWE-407: list-scan inside loop in mybatis-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mybatis-0001: CWE-407: list-scan inside loop in mybatis-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mybatis/bench/results.txt b/defects/mybatis/bench/results.txt deleted file mode 100644 index 9a71a797b..000000000 --- a/defects/mybatis/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== mybatis-0001: CWE-407: list-scan inside loop in mybatis-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.127ms fixed=0.022ms speedup=96.6x -N=1000 k=1000 : defective=8.934ms fixed=0.084ms speedup=106.0x -N=2000 k=2000 : defective=35.746ms fixed=0.096ms speedup=371.7x - diff --git a/defects/mybatis/bench/run_all.py b/defects/mybatis/bench/run_all.py deleted file mode 100644 index 16b3d430d..000000000 --- a/defects/mybatis/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mybatis-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/mysql/Makefile b/defects/mysql/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/mysql/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/mysql/bench/bench-mysql-0001.py b/defects/mysql/bench/bench-mysql-0001.py deleted file mode 100644 index 563d5d8d0..000000000 --- a/defects/mysql/bench/bench-mysql-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mysql-0001.py -# CWE-407: list-scan inside loop in mysql-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mysql-0001: CWE-407: list-scan inside loop in mysql-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mysql/bench/bench-mysql-0002.py b/defects/mysql/bench/bench-mysql-0002.py deleted file mode 100644 index 1d49a60cb..000000000 --- a/defects/mysql/bench/bench-mysql-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mysql-0002.py -# CWE-407: list-scan inside loop in mysql-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mysql-0002: CWE-407: list-scan inside loop in mysql-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mysql/bench/bench-mysql-0003.py b/defects/mysql/bench/bench-mysql-0003.py deleted file mode 100644 index e82beafd3..000000000 --- a/defects/mysql/bench/bench-mysql-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mysql-0003.py -# CWE-407: list-scan inside loop in mysql-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mysql-0003: CWE-407: list-scan inside loop in mysql-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mysql/bench/bench-mysql-0004.py b/defects/mysql/bench/bench-mysql-0004.py deleted file mode 100644 index 85b71bc7f..000000000 --- a/defects/mysql/bench/bench-mysql-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mysql-0004.py -# CWE-407: list-scan inside loop in mysql-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mysql-0004: CWE-407: list-scan inside loop in mysql-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mysql/bench/bench-mysql-0005.py b/defects/mysql/bench/bench-mysql-0005.py deleted file mode 100644 index 111a511d6..000000000 --- a/defects/mysql/bench/bench-mysql-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-mysql-0005.py -# Severity: HIGH (hot query execution path — every secondary index covering scan) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== mysql-0005: Severity: HIGH (hot query execution path — every secondary index covering scan) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/mysql/bench/results.txt b/defects/mysql/bench/results.txt deleted file mode 100644 index 93841b927..000000000 --- a/defects/mysql/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== mysql-0001: CWE-407: list-scan inside loop in mysql-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.109ms fixed=0.020ms speedup=103.2x -N=1000 k=1000 : defective=8.680ms fixed=0.046ms speedup=187.7x -N=2000 k=2000 : defective=35.459ms fixed=0.096ms speedup=369.0x - -=== mysql-0002: CWE-407: list-scan inside loop in mysql-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.123ms fixed=0.021ms speedup=100.6x -N=1000 k=1000 : defective=8.780ms fixed=0.046ms speedup=189.7x -N=2000 k=2000 : defective=33.574ms fixed=0.093ms speedup=362.0x - -=== mysql-0003: CWE-407: list-scan inside loop in mysql-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.012ms fixed=0.020ms speedup=102.6x -N=1000 k=1000 : defective=8.254ms fixed=0.043ms speedup=190.7x -N=2000 k=2000 : defective=33.611ms fixed=0.094ms speedup=359.4x - -=== mysql-0004: CWE-407: list-scan inside loop in mysql-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.030ms fixed=0.020ms speedup=102.3x -N=1000 k=1000 : defective=8.731ms fixed=0.046ms speedup=191.8x -N=2000 k=2000 : defective=34.490ms fixed=0.100ms speedup=344.8x - -=== mysql-0005: Severity: HIGH (hot query execution path — every secondary index covering scan) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.024ms fixed=0.019ms speedup=104.0x -N=1000 k=1000 : defective=8.347ms fixed=0.044ms speedup=189.4x -N=2000 k=2000 : defective=33.906ms fixed=0.091ms speedup=372.9x - diff --git a/defects/mysql/bench/run_all.py b/defects/mysql/bench/run_all.py deleted file mode 100644 index 0fcd109a8..000000000 --- a/defects/mysql/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-mysql-0001.py", "bench-mysql-0002.py", "bench-mysql-0003.py", "bench-mysql-0004.py", "bench-mysql-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/naev-0001/Makefile b/defects/naev-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/naev-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/naev-0001/bench/bench-naev-0001-0001.py b/defects/naev-0001/bench/bench-naev-0001-0001.py deleted file mode 100644 index 45863bfc8..000000000 --- a/defects/naev-0001/bench/bench-naev-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-naev-0001-0001.py -# CWE-407: list-scan inside loop in naev-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== naev-0001-0001: CWE-407: list-scan inside loop in naev-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/naev-0001/bench/results.txt b/defects/naev-0001/bench/results.txt deleted file mode 100644 index dccc6fa26..000000000 --- a/defects/naev-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== naev-0001-0001: CWE-407: list-scan inside loop in naev-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.159ms fixed=0.021ms speedup=104.9x -N=1000 k=1000 : defective=8.825ms fixed=0.048ms speedup=184.6x -N=2000 k=2000 : defective=35.375ms fixed=0.098ms speedup=361.4x - diff --git a/defects/naev-0001/bench/run_all.py b/defects/naev-0001/bench/run_all.py deleted file mode 100644 index 316522178..000000000 --- a/defects/naev-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-naev-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/naev-0002/Makefile b/defects/naev-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/naev-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/naev-0002/bench/bench-naev-0002-0002.py b/defects/naev-0002/bench/bench-naev-0002-0002.py deleted file mode 100644 index 4e5688e14..000000000 --- a/defects/naev-0002/bench/bench-naev-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-naev-0002-0002.py -# CWE-407: list-scan inside loop in naev-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== naev-0002-0002: CWE-407: list-scan inside loop in naev-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/naev-0002/bench/results.txt b/defects/naev-0002/bench/results.txt deleted file mode 100644 index 8cd21a263..000000000 --- a/defects/naev-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== naev-0002-0002: CWE-407: list-scan inside loop in naev-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.140ms fixed=0.020ms speedup=105.8x -N=1000 k=1000 : defective=8.755ms fixed=0.045ms speedup=194.5x -N=2000 k=2000 : defective=36.505ms fixed=0.099ms speedup=368.7x - diff --git a/defects/naev-0002/bench/run_all.py b/defects/naev-0002/bench/run_all.py deleted file mode 100644 index e5e6cf30e..000000000 --- a/defects/naev-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-naev-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nagioscore-0001/Makefile b/defects/nagioscore-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nagioscore-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nagioscore-0001/bench/bench-nagioscore-0001-0001.py b/defects/nagioscore-0001/bench/bench-nagioscore-0001-0001.py deleted file mode 100644 index 6525ba625..000000000 --- a/defects/nagioscore-0001/bench/bench-nagioscore-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nagioscore-0001-0001.py -# CWE-407: list-scan inside loop in nagioscore-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nagioscore-0001-0001: CWE-407: list-scan inside loop in nagioscore-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nagioscore-0001/bench/results.txt b/defects/nagioscore-0001/bench/results.txt deleted file mode 100644 index 3a7c1c6aa..000000000 --- a/defects/nagioscore-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nagioscore-0001-0001: CWE-407: list-scan inside loop in nagioscore-0001-0001 (generic model) === -N=100 k=100 : defective=0.164ms fixed=0.004ms speedup=44.8x -N=500 k=500 : defective=2.375ms fixed=0.022ms speedup=105.9x -N=1000 k=1000 : defective=9.964ms fixed=0.050ms speedup=198.4x -N=2000 k=2000 : defective=37.286ms fixed=0.097ms speedup=383.0x - diff --git a/defects/nagioscore-0001/bench/run_all.py b/defects/nagioscore-0001/bench/run_all.py deleted file mode 100644 index 5374b5797..000000000 --- a/defects/nagioscore-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nagioscore-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nagioscore-0002/Makefile b/defects/nagioscore-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nagioscore-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nagioscore-0002/bench/bench-nagioscore-0002-0002.py b/defects/nagioscore-0002/bench/bench-nagioscore-0002-0002.py deleted file mode 100644 index 9e0e5dbb5..000000000 --- a/defects/nagioscore-0002/bench/bench-nagioscore-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nagioscore-0002-0002.py -# CWE-407: list-scan inside loop in nagioscore-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nagioscore-0002-0002: CWE-407: list-scan inside loop in nagioscore-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nagioscore-0002/bench/results.txt b/defects/nagioscore-0002/bench/results.txt deleted file mode 100644 index 495cb469a..000000000 --- a/defects/nagioscore-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nagioscore-0002-0002: CWE-407: list-scan inside loop in nagioscore-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.382ms fixed=0.023ms speedup=102.0x -N=1000 k=1000 : defective=9.432ms fixed=0.045ms speedup=209.9x -N=2000 k=2000 : defective=41.016ms fixed=0.101ms speedup=405.9x - diff --git a/defects/nagioscore-0002/bench/run_all.py b/defects/nagioscore-0002/bench/run_all.py deleted file mode 100644 index 31c363a8e..000000000 --- a/defects/nagioscore-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nagioscore-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nakama/patch/nakama-0001-social-oauth-token-debug-log-leak.patch b/defects/nakama/patch/nakama-0001-social-oauth-token-debug-log-leak.patch deleted file mode 100644 index 5e3758c04..000000000 --- a/defects/nakama/patch/nakama-0001-social-oauth-token-debug-log-leak.patch +++ /dev/null @@ -1,133 +0,0 @@ -# UNDF: UNDF-2026-000001309 -# CWE-532 / MOAD-0004: A Logged Secret — nakama social.go logs raw OAuth -# access tokens, ID tokens, Steam -# publisher keys, and Game Center -# signatures at debug level -# -# Defect: social/social.go has 11 debug-level zap.Field call sites that -# include third-party authentication SECRETS as full string/object values: -# -# L235 Debug("Getting Facebook profile", zap.String("token", accessToken)) -# L250 Debug("Getting Facebook friends", zap.String("token", accessToken)) -# L290 Debug("Extracting Facebook Instant Game ID", -# zap.String("signedPlayerInfo", signedPlayerInfo)) -# L353 Debug("Checking Google ID", zap.String("idToken", idToken)) -# L435 Debug("Failed to exchange ...", zap.String("auth_token", idToken), ...) -# L439 Debug("Exchanged an authorization ...", zap.Any("token", t), ...) -# L443 Debug("Failed to request player info.", zap.Any("token", t), ...) -# L448 Debug("Failed to parse playerId.", zap.Any("token", t), ...) -# L452 Debug("Obtained the player profile ...",zap.Any("token", t), ..., zap.Any("player", profile)) -# L630 Debug("Getting Steam profile", zap.String("publisherKey", publisherKey), -# ..., zap.String("ticket", ticket)) -# -# Game-server operators run nakama with debug logging enabled in -# development and frequently leave it on in production. Log files routed -# to centralized aggregators (ELK, Datadog, Loki) inherit the leaked -# tokens and become a credential exfiltration target. -# -# Real-world impact: -# - Facebook accessToken (L235, L250): full Graph API access for the user -# - Google idToken (L353, L435): user identity assertion, can be reused -# - oauth2.Token object t (L439, L443, L448, L452): contains AccessToken -# AND RefreshToken — refresh token grants long-lived backend access -# - Steam publisherKey (L630): the SERVER's Steam web API key — -# compromise gives full access to the developer's Steam app -# - Game Center signature (L578) and signedPlayerInfo (L290): per-player -# authenticator strings; useful for replay attacks -# -# Fix: replace value logging with shape logging — log the FACT that we -# had a token (and its length) without logging the bytes. Apache log4j2 -# guidance is the same pattern. This preserves debug value (can confirm -# whether the call site received any token) without leaking secrets. -# -# Before: zap.String("token", accessToken) -# After: zap.Int("token_len", len(accessToken)) -# -# Before: zap.Any("token", t) // t is *oauth2.Token -# After: zap.Bool("has_token", t != nil) -# (token presence is enough for debug; AccessToken value never -# belongs in logs) -# -# For Steam publisherKey + ticket, the right fix is to redact entirely; -# neither presence nor length is a useful debug signal here, both are -# secrets that should never appear in log records. Replace with the -# non-secret fields already in scope (appID, errorDescription). ---- a/social/social.go -+++ b/social/social.go -@@ -232,7 +232,7 @@ func (c *Client) GetFacebookProfile(ctx context.Context, accessToken string) (*F - FirstName string `json:"first_name"` - LastName string `json:"last_name"` - }{} -- c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken)) -+ c.logger.Debug("Getting Facebook profile", zap.Int("token_len", len(accessToken))) - if err := c.request(ctx, "facebook profile", path, nil, &profile); err != nil { - return nil, err - } -@@ -247,7 +247,7 @@ func (c *Client) GetFacebookFriends(ctx context.Context, accessToken string) ([] - Data []friend `json:"data"` - }{} - path := "https://graph.facebook.com/v17.0/me/friends?access_token=" + url.QueryEscape(accessToken) -- c.logger.Debug("Getting Facebook friends", zap.String("token", accessToken)) -+ c.logger.Debug("Getting Facebook friends", zap.Int("token_len", len(accessToken))) - if err := c.request(ctx, "facebook friends", path, nil, &friends); err != nil { - return nil, err - } -@@ -287,7 +287,7 @@ func (c *Client) ExtractFacebookInstantGameID(signedPlayerInfo string) (string, - ExpiresIn int64 `json:"expires_in"` - PlayerId string `json:"player_id"` - }{} -- c.logger.Debug("Extracting Facebook Instant Game ID", zap.String("signedPlayerInfo", signedPlayerInfo)) -+ c.logger.Debug("Extracting Facebook Instant Game ID", zap.Int("signedPlayerInfo_len", len(signedPlayerInfo))) - parts := strings.Split(signedPlayerInfo, ".") - if len(parts) != 2 { - return "", errors.New("invalid signedPlayerInfo") -@@ -350,7 +350,7 @@ func (c *Client) CheckGoogleToken(ctx context.Context, idToken string) (*GoogleP - // Validate the token via Google's API. - var token *GoogleClaims - var err error -- c.logger.Debug("Checking Google ID", zap.String("idToken", idToken)) -+ c.logger.Debug("Checking Google ID", zap.Int("idToken_len", len(idToken))) - for _, key := range c.googleCerts { - token, err = c.parseGoogleIDToken(idToken, key) - if err == nil { -@@ -432,21 +432,21 @@ func (c *Client) CheckGoogleToken(ctx context.Context, idToken string) (*GoogleP - // The id provided could be from the new auth flow. Let's exchange it for a token. - t, err := c.exchangeGoogleAuthCode(ctx, idToken) - if err != nil { -- c.logger.Debug("Failed to exchange an authorization code for an access token.", zap.String("auth_token", idToken), zap.Error(err)) -+ c.logger.Debug("Failed to exchange an authorization code for an access token.", zap.Int("auth_token_len", len(idToken)), zap.Error(err)) - return nil, errors.New("google id token invalid") - } - -- c.logger.Debug("Exchanged an authorization code for an access token.", zap.Any("token", t), zap.Error(err)) -+ c.logger.Debug("Exchanged an authorization code for an access token.", zap.Bool("has_token", t != nil), zap.Error(err)) - - profile := GooglePlayServiceProfile{} - if err := c.request(ctx, "google play services", "https://www.googleapis.com/games/v1/players/me?access_token="+url.QueryEscape(t.AccessToken), nil, &profile); err != nil { -- c.logger.Debug("Failed to request player info.", zap.Any("token", t), zap.Error(err)) -+ c.logger.Debug("Failed to request player info.", zap.Bool("has_token", t != nil), zap.Error(err)) - return nil, errors.New("failed to request player info.") - } - - if profile.PlayerId == "" { -- c.logger.Debug("Failed to parse playerId.", zap.Any("token", t), zap.Error(err)) -+ c.logger.Debug("Failed to parse playerId.", zap.Bool("has_token", t != nil), zap.Error(err)) - return nil, errors.New("player_id cannot be an empty string.") - } - -- c.logger.Debug("Obtained the player profile using an access token.", zap.Any("token", t), zap.Error(err), zap.Any("player", profile)) -+ c.logger.Debug("Obtained the player profile using an access token.", zap.Bool("has_token", t != nil), zap.Error(err), zap.Any("player", profile)) - return &profile, nil - } - -@@ -627,7 +627,7 @@ func (c *Client) GetSteamProfile(ctx context.Context, publisherKey string, appID - Players []SteamProfile `json:"players"` - } `json:"response"` - }{} -- c.logger.Debug("Getting Steam profile", zap.String("publisherKey", publisherKey), zap.Int("appID", appID), zap.String("ticket", ticket)) -+ // publisherKey and ticket are secrets — the developer's Steam web API key -+ // and the per-player session ticket. Log only the non-secret context. -+ c.logger.Debug("Getting Steam profile", zap.Int("appID", appID), zap.Int("publisherKey_len", len(publisherKey)), zap.Int("ticket_len", len(ticket))) - if err := c.request(ctx, "steam profile", "https://partner.steam-api.com/ISteamUserAuth/AuthenticateUserTicket/v1/?key="+url.QueryEscape(publisherKey)+"&appid="+strconv.Itoa(appID)+"&ticket="+url.QueryEscape(ticket), nil, &profileWrapper); err != nil { - return nil, err - } diff --git a/defects/natron/Makefile b/defects/natron/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/natron/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/natron/bench/bench-natron-0001.py b/defects/natron/bench/bench-natron-0001.py deleted file mode 100644 index 64bd92a12..000000000 --- a/defects/natron/bench/bench-natron-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-natron-0001.py -# File: Engine/Node.cpp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== natron-0001: File: Engine/Node.cpp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/natron/bench/results.txt b/defects/natron/bench/results.txt deleted file mode 100644 index 7e727d3c0..000000000 --- a/defects/natron/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== natron-0001: File: Engine/Node.cpp === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.295ms fixed=0.022ms speedup=102.5x -N=1000 k=1000 : defective=9.622ms fixed=0.050ms speedup=191.8x -N=2000 k=2000 : defective=36.748ms fixed=0.096ms speedup=383.9x - diff --git a/defects/natron/bench/run_all.py b/defects/natron/bench/run_all.py deleted file mode 100644 index e67a96ce7..000000000 --- a/defects/natron/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-natron-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nats-server/Makefile b/defects/nats-server/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nats-server/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nats-server/bench/bench-nats-server-0001.py b/defects/nats-server/bench/bench-nats-server-0001.py deleted file mode 100644 index 6a4f50f5b..000000000 --- a/defects/nats-server/bench/bench-nats-server-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nats-server-0001.py -# CWE-407: list-scan inside loop in nats-server-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nats-server-0001: CWE-407: list-scan inside loop in nats-server-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nats-server/bench/bench-nats-server-0002.py b/defects/nats-server/bench/bench-nats-server-0002.py deleted file mode 100644 index d24c4128a..000000000 --- a/defects/nats-server/bench/bench-nats-server-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nats-server-0002.py -# CWE-407: list-scan inside loop in nats-server-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nats-server-0002: CWE-407: list-scan inside loop in nats-server-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nats-server/bench/results.txt b/defects/nats-server/bench/results.txt deleted file mode 100644 index 24607386a..000000000 --- a/defects/nats-server/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== nats-server-0001: CWE-407: list-scan inside loop in nats-server-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=2.310ms fixed=0.023ms speedup=102.0x -N=1000 k=1000 : defective=9.772ms fixed=0.050ms speedup=194.0x -N=2000 k=2000 : defective=39.799ms fixed=0.098ms speedup=406.4x - -=== nats-server-0002: CWE-407: list-scan inside loop in nats-server-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.167ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=8.859ms fixed=0.046ms speedup=193.6x -N=2000 k=2000 : defective=35.843ms fixed=0.095ms speedup=375.7x - diff --git a/defects/nats-server/bench/run_all.py b/defects/nats-server/bench/run_all.py deleted file mode 100644 index 26ca1586b..000000000 --- a/defects/nats-server/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nats-server-0001.py", "bench-nats-server-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nats/Makefile b/defects/nats/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nats/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nats/bench/bench-nats-0001.py b/defects/nats/bench/bench-nats-0001.py deleted file mode 100644 index f48dcfdc4..000000000 --- a/defects/nats/bench/bench-nats-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nats-0001.py -# CWE-407: list-scan inside loop in nats-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nats-0001: CWE-407: list-scan inside loop in nats-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nats/bench/bench-nats-server-0001.py b/defects/nats/bench/bench-nats-server-0001.py deleted file mode 100644 index 6a4f50f5b..000000000 --- a/defects/nats/bench/bench-nats-server-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nats-server-0001.py -# CWE-407: list-scan inside loop in nats-server-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nats-server-0001: CWE-407: list-scan inside loop in nats-server-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nats/bench/bench-nats-server-0002.py b/defects/nats/bench/bench-nats-server-0002.py deleted file mode 100644 index d24c4128a..000000000 --- a/defects/nats/bench/bench-nats-server-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nats-server-0002.py -# CWE-407: list-scan inside loop in nats-server-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nats-server-0002: CWE-407: list-scan inside loop in nats-server-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nats/bench/results.txt b/defects/nats/bench/results.txt deleted file mode 100644 index 7c42c101c..000000000 --- a/defects/nats/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== nats-0001: CWE-407: list-scan inside loop in nats-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=3.193ms fixed=0.038ms speedup=83.7x -N=1000 k=1000 : defective=12.398ms fixed=0.059ms speedup=210.5x -N=2000 k=2000 : defective=46.886ms fixed=0.113ms speedup=415.3x - -=== nats-server-0001: CWE-407: list-scan inside loop in nats-server-0001 (generic model) === -N=100 k=100 : defective=0.252ms fixed=0.004ms speedup=65.0x -N=500 k=500 : defective=3.684ms fixed=0.042ms speedup=87.8x -N=1000 k=1000 : defective=11.378ms fixed=0.054ms speedup=211.4x -N=2000 k=2000 : defective=57.101ms fixed=0.173ms speedup=330.5x - -=== nats-server-0002: CWE-407: list-scan inside loop in nats-server-0002 (generic model) === -N=100 k=100 : defective=0.149ms fixed=0.006ms speedup=24.3x -N=500 k=500 : defective=2.590ms fixed=0.024ms speedup=107.2x -N=1000 k=1000 : defective=11.044ms fixed=0.049ms speedup=223.9x -N=2000 k=2000 : defective=47.968ms fixed=0.103ms speedup=464.6x - diff --git a/defects/nats/bench/run_all.py b/defects/nats/bench/run_all.py deleted file mode 100644 index 28fa82c6f..000000000 --- a/defects/nats/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nats-0001.py", "bench-nats-server-0001.py", "bench-nats-server-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/neo4j/Makefile b/defects/neo4j/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/neo4j/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/neo4j/bench/bench-neo4j-0001.py b/defects/neo4j/bench/bench-neo4j-0001.py deleted file mode 100644 index d55c5c544..000000000 --- a/defects/neo4j/bench/bench-neo4j-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-neo4j-0001.py -# Dijkstra predecessors List.contains() — O(E×P) in all-shortest-paths mode -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== neo4j-0001: Dijkstra predecessors List.contains() — O(E×P) in all-shortest-paths mode ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/neo4j/bench/results.txt b/defects/neo4j/bench/results.txt deleted file mode 100644 index 8e90d987a..000000000 --- a/defects/neo4j/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== neo4j-0001: Dijkstra predecessors List.contains() — O(E×P) in all-shortest-paths mode === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.335ms fixed=0.024ms speedup=98.8x -N=1000 k=1000 : defective=10.974ms fixed=0.049ms speedup=222.2x -N=2000 k=2000 : defective=34.745ms fixed=0.096ms speedup=361.4x - diff --git a/defects/neo4j/bench/run_all.py b/defects/neo4j/bench/run_all.py deleted file mode 100644 index 2bb0f169c..000000000 --- a/defects/neo4j/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-neo4j-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/neo4j/unit/TestNeo4jExplore.java b/defects/neo4j/unit/TestNeo4jExplore.java deleted file mode 100644 index 0d183c738..000000000 --- a/defects/neo4j/unit/TestNeo4jExplore.java +++ /dev/null @@ -1,97 +0,0 @@ -import java.util.regex.*; -import java.util.concurrent.*; - -public class TestNeo4jExplore { - static long timedMatch(Pattern p, String s, long timeoutMs) { - ExecutorService exec = Executors.newSingleThreadExecutor(); - long start = System.nanoTime(); - Future f = exec.submit(() -> p.matcher(s).matches()); - try { - f.get(timeoutMs, TimeUnit.MILLISECONDS); - return (System.nanoTime() - start) / 1_000_000; - } catch (TimeoutException e) { - f.cancel(true); - return -1; - } catch (Exception e) { - return -2; - } finally { - exec.shutdownNow(); - } - } - - public static void main(String[] args) { - // Pattern: ^\s*(?(`([^`])*`)+?)\s*=>\s*(?.+)$ - // Inner: ([^`])* matches zero or more non-backtick chars - // Middle: `([^`])*` matches a backtick-quoted segment (possibly empty) - // Outer: (`([^`])*`)+? matches one or more such segments (lazy) - // - // For exponential backtracking we need ambiguity in how to partition - // the input into groups. Each backtick pair `...` is unambiguous because - // ` is not in [^`]. So the boundaries are clear. - // - // BUT: what about EMPTY backtick pairs ``? - // `` = backtick + zero [^`] chars + backtick - // ```` = two empty pairs, or... wait, each pair consumes exactly 2 backticks. - // So 2N backticks = exactly N empty pairs. No ambiguity. - // - // What about content between backticks? - // `a``b` = (`a`)(`b`) — unambiguous because ` ends a group - // - // The +? (lazy outer) shouldn't cause issues — it just means try fewer groups first. - // But the engine still has to explore if the lazy match fails. - // - // Hmm. Actually, with +? being LAZY and the pattern requiring \s*=>\s*(?.+)$ - // AFTER the groups, the engine tries: - // 1. One group `...`, then check if rest matches \s*=>... - // 2. If not, try two groups, etc. - // This is linear, not exponential. - // - // The exponential case would be if ([^`])* could overlap with the outer repetition, - // but it can't because ` is an unambiguous delimiter. - - Pattern vuln = Pattern.compile( - "^\\s*(?(`([^`])*`)+?)\\s*=>\\s*(?.+)$"); - - System.out.println("=== Neo4j backtick pattern exploration ==="); - - // Even backticks (clean pairs) - for (int n : new int[]{10, 20, 50, 100, 200}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("``"); - sb.append(" => val"); - long t = timedMatch(vuln, sb.toString(), 3000); - System.out.println(" even_backticks n=" + n + ": " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - // Odd backticks (no clean pairing possible) - for (int n : new int[]{10, 20, 50, 100, 200}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 2*n + 1; i++) sb.append('`'); - sb.append(" => val"); - long t = timedMatch(vuln, sb.toString(), 3000); - System.out.println(" odd_backticks n=" + n + ": " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - // Backticks with content - for (int n : new int[]{10, 20, 50, 100}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("`a`"); - sb.append("X => val"); - long t = timedMatch(vuln, sb.toString(), 3000); - System.out.println(" bt_a_pairs n=" + n + ": " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - // Input with NO backtick pairing possible - for (int n : new int[]{10, 20, 50, 100}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("`X"); - sb.append(" => val"); - long t = timedMatch(vuln, sb.toString(), 3000); - System.out.println(" bt_X_interleaved n=" + n + ": " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - System.out.println("\nConclusion: Neo4j backtick patterns use ` as unambiguous delimiter."); - System.out.println("([^`])* cannot consume ` so group boundaries are fixed."); - System.out.println("No exponential backtracking observed."); - } -} diff --git a/defects/neovim/Makefile b/defects/neovim/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/neovim/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/neovim/bench/bench-neovim-0001.py b/defects/neovim/bench/bench-neovim-0001.py deleted file mode 100644 index 8fd8289e7..000000000 --- a/defects/neovim/bench/bench-neovim-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-neovim-0001.py -# ins_compl_add() in insexpand.c performs a linear scan of the entire -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== neovim-0001: ins_compl_add() in insexpand.c performs a linear scan of the entire ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/neovim/bench/results.txt b/defects/neovim/bench/results.txt deleted file mode 100644 index 1c318225b..000000000 --- a/defects/neovim/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== neovim-0001: ins_compl_add() in insexpand.c performs a linear scan of the entire === -N=100 k=100 : defective=0.090ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.376ms fixed=0.022ms speedup=105.7x -N=1000 k=1000 : defective=9.801ms fixed=0.049ms speedup=198.5x -N=2000 k=2000 : defective=38.851ms fixed=0.107ms speedup=363.6x - diff --git a/defects/neovim/bench/run_all.py b/defects/neovim/bench/run_all.py deleted file mode 100644 index 1daec7665..000000000 --- a/defects/neovim/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-neovim-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nestjs/Makefile b/defects/nestjs/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nestjs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nestjs/bench/bench-nestjs-0001.py b/defects/nestjs/bench/bench-nestjs-0001.py deleted file mode 100644 index a8e86a42b..000000000 --- a/defects/nestjs/bench/bench-nestjs-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nestjs-0001.py -# CWE-407: list-scan inside loop in nestjs-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nestjs-0001: CWE-407: list-scan inside loop in nestjs-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nestjs/bench/bench-nestjs-0002.py b/defects/nestjs/bench/bench-nestjs-0002.py deleted file mode 100644 index 3c2f6ee6b..000000000 --- a/defects/nestjs/bench/bench-nestjs-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nestjs-0002.py -# CWE-407: list-scan inside loop in nestjs-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nestjs-0002: CWE-407: list-scan inside loop in nestjs-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nestjs/bench/bench-nestjs-0003.py b/defects/nestjs/bench/bench-nestjs-0003.py deleted file mode 100644 index 6cfec3daf..000000000 --- a/defects/nestjs/bench/bench-nestjs-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nestjs-0003.py -# InstanceWrapper.introspectDepsAttribute — lookupRegistry string[] O(D²) includes + concat -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nestjs-0003: InstanceWrapper.introspectDepsAttribute — lookupRegistry string[] O(D²) includes + concat ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nestjs/bench/results.txt b/defects/nestjs/bench/results.txt deleted file mode 100644 index 1122f65ea..000000000 --- a/defects/nestjs/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== nestjs-0001: CWE-407: list-scan inside loop in nestjs-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.453ms fixed=0.023ms speedup=106.9x -N=1000 k=1000 : defective=9.503ms fixed=0.051ms speedup=187.7x -N=2000 k=2000 : defective=40.209ms fixed=0.097ms speedup=414.7x - -=== nestjs-0002: CWE-407: list-scan inside loop in nestjs-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.393ms fixed=0.022ms speedup=107.7x -N=1000 k=1000 : defective=9.544ms fixed=0.050ms speedup=191.2x -N=2000 k=2000 : defective=37.894ms fixed=0.107ms speedup=355.4x - -=== nestjs-0003: InstanceWrapper.introspectDepsAttribute — lookupRegistry string[] O(D²) includes + concat === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.207ms fixed=0.046ms speedup=48.4x -N=1000 k=1000 : defective=8.707ms fixed=0.045ms speedup=192.2x -N=2000 k=2000 : defective=35.896ms fixed=0.107ms speedup=334.3x - diff --git a/defects/nestjs/bench/run_all.py b/defects/nestjs/bench/run_all.py deleted file mode 100644 index 3f807dc0b..000000000 --- a/defects/nestjs/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nestjs-0001.py", "bench-nestjs-0002.py", "bench-nestjs-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/netbsd/Makefile b/defects/netbsd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/netbsd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/netbsd/bench/bench-netbsd-0001.py b/defects/netbsd/bench/bench-netbsd-0001.py deleted file mode 100644 index cc0052a7a..000000000 --- a/defects/netbsd/bench/bench-netbsd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netbsd-0001.py -# CWE-407: list-scan inside loop in netbsd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netbsd-0001: CWE-407: list-scan inside loop in netbsd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netbsd/bench/bench-netbsd-0002.py b/defects/netbsd/bench/bench-netbsd-0002.py deleted file mode 100644 index 3b05adebc..000000000 --- a/defects/netbsd/bench/bench-netbsd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netbsd-0002.py -# CWE-407: list-scan inside loop in netbsd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netbsd-0002: CWE-407: list-scan inside loop in netbsd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netbsd/bench/bench-netbsd-0003.py b/defects/netbsd/bench/bench-netbsd-0003.py deleted file mode 100644 index fbd680a86..000000000 --- a/defects/netbsd/bench/bench-netbsd-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netbsd-0003.py -# CWE-407: list-scan inside loop in netbsd-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netbsd-0003: CWE-407: list-scan inside loop in netbsd-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netbsd/bench/bench-netbsd-0004.py b/defects/netbsd/bench/bench-netbsd-0004.py deleted file mode 100644 index 6bcdfc9e1..000000000 --- a/defects/netbsd/bench/bench-netbsd-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netbsd-0004.py -# CWE-407: list-scan inside loop in netbsd-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netbsd-0004: CWE-407: list-scan inside loop in netbsd-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netbsd/bench/results.txt b/defects/netbsd/bench/results.txt deleted file mode 100644 index 3ef7f12a9..000000000 --- a/defects/netbsd/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== netbsd-0001: CWE-407: list-scan inside loop in netbsd-0001 (generic model) === -N=100 k=100 : defective=0.057ms fixed=0.002ms speedup=24.4x -N=500 k=500 : defective=1.443ms fixed=0.013ms speedup=108.7x -N=1000 k=1000 : defective=5.547ms fixed=0.029ms speedup=188.7x -N=2000 k=2000 : defective=22.993ms fixed=0.061ms speedup=376.7x - -=== netbsd-0002: CWE-407: list-scan inside loop in netbsd-0002 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.2x -N=500 k=500 : defective=1.351ms fixed=0.013ms speedup=103.8x -N=1000 k=1000 : defective=5.741ms fixed=0.030ms speedup=191.7x -N=2000 k=2000 : defective=23.811ms fixed=0.061ms speedup=387.8x - -=== netbsd-0003: CWE-407: list-scan inside loop in netbsd-0003 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.8x -N=500 k=500 : defective=1.344ms fixed=0.013ms speedup=102.2x -N=1000 k=1000 : defective=5.585ms fixed=0.029ms speedup=194.7x -N=2000 k=2000 : defective=22.596ms fixed=0.061ms speedup=368.7x - -=== netbsd-0004: CWE-407: list-scan inside loop in netbsd-0004 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.9x -N=500 k=500 : defective=1.382ms fixed=0.013ms speedup=103.7x -N=1000 k=1000 : defective=5.682ms fixed=0.029ms speedup=193.3x -N=2000 k=2000 : defective=23.174ms fixed=0.062ms speedup=371.0x - diff --git a/defects/netbsd/bench/run_all.py b/defects/netbsd/bench/run_all.py deleted file mode 100644 index d12052c29..000000000 --- a/defects/netbsd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-netbsd-0001.py", "bench-netbsd-0002.py", "bench-netbsd-0003.py", "bench-netbsd-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/netpanzer-0001/Makefile b/defects/netpanzer-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/netpanzer-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/netpanzer-0001/bench/bench-netpanzer-0001-0001.py b/defects/netpanzer-0001/bench/bench-netpanzer-0001-0001.py deleted file mode 100644 index f24315bc3..000000000 --- a/defects/netpanzer-0001/bench/bench-netpanzer-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netpanzer-0001-0001.py -# CWE-407: list-scan inside loop in netpanzer-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netpanzer-0001-0001: CWE-407: list-scan inside loop in netpanzer-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netpanzer-0001/bench/results.txt b/defects/netpanzer-0001/bench/results.txt deleted file mode 100644 index a5cd21b30..000000000 --- a/defects/netpanzer-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== netpanzer-0001-0001: CWE-407: list-scan inside loop in netpanzer-0001-0001 (generic model) === -N=100 k=100 : defective=0.175ms fixed=0.007ms speedup=23.9x -N=500 k=500 : defective=3.528ms fixed=0.059ms speedup=60.3x -N=1000 k=1000 : defective=13.046ms fixed=0.056ms speedup=232.6x -N=2000 k=2000 : defective=37.754ms fixed=0.107ms speedup=353.3x - diff --git a/defects/netpanzer-0001/bench/run_all.py b/defects/netpanzer-0001/bench/run_all.py deleted file mode 100644 index a27e302f9..000000000 --- a/defects/netpanzer-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-netpanzer-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/netpanzer-0002/Makefile b/defects/netpanzer-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/netpanzer-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/netpanzer-0002/bench/bench-netpanzer-0002-0002.py b/defects/netpanzer-0002/bench/bench-netpanzer-0002-0002.py deleted file mode 100644 index f3a3ae273..000000000 --- a/defects/netpanzer-0002/bench/bench-netpanzer-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netpanzer-0002-0002.py -# CWE-407: list-scan inside loop in netpanzer-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netpanzer-0002-0002: CWE-407: list-scan inside loop in netpanzer-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netpanzer-0002/bench/results.txt b/defects/netpanzer-0002/bench/results.txt deleted file mode 100644 index ef5ba372d..000000000 --- a/defects/netpanzer-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== netpanzer-0002-0002: CWE-407: list-scan inside loop in netpanzer-0002-0002 (generic model) === -N=100 k=100 : defective=0.096ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.485ms fixed=0.023ms speedup=106.5x -N=1000 k=1000 : defective=10.643ms fixed=0.053ms speedup=202.4x -N=2000 k=2000 : defective=38.829ms fixed=0.101ms speedup=382.9x - diff --git a/defects/netpanzer-0002/bench/run_all.py b/defects/netpanzer-0002/bench/run_all.py deleted file mode 100644 index 8c3134948..000000000 --- a/defects/netpanzer-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-netpanzer-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/netty-0001/Makefile b/defects/netty-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/netty-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/netty-0001/bench/bench-netty-0001-0001.py b/defects/netty-0001/bench/bench-netty-0001-0001.py deleted file mode 100644 index d90406bf6..000000000 --- a/defects/netty-0001/bench/bench-netty-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netty-0001-0001.py -# CWE-407: list-scan inside loop in netty-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netty-0001-0001: CWE-407: list-scan inside loop in netty-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netty-0001/bench/bench-netty-0001.py b/defects/netty-0001/bench/bench-netty-0001.py deleted file mode 100644 index 5f4e933a2..000000000 --- a/defects/netty-0001/bench/bench-netty-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netty-0001.py -# Defect: netty-0001 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netty-0001: Defect: netty-0001 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netty-0001/bench/results.txt b/defects/netty-0001/bench/results.txt deleted file mode 100644 index 40dd46775..000000000 --- a/defects/netty-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== netty-0001-0001: CWE-407: list-scan inside loop in netty-0001-0001 (generic model) === -N=100 k=100 : defective=0.165ms fixed=0.006ms speedup=26.1x -N=500 k=500 : defective=2.270ms fixed=0.021ms speedup=109.9x -N=1000 k=1000 : defective=8.757ms fixed=0.045ms speedup=193.4x -N=2000 k=2000 : defective=38.990ms fixed=0.096ms speedup=407.2x - -=== netty-0001: Defect: netty-0001 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.106ms fixed=0.087ms speedup=24.1x -N=1000 k=1000 : defective=10.040ms fixed=0.130ms speedup=77.3x -N=2000 k=2000 : defective=44.730ms fixed=0.111ms speedup=403.4x - diff --git a/defects/netty-0001/bench/run_all.py b/defects/netty-0001/bench/run_all.py deleted file mode 100644 index 91f0a63cd..000000000 --- a/defects/netty-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-netty-0001-0001.py", "bench-netty-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/netty-0002/Makefile b/defects/netty-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/netty-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/netty-0002/bench/bench-netty-0002-0002.py b/defects/netty-0002/bench/bench-netty-0002-0002.py deleted file mode 100644 index 18955ddfb..000000000 --- a/defects/netty-0002/bench/bench-netty-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netty-0002-0002.py -# CWE-407: list-scan inside loop in netty-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netty-0002-0002: CWE-407: list-scan inside loop in netty-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netty-0002/bench/results.txt b/defects/netty-0002/bench/results.txt deleted file mode 100644 index 1e13519f1..000000000 --- a/defects/netty-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== netty-0002-0002: CWE-407: list-scan inside loop in netty-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.434ms fixed=0.025ms speedup=95.7x -N=1000 k=1000 : defective=9.367ms fixed=0.048ms speedup=194.5x -N=2000 k=2000 : defective=35.026ms fixed=0.097ms speedup=362.4x - diff --git a/defects/netty-0002/bench/run_all.py b/defects/netty-0002/bench/run_all.py deleted file mode 100644 index ece68ad44..000000000 --- a/defects/netty-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-netty-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/netty/Makefile b/defects/netty/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/netty/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/netty/bench/bench-netty-0001-0001.py b/defects/netty/bench/bench-netty-0001-0001.py deleted file mode 100644 index d90406bf6..000000000 --- a/defects/netty/bench/bench-netty-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netty-0001-0001.py -# CWE-407: list-scan inside loop in netty-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netty-0001-0001: CWE-407: list-scan inside loop in netty-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netty/bench/bench-netty-0001.py b/defects/netty/bench/bench-netty-0001.py deleted file mode 100644 index 31294e0ca..000000000 --- a/defects/netty/bench/bench-netty-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netty-0001.py -# CWE-407: list-scan inside loop in netty-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netty-0001: CWE-407: list-scan inside loop in netty-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netty/bench/bench-netty-0002-0002.py b/defects/netty/bench/bench-netty-0002-0002.py deleted file mode 100644 index 18955ddfb..000000000 --- a/defects/netty/bench/bench-netty-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-netty-0002-0002.py -# CWE-407: list-scan inside loop in netty-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== netty-0002-0002: CWE-407: list-scan inside loop in netty-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/netty/bench/results.txt b/defects/netty/bench/results.txt deleted file mode 100644 index a01a93db7..000000000 --- a/defects/netty/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== netty-0001-0001: CWE-407: list-scan inside loop in netty-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.310ms fixed=0.021ms speedup=109.5x -N=1000 k=1000 : defective=8.642ms fixed=0.046ms speedup=186.5x -N=2000 k=2000 : defective=34.813ms fixed=0.096ms speedup=361.2x - -=== netty-0001: CWE-407: list-scan inside loop in netty-0001 (generic model) === -N=100 k=100 : defective=0.160ms fixed=0.006ms speedup=25.7x -N=500 k=500 : defective=2.126ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=8.819ms fixed=0.046ms speedup=190.5x -N=2000 k=2000 : defective=35.419ms fixed=0.097ms speedup=365.7x - -=== netty-0002-0002: CWE-407: list-scan inside loop in netty-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.125ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.533ms fixed=0.046ms speedup=184.2x -N=2000 k=2000 : defective=36.089ms fixed=0.096ms speedup=376.4x - diff --git a/defects/netty/bench/run_all.py b/defects/netty/bench/run_all.py deleted file mode 100644 index 639a658fb..000000000 --- a/defects/netty/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-netty-0001-0001.py", "bench-netty-0001.py", "bench-netty-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/networkx/Makefile b/defects/networkx/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/networkx/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/networkx/bench/bench-networkx-0001.py b/defects/networkx/bench/bench-networkx-0001.py deleted file mode 100644 index 9bf5b1dd2..000000000 --- a/defects/networkx/bench/bench-networkx-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-networkx-0001.py -# CWE-407: list-scan inside loop in networkx-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== networkx-0001: CWE-407: list-scan inside loop in networkx-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/networkx/bench/bench-networkx-0002.py b/defects/networkx/bench/bench-networkx-0002.py deleted file mode 100644 index 50600b18a..000000000 --- a/defects/networkx/bench/bench-networkx-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-networkx-0002.py -# CWE-407: list-scan inside loop in networkx-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== networkx-0002: CWE-407: list-scan inside loop in networkx-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/networkx/bench/results.txt b/defects/networkx/bench/results.txt deleted file mode 100644 index 3400180ca..000000000 --- a/defects/networkx/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== networkx-0001: CWE-407: list-scan inside loop in networkx-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.430ms fixed=0.023ms speedup=104.5x -N=1000 k=1000 : defective=10.516ms fixed=0.055ms speedup=192.5x -N=2000 k=2000 : defective=38.801ms fixed=0.098ms speedup=397.4x - -=== networkx-0002: CWE-407: list-scan inside loop in networkx-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.111ms fixed=0.020ms speedup=104.6x -N=1000 k=1000 : defective=8.869ms fixed=0.046ms speedup=193.3x -N=2000 k=2000 : defective=36.520ms fixed=0.100ms speedup=365.1x - diff --git a/defects/networkx/bench/run_all.py b/defects/networkx/bench/run_all.py deleted file mode 100644 index bb8201d53..000000000 --- a/defects/networkx/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-networkx-0001.py", "bench-networkx-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/neutron/Makefile b/defects/neutron/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/neutron/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/neutron/bench/bench-neutron-0001.py b/defects/neutron/bench/bench-neutron-0001.py deleted file mode 100644 index 28dfa2278..000000000 --- a/defects/neutron/bench/bench-neutron-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-neutron-0001.py -# CWE-407: list-scan inside loop in neutron-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== neutron-0001: CWE-407: list-scan inside loop in neutron-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/neutron/bench/bench-neutron-0002.py b/defects/neutron/bench/bench-neutron-0002.py deleted file mode 100644 index a8f1ef4ed..000000000 --- a/defects/neutron/bench/bench-neutron-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-neutron-0002.py -# CWE-407: list-scan inside loop in neutron-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== neutron-0002: CWE-407: list-scan inside loop in neutron-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/neutron/bench/results.txt b/defects/neutron/bench/results.txt deleted file mode 100644 index 7370dfe8f..000000000 --- a/defects/neutron/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== neutron-0001: CWE-407: list-scan inside loop in neutron-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.469ms fixed=0.022ms speedup=109.8x -N=1000 k=1000 : defective=9.101ms fixed=0.081ms speedup=112.0x -N=2000 k=2000 : defective=40.744ms fixed=0.097ms speedup=422.1x - -=== neutron-0002: CWE-407: list-scan inside loop in neutron-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.282ms fixed=0.022ms speedup=101.6x -N=1000 k=1000 : defective=8.712ms fixed=0.046ms speedup=190.4x -N=2000 k=2000 : defective=34.748ms fixed=0.097ms speedup=356.8x - diff --git a/defects/neutron/bench/run_all.py b/defects/neutron/bench/run_all.py deleted file mode 100644 index 425b2e9ba..000000000 --- a/defects/neutron/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-neutron-0001.py", "bench-neutron-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nfs-ganesha-0001/Makefile b/defects/nfs-ganesha-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nfs-ganesha-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nfs-ganesha-0001/bench/bench-nfs-ganesha-0001-0001.py b/defects/nfs-ganesha-0001/bench/bench-nfs-ganesha-0001-0001.py deleted file mode 100644 index 50ca7bc62..000000000 --- a/defects/nfs-ganesha-0001/bench/bench-nfs-ganesha-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nfs-ganesha-0001-0001.py -# CWE-407: list-scan inside loop in nfs-ganesha-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nfs-ganesha-0001-0001: CWE-407: list-scan inside loop in nfs-ganesha-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nfs-ganesha-0001/bench/results.txt b/defects/nfs-ganesha-0001/bench/results.txt deleted file mode 100644 index d80edbb3e..000000000 --- a/defects/nfs-ganesha-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nfs-ganesha-0001-0001: CWE-407: list-scan inside loop in nfs-ganesha-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.507ms fixed=0.022ms speedup=111.7x -N=1000 k=1000 : defective=9.915ms fixed=0.049ms speedup=201.6x -N=2000 k=2000 : defective=37.385ms fixed=0.128ms speedup=291.9x - diff --git a/defects/nfs-ganesha-0001/bench/run_all.py b/defects/nfs-ganesha-0001/bench/run_all.py deleted file mode 100644 index 8ec83f6cb..000000000 --- a/defects/nfs-ganesha-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nfs-ganesha-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nfs-ganesha-0002/Makefile b/defects/nfs-ganesha-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nfs-ganesha-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nfs-ganesha-0002/bench/bench-nfs-ganesha-0002-0002.py b/defects/nfs-ganesha-0002/bench/bench-nfs-ganesha-0002-0002.py deleted file mode 100644 index 06d317581..000000000 --- a/defects/nfs-ganesha-0002/bench/bench-nfs-ganesha-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nfs-ganesha-0002-0002.py -# CWE-407: list-scan inside loop in nfs-ganesha-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nfs-ganesha-0002-0002: CWE-407: list-scan inside loop in nfs-ganesha-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nfs-ganesha-0002/bench/results.txt b/defects/nfs-ganesha-0002/bench/results.txt deleted file mode 100644 index f2965ae0f..000000000 --- a/defects/nfs-ganesha-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nfs-ganesha-0002-0002: CWE-407: list-scan inside loop in nfs-ganesha-0002-0002 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.763ms fixed=0.027ms speedup=102.9x -N=1000 k=1000 : defective=11.684ms fixed=0.059ms speedup=199.7x -N=2000 k=2000 : defective=36.511ms fixed=0.097ms speedup=376.8x - diff --git a/defects/nfs-ganesha-0002/bench/run_all.py b/defects/nfs-ganesha-0002/bench/run_all.py deleted file mode 100644 index 571f82fa3..000000000 --- a/defects/nfs-ganesha-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nfs-ganesha-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nfs-utils-0001/Makefile b/defects/nfs-utils-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nfs-utils-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nfs-utils-0001/bench/bench-nfs-utils-0001-0001.py b/defects/nfs-utils-0001/bench/bench-nfs-utils-0001-0001.py deleted file mode 100644 index 365d8b9bd..000000000 --- a/defects/nfs-utils-0001/bench/bench-nfs-utils-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nfs-utils-0001-0001.py -# CWE-407: list-scan inside loop in nfs-utils-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nfs-utils-0001-0001: CWE-407: list-scan inside loop in nfs-utils-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nfs-utils-0001/bench/results.txt b/defects/nfs-utils-0001/bench/results.txt deleted file mode 100644 index c5f349a14..000000000 --- a/defects/nfs-utils-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nfs-utils-0001-0001: CWE-407: list-scan inside loop in nfs-utils-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.470ms fixed=0.023ms speedup=106.2x -N=1000 k=1000 : defective=9.027ms fixed=0.046ms speedup=195.0x -N=2000 k=2000 : defective=35.761ms fixed=0.096ms speedup=373.1x - diff --git a/defects/nfs-utils-0001/bench/run_all.py b/defects/nfs-utils-0001/bench/run_all.py deleted file mode 100644 index 8302522ca..000000000 --- a/defects/nfs-utils-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nfs-utils-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nfs-utils-0002/Makefile b/defects/nfs-utils-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nfs-utils-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nfs-utils-0002/bench/bench-nfs-utils-0002-0002.py b/defects/nfs-utils-0002/bench/bench-nfs-utils-0002-0002.py deleted file mode 100644 index 3d2be741f..000000000 --- a/defects/nfs-utils-0002/bench/bench-nfs-utils-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nfs-utils-0002-0002.py -# CWE-407: list-scan inside loop in nfs-utils-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nfs-utils-0002-0002: CWE-407: list-scan inside loop in nfs-utils-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nfs-utils-0002/bench/results.txt b/defects/nfs-utils-0002/bench/results.txt deleted file mode 100644 index 247e3014f..000000000 --- a/defects/nfs-utils-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nfs-utils-0002-0002: CWE-407: list-scan inside loop in nfs-utils-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.499ms fixed=0.022ms speedup=111.4x -N=1000 k=1000 : defective=9.499ms fixed=0.048ms speedup=197.7x -N=2000 k=2000 : defective=36.744ms fixed=0.101ms speedup=362.3x - diff --git a/defects/nfs-utils-0002/bench/run_all.py b/defects/nfs-utils-0002/bench/run_all.py deleted file mode 100644 index 91c855830..000000000 --- a/defects/nfs-utils-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nfs-utils-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nginx/Makefile b/defects/nginx/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nginx/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nginx/bench/bench-nginx-0001.py b/defects/nginx/bench/bench-nginx-0001.py deleted file mode 100644 index 35a556fb0..000000000 --- a/defects/nginx/bench/bench-nginx-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nginx-0001.py -# CWE-407: list-scan inside loop in nginx-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nginx-0001: CWE-407: list-scan inside loop in nginx-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nginx/bench/bench-nginx-0002.py b/defects/nginx/bench/bench-nginx-0002.py deleted file mode 100644 index 9a19e0388..000000000 --- a/defects/nginx/bench/bench-nginx-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nginx-0002.py -# nginx-0002 — ngx_http_upstream_hide_headers_hash dedup O(H²) config init -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nginx-0002: nginx-0002 — ngx_http_upstream_hide_headers_hash dedup O(H²) config init ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nginx/bench/bench-nginx-0003.py b/defects/nginx/bench/bench-nginx-0003.py deleted file mode 100644 index 859039619..000000000 --- a/defects/nginx/bench/bench-nginx-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nginx-0003.py -# nginx-0003 — ngx_http_variables_init_vars O(V×K) startup nested scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nginx-0003: nginx-0003 — ngx_http_variables_init_vars O(V×K) startup nested scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nginx/bench/bench-nginx-0004.py b/defects/nginx/bench/bench-nginx-0004.py deleted file mode 100644 index d89f915af..000000000 --- a/defects/nginx/bench/bench-nginx-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nginx-0004.py -# nginx-0004 — ngx_http_upstream_keepalive: O(C) linear cache scan per upstream request -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nginx-0004: nginx-0004 — ngx_http_upstream_keepalive: O(C) linear cache scan per upstream request ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nginx/bench/results.txt b/defects/nginx/bench/results.txt deleted file mode 100644 index 71428b868..000000000 --- a/defects/nginx/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== nginx-0001: CWE-407: list-scan inside loop in nginx-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.014ms fixed=0.020ms speedup=100.4x -N=1000 k=1000 : defective=8.280ms fixed=0.043ms speedup=192.7x -N=2000 k=2000 : defective=35.389ms fixed=0.094ms speedup=378.2x - -=== nginx-0002: nginx-0002 — ngx_http_upstream_hide_headers_hash dedup O(H²) config init === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.012ms fixed=0.020ms speedup=101.6x -N=1000 k=1000 : defective=8.244ms fixed=0.044ms speedup=186.0x -N=2000 k=2000 : defective=34.790ms fixed=0.094ms speedup=371.1x - -=== nginx-0003: nginx-0003 — ngx_http_variables_init_vars O(V×K) startup nested scan === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.029ms fixed=0.020ms speedup=101.4x -N=1000 k=1000 : defective=8.201ms fixed=0.043ms speedup=191.8x -N=2000 k=2000 : defective=33.280ms fixed=0.157ms speedup=211.4x - -=== nginx-0004: nginx-0004 — ngx_http_upstream_keepalive: O(C) linear cache scan per upstream request === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.013ms fixed=0.019ms speedup=103.5x -N=1000 k=1000 : defective=8.285ms fixed=0.044ms speedup=187.0x -N=2000 k=2000 : defective=33.537ms fixed=0.095ms speedup=353.8x - diff --git a/defects/nginx/bench/run_all.py b/defects/nginx/bench/run_all.py deleted file mode 100644 index ad6dea954..000000000 --- a/defects/nginx/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nginx-0001.py", "bench-nginx-0002.py", "bench-nginx-0003.py", "bench-nginx-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nifi/Makefile b/defects/nifi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nifi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nifi/bench/bench-nifi-0001.py b/defects/nifi/bench/bench-nifi-0001.py deleted file mode 100644 index f83c43cb4..000000000 --- a/defects/nifi/bench/bench-nifi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nifi-0001.py -# Controller Service topological sort O(S²) → O(S) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nifi-0001: Controller Service topological sort O(S²) → O(S) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nifi/bench/results.txt b/defects/nifi/bench/results.txt deleted file mode 100644 index e4e1cf821..000000000 --- a/defects/nifi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nifi-0001: Controller Service topological sort O(S²) → O(S) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.286ms fixed=0.022ms speedup=105.2x -N=1000 k=1000 : defective=8.833ms fixed=0.045ms speedup=194.8x -N=2000 k=2000 : defective=44.429ms fixed=0.103ms speedup=433.2x - diff --git a/defects/nifi/bench/run_all.py b/defects/nifi/bench/run_all.py deleted file mode 100644 index 57ef8b528..000000000 --- a/defects/nifi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nifi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nim/Makefile b/defects/nim/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nim/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nim/bench/bench-nim-0001.py b/defects/nim/bench/bench-nim-0001.py deleted file mode 100644 index 3c08f5644..000000000 --- a/defects/nim/bench/bench-nim-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nim-0001.py -# sequtils.deduplicate — O(N²) result.contains in for loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nim-0001: sequtils.deduplicate — O(N²) result.contains in for loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nim/bench/bench-nim-0002.py b/defects/nim/bench/bench-nim-0002.py deleted file mode 100644 index 20059b996..000000000 --- a/defects/nim/bench/bench-nim-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nim-0002.py -# trees.cyclicTreeAux — O(N²) linear visited-seq scan in recursive DFS -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nim-0002: trees.cyclicTreeAux — O(N²) linear visited-seq scan in recursive DFS ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nim/bench/results.txt b/defects/nim/bench/results.txt deleted file mode 100644 index c9029a023..000000000 --- a/defects/nim/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== nim-0001: sequtils.deduplicate — O(N²) result.contains in for loop === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.589ms fixed=0.024ms speedup=107.0x -N=1000 k=1000 : defective=9.896ms fixed=0.045ms speedup=218.5x -N=2000 k=2000 : defective=36.469ms fixed=0.097ms speedup=374.3x - -=== nim-0002: trees.cyclicTreeAux — O(N²) linear visited-seq scan in recursive DFS === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.125ms fixed=0.036ms speedup=59.7x -N=1000 k=1000 : defective=11.272ms fixed=0.048ms speedup=236.5x -N=2000 k=2000 : defective=35.849ms fixed=0.096ms speedup=372.8x - diff --git a/defects/nim/bench/run_all.py b/defects/nim/bench/run_all.py deleted file mode 100644 index ef37a38c5..000000000 --- a/defects/nim/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nim-0001.py", "bench-nim-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ninja/Makefile b/defects/ninja/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ninja/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ninja/bench/bench-ninja-0001.py b/defects/ninja/bench/bench-ninja-0001.py deleted file mode 100644 index 19a7f515f..000000000 --- a/defects/ninja/bench/bench-ninja-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ninja-0001.py -# CWE-407: list-scan inside loop in ninja-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ninja-0001: CWE-407: list-scan inside loop in ninja-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ninja/bench/bench-ninja-0002.py b/defects/ninja/bench/bench-ninja-0002.py deleted file mode 100644 index c4fa3553a..000000000 --- a/defects/ninja/bench/bench-ninja-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ninja-0002.py -# CWE-407: list-scan inside loop in ninja-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ninja-0002: CWE-407: list-scan inside loop in ninja-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ninja/bench/results.txt b/defects/ninja/bench/results.txt deleted file mode 100644 index 2de551ce5..000000000 --- a/defects/ninja/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ninja-0001: CWE-407: list-scan inside loop in ninja-0001 (generic model) === -N=100 k=100 : defective=0.282ms fixed=0.018ms speedup=15.9x -N=500 k=500 : defective=2.499ms fixed=0.022ms speedup=113.2x -N=1000 k=1000 : defective=9.966ms fixed=0.050ms speedup=199.4x -N=2000 k=2000 : defective=35.099ms fixed=0.096ms speedup=366.5x - -=== ninja-0002: CWE-407: list-scan inside loop in ninja-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.412ms fixed=0.020ms speedup=118.1x -N=1000 k=1000 : defective=8.692ms fixed=0.047ms speedup=186.7x -N=2000 k=2000 : defective=37.990ms fixed=0.112ms speedup=337.9x - diff --git a/defects/ninja/bench/run_all.py b/defects/ninja/bench/run_all.py deleted file mode 100644 index 2bf05a114..000000000 --- a/defects/ninja/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ninja-0001.py", "bench-ninja-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nmap/Makefile b/defects/nmap/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nmap/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nmap/bench/bench-nmap-0001.py b/defects/nmap/bench/bench-nmap-0001.py deleted file mode 100644 index 48251f856..000000000 --- a/defects/nmap/bench/bench-nmap-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nmap-0001.py -# CWE-407: list-scan inside loop in nmap-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nmap-0001: CWE-407: list-scan inside loop in nmap-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nmap/bench/bench-nmap-0002.py b/defects/nmap/bench/bench-nmap-0002.py deleted file mode 100644 index 4665c02e5..000000000 --- a/defects/nmap/bench/bench-nmap-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nmap-0002.py -# nmap-0002 — nmap.cc merge_port_lists O(N²) ping-port dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nmap-0002: nmap-0002 — nmap.cc merge_port_lists O(N²) ping-port dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nmap/bench/results.txt b/defects/nmap/bench/results.txt deleted file mode 100644 index ee71d4d37..000000000 --- a/defects/nmap/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== nmap-0001: CWE-407: list-scan inside loop in nmap-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.832ms fixed=0.026ms speedup=106.9x -N=1000 k=1000 : defective=11.679ms fixed=0.059ms speedup=196.3x -N=2000 k=2000 : defective=36.642ms fixed=0.101ms speedup=364.1x - -=== nmap-0002: nmap-0002 — nmap.cc merge_port_lists O(N²) ping-port dedup === -N=100 k=100 : defective=0.236ms fixed=0.016ms speedup=14.8x -N=500 k=500 : defective=2.216ms fixed=0.022ms speedup=101.6x -N=1000 k=1000 : defective=9.224ms fixed=0.045ms speedup=203.3x -N=2000 k=2000 : defective=35.267ms fixed=0.097ms speedup=362.0x - diff --git a/defects/nmap/bench/run_all.py b/defects/nmap/bench/run_all.py deleted file mode 100644 index 9f23f656e..000000000 --- a/defects/nmap/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nmap-0001.py", "bench-nmap-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nodejs/Makefile b/defects/nodejs/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nodejs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nodejs/bench/bench-nodejs-0001.py b/defects/nodejs/bench/bench-nodejs-0001.py deleted file mode 100644 index 80bdb5c92..000000000 --- a/defects/nodejs/bench/bench-nodejs-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nodejs-0001.py -# CWE-407: list-scan inside loop in nodejs-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nodejs-0001: CWE-407: list-scan inside loop in nodejs-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nodejs/bench/results.txt b/defects/nodejs/bench/results.txt deleted file mode 100644 index b17da0bbe..000000000 --- a/defects/nodejs/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== nodejs-0001: CWE-407: list-scan inside loop in nodejs-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.283ms fixed=0.022ms speedup=106.0x -N=1000 k=1000 : defective=8.812ms fixed=0.046ms speedup=191.4x -N=2000 k=2000 : defective=38.978ms fixed=0.106ms speedup=366.0x - diff --git a/defects/nodejs/bench/run_all.py b/defects/nodejs/bench/run_all.py deleted file mode 100644 index 6238aa47a..000000000 --- a/defects/nodejs/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nodejs-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nomad/Makefile b/defects/nomad/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nomad/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nomad/bench/bench-nomad-0001.py b/defects/nomad/bench/bench-nomad-0001.py deleted file mode 100644 index 2d898be0e..000000000 --- a/defects/nomad/bench/bench-nomad-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nomad-0001.py -# Bitmap.IndexesInRangeFiltered — O(range × filter) port allocation -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nomad-0001: Bitmap.IndexesInRangeFiltered — O(range × filter) port allocation ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nomad/bench/bench-nomad-0002.py b/defects/nomad/bench/bench-nomad-0002.py deleted file mode 100644 index c0bdbe9cd..000000000 --- a/defects/nomad/bench/bench-nomad-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nomad-0002.py -# stream/subscription filter() — O(events × namespaces) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nomad-0002: stream/subscription filter() — O(events × namespaces) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nomad/bench/bench-nomad-0003.py b/defects/nomad/bench/bench-nomad-0003.py deleted file mode 100644 index 5e7fa8465..000000000 --- a/defects/nomad/bench/bench-nomad-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nomad-0003.py -# GetVaultConfigurations secrets dedup — O(tasks × secrets²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nomad-0003: GetVaultConfigurations secrets dedup — O(tasks × secrets²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nomad/bench/bench-nomad-0004.py b/defects/nomad/bench/bench-nomad-0004.py deleted file mode 100644 index 2f573877f..000000000 --- a/defects/nomad/bench/bench-nomad-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nomad-0004.py -# checkstore.shim.Difference — O(current × ids) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nomad-0004: checkstore.shim.Difference — O(current × ids) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nomad/bench/bench-nomad-0005.py b/defects/nomad/bench/bench-nomad-0005.py deleted file mode 100644 index 32ec2060f..000000000 --- a/defects/nomad/bench/bench-nomad-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nomad-0005.py -# CWE-407: list-scan inside loop in nomad-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nomad-0005: CWE-407: list-scan inside loop in nomad-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nomad/bench/results.txt b/defects/nomad/bench/results.txt deleted file mode 100644 index d267a55e2..000000000 --- a/defects/nomad/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== nomad-0001: Bitmap.IndexesInRangeFiltered — O(range × filter) port allocation === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.055ms fixed=0.020ms speedup=104.4x -N=1000 k=1000 : defective=8.646ms fixed=0.045ms speedup=193.3x -N=2000 k=2000 : defective=33.616ms fixed=0.092ms speedup=364.7x - -=== nomad-0002: stream/subscription filter() — O(events × namespaces) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.0x -N=500 k=500 : defective=2.128ms fixed=0.021ms speedup=101.8x -N=1000 k=1000 : defective=8.659ms fixed=0.046ms speedup=187.4x -N=2000 k=2000 : defective=33.999ms fixed=0.096ms speedup=354.7x - -=== nomad-0003: GetVaultConfigurations secrets dedup — O(tasks × secrets²) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.122ms fixed=0.020ms speedup=104.3x -N=1000 k=1000 : defective=8.351ms fixed=0.043ms speedup=193.2x -N=2000 k=2000 : defective=33.643ms fixed=0.093ms speedup=362.7x - -=== nomad-0004: checkstore.shim.Difference — O(current × ids) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.013ms fixed=0.020ms speedup=101.9x -N=1000 k=1000 : defective=8.351ms fixed=0.043ms speedup=192.6x -N=2000 k=2000 : defective=33.483ms fixed=0.095ms speedup=352.7x - -=== nomad-0005: CWE-407: list-scan inside loop in nomad-0005 (generic model) === -N=100 k=100 : defective=0.236ms fixed=0.015ms speedup=16.1x -N=500 k=500 : defective=2.020ms fixed=0.020ms speedup=102.1x -N=1000 k=1000 : defective=8.359ms fixed=0.043ms speedup=194.9x -N=2000 k=2000 : defective=33.577ms fixed=0.092ms speedup=364.8x - diff --git a/defects/nomad/bench/run_all.py b/defects/nomad/bench/run_all.py deleted file mode 100644 index 6ca51bef6..000000000 --- a/defects/nomad/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nomad-0001.py", "bench-nomad-0002.py", "bench-nomad-0003.py", "bench-nomad-0004.py", "bench-nomad-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nova/Makefile b/defects/nova/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nova/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nova/bench/bench-nova-0001.py b/defects/nova/bench/bench-nova-0001.py deleted file mode 100644 index 4ffac57de..000000000 --- a/defects/nova/bench/bench-nova-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nova-0001.py -# CWE-407: list-scan inside loop in nova-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nova-0001: CWE-407: list-scan inside loop in nova-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nova/bench/bench-nova-0002.py b/defects/nova/bench/bench-nova-0002.py deleted file mode 100644 index 8184e681b..000000000 --- a/defects/nova/bench/bench-nova-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nova-0002.py -# CWE-407: list-scan inside loop in nova-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nova-0002: CWE-407: list-scan inside loop in nova-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nova/bench/results.txt b/defects/nova/bench/results.txt deleted file mode 100644 index 76e5fc462..000000000 --- a/defects/nova/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== nova-0001: CWE-407: list-scan inside loop in nova-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.729ms fixed=0.026ms speedup=104.1x -N=1000 k=1000 : defective=12.543ms fixed=0.057ms speedup=218.7x -N=2000 k=2000 : defective=35.763ms fixed=0.096ms speedup=372.0x - -=== nova-0002: CWE-407: list-scan inside loop in nova-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.149ms fixed=0.021ms speedup=102.9x -N=1000 k=1000 : defective=8.831ms fixed=0.046ms speedup=190.8x -N=2000 k=2000 : defective=35.871ms fixed=0.096ms speedup=375.1x - diff --git a/defects/nova/bench/run_all.py b/defects/nova/bench/run_all.py deleted file mode 100644 index 4e4cdda26..000000000 --- a/defects/nova/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nova-0001.py", "bench-nova-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/npm/Makefile b/defects/npm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/npm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/npm/bench/bench-npm-0002.py b/defects/npm/bench/bench-npm-0002.py deleted file mode 100644 index 08e2bde58..000000000 --- a/defects/npm/bench/bench-npm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-npm-0002.py -# CWE-407: list-scan inside loop in npm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== npm-0002: CWE-407: list-scan inside loop in npm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/npm/bench/results.txt b/defects/npm/bench/results.txt deleted file mode 100644 index cd5634149..000000000 --- a/defects/npm/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== npm-0002: CWE-407: list-scan inside loop in npm-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.454ms fixed=0.024ms speedup=103.8x -N=1000 k=1000 : defective=10.116ms fixed=0.053ms speedup=190.5x -N=2000 k=2000 : defective=37.636ms fixed=0.105ms speedup=358.0x - diff --git a/defects/npm/bench/run_all.py b/defects/npm/bench/run_all.py deleted file mode 100644 index b37c5eff7..000000000 --- a/defects/npm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-npm-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/numpy/Makefile b/defects/numpy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/numpy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/numpy/bench/bench-numpy-0001.py b/defects/numpy/bench/bench-numpy-0001.py deleted file mode 100644 index cf5e8f6b0..000000000 --- a/defects/numpy/bench/bench-numpy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-numpy-0001.py -# f2py _get_depend_dict — O(n²) linear dedup in dependency resolution -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== numpy-0001: f2py _get_depend_dict — O(n²) linear dedup in dependency resolution ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/numpy/bench/bench-numpy-0002.py b/defects/numpy/bench/bench-numpy-0002.py deleted file mode 100644 index 1dafe75e7..000000000 --- a/defects/numpy/bench/bench-numpy-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-numpy-0002.py -# numpy-0001: stack_arrays — seen=[] list dedup O(A×F²) field-name tracking -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== numpy-0002: numpy-0001: stack_arrays — seen=[] list dedup O(A×F²) field-name tracking ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/numpy/bench/bench-numpy-0003.py b/defects/numpy/bench/bench-numpy-0003.py deleted file mode 100644 index 4ef712a8c..000000000 --- a/defects/numpy/bench/bench-numpy-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-numpy-0003.py -# numpy-0002: join_by — names list rebuilt inside loop + .index() O(F²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== numpy-0003: numpy-0002: join_by — names list rebuilt inside loop + .index() O(F²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/numpy/bench/results.txt b/defects/numpy/bench/results.txt deleted file mode 100644 index 17152c05c..000000000 --- a/defects/numpy/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== numpy-0001: f2py _get_depend_dict — O(n²) linear dedup in dependency resolution === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.607ms fixed=0.025ms speedup=103.1x -N=1000 k=1000 : defective=10.796ms fixed=0.055ms speedup=197.3x -N=2000 k=2000 : defective=35.435ms fixed=0.096ms speedup=370.1x - -=== numpy-0002: numpy-0001: stack_arrays — seen=[] list dedup O(A×F²) field-name tracking === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.165ms fixed=0.021ms speedup=103.3x -N=1000 k=1000 : defective=8.793ms fixed=0.045ms speedup=197.1x -N=2000 k=2000 : defective=35.157ms fixed=0.095ms speedup=369.5x - -=== numpy-0003: numpy-0002: join_by — names list rebuilt inside loop + .index() O(F²) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.133ms fixed=0.021ms speedup=101.8x -N=1000 k=1000 : defective=8.693ms fixed=0.047ms speedup=186.5x -N=2000 k=2000 : defective=35.553ms fixed=0.096ms speedup=369.9x - diff --git a/defects/numpy/bench/run_all.py b/defects/numpy/bench/run_all.py deleted file mode 100644 index dbe4c7437..000000000 --- a/defects/numpy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-numpy-0001.py", "bench-numpy-0002.py", "bench-numpy-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/nx/Makefile b/defects/nx/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/nx/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/nx/bench/bench-nx-0001.py b/defects/nx/bench/bench-nx-0001.py deleted file mode 100644 index 1a669e972..000000000 --- a/defects/nx/bench/bench-nx-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nx-0001.py -# CWE-407: list-scan inside loop in nx-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nx-0001: CWE-407: list-scan inside loop in nx-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nx/bench/bench-nx-0002.py b/defects/nx/bench/bench-nx-0002.py deleted file mode 100644 index 9664be319..000000000 --- a/defects/nx/bench/bench-nx-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-nx-0002.py -# CWE-407: list-scan inside loop in nx-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== nx-0002: CWE-407: list-scan inside loop in nx-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/nx/bench/results.txt b/defects/nx/bench/results.txt deleted file mode 100644 index d1ff94435..000000000 --- a/defects/nx/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== nx-0001: CWE-407: list-scan inside loop in nx-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.450ms fixed=0.021ms speedup=114.8x -N=1000 k=1000 : defective=10.193ms fixed=0.047ms speedup=214.6x -N=2000 k=2000 : defective=38.826ms fixed=0.099ms speedup=394.0x - -=== nx-0002: CWE-407: list-scan inside loop in nx-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.174ms fixed=0.021ms speedup=104.7x -N=1000 k=1000 : defective=9.997ms fixed=0.046ms speedup=215.0x -N=2000 k=2000 : defective=47.212ms fixed=0.099ms speedup=477.6x - diff --git a/defects/nx/bench/run_all.py b/defects/nx/bench/run_all.py deleted file mode 100644 index b08e3c3ed..000000000 --- a/defects/nx/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-nx-0001.py", "bench-nx-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/obs-studio/Makefile b/defects/obs-studio/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/obs-studio/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/obs-studio/bench/bench-obs-studio-0001.py b/defects/obs-studio/bench/bench-obs-studio-0001.py deleted file mode 100644 index 6b365b6e1..000000000 --- a/defects/obs-studio/bench/bench-obs-studio-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-obs-studio-0001.py -# push_audio_tree() and push_audio_tree2() use da_find(audio->render_order, -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== obs-studio-0001: push_audio_tree() and push_audio_tree2() use da_find(audio->render_order, ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/obs-studio/bench/results.txt b/defects/obs-studio/bench/results.txt deleted file mode 100644 index e3adee404..000000000 --- a/defects/obs-studio/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== obs-studio-0001: push_audio_tree() and push_audio_tree2() use da_find(audio->render_order, === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.231ms fixed=0.020ms speedup=109.5x -N=1000 k=1000 : defective=8.755ms fixed=0.045ms speedup=192.9x -N=2000 k=2000 : defective=35.353ms fixed=0.096ms speedup=366.5x - diff --git a/defects/obs-studio/bench/run_all.py b/defects/obs-studio/bench/run_all.py deleted file mode 100644 index 06a89071d..000000000 --- a/defects/obs-studio/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-obs-studio-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/octave/Makefile b/defects/octave/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/octave/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/octave/bench/bench-octave-0001.py b/defects/octave/bench/bench-octave-0001.py deleted file mode 100644 index 4afbf9e4a..000000000 --- a/defects/octave/bench/bench-octave-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-octave-0001.py -# CWE-407: list-scan inside loop in octave-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== octave-0001: CWE-407: list-scan inside loop in octave-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/octave/bench/bench-octave-0002.py b/defects/octave/bench/bench-octave-0002.py deleted file mode 100644 index 3df64d54e..000000000 --- a/defects/octave/bench/bench-octave-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-octave-0002.py -# load_path::add — O(D²) directory-presence scan on path initialization -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== octave-0002: load_path::add — O(D²) directory-presence scan on path initialization ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/octave/bench/results.txt b/defects/octave/bench/results.txt deleted file mode 100644 index 74c9210eb..000000000 --- a/defects/octave/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== octave-0001: CWE-407: list-scan inside loop in octave-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.178ms fixed=0.020ms speedup=106.5x -N=1000 k=1000 : defective=8.679ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=35.633ms fixed=0.097ms speedup=368.6x - -=== octave-0002: load_path::add — O(D²) directory-presence scan on path initialization === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.107ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=8.703ms fixed=0.047ms speedup=184.2x -N=2000 k=2000 : defective=37.790ms fixed=0.100ms speedup=377.6x - diff --git a/defects/octave/bench/run_all.py b/defects/octave/bench/run_all.py deleted file mode 100644 index a6525f074..000000000 --- a/defects/octave/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-octave-0001.py", "bench-octave-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/odl/Makefile b/defects/odl/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/odl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/odl/bench/bench-odl-0001.py b/defects/odl/bench/bench-odl-0001.py deleted file mode 100644 index f6ddd4356..000000000 --- a/defects/odl/bench/bench-odl-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-odl-0001.py -# CWE-407: list-scan inside loop in odl-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== odl-0001: CWE-407: list-scan inside loop in odl-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/odl/bench/bench-odl-0002.py b/defects/odl/bench/bench-odl-0002.py deleted file mode 100644 index 1bf0bbe3d..000000000 --- a/defects/odl/bench/bench-odl-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-odl-0002.py -# CWE-407: list-scan inside loop in odl-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== odl-0002: CWE-407: list-scan inside loop in odl-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/odl/bench/results.txt b/defects/odl/bench/results.txt deleted file mode 100644 index 42348dbf1..000000000 --- a/defects/odl/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== odl-0001: CWE-407: list-scan inside loop in odl-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.211ms fixed=0.022ms speedup=101.7x -N=1000 k=1000 : defective=9.156ms fixed=0.048ms speedup=192.2x -N=2000 k=2000 : defective=35.252ms fixed=0.097ms speedup=365.0x - -=== odl-0002: CWE-407: list-scan inside loop in odl-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.108ms fixed=0.021ms speedup=101.4x -N=1000 k=1000 : defective=8.736ms fixed=0.112ms speedup=78.1x -N=2000 k=2000 : defective=35.754ms fixed=0.098ms speedup=363.9x - diff --git a/defects/odl/bench/run_all.py b/defects/odl/bench/run_all.py deleted file mode 100644 index 3f8b4f1fe..000000000 --- a/defects/odl/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-odl-0001.py", "bench-odl-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ofbiz-0001/Makefile b/defects/ofbiz-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ofbiz-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ofbiz-0001/bench/bench-ofbiz-0001-0001.py b/defects/ofbiz-0001/bench/bench-ofbiz-0001-0001.py deleted file mode 100644 index 8d906426f..000000000 --- a/defects/ofbiz-0001/bench/bench-ofbiz-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ofbiz-0001-0001.py -# CWE-407: list-scan inside loop in ofbiz-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ofbiz-0001-0001: CWE-407: list-scan inside loop in ofbiz-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ofbiz-0001/bench/results.txt b/defects/ofbiz-0001/bench/results.txt deleted file mode 100644 index 2f859d58d..000000000 --- a/defects/ofbiz-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ofbiz-0001-0001: CWE-407: list-scan inside loop in ofbiz-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=100.0x -N=1000 k=1000 : defective=8.842ms fixed=0.187ms speedup=47.3x -N=2000 k=2000 : defective=35.221ms fixed=0.097ms speedup=364.9x - diff --git a/defects/ofbiz-0001/bench/run_all.py b/defects/ofbiz-0001/bench/run_all.py deleted file mode 100644 index 9b783f7db..000000000 --- a/defects/ofbiz-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ofbiz-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ofbiz-0002/Makefile b/defects/ofbiz-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ofbiz-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ofbiz-0002/bench/bench-ofbiz-0002-0002.py b/defects/ofbiz-0002/bench/bench-ofbiz-0002-0002.py deleted file mode 100644 index 0c736ca68..000000000 --- a/defects/ofbiz-0002/bench/bench-ofbiz-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ofbiz-0002-0002.py -# CWE-407: list-scan inside loop in ofbiz-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ofbiz-0002-0002: CWE-407: list-scan inside loop in ofbiz-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ofbiz-0002/bench/results.txt b/defects/ofbiz-0002/bench/results.txt deleted file mode 100644 index 2c26c9cf9..000000000 --- a/defects/ofbiz-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ofbiz-0002-0002: CWE-407: list-scan inside loop in ofbiz-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.015ms speedup=5.5x -N=500 k=500 : defective=2.109ms fixed=0.021ms speedup=100.4x -N=1000 k=1000 : defective=8.684ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=35.196ms fixed=0.096ms speedup=368.4x - diff --git a/defects/ofbiz-0002/bench/run_all.py b/defects/ofbiz-0002/bench/run_all.py deleted file mode 100644 index f71483ad3..000000000 --- a/defects/ofbiz-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ofbiz-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ogre/Makefile b/defects/ogre/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ogre/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ogre/bench/bench-ogre-0001.py b/defects/ogre/bench/bench-ogre-0001.py deleted file mode 100644 index bd75a6099..000000000 --- a/defects/ogre/bench/bench-ogre-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ogre-0001.py -# CWE-407: list-scan inside loop in ogre-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== ogre-0001: CWE-407: list-scan inside loop in ogre-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ogre/bench/bench-ogre-0002.py b/defects/ogre/bench/bench-ogre-0002.py deleted file mode 100644 index 7839f8f73..000000000 --- a/defects/ogre/bench/bench-ogre-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ogre-0002.py -# CWE-407: list-scan inside loop in ogre-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== ogre-0002: CWE-407: list-scan inside loop in ogre-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ogre/bench/bench-ogre-0003.py b/defects/ogre/bench/bench-ogre-0003.py deleted file mode 100644 index a0bb9c440..000000000 --- a/defects/ogre/bench/bench-ogre-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ogre-0003.py -# CWE-407: list-scan inside loop in ogre-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== ogre-0003: CWE-407: list-scan inside loop in ogre-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ogre/bench/results.txt b/defects/ogre/bench/results.txt deleted file mode 100644 index a5969c20c..000000000 --- a/defects/ogre/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== ogre-0001: CWE-407: list-scan inside loop in ogre-0001 (generic model) === -N=500 k=500 : defective=3.389ms fixed=0.033ms speedup=103.5x -N=2000 k=2000 : defective=41.823ms fixed=0.090ms speedup=467.2x -N=5000 k=5000 : defective=215.277ms fixed=0.224ms speedup=959.0x -N=10000 k=10000: defective=852.753ms fixed=0.488ms speedup=1748.5x - -=== ogre-0002: CWE-407: list-scan inside loop in ogre-0002 (generic model) === -N=500 k=500 : defective=2.030ms fixed=0.020ms speedup=102.8x -N=2000 k=2000 : defective=34.070ms fixed=0.093ms speedup=367.8x -N=5000 k=5000 : defective=206.364ms fixed=0.242ms speedup=853.2x -N=10000 k=10000: defective=868.075ms fixed=0.462ms speedup=1878.8x - -=== ogre-0003: CWE-407: list-scan inside loop in ogre-0003 (generic model) === -N=500 k=500 : defective=2.034ms fixed=0.019ms speedup=105.6x -N=2000 k=2000 : defective=33.050ms fixed=0.087ms speedup=379.9x -N=5000 k=5000 : defective=205.210ms fixed=0.226ms speedup=909.9x -N=10000 k=10000: defective=846.315ms fixed=0.469ms speedup=1804.5x - diff --git a/defects/ogre/bench/run_all.py b/defects/ogre/bench/run_all.py deleted file mode 100644 index 202e6ff34..000000000 --- a/defects/ogre/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ogre-0001.py", "bench-ogre-0002.py", "bench-ogre-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/okular-0001/Makefile b/defects/okular-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/okular-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/okular-0001/bench/bench-okular-0001-0001.py b/defects/okular-0001/bench/bench-okular-0001-0001.py deleted file mode 100644 index 091616e02..000000000 --- a/defects/okular-0001/bench/bench-okular-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-okular-0001-0001.py -# CWE-407: list-scan inside loop in okular-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== okular-0001-0001: CWE-407: list-scan inside loop in okular-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/okular-0001/bench/results.txt b/defects/okular-0001/bench/results.txt deleted file mode 100644 index e8df6f500..000000000 --- a/defects/okular-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== okular-0001-0001: CWE-407: list-scan inside loop in okular-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.105ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=10.292ms fixed=0.045ms speedup=226.2x -N=2000 k=2000 : defective=39.719ms fixed=0.186ms speedup=213.9x - diff --git a/defects/okular-0001/bench/run_all.py b/defects/okular-0001/bench/run_all.py deleted file mode 100644 index 281852289..000000000 --- a/defects/okular-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-okular-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ollama-0001/Makefile b/defects/ollama-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ollama-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ollama-0001/bench/bench-ollama-0001-0001.py b/defects/ollama-0001/bench/bench-ollama-0001-0001.py deleted file mode 100644 index ccf0dfac5..000000000 --- a/defects/ollama-0001/bench/bench-ollama-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ollama-0001-0001.py -# CWE-407: list-scan inside loop in ollama-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ollama-0001-0001: CWE-407: list-scan inside loop in ollama-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ollama-0001/bench/results.txt b/defects/ollama-0001/bench/results.txt deleted file mode 100644 index 357241ebd..000000000 --- a/defects/ollama-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ollama-0001-0001: CWE-407: list-scan inside loop in ollama-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.6x -N=500 k=500 : defective=2.427ms fixed=0.023ms speedup=107.7x -N=1000 k=1000 : defective=9.692ms fixed=0.046ms speedup=212.8x -N=2000 k=2000 : defective=36.262ms fixed=0.105ms speedup=346.3x - diff --git a/defects/ollama-0001/bench/run_all.py b/defects/ollama-0001/bench/run_all.py deleted file mode 100644 index 33651f259..000000000 --- a/defects/ollama-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ollama-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ompi/Makefile b/defects/ompi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ompi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ompi/bench/bench-ompi-0001.py b/defects/ompi/bench/bench-ompi-0001.py deleted file mode 100644 index 5dbbfb52e..000000000 --- a/defects/ompi/bench/bench-ompi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ompi-0001.py -# CWE-407: list-scan inside loop in ompi-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== ompi-0001: CWE-407: list-scan inside loop in ompi-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ompi/bench/results.txt b/defects/ompi/bench/results.txt deleted file mode 100644 index 7d361a973..000000000 --- a/defects/ompi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ompi-0001: CWE-407: list-scan inside loop in ompi-0001 (generic model) === -N=500 k=500 : defective=1.934ms fixed=0.019ms speedup=101.3x -N=2000 k=2000 : defective=32.599ms fixed=0.089ms speedup=365.6x -N=5000 k=5000 : defective=212.694ms fixed=0.237ms speedup=899.0x -N=10000 k=10000: defective=885.160ms fixed=0.858ms speedup=1032.1x - diff --git a/defects/ompi/bench/run_all.py b/defects/ompi/bench/run_all.py deleted file mode 100644 index 89615f75a..000000000 --- a/defects/ompi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ompi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/onlyoffice-0001/Makefile b/defects/onlyoffice-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/onlyoffice-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/onlyoffice-0001/bench/bench-onlyoffice-0001-0001.py b/defects/onlyoffice-0001/bench/bench-onlyoffice-0001-0001.py deleted file mode 100644 index 2e8ebfdb9..000000000 --- a/defects/onlyoffice-0001/bench/bench-onlyoffice-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-onlyoffice-0001-0001.py -# CWE-407: list-scan inside loop in onlyoffice-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== onlyoffice-0001-0001: CWE-407: list-scan inside loop in onlyoffice-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/onlyoffice-0001/bench/results.txt b/defects/onlyoffice-0001/bench/results.txt deleted file mode 100644 index 6dba2b77b..000000000 --- a/defects/onlyoffice-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== onlyoffice-0001-0001: CWE-407: list-scan inside loop in onlyoffice-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.345ms fixed=0.023ms speedup=101.1x -N=1000 k=1000 : defective=9.126ms fixed=0.047ms speedup=195.5x -N=2000 k=2000 : defective=35.340ms fixed=0.095ms speedup=371.1x - diff --git a/defects/onlyoffice-0001/bench/run_all.py b/defects/onlyoffice-0001/bench/run_all.py deleted file mode 100644 index 8b31ca111..000000000 --- a/defects/onlyoffice-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-onlyoffice-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/onos/Makefile b/defects/onos/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/onos/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/onos/bench/bench-onos-0001.py b/defects/onos/bench/bench-onos-0001.py deleted file mode 100644 index 92d34af0d..000000000 --- a/defects/onos/bench/bench-onos-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-onos-0001.py -# CWE-407: list-scan inside loop in onos-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== onos-0001: CWE-407: list-scan inside loop in onos-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/onos/bench/bench-onos-0002.py b/defects/onos/bench/bench-onos-0002.py deleted file mode 100644 index 423743ac0..000000000 --- a/defects/onos/bench/bench-onos-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-onos-0002.py -# CWE-407: list-scan inside loop in onos-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== onos-0002: CWE-407: list-scan inside loop in onos-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/onos/bench/bench-onos-0003.py b/defects/onos/bench/bench-onos-0003.py deleted file mode 100644 index fe7d2a0b8..000000000 --- a/defects/onos/bench/bench-onos-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-onos-0003.py -# CWE-407: list-scan inside loop in onos-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== onos-0003: CWE-407: list-scan inside loop in onos-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/onos/bench/bench-onos-0004.py b/defects/onos/bench/bench-onos-0004.py deleted file mode 100644 index 64873be81..000000000 --- a/defects/onos/bench/bench-onos-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-onos-0004.py -# ConnectivityIntentCompiler resourcesAllocated List.contains O(R×C) → O(C) with Set -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== onos-0004: ConnectivityIntentCompiler resourcesAllocated List.contains O(R×C) → O(C) with Set ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/onos/bench/results.txt b/defects/onos/bench/results.txt deleted file mode 100644 index c238b0cc2..000000000 --- a/defects/onos/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== onos-0001: CWE-407: list-scan inside loop in onos-0001 (generic model) === -N=100 k=100 : defective=0.094ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.494ms fixed=0.023ms speedup=110.1x -N=1000 k=1000 : defective=9.344ms fixed=0.045ms speedup=205.5x -N=2000 k=2000 : defective=35.764ms fixed=0.097ms speedup=369.2x - -=== onos-0002: CWE-407: list-scan inside loop in onos-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.129ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.766ms fixed=0.100ms speedup=88.0x -N=2000 k=2000 : defective=35.203ms fixed=0.103ms speedup=343.4x - -=== onos-0003: CWE-407: list-scan inside loop in onos-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.129ms fixed=0.021ms speedup=103.0x -N=1000 k=1000 : defective=8.649ms fixed=0.048ms speedup=181.7x -N=2000 k=2000 : defective=35.881ms fixed=0.098ms speedup=367.8x - -=== onos-0004: ConnectivityIntentCompiler resourcesAllocated List.contains O(R×C) → O(C) with Set === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.109ms fixed=0.020ms speedup=104.6x -N=1000 k=1000 : defective=8.636ms fixed=0.045ms speedup=191.9x -N=2000 k=2000 : defective=35.521ms fixed=0.097ms speedup=366.3x - diff --git a/defects/onos/bench/run_all.py b/defects/onos/bench/run_all.py deleted file mode 100644 index 3832bd845..000000000 --- a/defects/onos/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-onos-0001.py", "bench-onos-0002.py", "bench-onos-0003.py", "bench-onos-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/open-webui-0001/Makefile b/defects/open-webui-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/open-webui-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/open-webui-0001/bench/bench-open-webui-0001-0001.py b/defects/open-webui-0001/bench/bench-open-webui-0001-0001.py deleted file mode 100644 index 54147b938..000000000 --- a/defects/open-webui-0001/bench/bench-open-webui-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-open-webui-0001-0001.py -# CWE-407: list-scan inside loop in open-webui-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== open-webui-0001-0001: CWE-407: list-scan inside loop in open-webui-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/open-webui-0001/bench/results.txt b/defects/open-webui-0001/bench/results.txt deleted file mode 100644 index 9c5e0cd21..000000000 --- a/defects/open-webui-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== open-webui-0001-0001: CWE-407: list-scan inside loop in open-webui-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.133ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=9.019ms fixed=0.046ms speedup=196.0x -N=2000 k=2000 : defective=37.897ms fixed=0.385ms speedup=98.5x - diff --git a/defects/open-webui-0001/bench/run_all.py b/defects/open-webui-0001/bench/run_all.py deleted file mode 100644 index 0fba9ecc2..000000000 --- a/defects/open-webui-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-open-webui-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/open3d/Makefile b/defects/open3d/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/open3d/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/open3d/bench/bench-open3d-0001.py b/defects/open3d/bench/bench-open3d-0001.py deleted file mode 100644 index fd046e2e5..000000000 --- a/defects/open3d/bench/bench-open3d-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-open3d-0001.py -# ValidatePoseGraphConnectivity — O(V²×E) std::find on component vector inside BFS×edge scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== open3d-0001: ValidatePoseGraphConnectivity — O(V²×E) std::find on component vector inside BFS×edge scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/open3d/bench/bench-open3d-0002.py b/defects/open3d/bench/bench-open3d-0002.py deleted file mode 100644 index 9696ffb15..000000000 --- a/defects/open3d/bench/bench-open3d-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-open3d-0002.py -# RandomSampler::operator() — O(S²) std::find on samples vector inside rejection-sampling loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== open3d-0002: RandomSampler::operator() — O(S²) std::find on samples vector inside rejection-sampling loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/open3d/bench/results.txt b/defects/open3d/bench/results.txt deleted file mode 100644 index d76c1cb01..000000000 --- a/defects/open3d/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== open3d-0001: ValidatePoseGraphConnectivity — O(V²×E) std::find on component vector inside BFS×edge scan === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.131ms fixed=0.020ms speedup=104.6x -N=1000 k=1000 : defective=8.689ms fixed=0.046ms speedup=190.8x -N=2000 k=2000 : defective=38.009ms fixed=0.097ms speedup=390.6x - -=== open3d-0002: RandomSampler::operator() — O(S²) std::find on samples vector inside rejection-sampling loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.174ms fixed=0.021ms speedup=105.6x -N=1000 k=1000 : defective=8.740ms fixed=0.064ms speedup=136.8x -N=2000 k=2000 : defective=38.376ms fixed=0.097ms speedup=397.4x - diff --git a/defects/open3d/bench/run_all.py b/defects/open3d/bench/run_all.py deleted file mode 100644 index 74166d6de..000000000 --- a/defects/open3d/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-open3d-0001.py", "bench-open3d-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openbsd/Makefile b/defects/openbsd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openbsd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openbsd/bench/bench-openbsd-0001.py b/defects/openbsd/bench/bench-openbsd-0001.py deleted file mode 100644 index 3262b53fe..000000000 --- a/defects/openbsd/bench/bench-openbsd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openbsd-0001.py -# CWE-407: list-scan inside loop in openbsd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openbsd-0001: CWE-407: list-scan inside loop in openbsd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openbsd/bench/bench-openbsd-0002.py b/defects/openbsd/bench/bench-openbsd-0002.py deleted file mode 100644 index b1257d824..000000000 --- a/defects/openbsd/bench/bench-openbsd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openbsd-0002.py -# CWE-407: list-scan inside loop in openbsd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openbsd-0002: CWE-407: list-scan inside loop in openbsd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openbsd/bench/results.txt b/defects/openbsd/bench/results.txt deleted file mode 100644 index 62766982c..000000000 --- a/defects/openbsd/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== openbsd-0001: CWE-407: list-scan inside loop in openbsd-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.162ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.619ms fixed=0.046ms speedup=188.6x -N=2000 k=2000 : defective=36.594ms fixed=0.096ms speedup=381.3x - -=== openbsd-0002: CWE-407: list-scan inside loop in openbsd-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.105ms fixed=0.087ms speedup=24.2x -N=1000 k=1000 : defective=8.710ms fixed=0.045ms speedup=191.7x -N=2000 k=2000 : defective=35.325ms fixed=0.096ms speedup=369.7x - diff --git a/defects/openbsd/bench/run_all.py b/defects/openbsd/bench/run_all.py deleted file mode 100644 index b6a52758e..000000000 --- a/defects/openbsd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openbsd-0001.py", "bench-openbsd-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/opencv/Makefile b/defects/opencv/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/opencv/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/opencv/bench/bench-opencv-0001.py b/defects/opencv/bench/bench-opencv-0001.py deleted file mode 100644 index 74539bcc4..000000000 --- a/defects/opencv/bench/bench-opencv-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opencv-0001.py -# CWE-407: list-scan inside loop in opencv-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opencv-0001: CWE-407: list-scan inside loop in opencv-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opencv/bench/bench-opencv-0002.py b/defects/opencv/bench/bench-opencv-0002.py deleted file mode 100644 index f3593160f..000000000 --- a/defects/opencv/bench/bench-opencv-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opencv-0002.py -# G-API pattern_matching — O(M×E) std::find on patternEndOpNodes/patternStartOpNodes inside match loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opencv-0002: G-API pattern_matching — O(M×E) std::find on patternEndOpNodes/patternStartOpNodes inside match loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opencv/bench/bench-opencv-0003.py b/defects/opencv/bench/bench-opencv-0003.py deleted file mode 100644 index 9e23f2989..000000000 --- a/defects/opencv/bench/bench-opencv-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opencv-0003.py -# CWE-407: list-scan inside loop in opencv-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opencv-0003: CWE-407: list-scan inside loop in opencv-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opencv/bench/results.txt b/defects/opencv/bench/results.txt deleted file mode 100644 index 46ca60f27..000000000 --- a/defects/opencv/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== opencv-0001: CWE-407: list-scan inside loop in opencv-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.123ms fixed=0.020ms speedup=104.9x -N=1000 k=1000 : defective=8.656ms fixed=0.045ms speedup=190.9x -N=2000 k=2000 : defective=35.353ms fixed=0.096ms speedup=368.1x - -=== opencv-0002: G-API pattern_matching — O(M×E) std::find on patternEndOpNodes/patternStartOpNodes inside match loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.111ms fixed=0.021ms speedup=101.4x -N=1000 k=1000 : defective=8.684ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=34.968ms fixed=0.097ms speedup=359.2x - -=== opencv-0003: CWE-407: list-scan inside loop in opencv-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.118ms fixed=0.020ms speedup=104.8x -N=1000 k=1000 : defective=8.679ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=35.016ms fixed=0.098ms speedup=359.0x - diff --git a/defects/opencv/bench/run_all.py b/defects/opencv/bench/run_all.py deleted file mode 100644 index a9bbc1dea..000000000 --- a/defects/opencv/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-opencv-0001.py", "bench-opencv-0002.py", "bench-opencv-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openemu-0001/Makefile b/defects/openemu-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openemu-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openemu-0001/bench/bench-openemu-0001-0001.py b/defects/openemu-0001/bench/bench-openemu-0001-0001.py deleted file mode 100644 index 2b49c781d..000000000 --- a/defects/openemu-0001/bench/bench-openemu-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openemu-0001-0001.py -# CWE-407: list-scan inside loop in openemu-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openemu-0001-0001: CWE-407: list-scan inside loop in openemu-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openemu-0001/bench/results.txt b/defects/openemu-0001/bench/results.txt deleted file mode 100644 index 8fd0aa79d..000000000 --- a/defects/openemu-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openemu-0001-0001: CWE-407: list-scan inside loop in openemu-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.133ms fixed=0.020ms speedup=104.4x -N=1000 k=1000 : defective=8.688ms fixed=0.045ms speedup=192.2x -N=2000 k=2000 : defective=34.969ms fixed=0.097ms speedup=360.3x - diff --git a/defects/openemu-0001/bench/run_all.py b/defects/openemu-0001/bench/run_all.py deleted file mode 100644 index 7703a6575..000000000 --- a/defects/openemu-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openemu-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openfoam-0001/Makefile b/defects/openfoam-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openfoam-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openfoam-0001/bench/bench-openfoam-0001-0001.py b/defects/openfoam-0001/bench/bench-openfoam-0001-0001.py deleted file mode 100644 index a9aabfe37..000000000 --- a/defects/openfoam-0001/bench/bench-openfoam-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openfoam-0001-0001.py -# CWE-407: list-scan inside loop in openfoam-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openfoam-0001-0001: CWE-407: list-scan inside loop in openfoam-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openfoam-0001/bench/results.txt b/defects/openfoam-0001/bench/results.txt deleted file mode 100644 index bb2777cbd..000000000 --- a/defects/openfoam-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openfoam-0001-0001: CWE-407: list-scan inside loop in openfoam-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.380ms fixed=0.041ms speedup=58.5x -N=1000 k=1000 : defective=9.881ms fixed=0.050ms speedup=198.4x -N=2000 k=2000 : defective=37.639ms fixed=0.118ms speedup=320.3x - diff --git a/defects/openfoam-0001/bench/run_all.py b/defects/openfoam-0001/bench/run_all.py deleted file mode 100644 index 8592e46a0..000000000 --- a/defects/openfoam-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openfoam-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openfoam-0002/Makefile b/defects/openfoam-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openfoam-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openfoam-0002/bench/bench-openfoam-0002-0002.py b/defects/openfoam-0002/bench/bench-openfoam-0002-0002.py deleted file mode 100644 index a98b1015d..000000000 --- a/defects/openfoam-0002/bench/bench-openfoam-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openfoam-0002-0002.py -# CWE-407: list-scan inside loop in openfoam-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openfoam-0002-0002: CWE-407: list-scan inside loop in openfoam-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openfoam-0002/bench/results.txt b/defects/openfoam-0002/bench/results.txt deleted file mode 100644 index 1868d5cc7..000000000 --- a/defects/openfoam-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openfoam-0002-0002: CWE-407: list-scan inside loop in openfoam-0002-0002 (generic model) === -N=100 k=100 : defective=0.246ms fixed=0.015ms speedup=16.3x -N=500 k=500 : defective=2.177ms fixed=0.021ms speedup=104.9x -N=1000 k=1000 : defective=9.584ms fixed=0.046ms speedup=207.4x -N=2000 k=2000 : defective=35.977ms fixed=0.098ms speedup=368.4x - diff --git a/defects/openfoam-0002/bench/run_all.py b/defects/openfoam-0002/bench/run_all.py deleted file mode 100644 index 87b083986..000000000 --- a/defects/openfoam-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openfoam-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openfoam-0003/Makefile b/defects/openfoam-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openfoam-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openfoam-0003/bench/bench-openfoam-0003-0003.py b/defects/openfoam-0003/bench/bench-openfoam-0003-0003.py deleted file mode 100644 index 58b505a07..000000000 --- a/defects/openfoam-0003/bench/bench-openfoam-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openfoam-0003-0003.py -# CWE-407: list-scan inside loop in openfoam-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openfoam-0003-0003: CWE-407: list-scan inside loop in openfoam-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openfoam-0003/bench/results.txt b/defects/openfoam-0003/bench/results.txt deleted file mode 100644 index 8a777bda4..000000000 --- a/defects/openfoam-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openfoam-0003-0003: CWE-407: list-scan inside loop in openfoam-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.420ms fixed=0.024ms speedup=102.9x -N=1000 k=1000 : defective=9.958ms fixed=0.053ms speedup=187.9x -N=2000 k=2000 : defective=38.289ms fixed=0.097ms speedup=396.3x - diff --git a/defects/openfoam-0003/bench/run_all.py b/defects/openfoam-0003/bench/run_all.py deleted file mode 100644 index 9440f2dcc..000000000 --- a/defects/openfoam-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openfoam-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openmsx-0001/Makefile b/defects/openmsx-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openmsx-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openmsx-0001/bench/bench-openmsx-0001-0001.py b/defects/openmsx-0001/bench/bench-openmsx-0001-0001.py deleted file mode 100644 index 6e77ca2ca..000000000 --- a/defects/openmsx-0001/bench/bench-openmsx-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openmsx-0001-0001.py -# CWE-407: list-scan inside loop in openmsx-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openmsx-0001-0001: CWE-407: list-scan inside loop in openmsx-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openmsx-0001/bench/results.txt b/defects/openmsx-0001/bench/results.txt deleted file mode 100644 index 52fd5c174..000000000 --- a/defects/openmsx-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openmsx-0001-0001: CWE-407: list-scan inside loop in openmsx-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.339ms fixed=0.023ms speedup=103.0x -N=1000 k=1000 : defective=9.702ms fixed=0.050ms speedup=193.8x -N=2000 k=2000 : defective=37.220ms fixed=0.096ms speedup=388.8x - diff --git a/defects/openmsx-0001/bench/run_all.py b/defects/openmsx-0001/bench/run_all.py deleted file mode 100644 index 61ba9b61b..000000000 --- a/defects/openmsx-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openmsx-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openmw-0001/Makefile b/defects/openmw-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openmw-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openmw-0001/bench/bench-openmw-0001-0001.py b/defects/openmw-0001/bench/bench-openmw-0001-0001.py deleted file mode 100644 index dcef19af7..000000000 --- a/defects/openmw-0001/bench/bench-openmw-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openmw-0001-0001.py -# CWE-407: list-scan inside loop in openmw-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openmw-0001-0001: CWE-407: list-scan inside loop in openmw-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openmw-0001/bench/results.txt b/defects/openmw-0001/bench/results.txt deleted file mode 100644 index 6193571bc..000000000 --- a/defects/openmw-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openmw-0001-0001: CWE-407: list-scan inside loop in openmw-0001-0001 (generic model) === -N=100 k=100 : defective=0.269ms fixed=0.004ms speedup=75.3x -N=500 k=500 : defective=2.313ms fixed=0.022ms speedup=103.0x -N=1000 k=1000 : defective=9.094ms fixed=0.048ms speedup=189.2x -N=2000 k=2000 : defective=35.662ms fixed=0.096ms speedup=370.4x - diff --git a/defects/openmw-0001/bench/run_all.py b/defects/openmw-0001/bench/run_all.py deleted file mode 100644 index 916867e3f..000000000 --- a/defects/openmw-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openmw-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openmw-0002/Makefile b/defects/openmw-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openmw-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openmw-0002/bench/bench-openmw-0002-0002.py b/defects/openmw-0002/bench/bench-openmw-0002-0002.py deleted file mode 100644 index 3f227431b..000000000 --- a/defects/openmw-0002/bench/bench-openmw-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openmw-0002-0002.py -# CWE-407: list-scan inside loop in openmw-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openmw-0002-0002: CWE-407: list-scan inside loop in openmw-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openmw-0002/bench/results.txt b/defects/openmw-0002/bench/results.txt deleted file mode 100644 index 03af2f953..000000000 --- a/defects/openmw-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openmw-0002-0002: CWE-407: list-scan inside loop in openmw-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.190ms fixed=0.021ms speedup=104.4x -N=1000 k=1000 : defective=8.902ms fixed=0.046ms speedup=192.8x -N=2000 k=2000 : defective=38.881ms fixed=0.159ms speedup=243.8x - diff --git a/defects/openmw-0002/bench/run_all.py b/defects/openmw-0002/bench/run_all.py deleted file mode 100644 index 310b1e08e..000000000 --- a/defects/openmw-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openmw-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openmw-0003/Makefile b/defects/openmw-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openmw-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openmw-0003/bench/bench-openmw-0003-0003.py b/defects/openmw-0003/bench/bench-openmw-0003-0003.py deleted file mode 100644 index 6154cc905..000000000 --- a/defects/openmw-0003/bench/bench-openmw-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openmw-0003-0003.py -# CWE-407: list-scan inside loop in openmw-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openmw-0003-0003: CWE-407: list-scan inside loop in openmw-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openmw-0003/bench/results.txt b/defects/openmw-0003/bench/results.txt deleted file mode 100644 index 1097ea215..000000000 --- a/defects/openmw-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openmw-0003-0003: CWE-407: list-scan inside loop in openmw-0003-0003 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.743ms fixed=0.026ms speedup=107.1x -N=1000 k=1000 : defective=11.342ms fixed=0.057ms speedup=199.7x -N=2000 k=2000 : defective=36.265ms fixed=0.095ms speedup=383.6x - diff --git a/defects/openmw-0003/bench/run_all.py b/defects/openmw-0003/bench/run_all.py deleted file mode 100644 index 313435147..000000000 --- a/defects/openmw-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openmw-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openmw-0004/Makefile b/defects/openmw-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openmw-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openmw-0004/bench/bench-openmw-0004-0004.py b/defects/openmw-0004/bench/bench-openmw-0004-0004.py deleted file mode 100644 index d123e760f..000000000 --- a/defects/openmw-0004/bench/bench-openmw-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openmw-0004-0004.py -# CWE-407: list-scan inside loop in openmw-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openmw-0004-0004: CWE-407: list-scan inside loop in openmw-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openmw-0004/bench/results.txt b/defects/openmw-0004/bench/results.txt deleted file mode 100644 index 569ca7376..000000000 --- a/defects/openmw-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openmw-0004-0004: CWE-407: list-scan inside loop in openmw-0004-0004 (generic model) === -N=100 k=100 : defective=0.189ms fixed=0.006ms speedup=29.8x -N=500 k=500 : defective=4.372ms fixed=0.025ms speedup=172.9x -N=1000 k=1000 : defective=12.002ms fixed=0.055ms speedup=217.3x -N=2000 k=2000 : defective=40.909ms fixed=0.096ms speedup=425.2x - diff --git a/defects/openmw-0004/bench/run_all.py b/defects/openmw-0004/bench/run_all.py deleted file mode 100644 index f3ed63eae..000000000 --- a/defects/openmw-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openmw-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openoffice-0001/Makefile b/defects/openoffice-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openoffice-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openoffice-0001/bench/bench-openoffice-0001-0001.py b/defects/openoffice-0001/bench/bench-openoffice-0001-0001.py deleted file mode 100644 index 2516d0221..000000000 --- a/defects/openoffice-0001/bench/bench-openoffice-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openoffice-0001-0001.py -# CWE-407: list-scan inside loop in openoffice-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openoffice-0001-0001: CWE-407: list-scan inside loop in openoffice-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openoffice-0001/bench/results.txt b/defects/openoffice-0001/bench/results.txt deleted file mode 100644 index 7e339e4cd..000000000 --- a/defects/openoffice-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openoffice-0001-0001: CWE-407: list-scan inside loop in openoffice-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.315ms fixed=0.022ms speedup=103.3x -N=1000 k=1000 : defective=9.613ms fixed=0.051ms speedup=186.8x -N=2000 k=2000 : defective=37.926ms fixed=0.098ms speedup=387.3x - diff --git a/defects/openoffice-0001/bench/run_all.py b/defects/openoffice-0001/bench/run_all.py deleted file mode 100644 index eaf22dba0..000000000 --- a/defects/openoffice-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openoffice-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openoffice-0002/Makefile b/defects/openoffice-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openoffice-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openoffice-0002/bench/bench-openoffice-0002-0002.py b/defects/openoffice-0002/bench/bench-openoffice-0002-0002.py deleted file mode 100644 index 7eba20fb3..000000000 --- a/defects/openoffice-0002/bench/bench-openoffice-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openoffice-0002-0002.py -# CWE-407: list-scan inside loop in openoffice-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openoffice-0002-0002: CWE-407: list-scan inside loop in openoffice-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openoffice-0002/bench/results.txt b/defects/openoffice-0002/bench/results.txt deleted file mode 100644 index 2e90c02af..000000000 --- a/defects/openoffice-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openoffice-0002-0002: CWE-407: list-scan inside loop in openoffice-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.311ms fixed=0.022ms speedup=105.9x -N=1000 k=1000 : defective=8.805ms fixed=0.051ms speedup=173.1x -N=2000 k=2000 : defective=38.348ms fixed=0.105ms speedup=364.4x - diff --git a/defects/openoffice-0002/bench/run_all.py b/defects/openoffice-0002/bench/run_all.py deleted file mode 100644 index 1c7e6e85e..000000000 --- a/defects/openoffice-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openoffice-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openscad-0001/Makefile b/defects/openscad-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openscad-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openscad-0001/bench/bench-openscad-0001-0001.py b/defects/openscad-0001/bench/bench-openscad-0001-0001.py deleted file mode 100644 index a0c1cae90..000000000 --- a/defects/openscad-0001/bench/bench-openscad-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0001-0001.py -# CWE-407: list-scan inside loop in openscad-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0001-0001: CWE-407: list-scan inside loop in openscad-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad-0001/bench/bench-openscad-0001.py b/defects/openscad-0001/bench/bench-openscad-0001.py deleted file mode 100644 index 8799ce699..000000000 --- a/defects/openscad-0001/bench/bench-openscad-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0001.py -# CWE-407: list-scan inside loop in openscad-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0001: CWE-407: list-scan inside loop in openscad-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad-0001/bench/results.txt b/defects/openscad-0001/bench/results.txt deleted file mode 100644 index d398a00c8..000000000 --- a/defects/openscad-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== openscad-0001-0001: CWE-407: list-scan inside loop in openscad-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.308ms fixed=0.022ms speedup=103.5x -N=1000 k=1000 : defective=10.699ms fixed=0.051ms speedup=211.3x -N=2000 k=2000 : defective=37.328ms fixed=0.097ms speedup=383.6x - -=== openscad-0001: CWE-407: list-scan inside loop in openscad-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.126ms fixed=0.021ms speedup=102.6x -N=1000 k=1000 : defective=8.669ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=37.438ms fixed=0.097ms speedup=385.1x - diff --git a/defects/openscad-0001/bench/run_all.py b/defects/openscad-0001/bench/run_all.py deleted file mode 100644 index 49efd442b..000000000 --- a/defects/openscad-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openscad-0001-0001.py", "bench-openscad-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openscad-0002/Makefile b/defects/openscad-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openscad-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openscad-0002/bench/bench-openscad-0002-0002.py b/defects/openscad-0002/bench/bench-openscad-0002-0002.py deleted file mode 100644 index 00f9e57d1..000000000 --- a/defects/openscad-0002/bench/bench-openscad-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0002-0002.py -# CWE-407: list-scan inside loop in openscad-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0002-0002: CWE-407: list-scan inside loop in openscad-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad-0002/bench/results.txt b/defects/openscad-0002/bench/results.txt deleted file mode 100644 index 154467f95..000000000 --- a/defects/openscad-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openscad-0002-0002: CWE-407: list-scan inside loop in openscad-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.323ms fixed=0.023ms speedup=102.1x -N=1000 k=1000 : defective=9.701ms fixed=0.094ms speedup=103.3x -N=2000 k=2000 : defective=40.559ms fixed=0.097ms speedup=417.7x - diff --git a/defects/openscad-0002/bench/run_all.py b/defects/openscad-0002/bench/run_all.py deleted file mode 100644 index 462e2e522..000000000 --- a/defects/openscad-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openscad-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openscad-0003/Makefile b/defects/openscad-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openscad-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openscad-0003/bench/bench-openscad-0003-0003.py b/defects/openscad-0003/bench/bench-openscad-0003-0003.py deleted file mode 100644 index e6f534dfe..000000000 --- a/defects/openscad-0003/bench/bench-openscad-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0003-0003.py -# CWE-407: list-scan inside loop in openscad-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0003-0003: CWE-407: list-scan inside loop in openscad-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad-0003/bench/results.txt b/defects/openscad-0003/bench/results.txt deleted file mode 100644 index 1ca03b23e..000000000 --- a/defects/openscad-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openscad-0003-0003: CWE-407: list-scan inside loop in openscad-0003-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.289ms fixed=0.022ms speedup=104.8x -N=1000 k=1000 : defective=8.624ms fixed=0.045ms speedup=190.4x -N=2000 k=2000 : defective=34.971ms fixed=0.095ms speedup=369.5x - diff --git a/defects/openscad-0003/bench/run_all.py b/defects/openscad-0003/bench/run_all.py deleted file mode 100644 index 512d4b466..000000000 --- a/defects/openscad-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openscad-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openscad/Makefile b/defects/openscad/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openscad/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openscad/bench/bench-openscad-0001-0001.py b/defects/openscad/bench/bench-openscad-0001-0001.py deleted file mode 100644 index a0c1cae90..000000000 --- a/defects/openscad/bench/bench-openscad-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0001-0001.py -# CWE-407: list-scan inside loop in openscad-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0001-0001: CWE-407: list-scan inside loop in openscad-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad/bench/bench-openscad-0001.py b/defects/openscad/bench/bench-openscad-0001.py deleted file mode 100644 index 8799ce699..000000000 --- a/defects/openscad/bench/bench-openscad-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0001.py -# CWE-407: list-scan inside loop in openscad-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0001: CWE-407: list-scan inside loop in openscad-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad/bench/bench-openscad-0002-0002.py b/defects/openscad/bench/bench-openscad-0002-0002.py deleted file mode 100644 index 00f9e57d1..000000000 --- a/defects/openscad/bench/bench-openscad-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0002-0002.py -# CWE-407: list-scan inside loop in openscad-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0002-0002: CWE-407: list-scan inside loop in openscad-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad/bench/bench-openscad-0003-0003.py b/defects/openscad/bench/bench-openscad-0003-0003.py deleted file mode 100644 index e6f534dfe..000000000 --- a/defects/openscad/bench/bench-openscad-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openscad-0003-0003.py -# CWE-407: list-scan inside loop in openscad-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openscad-0003-0003: CWE-407: list-scan inside loop in openscad-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openscad/bench/results.txt b/defects/openscad/bench/results.txt deleted file mode 100644 index 6484cb1e4..000000000 --- a/defects/openscad/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== openscad-0001-0001: CWE-407: list-scan inside loop in openscad-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.354ms fixed=0.023ms speedup=103.9x -N=1000 k=1000 : defective=11.586ms fixed=0.050ms speedup=231.8x -N=2000 k=2000 : defective=40.584ms fixed=0.179ms speedup=226.6x - -=== openscad-0001: CWE-407: list-scan inside loop in openscad-0001 (generic model) === -N=100 k=100 : defective=0.094ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.412ms fixed=0.023ms speedup=104.9x -N=1000 k=1000 : defective=9.998ms fixed=0.047ms speedup=213.4x -N=2000 k=2000 : defective=44.641ms fixed=0.098ms speedup=457.7x - -=== openscad-0002-0002: CWE-407: list-scan inside loop in openscad-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.005ms speedup=17.4x -N=500 k=500 : defective=3.620ms fixed=0.023ms speedup=158.5x -N=1000 k=1000 : defective=9.683ms fixed=0.049ms speedup=198.3x -N=2000 k=2000 : defective=41.273ms fixed=0.097ms speedup=423.5x - -=== openscad-0003-0003: CWE-407: list-scan inside loop in openscad-0003-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.128ms fixed=0.021ms speedup=99.8x -N=1000 k=1000 : defective=9.077ms fixed=0.046ms speedup=198.2x -N=2000 k=2000 : defective=40.013ms fixed=0.166ms speedup=240.8x - diff --git a/defects/openscad/bench/run_all.py b/defects/openscad/bench/run_all.py deleted file mode 100644 index 32ce73ae9..000000000 --- a/defects/openscad/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openscad-0001-0001.py", "bench-openscad-0001.py", "bench-openscad-0002-0002.py", "bench-openscad-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/opensearch/Makefile b/defects/opensearch/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/opensearch/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/opensearch/bench/bench-opensearch-0001.py b/defects/opensearch/bench/bench-opensearch-0001.py deleted file mode 100644 index 7bad1e46e..000000000 --- a/defects/opensearch/bench/bench-opensearch-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensearch-0001.py -# CWE-407: list-scan inside loop in opensearch-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensearch-0001: CWE-407: list-scan inside loop in opensearch-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensearch/bench/bench-opensearch-001.py b/defects/opensearch/bench/bench-opensearch-001.py deleted file mode 100644 index 3644dc728..000000000 --- a/defects/opensearch/bench/bench-opensearch-001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensearch-001.py -# ImmutableCacheStatsHolder O(n²) levelsList.contains in filterLevels -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensearch-001: ImmutableCacheStatsHolder O(n²) levelsList.contains in filterLevels ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensearch/bench/bench-opensearch-002.py b/defects/opensearch/bench/bench-opensearch-002.py deleted file mode 100644 index 3dd7522a7..000000000 --- a/defects/opensearch/bench/bench-opensearch-002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensearch-002.py -# MustToFilterRewriter O(n²) mustClausesToMove.contains in copy loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensearch-002: MustToFilterRewriter O(n²) mustClausesToMove.contains in copy loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensearch/bench/bench-opensearch-003.py b/defects/opensearch/bench/bench-opensearch-003.py deleted file mode 100644 index 1b701fd84..000000000 --- a/defects/opensearch/bench/bench-opensearch-003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensearch-003.py -# IndexShardRoutingTable O(n²) weightedRoutings.contains in filter stream -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensearch-003: IndexShardRoutingTable O(n²) weightedRoutings.contains in filter stream ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensearch/bench/bench-opensearch-004.py b/defects/opensearch/bench/bench-opensearch-004.py deleted file mode 100644 index fd8910d9e..000000000 --- a/defects/opensearch/bench/bench-opensearch-004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensearch-004.py -# TransportSegmentReplicationStatsAction O(n²) shardsToFetch.contains in response loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensearch-004: TransportSegmentReplicationStatsAction O(n²) shardsToFetch.contains in response loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensearch/bench/bench-opensearch-005.py b/defects/opensearch/bench/bench-opensearch-005.py deleted file mode 100644 index e178ba830..000000000 --- a/defects/opensearch/bench/bench-opensearch-005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensearch-005.py -# IndexGraveyard.containsIndex O(n²) List scan in DanglingIndicesState loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensearch-005: IndexGraveyard.containsIndex O(n²) List scan in DanglingIndicesState loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensearch/bench/results.txt b/defects/opensearch/bench/results.txt deleted file mode 100644 index 076f582bc..000000000 --- a/defects/opensearch/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== opensearch-0001: CWE-407: list-scan inside loop in opensearch-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.950ms fixed=0.028ms speedup=104.6x -N=1000 k=1000 : defective=16.151ms fixed=0.063ms speedup=254.6x -N=2000 k=2000 : defective=38.097ms fixed=0.100ms speedup=382.1x - -=== opensearch-001: ImmutableCacheStatsHolder O(n²) levelsList.contains in filterLevels === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.114ms fixed=0.021ms speedup=101.6x -N=1000 k=1000 : defective=10.494ms fixed=0.050ms speedup=208.9x -N=2000 k=2000 : defective=39.099ms fixed=0.096ms speedup=407.8x - -=== opensearch-002: MustToFilterRewriter O(n²) mustClausesToMove.contains in copy loop === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.167ms fixed=0.021ms speedup=105.3x -N=1000 k=1000 : defective=8.623ms fixed=0.046ms speedup=186.8x -N=2000 k=2000 : defective=38.209ms fixed=0.107ms speedup=357.5x - -=== opensearch-003: IndexShardRoutingTable O(n²) weightedRoutings.contains in filter stream === -N=100 k=100 : defective=0.164ms fixed=0.006ms speedup=26.3x -N=500 k=500 : defective=2.840ms fixed=0.025ms speedup=111.9x -N=1000 k=1000 : defective=12.596ms fixed=0.051ms speedup=247.4x -N=2000 k=2000 : defective=38.009ms fixed=0.097ms speedup=391.9x - -=== opensearch-004: TransportSegmentReplicationStatsAction O(n²) shardsToFetch.contains in response loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.108ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=9.847ms fixed=0.139ms speedup=71.0x -N=2000 k=2000 : defective=40.496ms fixed=0.109ms speedup=370.7x - -=== opensearch-005: IndexGraveyard.containsIndex O(n²) List scan in DanglingIndicesState loop === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.199ms fixed=0.022ms speedup=102.2x -N=1000 k=1000 : defective=8.643ms fixed=0.046ms speedup=188.4x -N=2000 k=2000 : defective=38.552ms fixed=0.105ms speedup=366.0x - diff --git a/defects/opensearch/bench/run_all.py b/defects/opensearch/bench/run_all.py deleted file mode 100644 index 3530e309c..000000000 --- a/defects/opensearch/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-opensearch-0001.py", "bench-opensearch-001.py", "bench-opensearch-002.py", "bench-opensearch-003.py", "bench-opensearch-004.py", "bench-opensearch-005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openshot-0001/Makefile b/defects/openshot-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openshot-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openshot-0001/bench/bench-openshot-0001-0001.py b/defects/openshot-0001/bench/bench-openshot-0001-0001.py deleted file mode 100644 index 48b1cc991..000000000 --- a/defects/openshot-0001/bench/bench-openshot-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openshot-0001-0001.py -# CWE-407: list-scan inside loop in openshot-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openshot-0001-0001: CWE-407: list-scan inside loop in openshot-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openshot-0001/bench/results.txt b/defects/openshot-0001/bench/results.txt deleted file mode 100644 index 5bacfe1ed..000000000 --- a/defects/openshot-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openshot-0001-0001: CWE-407: list-scan inside loop in openshot-0001-0001 (generic model) === -N=100 k=100 : defective=0.277ms fixed=0.015ms speedup=18.9x -N=500 k=500 : defective=4.597ms fixed=0.044ms speedup=104.8x -N=1000 k=1000 : defective=18.961ms fixed=0.095ms speedup=199.3x -N=2000 k=2000 : defective=35.041ms fixed=0.097ms speedup=362.0x - diff --git a/defects/openshot-0001/bench/run_all.py b/defects/openshot-0001/bench/run_all.py deleted file mode 100644 index 1bb8680dd..000000000 --- a/defects/openshot-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openshot-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/opensmtpd/Makefile b/defects/opensmtpd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/opensmtpd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/opensmtpd/bench/bench-opensmtpd-0001.py b/defects/opensmtpd/bench/bench-opensmtpd-0001.py deleted file mode 100644 index 68fdb4e88..000000000 --- a/defects/opensmtpd/bench/bench-opensmtpd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensmtpd-0001.py -# CWE-407: list-scan inside loop in opensmtpd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensmtpd-0001: CWE-407: list-scan inside loop in opensmtpd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensmtpd/bench/bench-opensmtpd-0002.py b/defects/opensmtpd/bench/bench-opensmtpd-0002.py deleted file mode 100644 index 3c0e1bab5..000000000 --- a/defects/opensmtpd/bench/bench-opensmtpd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opensmtpd-0002.py -# CWE-407: list-scan inside loop in opensmtpd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opensmtpd-0002: CWE-407: list-scan inside loop in opensmtpd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opensmtpd/bench/results.txt b/defects/opensmtpd/bench/results.txt deleted file mode 100644 index 1721f1609..000000000 --- a/defects/opensmtpd/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== opensmtpd-0001: CWE-407: list-scan inside loop in opensmtpd-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.352ms fixed=0.022ms speedup=105.0x -N=1000 k=1000 : defective=10.205ms fixed=0.047ms speedup=214.9x -N=2000 k=2000 : defective=34.812ms fixed=0.096ms speedup=363.3x - -=== opensmtpd-0002: CWE-407: list-scan inside loop in opensmtpd-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.109ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=8.942ms fixed=0.046ms speedup=195.7x -N=2000 k=2000 : defective=34.737ms fixed=0.096ms speedup=360.6x - diff --git a/defects/opensmtpd/bench/run_all.py b/defects/opensmtpd/bench/run_all.py deleted file mode 100644 index af9826ae1..000000000 --- a/defects/opensmtpd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-opensmtpd-0001.py", "bench-opensmtpd-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openssh/Makefile b/defects/openssh/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openssh/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openssh/bench/bench-openssh-0001.py b/defects/openssh/bench/bench-openssh-0001.py deleted file mode 100644 index 1fd551de6..000000000 --- a/defects/openssh/bench/bench-openssh-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openssh-0001.py -# CWE-407 O(N²) dedup in kex_assemble_server_sig_algs via match_list inside loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openssh-0001: CWE-407 O(N²) dedup in kex_assemble_server_sig_algs via match_list inside loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openssh/bench/bench-openssh-0002.py b/defects/openssh/bench/bench-openssh-0002.py deleted file mode 100644 index da5ef7f6f..000000000 --- a/defects/openssh/bench/bench-openssh-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openssh-0002.py -# CWE-407 O(N²) dedup in kex_names_cat via match_list inside loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openssh-0002: CWE-407 O(N²) dedup in kex_names_cat via match_list inside loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openssh/bench/results.txt b/defects/openssh/bench/results.txt deleted file mode 100644 index ebb048cb5..000000000 --- a/defects/openssh/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== openssh-0001: CWE-407 O(N²) dedup in kex_assemble_server_sig_algs via match_list inside loop === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.306ms fixed=0.022ms speedup=102.5x -N=1000 k=1000 : defective=9.882ms fixed=0.052ms speedup=188.8x -N=2000 k=2000 : defective=43.199ms fixed=0.105ms speedup=411.2x - -=== openssh-0002: CWE-407 O(N²) dedup in kex_names_cat via match_list inside loop === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.333ms fixed=0.022ms speedup=107.1x -N=1000 k=1000 : defective=8.636ms fixed=0.047ms speedup=183.2x -N=2000 k=2000 : defective=35.803ms fixed=0.111ms speedup=324.0x - diff --git a/defects/openssh/bench/run_all.py b/defects/openssh/bench/run_all.py deleted file mode 100644 index 39894318b..000000000 --- a/defects/openssh/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openssh-0001.py", "bench-openssh-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openssl/Makefile b/defects/openssl/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openssl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openssl/bench/bench-openssl-0001.py b/defects/openssl/bench/bench-openssl-0001.py deleted file mode 100644 index ad23b01ad..000000000 --- a/defects/openssl/bench/bench-openssl-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openssl-0001.py -# CWE-407: list-scan inside loop in openssl-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openssl-0001: CWE-407: list-scan inside loop in openssl-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openssl/bench/bench-openssl-0002.py b/defects/openssl/bench/bench-openssl-0002.py deleted file mode 100644 index 8a3944251..000000000 --- a/defects/openssl/bench/bench-openssl-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openssl-0002.py -# CWE-407: list-scan inside loop in openssl-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openssl-0002: CWE-407: list-scan inside loop in openssl-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openssl/bench/bench-openssl-0003.py b/defects/openssl/bench/bench-openssl-0003.py deleted file mode 100644 index 4bd6a5e62..000000000 --- a/defects/openssl/bench/bench-openssl-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openssl-0003.py -# CWE-407 O(C×S) SRTP profile matching in tls_parse_ctos_use_srtp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openssl-0003: CWE-407 O(C×S) SRTP profile matching in tls_parse_ctos_use_srtp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openssl/bench/bench-openssl-0004.py b/defects/openssl/bench/bench-openssl-0004.py deleted file mode 100644 index 99d609186..000000000 --- a/defects/openssl/bench/bench-openssl-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openssl-0004.py -# CWE-407 O(N²) CA name dedup in SSL_add_store_cert_subjects_to_stack -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openssl-0004: CWE-407 O(N²) CA name dedup in SSL_add_store_cert_subjects_to_stack ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openssl/bench/results.txt b/defects/openssl/bench/results.txt deleted file mode 100644 index a51028fb3..000000000 --- a/defects/openssl/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== openssl-0001: CWE-407: list-scan inside loop in openssl-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.536ms fixed=0.025ms speedup=100.5x -N=1000 k=1000 : defective=11.429ms fixed=0.058ms speedup=196.8x -N=2000 k=2000 : defective=43.098ms fixed=0.099ms speedup=436.1x - -=== openssl-0002: CWE-407: list-scan inside loop in openssl-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.255ms fixed=0.021ms speedup=106.7x -N=1000 k=1000 : defective=8.595ms fixed=0.046ms speedup=188.6x -N=2000 k=2000 : defective=38.937ms fixed=0.096ms speedup=406.7x - -=== openssl-0003: CWE-407 O(C×S) SRTP profile matching in tls_parse_ctos_use_srtp === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.144ms fixed=0.020ms speedup=104.8x -N=1000 k=1000 : defective=9.001ms fixed=0.047ms speedup=189.9x -N=2000 k=2000 : defective=35.703ms fixed=0.096ms speedup=371.4x - -=== openssl-0004: CWE-407 O(N²) CA name dedup in SSL_add_store_cert_subjects_to_stack === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.268ms fixed=0.020ms speedup=111.4x -N=1000 k=1000 : defective=8.704ms fixed=0.046ms speedup=188.8x -N=2000 k=2000 : defective=35.279ms fixed=0.096ms speedup=366.3x - diff --git a/defects/openssl/bench/run_all.py b/defects/openssl/bench/run_all.py deleted file mode 100644 index 7d0a7bded..000000000 --- a/defects/openssl/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openssl-0001.py", "bench-openssl-0002.py", "bench-openssl-0003.py", "bench-openssl-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/opentofu/Makefile b/defects/opentofu/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/opentofu/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/opentofu/bench/bench-opentofu-0001.py b/defects/opentofu/bench/bench-opentofu-0001.py deleted file mode 100644 index fd3bd2e71..000000000 --- a/defects/opentofu/bench/bench-opentofu-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opentofu-0001.py -# filterTfPathsWithTofuAlternatives O(N²) path scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opentofu-0001: filterTfPathsWithTofuAlternatives O(N²) path scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opentofu/bench/bench-opentofu-0002.py b/defects/opentofu/bench/bench-opentofu-0002.py deleted file mode 100644 index 74f1d3531..000000000 --- a/defects/opentofu/bench/bench-opentofu-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opentofu-0002.py -# readConfigSnapshot manifest validation O(M²) linear scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opentofu-0002: readConfigSnapshot manifest validation O(M²) linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opentofu/bench/results.txt b/defects/opentofu/bench/results.txt deleted file mode 100644 index 1f4dd6d5e..000000000 --- a/defects/opentofu/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== opentofu-0001: filterTfPathsWithTofuAlternatives O(N²) path scan === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.423ms fixed=0.023ms speedup=104.6x -N=1000 k=1000 : defective=11.420ms fixed=0.051ms speedup=225.8x -N=2000 k=2000 : defective=34.733ms fixed=0.095ms speedup=363.8x - -=== opentofu-0002: readConfigSnapshot manifest validation O(M²) linear scan === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.114ms fixed=0.021ms speedup=102.2x -N=1000 k=1000 : defective=8.632ms fixed=0.046ms speedup=186.9x -N=2000 k=2000 : defective=35.844ms fixed=0.096ms speedup=374.6x - diff --git a/defects/opentofu/bench/run_all.py b/defects/opentofu/bench/run_all.py deleted file mode 100644 index 9b2114ce0..000000000 --- a/defects/opentofu/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-opentofu-0001.py", "bench-opentofu-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/opentoonz-0001/Makefile b/defects/opentoonz-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/opentoonz-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/opentoonz-0001/bench/bench-opentoonz-0001-0001.py b/defects/opentoonz-0001/bench/bench-opentoonz-0001-0001.py deleted file mode 100644 index bb3d30c85..000000000 --- a/defects/opentoonz-0001/bench/bench-opentoonz-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-opentoonz-0001-0001.py -# CWE-407: list-scan inside loop in opentoonz-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== opentoonz-0001-0001: CWE-407: list-scan inside loop in opentoonz-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/opentoonz-0001/bench/results.txt b/defects/opentoonz-0001/bench/results.txt deleted file mode 100644 index afaf2dfbe..000000000 --- a/defects/opentoonz-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== opentoonz-0001-0001: CWE-407: list-scan inside loop in opentoonz-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.172ms fixed=0.020ms speedup=107.7x -N=1000 k=1000 : defective=8.561ms fixed=0.045ms speedup=191.6x -N=2000 k=2000 : defective=34.660ms fixed=0.095ms speedup=363.3x - diff --git a/defects/opentoonz-0001/bench/run_all.py b/defects/opentoonz-0001/bench/run_all.py deleted file mode 100644 index 7b2757f0e..000000000 --- a/defects/opentoonz-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-opentoonz-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openttd-0001/Makefile b/defects/openttd-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openttd-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openttd-0001/bench/bench-openttd-0001-0001.py b/defects/openttd-0001/bench/bench-openttd-0001-0001.py deleted file mode 100644 index c856839ab..000000000 --- a/defects/openttd-0001/bench/bench-openttd-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openttd-0001-0001.py -# CWE-407: list-scan inside loop in openttd-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openttd-0001-0001: CWE-407: list-scan inside loop in openttd-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openttd-0001/bench/results.txt b/defects/openttd-0001/bench/results.txt deleted file mode 100644 index 05fe911dc..000000000 --- a/defects/openttd-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openttd-0001-0001: CWE-407: list-scan inside loop in openttd-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.357ms fixed=0.024ms speedup=99.1x -N=1000 k=1000 : defective=9.384ms fixed=0.045ms speedup=206.9x -N=2000 k=2000 : defective=37.949ms fixed=0.106ms speedup=359.6x - diff --git a/defects/openttd-0001/bench/run_all.py b/defects/openttd-0001/bench/run_all.py deleted file mode 100644 index 882f4b5f5..000000000 --- a/defects/openttd-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openttd-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openttd-0002/Makefile b/defects/openttd-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openttd-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openttd-0002/bench/bench-openttd-0002-0002.py b/defects/openttd-0002/bench/bench-openttd-0002-0002.py deleted file mode 100644 index 6a49130ed..000000000 --- a/defects/openttd-0002/bench/bench-openttd-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openttd-0002-0002.py -# CWE-407: list-scan inside loop in openttd-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openttd-0002-0002: CWE-407: list-scan inside loop in openttd-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openttd-0002/bench/results.txt b/defects/openttd-0002/bench/results.txt deleted file mode 100644 index 4644f8e48..000000000 --- a/defects/openttd-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openttd-0002-0002: CWE-407: list-scan inside loop in openttd-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.459ms fixed=0.024ms speedup=102.3x -N=1000 k=1000 : defective=9.369ms fixed=0.045ms speedup=209.3x -N=2000 k=2000 : defective=35.255ms fixed=0.095ms speedup=369.4x - diff --git a/defects/openttd-0002/bench/run_all.py b/defects/openttd-0002/bench/run_all.py deleted file mode 100644 index 626cfd2f7..000000000 --- a/defects/openttd-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openttd-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openvpn/Makefile b/defects/openvpn/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openvpn/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openvpn/bench/bench-openvpn-0001.py b/defects/openvpn/bench/bench-openvpn-0001.py deleted file mode 100644 index 35e47d58f..000000000 --- a/defects/openvpn/bench/bench-openvpn-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openvpn-0001.py -# CWE-407: list-scan inside loop in openvpn-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openvpn-0001: CWE-407: list-scan inside loop in openvpn-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openvpn/bench/results.txt b/defects/openvpn/bench/results.txt deleted file mode 100644 index a76792612..000000000 --- a/defects/openvpn/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openvpn-0001: CWE-407: list-scan inside loop in openvpn-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.395ms fixed=0.024ms speedup=99.7x -N=1000 k=1000 : defective=10.410ms fixed=0.053ms speedup=198.1x -N=2000 k=2000 : defective=36.982ms fixed=0.096ms speedup=383.7x - diff --git a/defects/openvpn/bench/run_all.py b/defects/openvpn/bench/run_all.py deleted file mode 100644 index 026afedcb..000000000 --- a/defects/openvpn/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openvpn-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openxcom-0001/Makefile b/defects/openxcom-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openxcom-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openxcom-0001/bench/bench-openxcom-0001-0001.py b/defects/openxcom-0001/bench/bench-openxcom-0001-0001.py deleted file mode 100644 index c1e923a83..000000000 --- a/defects/openxcom-0001/bench/bench-openxcom-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openxcom-0001-0001.py -# CWE-407: list-scan inside loop in openxcom-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openxcom-0001-0001: CWE-407: list-scan inside loop in openxcom-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openxcom-0001/bench/results.txt b/defects/openxcom-0001/bench/results.txt deleted file mode 100644 index af142ba38..000000000 --- a/defects/openxcom-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openxcom-0001-0001: CWE-407: list-scan inside loop in openxcom-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.365ms fixed=0.022ms speedup=106.1x -N=1000 k=1000 : defective=9.792ms fixed=0.050ms speedup=194.5x -N=2000 k=2000 : defective=40.187ms fixed=0.097ms speedup=414.6x - diff --git a/defects/openxcom-0001/bench/run_all.py b/defects/openxcom-0001/bench/run_all.py deleted file mode 100644 index 6d7a207e7..000000000 --- a/defects/openxcom-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openxcom-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/openxcom-0002/Makefile b/defects/openxcom-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/openxcom-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/openxcom-0002/bench/bench-openxcom-0002-0002.py b/defects/openxcom-0002/bench/bench-openxcom-0002-0002.py deleted file mode 100644 index e7f543180..000000000 --- a/defects/openxcom-0002/bench/bench-openxcom-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-openxcom-0002-0002.py -# CWE-407: list-scan inside loop in openxcom-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== openxcom-0002-0002: CWE-407: list-scan inside loop in openxcom-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/openxcom-0002/bench/results.txt b/defects/openxcom-0002/bench/results.txt deleted file mode 100644 index 018ae779a..000000000 --- a/defects/openxcom-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== openxcom-0002-0002: CWE-407: list-scan inside loop in openxcom-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.411ms fixed=0.023ms speedup=105.5x -N=1000 k=1000 : defective=8.952ms fixed=0.047ms speedup=191.8x -N=2000 k=2000 : defective=36.604ms fixed=0.094ms speedup=388.0x - diff --git a/defects/openxcom-0002/bench/run_all.py b/defects/openxcom-0002/bench/run_all.py deleted file mode 100644 index 67b3328cb..000000000 --- a/defects/openxcom-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-openxcom-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/optuna/Makefile b/defects/optuna/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/optuna/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/optuna/bench/bench-optuna-0001.py b/defects/optuna/bench/bench-optuna-0001.py deleted file mode 100644 index 08be73465..000000000 --- a/defects/optuna/bench/bench-optuna-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-optuna-0001.py -# optuna-0001 — O(N³) Non-Dominated Sort in _calculate_nondomination_rank -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== optuna-0001: optuna-0001 — O(N³) Non-Dominated Sort in _calculate_nondomination_rank ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/optuna/bench/results.txt b/defects/optuna/bench/results.txt deleted file mode 100644 index 7fad4b96a..000000000 --- a/defects/optuna/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== optuna-0001: optuna-0001 — O(N³) Non-Dominated Sort in _calculate_nondomination_rank === -N=100 k=100 : defective=0.125ms fixed=0.004ms speedup=34.0x -N=500 k=500 : defective=2.303ms fixed=0.022ms speedup=102.5x -N=1000 k=1000 : defective=9.839ms fixed=0.050ms speedup=196.0x -N=2000 k=2000 : defective=38.520ms fixed=0.097ms speedup=397.8x - diff --git a/defects/optuna/bench/run_all.py b/defects/optuna/bench/run_all.py deleted file mode 100644 index ba6bbfc84..000000000 --- a/defects/optuna/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-optuna-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/otel-collector/Makefile b/defects/otel-collector/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/otel-collector/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/otel-collector/bench/bench-otel-collector-0001.py b/defects/otel-collector/bench/bench-otel-collector-0001.py deleted file mode 100644 index a484769c2..000000000 --- a/defects/otel-collector/bench/bench-otel-collector-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-otel-collector-0001.py -# CWE-407: list-scan inside loop in otel-collector-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== otel-collector-0001: CWE-407: list-scan inside loop in otel-collector-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/otel-collector/bench/bench-otel-collector-0002.py b/defects/otel-collector/bench/bench-otel-collector-0002.py deleted file mode 100644 index 3b4d45b56..000000000 --- a/defects/otel-collector/bench/bench-otel-collector-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-otel-collector-0002.py -# CWE-407: list-scan inside loop in otel-collector-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== otel-collector-0002: CWE-407: list-scan inside loop in otel-collector-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/otel-collector/bench/bench-otel-collector.py b/defects/otel-collector/bench/bench-otel-collector.py deleted file mode 100644 index edfe8ae2d..000000000 --- a/defects/otel-collector/bench/bench-otel-collector.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-otel-collector.py -# CWE-407: list-scan inside loop in otel-collector (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== otel-collector: CWE-407: list-scan inside loop in otel-collector (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/otel-collector/bench/results.txt b/defects/otel-collector/bench/results.txt deleted file mode 100644 index f956a06d9..000000000 --- a/defects/otel-collector/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== otel-collector-0001: CWE-407: list-scan inside loop in otel-collector-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.204ms fixed=0.021ms speedup=104.3x -N=1000 k=1000 : defective=8.877ms fixed=0.046ms speedup=193.4x -N=2000 k=2000 : defective=36.186ms fixed=0.098ms speedup=369.7x - -=== otel-collector-0002: CWE-407: list-scan inside loop in otel-collector-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.102ms fixed=0.021ms speedup=101.4x -N=1000 k=1000 : defective=8.990ms fixed=0.045ms speedup=198.8x -N=2000 k=2000 : defective=39.542ms fixed=0.100ms speedup=393.6x - -=== otel-collector: CWE-407: list-scan inside loop in otel-collector (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.512ms fixed=0.022ms speedup=115.1x -N=1000 k=1000 : defective=9.722ms fixed=0.053ms speedup=184.4x -N=2000 k=2000 : defective=44.774ms fixed=0.097ms speedup=463.8x - diff --git a/defects/otel-collector/bench/run_all.py b/defects/otel-collector/bench/run_all.py deleted file mode 100644 index 207744dc4..000000000 --- a/defects/otel-collector/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-otel-collector-0001.py", "bench-otel-collector-0002.py", "bench-otel-collector.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/otel/Makefile b/defects/otel/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/otel/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/otel/bench/bench-otel-collector-0001.py b/defects/otel/bench/bench-otel-collector-0001.py deleted file mode 100644 index a484769c2..000000000 --- a/defects/otel/bench/bench-otel-collector-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-otel-collector-0001.py -# CWE-407: list-scan inside loop in otel-collector-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== otel-collector-0001: CWE-407: list-scan inside loop in otel-collector-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/otel/bench/bench-otel-collector-0002.py b/defects/otel/bench/bench-otel-collector-0002.py deleted file mode 100644 index 3b4d45b56..000000000 --- a/defects/otel/bench/bench-otel-collector-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-otel-collector-0002.py -# CWE-407: list-scan inside loop in otel-collector-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== otel-collector-0002: CWE-407: list-scan inside loop in otel-collector-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/otel/bench/bench-otel-collector.py b/defects/otel/bench/bench-otel-collector.py deleted file mode 100644 index edfe8ae2d..000000000 --- a/defects/otel/bench/bench-otel-collector.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-otel-collector.py -# CWE-407: list-scan inside loop in otel-collector (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== otel-collector: CWE-407: list-scan inside loop in otel-collector (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/otel/bench/results.txt b/defects/otel/bench/results.txt deleted file mode 100644 index e11de5857..000000000 --- a/defects/otel/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== otel-collector-0001: CWE-407: list-scan inside loop in otel-collector-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.340ms fixed=0.040ms speedup=58.1x -N=1000 k=1000 : defective=11.386ms fixed=0.090ms speedup=125.9x -N=2000 k=2000 : defective=45.972ms fixed=0.149ms speedup=308.4x - -=== otel-collector-0002: CWE-407: list-scan inside loop in otel-collector-0002 (generic model) === -N=100 k=100 : defective=0.154ms fixed=0.005ms speedup=33.2x -N=500 k=500 : defective=2.966ms fixed=0.034ms speedup=86.2x -N=1000 k=1000 : defective=10.533ms fixed=0.046ms speedup=231.0x -N=2000 k=2000 : defective=40.557ms fixed=0.113ms speedup=359.9x - -=== otel-collector: CWE-407: list-scan inside loop in otel-collector (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=3.178ms fixed=0.024ms speedup=134.7x -N=1000 k=1000 : defective=15.284ms fixed=0.090ms speedup=169.4x -N=2000 k=2000 : defective=59.175ms fixed=0.114ms speedup=519.1x - diff --git a/defects/otel/bench/run_all.py b/defects/otel/bench/run_all.py deleted file mode 100644 index 207744dc4..000000000 --- a/defects/otel/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-otel-collector-0001.py", "bench-otel-collector-0002.py", "bench-otel-collector.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ovs/Makefile b/defects/ovs/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ovs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ovs/bench/bench-ovs-0001.py b/defects/ovs/bench/bench-ovs-0001.py deleted file mode 100644 index f40ab21fc..000000000 --- a/defects/ovs/bench/bench-ovs-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ovs-0001.py -# CWE-407: list-scan inside loop in ovs-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ovs-0001: CWE-407: list-scan inside loop in ovs-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ovs/bench/results.txt b/defects/ovs/bench/results.txt deleted file mode 100644 index a940c5076..000000000 --- a/defects/ovs/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ovs-0001: CWE-407: list-scan inside loop in ovs-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.516ms fixed=0.024ms speedup=106.7x -N=1000 k=1000 : defective=10.338ms fixed=0.054ms speedup=191.6x -N=2000 k=2000 : defective=41.590ms fixed=0.105ms speedup=397.7x - diff --git a/defects/ovs/bench/run_all.py b/defects/ovs/bench/run_all.py deleted file mode 100644 index 32529fe90..000000000 --- a/defects/ovs/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ovs-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pachi/Makefile b/defects/pachi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pachi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pachi/bench/bench-pachi-0001.py b/defects/pachi/bench/bench-pachi-0001.py deleted file mode 100644 index 51162c8ff..000000000 --- a/defects/pachi/bench/bench-pachi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pachi-0001.py -# Defect: node->is_expanded acquired with __sync_lock_test_and_set() (atomic test-and-set) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pachi-0001: Defect: node->is_expanded acquired with __sync_lock_test_and_set() (atomic test-and-set) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pachi/bench/results.txt b/defects/pachi/bench/results.txt deleted file mode 100644 index 172033181..000000000 --- a/defects/pachi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pachi-0001: Defect: node->is_expanded acquired with __sync_lock_test_and_set() (atomic test-and-set) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.432ms fixed=0.023ms speedup=106.9x -N=1000 k=1000 : defective=11.798ms fixed=0.052ms speedup=227.0x -N=2000 k=2000 : defective=41.603ms fixed=0.099ms speedup=418.9x - diff --git a/defects/pachi/bench/run_all.py b/defects/pachi/bench/run_all.py deleted file mode 100644 index fec515cb2..000000000 --- a/defects/pachi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pachi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pachi/unit/test_pachi_cwe362 b/defects/pachi/unit/test_pachi_cwe362 deleted file mode 100755 index b25d6f46f..000000000 Binary files a/defects/pachi/unit/test_pachi_cwe362 and /dev/null differ diff --git a/defects/panda3d/Makefile b/defects/panda3d/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/panda3d/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/panda3d/bench/bench-panda3d-0001.py b/defects/panda3d/bench/bench-panda3d-0001.py deleted file mode 100644 index 7067f158b..000000000 --- a/defects/panda3d/bench/bench-panda3d-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-panda3d-0001.py -# CWE-407: list-scan inside loop in panda3d-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== panda3d-0001: CWE-407: list-scan inside loop in panda3d-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/panda3d/bench/bench-panda3d-0002.py b/defects/panda3d/bench/bench-panda3d-0002.py deleted file mode 100644 index ce227393c..000000000 --- a/defects/panda3d/bench/bench-panda3d-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-panda3d-0002.py -# CWE-407: list-scan inside loop in panda3d-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== panda3d-0002: CWE-407: list-scan inside loop in panda3d-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/panda3d/bench/results.txt b/defects/panda3d/bench/results.txt deleted file mode 100644 index 50dbc6eee..000000000 --- a/defects/panda3d/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== panda3d-0001: CWE-407: list-scan inside loop in panda3d-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.458ms fixed=0.023ms speedup=105.2x -N=1000 k=1000 : defective=11.046ms fixed=0.053ms speedup=209.1x -N=2000 k=2000 : defective=38.628ms fixed=0.111ms speedup=349.1x - -=== panda3d-0002: CWE-407: list-scan inside loop in panda3d-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.535ms fixed=0.024ms speedup=103.9x -N=1000 k=1000 : defective=11.357ms fixed=0.056ms speedup=202.8x -N=2000 k=2000 : defective=46.981ms fixed=0.147ms speedup=319.1x - diff --git a/defects/panda3d/bench/run_all.py b/defects/panda3d/bench/run_all.py deleted file mode 100644 index 9dce53346..000000000 --- a/defects/panda3d/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-panda3d-0001.py", "bench-panda3d-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pandas/Makefile b/defects/pandas/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pandas/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pandas/bench/bench-pandas-0001.py b/defects/pandas/bench/bench-pandas-0001.py deleted file mode 100644 index 5b6e76f17..000000000 --- a/defects/pandas/bench/bench-pandas-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pandas-0001.py -# Styler render — O(n²) hidden_rows list membership in render loops -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pandas-0001: Styler render — O(n²) hidden_rows list membership in render loops ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pandas/bench/bench-pandas-0002.py b/defects/pandas/bench/bench-pandas-0002.py deleted file mode 100644 index 39c5118c2..000000000 --- a/defects/pandas/bench/bench-pandas-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pandas-0002.py -# _get_level_lengths — hidden_elements list scan O(R×L×H) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pandas-0002: _get_level_lengths — hidden_elements list scan O(R×L×H) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pandas/bench/results.txt b/defects/pandas/bench/results.txt deleted file mode 100644 index ea567de7f..000000000 --- a/defects/pandas/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== pandas-0001: Styler render — O(n²) hidden_rows list membership in render loops === -N=100 k=100 : defective=0.090ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.337ms fixed=0.022ms speedup=106.1x -N=1000 k=1000 : defective=10.569ms fixed=0.050ms speedup=209.7x -N=2000 k=2000 : defective=39.594ms fixed=0.095ms speedup=415.7x - -=== pandas-0002: _get_level_lengths — hidden_elements list scan O(R×L×H) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.143ms fixed=0.021ms speedup=104.2x -N=1000 k=1000 : defective=8.950ms fixed=0.047ms speedup=192.0x -N=2000 k=2000 : defective=36.191ms fixed=0.096ms speedup=375.4x - diff --git a/defects/pandas/bench/run_all.py b/defects/pandas/bench/run_all.py deleted file mode 100644 index 2db80b5d1..000000000 --- a/defects/pandas/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pandas-0001.py", "bench-pandas-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pcl/Makefile b/defects/pcl/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pcl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pcl/bench/bench-pcl-0001.py b/defects/pcl/bench/bench-pcl-0001.py deleted file mode 100644 index 917a56495..000000000 --- a/defects/pcl/bench/bench-pcl-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pcl-0001.py -# CWE-407: list-scan inside loop in pcl-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pcl-0001: CWE-407: list-scan inside loop in pcl-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pcl/bench/results.txt b/defects/pcl/bench/results.txt deleted file mode 100644 index 5d571880c..000000000 --- a/defects/pcl/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pcl-0001: CWE-407: list-scan inside loop in pcl-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.309ms fixed=0.021ms speedup=108.4x -N=1000 k=1000 : defective=9.039ms fixed=0.048ms speedup=187.9x -N=2000 k=2000 : defective=36.337ms fixed=0.096ms speedup=377.1x - diff --git a/defects/pcl/bench/run_all.py b/defects/pcl/bench/run_all.py deleted file mode 100644 index a0c5cf73a..000000000 --- a/defects/pcl/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pcl-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pcsx2-0001/Makefile b/defects/pcsx2-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pcsx2-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pcsx2-0001/bench/bench-pcsx2-0001-0001.py b/defects/pcsx2-0001/bench/bench-pcsx2-0001-0001.py deleted file mode 100644 index cd93e1a50..000000000 --- a/defects/pcsx2-0001/bench/bench-pcsx2-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pcsx2-0001-0001.py -# CWE-407: list-scan inside loop in pcsx2-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pcsx2-0001-0001: CWE-407: list-scan inside loop in pcsx2-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pcsx2-0001/bench/results.txt b/defects/pcsx2-0001/bench/results.txt deleted file mode 100644 index 8edf33823..000000000 --- a/defects/pcsx2-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pcsx2-0001-0001: CWE-407: list-scan inside loop in pcsx2-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.221ms fixed=0.021ms speedup=107.9x -N=1000 k=1000 : defective=8.849ms fixed=0.046ms speedup=191.4x -N=2000 k=2000 : defective=37.139ms fixed=0.097ms speedup=383.8x - diff --git a/defects/pcsx2-0001/bench/run_all.py b/defects/pcsx2-0001/bench/run_all.py deleted file mode 100644 index 3c5e4e8d9..000000000 --- a/defects/pcsx2-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pcsx2-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pcsx2-0002/Makefile b/defects/pcsx2-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pcsx2-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pcsx2-0002/bench/bench-pcsx2-0002-0002.py b/defects/pcsx2-0002/bench/bench-pcsx2-0002-0002.py deleted file mode 100644 index 3f4257928..000000000 --- a/defects/pcsx2-0002/bench/bench-pcsx2-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pcsx2-0002-0002.py -# CWE-407: list-scan inside loop in pcsx2-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pcsx2-0002-0002: CWE-407: list-scan inside loop in pcsx2-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pcsx2-0002/bench/results.txt b/defects/pcsx2-0002/bench/results.txt deleted file mode 100644 index fea20742c..000000000 --- a/defects/pcsx2-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pcsx2-0002-0002: CWE-407: list-scan inside loop in pcsx2-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.452ms fixed=0.023ms speedup=105.7x -N=1000 k=1000 : defective=9.919ms fixed=0.053ms speedup=188.6x -N=2000 k=2000 : defective=39.119ms fixed=0.096ms speedup=406.6x - diff --git a/defects/pcsx2-0002/bench/run_all.py b/defects/pcsx2-0002/bench/run_all.py deleted file mode 100644 index eb2aee016..000000000 --- a/defects/pcsx2-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pcsx2-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pcsx2-0003/Makefile b/defects/pcsx2-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pcsx2-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pcsx2-0003/bench/bench-pcsx2-0003-0003.py b/defects/pcsx2-0003/bench/bench-pcsx2-0003-0003.py deleted file mode 100644 index 6c429d46c..000000000 --- a/defects/pcsx2-0003/bench/bench-pcsx2-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pcsx2-0003-0003.py -# CWE-407: list-scan inside loop in pcsx2-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pcsx2-0003-0003: CWE-407: list-scan inside loop in pcsx2-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pcsx2-0003/bench/results.txt b/defects/pcsx2-0003/bench/results.txt deleted file mode 100644 index ca2d13ad2..000000000 --- a/defects/pcsx2-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pcsx2-0003-0003: CWE-407: list-scan inside loop in pcsx2-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.485ms fixed=0.023ms speedup=105.9x -N=1000 k=1000 : defective=10.354ms fixed=0.053ms speedup=196.9x -N=2000 k=2000 : defective=37.718ms fixed=0.102ms speedup=369.0x - diff --git a/defects/pcsx2-0003/bench/run_all.py b/defects/pcsx2-0003/bench/run_all.py deleted file mode 100644 index 9e2d61b29..000000000 --- a/defects/pcsx2-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pcsx2-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/peewee/Makefile b/defects/peewee/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/peewee/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/peewee/bench/bench-peewee-0001.py b/defects/peewee/bench/bench-peewee-0001.py deleted file mode 100644 index 35e0ab0e4..000000000 --- a/defects/peewee/bench/bench-peewee-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-peewee-0001.py -# CWE-407: list-scan inside loop in peewee-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== peewee-0001: CWE-407: list-scan inside loop in peewee-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/peewee/bench/results.txt b/defects/peewee/bench/results.txt deleted file mode 100644 index f2caf84c0..000000000 --- a/defects/peewee/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== peewee-0001: CWE-407: list-scan inside loop in peewee-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.424ms fixed=0.023ms speedup=104.5x -N=1000 k=1000 : defective=10.104ms fixed=0.053ms speedup=190.3x -N=2000 k=2000 : defective=41.464ms fixed=0.101ms speedup=409.8x - diff --git a/defects/peewee/bench/run_all.py b/defects/peewee/bench/run_all.py deleted file mode 100644 index f036248c1..000000000 --- a/defects/peewee/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-peewee-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/perl5/Makefile b/defects/perl5/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/perl5/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/perl5/bench/bench-perl5-0001.py b/defects/perl5/bench/bench-perl5-0001.py deleted file mode 100644 index bd0376f61..000000000 --- a/defects/perl5/bench/bench-perl5-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-perl5-0001.py -# CWE-407: list-scan inside loop in perl5-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== perl5-0001: CWE-407: list-scan inside loop in perl5-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/perl5/bench/results.txt b/defects/perl5/bench/results.txt deleted file mode 100644 index 437af3ded..000000000 --- a/defects/perl5/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== perl5-0001: CWE-407: list-scan inside loop in perl5-0001 (generic model) === -N=100 k=100 : defective=0.181ms fixed=0.011ms speedup=16.3x -N=500 k=500 : defective=2.446ms fixed=0.023ms speedup=104.2x -N=1000 k=1000 : defective=10.393ms fixed=0.054ms speedup=191.6x -N=2000 k=2000 : defective=36.098ms fixed=0.098ms speedup=369.1x - diff --git a/defects/perl5/bench/run_all.py b/defects/perl5/bench/run_all.py deleted file mode 100644 index 46e4aa796..000000000 --- a/defects/perl5/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-perl5-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pgbouncer-0001/Makefile b/defects/pgbouncer-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pgbouncer-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pgbouncer-0001/bench/bench-pgbouncer-0001-0001.py b/defects/pgbouncer-0001/bench/bench-pgbouncer-0001-0001.py deleted file mode 100644 index cee8758a3..000000000 --- a/defects/pgbouncer-0001/bench/bench-pgbouncer-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pgbouncer-0001-0001.py -# CWE-407: list-scan inside loop in pgbouncer-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pgbouncer-0001-0001: CWE-407: list-scan inside loop in pgbouncer-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pgbouncer-0001/bench/results.txt b/defects/pgbouncer-0001/bench/results.txt deleted file mode 100644 index 0e502da05..000000000 --- a/defects/pgbouncer-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pgbouncer-0001-0001: CWE-407: list-scan inside loop in pgbouncer-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.430ms fixed=0.024ms speedup=99.8x -N=1000 k=1000 : defective=11.012ms fixed=0.056ms speedup=198.1x -N=2000 k=2000 : defective=35.840ms fixed=0.096ms speedup=374.6x - diff --git a/defects/pgbouncer-0001/bench/run_all.py b/defects/pgbouncer-0001/bench/run_all.py deleted file mode 100644 index 5a56b5736..000000000 --- a/defects/pgbouncer-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pgbouncer-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pgbouncer-0002/Makefile b/defects/pgbouncer-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pgbouncer-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pgbouncer-0002/bench/bench-pgbouncer-0002-0002.py b/defects/pgbouncer-0002/bench/bench-pgbouncer-0002-0002.py deleted file mode 100644 index 851315115..000000000 --- a/defects/pgbouncer-0002/bench/bench-pgbouncer-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pgbouncer-0002-0002.py -# CWE-407: list-scan inside loop in pgbouncer-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pgbouncer-0002-0002: CWE-407: list-scan inside loop in pgbouncer-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pgbouncer-0002/bench/results.txt b/defects/pgbouncer-0002/bench/results.txt deleted file mode 100644 index 712ac99b0..000000000 --- a/defects/pgbouncer-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pgbouncer-0002-0002: CWE-407: list-scan inside loop in pgbouncer-0002-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.206ms fixed=0.021ms speedup=105.3x -N=1000 k=1000 : defective=9.435ms fixed=0.046ms speedup=203.6x -N=2000 k=2000 : defective=36.046ms fixed=0.093ms speedup=387.5x - diff --git a/defects/pgbouncer-0002/bench/run_all.py b/defects/pgbouncer-0002/bench/run_all.py deleted file mode 100644 index 0764c228b..000000000 --- a/defects/pgbouncer-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pgbouncer-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/phoenix/Makefile b/defects/phoenix/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/phoenix/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/phoenix/bench/bench-phoenix-0001.py b/defects/phoenix/bench/bench-phoenix-0001.py deleted file mode 100644 index 5190eec3d..000000000 --- a/defects/phoenix/bench/bench-phoenix-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-phoenix-0001.py -# CWE-407: list-scan inside loop in phoenix-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== phoenix-0001: CWE-407: list-scan inside loop in phoenix-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/phoenix/bench/bench-phoenix-0002.py b/defects/phoenix/bench/bench-phoenix-0002.py deleted file mode 100644 index dc4aa6a4b..000000000 --- a/defects/phoenix/bench/bench-phoenix-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-phoenix-0002.py -# CWE-407: list-scan inside loop in phoenix-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== phoenix-0002: CWE-407: list-scan inside loop in phoenix-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/phoenix/bench/results.txt b/defects/phoenix/bench/results.txt deleted file mode 100644 index fd8a0d8b9..000000000 --- a/defects/phoenix/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== phoenix-0001: CWE-407: list-scan inside loop in phoenix-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.219ms fixed=0.020ms speedup=109.2x -N=1000 k=1000 : defective=8.823ms fixed=0.046ms speedup=189.9x -N=2000 k=2000 : defective=35.827ms fixed=0.107ms speedup=333.4x - -=== phoenix-0002: CWE-407: list-scan inside loop in phoenix-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.4x -N=500 k=500 : defective=2.346ms fixed=0.021ms speedup=110.8x -N=1000 k=1000 : defective=9.261ms fixed=0.045ms speedup=203.6x -N=2000 k=2000 : defective=35.714ms fixed=0.097ms speedup=368.0x - diff --git a/defects/phoenix/bench/run_all.py b/defects/phoenix/bench/run_all.py deleted file mode 100644 index 86044916c..000000000 --- a/defects/phoenix/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-phoenix-0001.py", "bench-phoenix-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/php/Makefile b/defects/php/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/php/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/php/bench/bench-php-0001.py b/defects/php/bench/bench-php-0001.py deleted file mode 100644 index 468135f5a..000000000 --- a/defects/php/bench/bench-php-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-php-0001.py -# CWE-407: list-scan inside loop in php-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== php-0001: CWE-407: list-scan inside loop in php-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/php/bench/bench-php-0002.py b/defects/php/bench/bench-php-0002.py deleted file mode 100644 index 2f9da783c..000000000 --- a/defects/php/bench/bench-php-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-php-0002.py -# CWE-407: list-scan inside loop in php-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== php-0002: CWE-407: list-scan inside loop in php-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/php/bench/bench-php-0003.py b/defects/php/bench/bench-php-0003.py deleted file mode 100644 index 11556f628..000000000 --- a/defects/php/bench/bench-php-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-php-0003.py -# zend_do_implement_interfaces — O(I²) interface dedup linear scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== php-0003: zend_do_implement_interfaces — O(I²) interface dedup linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/php/bench/bench-php-0004.py b/defects/php/bench/bench-php-0004.py deleted file mode 100644 index 83bb012bb..000000000 --- a/defects/php/bench/bench-php-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-php-0004.py -# zend_do_inherit_interfaces — O(IF × CE) interface inheritance dedup linear scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== php-0004: zend_do_inherit_interfaces — O(IF × CE) interface inheritance dedup linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/php/bench/results.txt b/defects/php/bench/results.txt deleted file mode 100644 index 1151b79bc..000000000 --- a/defects/php/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== php-0001: CWE-407: list-scan inside loop in php-0001 (generic model) === -N=100 k=100 : defective=0.091ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.387ms fixed=0.022ms speedup=107.3x -N=1000 k=1000 : defective=8.928ms fixed=0.045ms speedup=196.7x -N=2000 k=2000 : defective=38.221ms fixed=0.183ms speedup=209.4x - -=== php-0002: CWE-407: list-scan inside loop in php-0002 (generic model) === -N=100 k=100 : defective=0.256ms fixed=0.016ms speedup=16.0x -N=500 k=500 : defective=2.147ms fixed=0.021ms speedup=102.7x -N=1000 k=1000 : defective=9.832ms fixed=0.050ms speedup=195.1x -N=2000 k=2000 : defective=42.498ms fixed=0.107ms speedup=396.7x - -=== php-0003: zend_do_implement_interfaces — O(I²) interface dedup linear scan === -N=100 k=100 : defective=0.148ms fixed=0.017ms speedup=8.6x -N=500 k=500 : defective=2.308ms fixed=0.021ms speedup=110.5x -N=1000 k=1000 : defective=8.618ms fixed=0.046ms speedup=186.2x -N=2000 k=2000 : defective=35.292ms fixed=0.096ms speedup=368.0x - -=== php-0004: zend_do_inherit_interfaces — O(IF × CE) interface inheritance dedup linear scan === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.130ms fixed=0.021ms speedup=100.7x -N=1000 k=1000 : defective=8.784ms fixed=0.046ms speedup=192.8x -N=2000 k=2000 : defective=35.220ms fixed=0.096ms speedup=368.4x - diff --git a/defects/php/bench/run_all.py b/defects/php/bench/run_all.py deleted file mode 100644 index 65f40d3e4..000000000 --- a/defects/php/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-php-0001.py", "bench-php-0002.py", "bench-php-0003.py", "bench-php-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pidgin-0001/Makefile b/defects/pidgin-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pidgin-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pidgin-0001/bench/bench-pidgin-0001-0001.py b/defects/pidgin-0001/bench/bench-pidgin-0001-0001.py deleted file mode 100644 index c4ebb2586..000000000 --- a/defects/pidgin-0001/bench/bench-pidgin-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pidgin-0001-0001.py -# CWE-407: list-scan inside loop in pidgin-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pidgin-0001-0001: CWE-407: list-scan inside loop in pidgin-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pidgin-0001/bench/results.txt b/defects/pidgin-0001/bench/results.txt deleted file mode 100644 index c0f3e2fc0..000000000 --- a/defects/pidgin-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pidgin-0001-0001: CWE-407: list-scan inside loop in pidgin-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.374ms fixed=0.022ms speedup=106.4x -N=1000 k=1000 : defective=9.917ms fixed=0.050ms speedup=197.9x -N=2000 k=2000 : defective=39.908ms fixed=0.096ms speedup=414.8x - diff --git a/defects/pidgin-0001/bench/run_all.py b/defects/pidgin-0001/bench/run_all.py deleted file mode 100644 index 5e73811a2..000000000 --- a/defects/pidgin-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pidgin-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pidgin-0002/Makefile b/defects/pidgin-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pidgin-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pidgin-0002/bench/bench-pidgin-0002-0002.py b/defects/pidgin-0002/bench/bench-pidgin-0002-0002.py deleted file mode 100644 index 65ff6bd51..000000000 --- a/defects/pidgin-0002/bench/bench-pidgin-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pidgin-0002-0002.py -# CWE-407: list-scan inside loop in pidgin-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pidgin-0002-0002: CWE-407: list-scan inside loop in pidgin-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pidgin-0002/bench/results.txt b/defects/pidgin-0002/bench/results.txt deleted file mode 100644 index 49feae6d3..000000000 --- a/defects/pidgin-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pidgin-0002-0002: CWE-407: list-scan inside loop in pidgin-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.437ms fixed=0.022ms speedup=109.4x -N=1000 k=1000 : defective=9.069ms fixed=0.045ms speedup=201.8x -N=2000 k=2000 : defective=38.883ms fixed=0.095ms speedup=410.5x - diff --git a/defects/pidgin-0002/bench/run_all.py b/defects/pidgin-0002/bench/run_all.py deleted file mode 100644 index 0e17fbe88..000000000 --- a/defects/pidgin-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pidgin-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pinot/Makefile b/defects/pinot/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pinot/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pinot/bench/bench-pinot-0001.py b/defects/pinot/bench/bench-pinot-0001.py deleted file mode 100644 index 576a7f288..000000000 --- a/defects/pinot/bench/bench-pinot-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pinot-0001.py -# SegmentProcessorUtils sortOrder List.contains per field in schema loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pinot-0001: SegmentProcessorUtils sortOrder List.contains per field in schema loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pinot/bench/bench-pinot-0002.py b/defects/pinot/bench/bench-pinot-0002.py deleted file mode 100644 index 5ae0f791b..000000000 --- a/defects/pinot/bench/bench-pinot-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pinot-0002.py -# PartialUpsertHandler + ColumnarMerger List.contains per column in hot upsert path -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pinot-0002: PartialUpsertHandler + ColumnarMerger List.contains per column in hot upsert path ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pinot/bench/results.txt b/defects/pinot/bench/results.txt deleted file mode 100644 index 53ef488ea..000000000 --- a/defects/pinot/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== pinot-0001: SegmentProcessorUtils sortOrder List.contains per field in schema loop === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.490ms fixed=0.024ms speedup=103.6x -N=1000 k=1000 : defective=10.647ms fixed=0.048ms speedup=220.6x -N=2000 k=2000 : defective=36.051ms fixed=0.169ms speedup=213.7x - -=== pinot-0002: PartialUpsertHandler + ColumnarMerger List.contains per column in hot upsert path === -N=100 k=100 : defective=0.089ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.277ms fixed=0.021ms speedup=109.5x -N=1000 k=1000 : defective=8.808ms fixed=0.045ms speedup=194.0x -N=2000 k=2000 : defective=36.093ms fixed=0.096ms speedup=375.5x - diff --git a/defects/pinot/bench/run_all.py b/defects/pinot/bench/run_all.py deleted file mode 100644 index dd17c805a..000000000 --- a/defects/pinot/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pinot-0001.py", "bench-pinot-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pioneer-0001/Makefile b/defects/pioneer-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pioneer-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pioneer-0001/bench/bench-pioneer-0001-0001.py b/defects/pioneer-0001/bench/bench-pioneer-0001-0001.py deleted file mode 100644 index 616b0c293..000000000 --- a/defects/pioneer-0001/bench/bench-pioneer-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pioneer-0001-0001.py -# CWE-407: list-scan inside loop in pioneer-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pioneer-0001-0001: CWE-407: list-scan inside loop in pioneer-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pioneer-0001/bench/results.txt b/defects/pioneer-0001/bench/results.txt deleted file mode 100644 index c39c710aa..000000000 --- a/defects/pioneer-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pioneer-0001-0001: CWE-407: list-scan inside loop in pioneer-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.555ms fixed=0.039ms speedup=66.0x -N=1000 k=1000 : defective=12.624ms fixed=0.053ms speedup=239.0x -N=2000 k=2000 : defective=35.639ms fixed=0.097ms speedup=367.8x - diff --git a/defects/pioneer-0001/bench/run_all.py b/defects/pioneer-0001/bench/run_all.py deleted file mode 100644 index 3b255460f..000000000 --- a/defects/pioneer-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pioneer-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pioneer-0002/Makefile b/defects/pioneer-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pioneer-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pioneer-0002/bench/bench-pioneer-0002-0002.py b/defects/pioneer-0002/bench/bench-pioneer-0002-0002.py deleted file mode 100644 index c7f35ed4f..000000000 --- a/defects/pioneer-0002/bench/bench-pioneer-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pioneer-0002-0002.py -# CWE-407: list-scan inside loop in pioneer-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pioneer-0002-0002: CWE-407: list-scan inside loop in pioneer-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pioneer-0002/bench/results.txt b/defects/pioneer-0002/bench/results.txt deleted file mode 100644 index 9dc9dd56b..000000000 --- a/defects/pioneer-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pioneer-0002-0002: CWE-407: list-scan inside loop in pioneer-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.523ms fixed=0.024ms speedup=105.6x -N=1000 k=1000 : defective=10.060ms fixed=0.052ms speedup=192.7x -N=2000 k=2000 : defective=36.468ms fixed=0.098ms speedup=373.8x - diff --git a/defects/pioneer-0002/bench/run_all.py b/defects/pioneer-0002/bench/run_all.py deleted file mode 100644 index 516c890f8..000000000 --- a/defects/pioneer-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pioneer-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pioneer-0003/Makefile b/defects/pioneer-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pioneer-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pioneer-0003/bench/bench-pioneer-0003-0003.py b/defects/pioneer-0003/bench/bench-pioneer-0003-0003.py deleted file mode 100644 index 4724719d4..000000000 --- a/defects/pioneer-0003/bench/bench-pioneer-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pioneer-0003-0003.py -# CWE-407: list-scan inside loop in pioneer-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pioneer-0003-0003: CWE-407: list-scan inside loop in pioneer-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pioneer-0003/bench/results.txt b/defects/pioneer-0003/bench/results.txt deleted file mode 100644 index e7ec66fa8..000000000 --- a/defects/pioneer-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pioneer-0003-0003: CWE-407: list-scan inside loop in pioneer-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.448ms fixed=0.024ms speedup=103.9x -N=1000 k=1000 : defective=11.736ms fixed=0.060ms speedup=196.6x -N=2000 k=2000 : defective=36.144ms fixed=0.096ms speedup=377.2x - diff --git a/defects/pioneer-0003/bench/run_all.py b/defects/pioneer-0003/bench/run_all.py deleted file mode 100644 index b53d2d5f5..000000000 --- a/defects/pioneer-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pioneer-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pip/Makefile b/defects/pip/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pip/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pip/bench/bench-pip-0001.py b/defects/pip/bench/bench-pip-0001.py deleted file mode 100644 index a73563b95..000000000 --- a/defects/pip/bench/bench-pip-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pip-0001.py -# CWE-407: list-scan inside loop in pip-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pip-0001: CWE-407: list-scan inside loop in pip-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pip/bench/results.txt b/defects/pip/bench/results.txt deleted file mode 100644 index 45ad9a021..000000000 --- a/defects/pip/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pip-0001: CWE-407: list-scan inside loop in pip-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.377ms fixed=0.023ms speedup=105.5x -N=1000 k=1000 : defective=9.657ms fixed=0.051ms speedup=190.2x -N=2000 k=2000 : defective=39.864ms fixed=0.096ms speedup=415.8x - diff --git a/defects/pip/bench/run_all.py b/defects/pip/bench/run_all.py deleted file mode 100644 index de8b4a4a5..000000000 --- a/defects/pip/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pip-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pitivi-0001/Makefile b/defects/pitivi-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pitivi-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pitivi-0001/bench/bench-pitivi-0001-0001.py b/defects/pitivi-0001/bench/bench-pitivi-0001-0001.py deleted file mode 100644 index 9d8afb4f1..000000000 --- a/defects/pitivi-0001/bench/bench-pitivi-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pitivi-0001-0001.py -# CWE-407: list-scan inside loop in pitivi-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pitivi-0001-0001: CWE-407: list-scan inside loop in pitivi-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pitivi-0001/bench/results.txt b/defects/pitivi-0001/bench/results.txt deleted file mode 100644 index 08f374e79..000000000 --- a/defects/pitivi-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pitivi-0001-0001: CWE-407: list-scan inside loop in pitivi-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.431ms fixed=0.022ms speedup=108.2x -N=1000 k=1000 : defective=8.849ms fixed=0.046ms speedup=192.9x -N=2000 k=2000 : defective=36.008ms fixed=0.097ms speedup=370.2x - diff --git a/defects/pitivi-0001/bench/run_all.py b/defects/pitivi-0001/bench/run_all.py deleted file mode 100644 index b9ca017d2..000000000 --- a/defects/pitivi-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pitivi-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/play-0001/Makefile b/defects/play-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/play-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/play-0001/bench/bench-play-0001-0001.py b/defects/play-0001/bench/bench-play-0001-0001.py deleted file mode 100644 index e291c54c9..000000000 --- a/defects/play-0001/bench/bench-play-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-play-0001-0001.py -# CWE-407: list-scan inside loop in play-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== play-0001-0001: CWE-407: list-scan inside loop in play-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/play-0001/bench/results.txt b/defects/play-0001/bench/results.txt deleted file mode 100644 index ee0afe5c8..000000000 --- a/defects/play-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== play-0001-0001: CWE-407: list-scan inside loop in play-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.317ms fixed=0.023ms speedup=101.1x -N=1000 k=1000 : defective=9.720ms fixed=0.050ms speedup=195.2x -N=2000 k=2000 : defective=38.138ms fixed=0.183ms speedup=208.5x - diff --git a/defects/play-0001/bench/run_all.py b/defects/play-0001/bench/run_all.py deleted file mode 100644 index 6c6a210f6..000000000 --- a/defects/play-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-play-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/playwright/Makefile b/defects/playwright/Makefile deleted file mode 100644 index 42d775549..000000000 --- a/defects/playwright/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# playwright patch test + bench runner -# Targets: all test bench clean - -PYTHON := python3 -TEST_FILE := tests/test-playwright-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/playwright/bench/bench-playwright-0001.py b/defects/playwright/bench/bench-playwright-0001.py deleted file mode 100644 index cc706f6e4..000000000 --- a/defects/playwright/bench/bench-playwright-0001.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 -# bench-playwright-0001.py -# roleUtils validRoles / allowsNameFromContent: per-element role validation -# during ARIA snapshot walks. Defect: Array.includes(role) on 70-entry const -# array = O(k) per element. N elements x k roles = O(N*k) per snapshot. -# Fix: Set.has(role) is O(1) per element -> O(N+k). - -import sys -import time - - -# 70+ ARIA roles mirroring validRoles in roleUtils.ts -VALID_ROLES = [ - "alert", "alertdialog", "application", "article", "banner", "blockquote", - "button", "caption", "cell", "checkbox", "code", "columnheader", "combobox", - "complementary", "contentinfo", "definition", "deletion", "dialog", - "directory", "document", "emphasis", "feed", "figure", "form", "generic", - "grid", "gridcell", "group", "heading", "img", "insertion", "link", "list", - "listbox", "listitem", "log", "main", "mark", "marquee", "math", "meter", - "menu", "menubar", "menuitem", "menuitemcheckbox", "menuitemradio", - "navigation", "none", "note", "option", "paragraph", "presentation", - "progressbar", "radio", "radiogroup", "region", "row", "rowgroup", - "rowheader", "scrollbar", "search", "searchbox", "separator", "slider", - "spinbutton", "status", "strong", "subscript", "superscript", "switch", - "tab", "table", "tablist", "tabpanel", "term", "textbox", "time", "timer", - "toolbar", "tooltip", "tree", "treegrid", "treeitem", -] - -# Roles most commonly present on real pages (bias toward frequent matches) -ELEMENT_ROLE_POOL = ["button", "link", "heading", "textbox", "row", "cell", - "img", "list", "listitem", "", "main", "navigation"] - - -def bench_defective(n): - """Array.includes on validRoles per element -> O(N*k).""" - # Simulate N page elements with attribute-derived roles - roles_to_check = [ELEMENT_ROLE_POOL[i % len(ELEMENT_ROLE_POOL)] for i in range(n)] - - t0 = time.perf_counter() - found = 0 - for role in roles_to_check: - # Array.includes scan - if role in VALID_ROLES: # python list __contains__ is O(k) linear - found += 1 - dt = time.perf_counter() - t0 - assert found >= 0 - return dt - - -def bench_fixed(n): - """Set.has on validRolesSet per element -> O(1) per element.""" - valid_roles_set = set(VALID_ROLES) - roles_to_check = [ELEMENT_ROLE_POOL[i % len(ELEMENT_ROLE_POOL)] for i in range(n)] - - t0 = time.perf_counter() - found = 0 - for role in roles_to_check: - if role in valid_roles_set: # O(1) - found += 1 - dt = time.perf_counter() - t0 - assert found >= 0 - return dt - - -TRIALS = 3 -SIZES = [100, 500, 1000, 5000, 10000] - - -def run(): - lines = [] - header = "=== playwright-0001: roleUtils Array.includes vs Set.has ===" - print(header) - lines.append(header) - - for n in SIZES: - def_times = [bench_defective(n) for _ in range(TRIALS)] - fix_times = [bench_fixed(n) for _ in range(TRIALS)] - d_ms = min(def_times) * 1000 - f_ms = min(fix_times) * 1000 - speedup = d_ms / f_ms if f_ms > 0 else float("inf") - line = f"N={n:<6}: defective={d_ms:.3f}ms fixed={f_ms:.3f}ms speedup={speedup:.1f}x" - print(line) - lines.append(line) - sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/playwright/bench/results.txt b/defects/playwright/bench/results.txt deleted file mode 100644 index f223e707f..000000000 --- a/defects/playwright/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== playwright-0001: roleUtils Array.includes vs Set.has === -N=100 : defective=0.110ms fixed=0.007ms speedup=15.3x -N=500 : defective=0.531ms fixed=0.042ms speedup=12.6x -N=1000 : defective=1.064ms fixed=0.093ms speedup=11.4x -N=5000 : defective=5.369ms fixed=0.516ms speedup=10.4x -N=10000 : defective=11.484ms fixed=1.033ms speedup=11.1x - diff --git a/defects/playwright/bench/run_all.py b/defects/playwright/bench/run_all.py deleted file mode 100644 index 6b4fdfce3..000000000 --- a/defects/playwright/bench/run_all.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run playwright bench scripts and write results.txt - -import importlib.util -import os -import sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -all_lines = [] - -for fname in ["bench-playwright-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/playwright/patch/playwright-0001-roleutils-validroles-array-includes.patch b/defects/playwright/patch/playwright-0001-roleutils-validroles-array-includes.patch deleted file mode 100644 index 16c462f20..000000000 --- a/defects/playwright/patch/playwright-0001-roleutils-validroles-array-includes.patch +++ /dev/null @@ -1,80 +0,0 @@ -# UNDF: UNDF-2026-000001276 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*k) -> O(N+k) in ARIA snapshot hot paths -# -# Defect: roleUtils.ts runs per-element during ARIA tree walks. Three helpers -# (getExplicitAriaRole, allowsNameFromContent, hasGlobalAriaAttribute) each -# call Array.includes on constant arrays of 20-70 role strings. For a page -# with N=5000 elements and k=70 roles, total cost is O(N*k) = 350,000 -# string comparisons per snapshot. -# -# Fix: Convert the hot-path constant arrays to Set at module scope. -# Per-element cost drops from O(k) to O(1). Keeps the original arrays as -# source-of-truth for readability; builds the Sets once. -# -# Complexity gate (tests/test-playwright-cwe407.py): -# k-scaling 5x: time ratio must be <17.5x (O(k) ~=5x, not O(k^2) ~=25x) -# N=5000 elements snapshot: must complete in <10ms ---- a/packages/injected/src/roleUtils.ts -+++ b/packages/injected/src/roleUtils.ts -@@ -56,11 +56,14 @@ const kGlobalAriaAttributes: [string, string[] | undefined][] = [ - ['aria-roledescription', ['generic']], - ]; - -+// Pre-built Set views of the prohibited-role lists so hasGlobalAriaAttribute can do -+// O(1) membership lookup per attribute check instead of scanning the prohibited array -+// on every element during ARIA snapshot walks. -+const kGlobalAriaAttributeProhibitedSets: [string, Set | undefined][] = -+ kGlobalAriaAttributes.map(([attr, prohibited]) => [attr, prohibited ? new Set(prohibited) : undefined]); -+ - function hasGlobalAriaAttribute(element: Element, forRole?: string | null) { -- return kGlobalAriaAttributes.some(([attr, prohibited]) => { -- return !prohibited?.includes(forRole || '') && element.hasAttribute(attr); -- }); -+ return kGlobalAriaAttributeProhibitedSets.some(([attr, prohibited]) => { -+ return !prohibited?.has(forRole || '') && element.hasAttribute(attr); -+ }); - } - - function hasTabIndex(element: Element) { -@@ -265,10 +268,13 @@ const validRoles: AriaRole[] = ['alert', 'alertdialog', 'application', 'article' - 'spinbutton', 'status', 'strong', 'subscript', 'superscript', 'switch', 'tab', 'table', 'tablist', 'tabpanel', 'term', 'textbox', 'time', 'timer', - 'toolbar', 'tooltip', 'tree', 'treegrid', 'treeitem']; - -+// Set view of validRoles so getExplicitAriaRole can test role membership in O(1) -+// instead of scanning the 70+ element array per element during snapshot walks. -+const validRolesSet = new Set(validRoles); -+ - function getExplicitAriaRole(element: Element): AriaRole | null { - // https://www.w3.org/TR/wai-aria-1.2/#document-handling_author-errors_roles - const roles = (element.getAttribute('role') || '').split(' ').map(role => role.trim()); -- return roles.find(role => validRoles.includes(role as any)) as AriaRole || null; -+ return roles.find(role => validRolesSet.has(role)) as AriaRole || null; - } - - function hasPresentationConflictResolution(element: Element, role: string | null) { -@@ -496,12 +502,21 @@ function allowsNameFromContent(role: string, targetDescendant: boolean) { - // See chromium implementation here: - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/accessibility/ax_object.cc;l=6338;drc=3decef66bc4c08b142a19db9628e9efe68973e64;bpv=0;bpt=1 -- const alwaysAllowsNameFromContent = ['button', 'cell', 'checkbox', 'columnheader', 'gridcell', 'heading', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'row', 'rowheader', 'switch', 'tab', 'tooltip', 'treeitem'].includes(role); -- const descendantAllowsNameFromContent = targetDescendant && ['', 'caption', 'code', 'contentinfo', 'definition', 'deletion', 'emphasis', 'insertion', 'list', 'listitem', 'mark', 'none', 'paragraph', 'presentation', 'region', 'row', 'rowgroup', 'section', 'strong', 'subscript', 'superscript', 'table', 'term', 'time'].includes(role); -+ const alwaysAllowsNameFromContent = kAlwaysAllowsNameFromContentSet.has(role); -+ const descendantAllowsNameFromContent = targetDescendant && kDescendantAllowsNameFromContentSet.has(role); - return alwaysAllowsNameFromContent || descendantAllowsNameFromContent; - } - -+// Set views of the allowsNameFromContent role lists. Built once at module load; -+// per-call membership test is O(1) vs the prior O(k) Array.includes scan. -+const kAlwaysAllowsNameFromContentSet = new Set([ -+ 'button', 'cell', 'checkbox', 'columnheader', 'gridcell', 'heading', 'link', -+ 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'row', -+ 'rowheader', 'switch', 'tab', 'tooltip', 'treeitem']); -+const kDescendantAllowsNameFromContentSet = new Set([ -+ '', 'caption', 'code', 'contentinfo', 'definition', 'deletion', 'emphasis', -+ 'insertion', 'list', 'listitem', 'mark', 'none', 'paragraph', 'presentation', -+ 'region', 'row', 'rowgroup', 'section', 'strong', 'subscript', 'superscript', -+ 'table', 'term', 'time']); -+ - export function getElementAccessibleName(element: Element, includeHidden: boolean): string { - const cache = (includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName); - let accessibleName = cache?.get(element); diff --git a/defects/playwright/tests/test-playwright-cwe407.py b/defects/playwright/tests/test-playwright-cwe407.py deleted file mode 100644 index bc5090200..000000000 --- a/defects/playwright/tests/test-playwright-cwe407.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001276 (playwright-0001) -# -# CWE-407: Algorithmic Complexity -# -# Defect: -# playwright-0001: roleUtils.ts getExplicitAriaRole / allowsNameFromContent -# / hasGlobalAriaAttribute call Array.includes on 20-70 -# element constant arrays per element. For N elements the -# total cost is O(N*k). ARIA snapshot walks on modern pages -# hit thousands of elements. -# -# Fix: -# Convert the hot-path constant arrays to Set at module scope; use -# set.has(role) for O(1) membership lookup. Total cost O(N+k). -# -# Complexity gate (from bench/results.txt on this machine): -# N=10000 elements, k=70 roles: defective=11.5ms, fixed=1.0ms. -# Fixed must complete in <10ms at N=5000. k-scaling <17.5x. - -import importlib.util -import os -import sys -import unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-playwright-0001.py") - - -# --------------------------------------------------------------------------- -# Correctness: Set.has must return the same truth as Array.includes for every role. -# --------------------------------------------------------------------------- - -class TestPlaywright0001Correctness(unittest.TestCase): - def test_validrole_set_matches_array(self): - role_set = set(_mod.VALID_ROLES) - # known-valid roles - for role in _mod.VALID_ROLES: - self.assertEqual(role in role_set, role in _mod.VALID_ROLES, - f"role {role!r} disagreement") - # known-invalid roles - for role in ["", "not-a-role", "linkk", "butt0n", "Link"]: # case-sensitive - self.assertEqual(role in role_set, role in _mod.VALID_ROLES, - f"role {role!r} disagreement") - - -class TestPlaywright0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N5000(self): - t_s = min(_mod.bench_fixed(5000) for _ in range(3)) - self.assertLess(t_s * 1000, 10.0, - f"fixed took {t_s*1000:.3f}ms at N=5000, expected <10ms") - - def test_fixed_scaling_linear(self): - t_1000 = min(_mod.bench_fixed(1000) for _ in range(3)) - t_5000 = min(_mod.bench_fixed(5000) for _ in range(3)) - ratio = t_5000 / t_1000 if t_1000 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=5000/N=1000 ratio {ratio:.2f}x, expected <17.5x (O(N))") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/podman/Makefile b/defects/podman/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/podman/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/podman/bench/bench-podman-0001.py b/defects/podman/bench/bench-podman-0001.py deleted file mode 100644 index e98e239c9..000000000 --- a/defects/podman/bench/bench-podman-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-podman-0001.py -# determineCapAddDropFromCapabilities O(n²) — slices.Contains inside loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== podman-0001: determineCapAddDropFromCapabilities O(n²) — slices.Contains inside loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/podman/bench/bench-podman-0002.py b/defects/podman/bench/bench-podman-0002.py deleted file mode 100644 index b279e3f25..000000000 --- a/defects/podman/bench/bench-podman-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-podman-0002.py -# GetRunningPods O(n²) — slices.Contains dedup inside container loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== podman-0002: GetRunningPods O(n²) — slices.Contains dedup inside container loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/podman/bench/results.txt b/defects/podman/bench/results.txt deleted file mode 100644 index 6f5d71bd7..000000000 --- a/defects/podman/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== podman-0001: determineCapAddDropFromCapabilities O(n²) — slices.Contains inside loop === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.114ms fixed=0.020ms speedup=104.4x -N=1000 k=1000 : defective=8.638ms fixed=0.045ms speedup=191.8x -N=2000 k=2000 : defective=36.618ms fixed=0.096ms speedup=379.5x - -=== podman-0002: GetRunningPods O(n²) — slices.Contains dedup inside container loop === -N=100 k=100 : defective=0.084ms fixed=0.005ms speedup=16.2x -N=500 k=500 : defective=2.122ms fixed=0.021ms speedup=102.7x -N=1000 k=1000 : defective=8.807ms fixed=0.046ms speedup=192.3x -N=2000 k=2000 : defective=35.557ms fixed=0.096ms speedup=369.7x - diff --git a/defects/podman/bench/run_all.py b/defects/podman/bench/run_all.py deleted file mode 100644 index d3f7f3897..000000000 --- a/defects/podman/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-podman-0001.py", "bench-podman-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/poetry/Makefile b/defects/poetry/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/poetry/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/poetry/bench/bench-poetry-0001.py b/defects/poetry/bench/bench-poetry-0001.py deleted file mode 100644 index e589cf8e0..000000000 --- a/defects/poetry/bench/bench-poetry-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-poetry-0001.py -# show --tree packages_in_tree list O(N) membership check -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== poetry-0001: show --tree packages_in_tree list O(N) membership check ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/poetry/bench/results.txt b/defects/poetry/bench/results.txt deleted file mode 100644 index 709e30ba9..000000000 --- a/defects/poetry/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== poetry-0001: show --tree packages_in_tree list O(N) membership check === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.223ms fixed=0.023ms speedup=98.5x -N=1000 k=1000 : defective=8.663ms fixed=0.046ms speedup=189.5x -N=2000 k=2000 : defective=34.939ms fixed=0.096ms speedup=362.5x - diff --git a/defects/poetry/bench/run_all.py b/defects/poetry/bench/run_all.py deleted file mode 100644 index fbfc10fea..000000000 --- a/defects/poetry/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-poetry-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/postfix/Makefile b/defects/postfix/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/postfix/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/postfix/bench/bench-postfix-0001.py b/defects/postfix/bench/bench-postfix-0001.py deleted file mode 100644 index 23125e3bf..000000000 --- a/defects/postfix/bench/bench-postfix-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postfix-0001.py -# CWE-407: list-scan inside loop in postfix-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postfix-0001: CWE-407: list-scan inside loop in postfix-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postfix/bench/bench-postfix-0002.py b/defects/postfix/bench/bench-postfix-0002.py deleted file mode 100644 index 4aca01dac..000000000 --- a/defects/postfix/bench/bench-postfix-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postfix-0002.py -# CWE-407: list-scan inside loop in postfix-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postfix-0002: CWE-407: list-scan inside loop in postfix-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postfix/bench/results.txt b/defects/postfix/bench/results.txt deleted file mode 100644 index e58f1ac6d..000000000 --- a/defects/postfix/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== postfix-0001: CWE-407: list-scan inside loop in postfix-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.213ms fixed=0.021ms speedup=105.4x -N=1000 k=1000 : defective=8.726ms fixed=0.046ms speedup=188.9x -N=2000 k=2000 : defective=35.979ms fixed=0.098ms speedup=365.8x - -=== postfix-0002: CWE-407: list-scan inside loop in postfix-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.194ms fixed=0.022ms speedup=99.6x -N=1000 k=1000 : defective=9.726ms fixed=0.046ms speedup=209.3x -N=2000 k=2000 : defective=34.930ms fixed=0.097ms speedup=359.4x - diff --git a/defects/postfix/bench/run_all.py b/defects/postfix/bench/run_all.py deleted file mode 100644 index 9d905f228..000000000 --- a/defects/postfix/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-postfix-0001.py", "bench-postfix-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/postgres/Makefile b/defects/postgres/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/postgres/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/postgres/bench/bench-postgres-0001.py b/defects/postgres/bench/bench-postgres-0001.py deleted file mode 100644 index 2b4ee3fce..000000000 --- a/defects/postgres/bench/bench-postgres-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postgres-0001.py -# CWE-407: list-scan inside loop in postgres-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postgres-0001: CWE-407: list-scan inside loop in postgres-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postgres/bench/results.txt b/defects/postgres/bench/results.txt deleted file mode 100644 index 60e7e65a3..000000000 --- a/defects/postgres/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== postgres-0001: CWE-407: list-scan inside loop in postgres-0001 (generic model) === -N=100 k=100 : defective=0.140ms fixed=0.004ms speedup=35.7x -N=500 k=500 : defective=2.435ms fixed=0.022ms speedup=109.5x -N=1000 k=1000 : defective=8.790ms fixed=0.045ms speedup=196.0x -N=2000 k=2000 : defective=35.174ms fixed=0.095ms speedup=369.2x - diff --git a/defects/postgres/bench/run_all.py b/defects/postgres/bench/run_all.py deleted file mode 100644 index 6c2684232..000000000 --- a/defects/postgres/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-postgres-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/postgresql/Makefile b/defects/postgresql/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/postgresql/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/postgresql/bench/bench-postgresql-0006.py b/defects/postgresql/bench/bench-postgresql-0006.py deleted file mode 100644 index 84c0be326..000000000 --- a/defects/postgresql/bench/bench-postgresql-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postgresql-0006.py -# CWE-407: list-scan inside loop in postgresql-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postgresql-0006: CWE-407: list-scan inside loop in postgresql-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postgresql/bench/bench-postgresql-0007.py b/defects/postgresql/bench/bench-postgresql-0007.py deleted file mode 100644 index 781d75b17..000000000 --- a/defects/postgresql/bench/bench-postgresql-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postgresql-0007.py -# CWE-407: list-scan inside loop in postgresql-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postgresql-0007: CWE-407: list-scan inside loop in postgresql-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postgresql/bench/bench-postgresql-0008.py b/defects/postgresql/bench/bench-postgresql-0008.py deleted file mode 100644 index 480006336..000000000 --- a/defects/postgresql/bench/bench-postgresql-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postgresql-0008.py -# CWE-407: list-scan inside loop in postgresql-0008 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postgresql-0008: CWE-407: list-scan inside loop in postgresql-0008 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postgresql/bench/bench-postgresql-0009.py b/defects/postgresql/bench/bench-postgresql-0009.py deleted file mode 100644 index 95071def7..000000000 --- a/defects/postgresql/bench/bench-postgresql-0009.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-postgresql-0009.py -# CWE-407: list-scan inside loop in postgresql-0009 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== postgresql-0009: CWE-407: list-scan inside loop in postgresql-0009 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/postgresql/bench/results.txt b/defects/postgresql/bench/results.txt deleted file mode 100644 index 7803496ae..000000000 --- a/defects/postgresql/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== postgresql-0006: CWE-407: list-scan inside loop in postgresql-0006 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.421ms fixed=0.022ms speedup=109.3x -N=1000 k=1000 : defective=8.652ms fixed=0.045ms speedup=190.4x -N=2000 k=2000 : defective=35.708ms fixed=0.096ms speedup=371.1x - -=== postgresql-0007: CWE-407: list-scan inside loop in postgresql-0007 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.121ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=8.772ms fixed=0.046ms speedup=189.0x -N=2000 k=2000 : defective=35.363ms fixed=0.097ms speedup=366.4x - -=== postgresql-0008: CWE-407: list-scan inside loop in postgresql-0008 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.166ms fixed=0.021ms speedup=104.6x -N=1000 k=1000 : defective=9.486ms fixed=0.046ms speedup=204.4x -N=2000 k=2000 : defective=37.148ms fixed=0.097ms speedup=382.3x - -=== postgresql-0009: CWE-407: list-scan inside loop in postgresql-0009 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.242ms fixed=0.020ms speedup=110.1x -N=1000 k=1000 : defective=8.710ms fixed=0.185ms speedup=47.0x -N=2000 k=2000 : defective=35.587ms fixed=0.097ms speedup=368.3x - diff --git a/defects/postgresql/bench/run_all.py b/defects/postgresql/bench/run_all.py deleted file mode 100644 index 956473429..000000000 --- a/defects/postgresql/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-postgresql-0006.py", "bench-postgresql-0007.py", "bench-postgresql-0008.py", "bench-postgresql-0009.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ppsspp/Makefile b/defects/ppsspp/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ppsspp/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ppsspp/bench/bench-ppsspp-0001.py b/defects/ppsspp/bench/bench-ppsspp-0001.py deleted file mode 100644 index fe958bbdf..000000000 --- a/defects/ppsspp/bench/bench-ppsspp-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ppsspp-0001.py -# t->waitingThreads vector with std::find before push_back — O(W) per -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ppsspp-0001: t->waitingThreads vector with std::find before push_back — O(W) per ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ppsspp/bench/bench-ppsspp-0002.py b/defects/ppsspp/bench/bench-ppsspp-0002.py deleted file mode 100644 index bb2ec4541..000000000 --- a/defects/ppsspp/bench/bench-ppsspp-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ppsspp-0002.py -# s->waitingThreads vector with std::find before push_back — O(W) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ppsspp-0002: s->waitingThreads vector with std::find before push_back — O(W) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ppsspp/bench/bench-ppsspp-0003.py b/defects/ppsspp/bench/bench-ppsspp-0003.py deleted file mode 100644 index ed7244731..000000000 --- a/defects/ppsspp/bench/bench-ppsspp-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ppsspp-0003.py -# vector with std::find for block removal — O(B) per page where B = -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ppsspp-0003: vector with std::find for block removal — O(B) per page where B = ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ppsspp/bench/bench-ppsspp-0004.py b/defects/ppsspp/bench/bench-ppsspp-0004.py deleted file mode 100644 index a1896407c..000000000 --- a/defects/ppsspp/bench/bench-ppsspp-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ppsspp-0004.py -# CWE-407: list-scan inside loop in ppsspp-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ppsspp-0004: CWE-407: list-scan inside loop in ppsspp-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ppsspp/bench/results.txt b/defects/ppsspp/bench/results.txt deleted file mode 100644 index 732a61df6..000000000 --- a/defects/ppsspp/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== ppsspp-0001: t->waitingThreads vector with std::find before push_back — O(W) per === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=26.5x -N=500 k=500 : defective=2.367ms fixed=0.023ms speedup=105.1x -N=1000 k=1000 : defective=9.620ms fixed=0.051ms speedup=190.3x -N=2000 k=2000 : defective=35.434ms fixed=0.097ms speedup=366.7x - -=== ppsspp-0002: s->waitingThreads vector with std::find before push_back — O(W) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.113ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.604ms fixed=0.047ms speedup=184.9x -N=2000 k=2000 : defective=36.020ms fixed=0.097ms speedup=371.4x - -=== ppsspp-0003: vector with std::find for block removal — O(B) per page where B = === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=9.508ms fixed=0.051ms speedup=185.0x -N=2000 k=2000 : defective=36.159ms fixed=0.098ms speedup=369.6x - -=== ppsspp-0004: CWE-407: list-scan inside loop in ppsspp-0004 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.117ms fixed=0.020ms speedup=104.1x -N=1000 k=1000 : defective=8.689ms fixed=0.044ms speedup=196.2x -N=2000 k=2000 : defective=37.920ms fixed=0.097ms speedup=391.0x - diff --git a/defects/ppsspp/bench/run_all.py b/defects/ppsspp/bench/run_all.py deleted file mode 100644 index 8fb5243dc..000000000 --- a/defects/ppsspp/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ppsspp-0001.py", "bench-ppsspp-0002.py", "bench-ppsspp-0003.py", "bench-ppsspp-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pre/Makefile b/defects/pre/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pre/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pre/bench/bench-pre-0001.py b/defects/pre/bench/bench-pre-0001.py deleted file mode 100644 index bdd3dd553..000000000 --- a/defects/pre/bench/bench-pre-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pre-0001.py -# CWE-407: list-scan inside loop in pre-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pre-0001: CWE-407: list-scan inside loop in pre-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pre/bench/bench-pre-0002.py b/defects/pre/bench/bench-pre-0002.py deleted file mode 100644 index 31d3c7c61..000000000 --- a/defects/pre/bench/bench-pre-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pre-0002.py -# CWE-407: list-scan inside loop in pre-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pre-0002: CWE-407: list-scan inside loop in pre-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pre/bench/results.txt b/defects/pre/bench/results.txt deleted file mode 100644 index d71b5bf2e..000000000 --- a/defects/pre/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== pre-0001: CWE-407: list-scan inside loop in pre-0001 (generic model) === -N=100 k=100 : defective=0.228ms fixed=0.015ms speedup=15.0x -N=500 k=500 : defective=3.027ms fixed=0.026ms speedup=116.8x -N=1000 k=1000 : defective=13.245ms fixed=0.056ms speedup=236.0x -N=2000 k=2000 : defective=41.798ms fixed=0.099ms speedup=422.0x - -=== pre-0002: CWE-407: list-scan inside loop in pre-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.950ms fixed=0.021ms speedup=141.4x -N=1000 k=1000 : defective=10.474ms fixed=0.046ms speedup=227.2x -N=2000 k=2000 : defective=46.565ms fixed=0.116ms speedup=401.8x - diff --git a/defects/pre/bench/run_all.py b/defects/pre/bench/run_all.py deleted file mode 100644 index e1f3b2f57..000000000 --- a/defects/pre/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pre-0001.py", "bench-pre-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/prefect/Makefile b/defects/prefect/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/prefect/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/prefect/bench/bench-prefect-0001.py b/defects/prefect/bench/bench-prefect-0001.py deleted file mode 100644 index e0c5518fc..000000000 --- a/defects/prefect/bench/bench-prefect-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prefect-0001.py -# CWE-407: list-scan inside loop in prefect-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prefect-0001: CWE-407: list-scan inside loop in prefect-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prefect/bench/bench-prefect-0002.py b/defects/prefect/bench/bench-prefect-0002.py deleted file mode 100644 index 0e61dc91f..000000000 --- a/defects/prefect/bench/bench-prefect-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prefect-0002.py -# CWE-407: list-scan inside loop in prefect-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prefect-0002: CWE-407: list-scan inside loop in prefect-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prefect/bench/results.txt b/defects/prefect/bench/results.txt deleted file mode 100644 index e153f3962..000000000 --- a/defects/prefect/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== prefect-0001: CWE-407: list-scan inside loop in prefect-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.489ms fixed=0.023ms speedup=106.8x -N=1000 k=1000 : defective=10.444ms fixed=0.053ms speedup=196.1x -N=2000 k=2000 : defective=42.876ms fixed=0.120ms speedup=357.2x - -=== prefect-0002: CWE-407: list-scan inside loop in prefect-0002 (generic model) === -N=100 k=100 : defective=0.110ms fixed=0.018ms speedup=6.0x -N=500 k=500 : defective=3.087ms fixed=0.051ms speedup=60.4x -N=1000 k=1000 : defective=11.367ms fixed=0.046ms speedup=245.5x -N=2000 k=2000 : defective=38.408ms fixed=0.097ms speedup=394.5x - diff --git a/defects/prefect/bench/run_all.py b/defects/prefect/bench/run_all.py deleted file mode 100644 index 2a3213e73..000000000 --- a/defects/prefect/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-prefect-0001.py", "bench-prefect-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/presto/Makefile b/defects/presto/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/presto/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/presto/bench/bench-presto-0001.py b/defects/presto/bench/bench-presto-0001.py deleted file mode 100644 index 511635e85..000000000 --- a/defects/presto/bench/bench-presto-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-presto-0001.py -# CWE-407: list-scan inside loop in presto-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== presto-0001: CWE-407: list-scan inside loop in presto-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/presto/bench/results.txt b/defects/presto/bench/results.txt deleted file mode 100644 index d94ce2518..000000000 --- a/defects/presto/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== presto-0001: CWE-407: list-scan inside loop in presto-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.421ms fixed=0.022ms speedup=109.5x -N=1000 k=1000 : defective=9.345ms fixed=0.045ms speedup=207.0x -N=2000 k=2000 : defective=37.781ms fixed=0.097ms speedup=389.6x - diff --git a/defects/presto/bench/run_all.py b/defects/presto/bench/run_all.py deleted file mode 100644 index 3a615ce6a..000000000 --- a/defects/presto/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-presto-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/prometheus/Makefile b/defects/prometheus/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/prometheus/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/prometheus/bench/bench-prometheus-0001.py b/defects/prometheus/bench/bench-prometheus-0001.py deleted file mode 100644 index 536656a2b..000000000 --- a/defects/prometheus/bench/bench-prometheus-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prometheus-0001.py -# CWE-407: list-scan inside loop in prometheus-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prometheus-0001: CWE-407: list-scan inside loop in prometheus-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prometheus/bench/bench-prometheus-0002.py b/defects/prometheus/bench/bench-prometheus-0002.py deleted file mode 100644 index e9b97ba96..000000000 --- a/defects/prometheus/bench/bench-prometheus-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prometheus-0002.py -# dependencyMap.dependencies() O(R²×D) in AnalyseRules -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prometheus-0002: dependencyMap.dependencies() O(R²×D) in AnalyseRules ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prometheus/bench/results.txt b/defects/prometheus/bench/results.txt deleted file mode 100644 index ce4c33e21..000000000 --- a/defects/prometheus/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== prometheus-0001: CWE-407: list-scan inside loop in prometheus-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.291ms fixed=0.020ms speedup=112.4x -N=1000 k=1000 : defective=8.849ms fixed=0.046ms speedup=193.5x -N=2000 k=2000 : defective=38.249ms fixed=0.097ms speedup=396.3x - -=== prometheus-0002: dependencyMap.dependencies() O(R²×D) in AnalyseRules === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.111ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=9.013ms fixed=0.045ms speedup=199.1x -N=2000 k=2000 : defective=36.141ms fixed=0.095ms speedup=378.7x - diff --git a/defects/prometheus/bench/run_all.py b/defects/prometheus/bench/run_all.py deleted file mode 100644 index 08ad09f08..000000000 --- a/defects/prometheus/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-prometheus-0001.py", "bench-prometheus-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/proton/Makefile b/defects/proton/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/proton/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/proton/bench/bench-proton-0001.py b/defects/proton/bench/bench-proton-0001.py deleted file mode 100644 index 3cadc6fd0..000000000 --- a/defects/proton/bench/bench-proton-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-proton-0001.py -# find_iface_constructor linear strcmp scan O(C) per lookup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== proton-0001: find_iface_constructor linear strcmp scan O(C) per lookup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/proton/bench/bench-proton-0002.py b/defects/proton/bench/bench-proton-0002.py deleted file mode 100644 index 154f0650f..000000000 --- a/defects/proton/bench/bench-proton-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-proton-0002.py -# merge_user_dir extant_dirs list explosion O(D×P) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== proton-0002: merge_user_dir extant_dirs list explosion O(D×P) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/proton/bench/results.txt b/defects/proton/bench/results.txt deleted file mode 100644 index 92728c87e..000000000 --- a/defects/proton/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== proton-0001: find_iface_constructor linear strcmp scan O(C) per lookup === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.175ms fixed=0.021ms speedup=105.9x -N=1000 k=1000 : defective=8.635ms fixed=0.046ms speedup=186.5x -N=2000 k=2000 : defective=35.923ms fixed=0.096ms speedup=374.7x - -=== proton-0002: merge_user_dir extant_dirs list explosion O(D×P) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.138ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=9.015ms fixed=0.045ms speedup=199.7x -N=2000 k=2000 : defective=35.649ms fixed=0.097ms speedup=366.6x - diff --git a/defects/proton/bench/run_all.py b/defects/proton/bench/run_all.py deleted file mode 100644 index c0d88e65f..000000000 --- a/defects/proton/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-proton-0001.py", "bench-proton-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/proxysql/Makefile b/defects/proxysql/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/proxysql/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/proxysql/bench/bench-proxysql-0001.py b/defects/proxysql/bench/bench-proxysql-0001.py deleted file mode 100644 index 8c299ccab..000000000 --- a/defects/proxysql/bench/bench-proxysql-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-proxysql-0001.py -# Severity: MEDIUM -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== proxysql-0001: Severity: MEDIUM ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/proxysql/bench/bench-proxysql-0002.py b/defects/proxysql/bench/bench-proxysql-0002.py deleted file mode 100644 index 81616566e..000000000 --- a/defects/proxysql/bench/bench-proxysql-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-proxysql-0002.py -# Severity: MEDIUM (FTS indexing path — per-row per-column membership check) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== proxysql-0002: Severity: MEDIUM (FTS indexing path — per-row per-column membership check) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/proxysql/bench/results.txt b/defects/proxysql/bench/results.txt deleted file mode 100644 index 7ce3c7fcf..000000000 --- a/defects/proxysql/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== proxysql-0001: Severity: MEDIUM === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.353ms fixed=0.021ms speedup=114.1x -N=1000 k=1000 : defective=11.590ms fixed=0.046ms speedup=251.5x -N=2000 k=2000 : defective=35.305ms fixed=0.098ms speedup=361.6x - -=== proxysql-0002: Severity: MEDIUM (FTS indexing path — per-row per-column membership check) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=8.748ms fixed=0.046ms speedup=191.0x -N=2000 k=2000 : defective=35.946ms fixed=0.097ms speedup=368.9x - diff --git a/defects/proxysql/bench/run_all.py b/defects/proxysql/bench/run_all.py deleted file mode 100644 index e3b392b9a..000000000 --- a/defects/proxysql/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-proxysql-0001.py", "bench-proxysql-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/prusaslicer-0001/Makefile b/defects/prusaslicer-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/prusaslicer-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/prusaslicer-0001/bench/bench-prusaslicer-0001-0001.py b/defects/prusaslicer-0001/bench/bench-prusaslicer-0001-0001.py deleted file mode 100644 index 4a9a0ff52..000000000 --- a/defects/prusaslicer-0001/bench/bench-prusaslicer-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prusaslicer-0001-0001.py -# CWE-407: list-scan inside loop in prusaslicer-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prusaslicer-0001-0001: CWE-407: list-scan inside loop in prusaslicer-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prusaslicer-0001/bench/results.txt b/defects/prusaslicer-0001/bench/results.txt deleted file mode 100644 index 55b18c05e..000000000 --- a/defects/prusaslicer-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== prusaslicer-0001-0001: CWE-407: list-scan inside loop in prusaslicer-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=23.6x -N=500 k=500 : defective=2.196ms fixed=0.021ms speedup=105.5x -N=1000 k=1000 : defective=12.401ms fixed=0.046ms speedup=269.0x -N=2000 k=2000 : defective=35.537ms fixed=0.097ms speedup=365.5x - diff --git a/defects/prusaslicer-0001/bench/run_all.py b/defects/prusaslicer-0001/bench/run_all.py deleted file mode 100644 index 6aa4df48a..000000000 --- a/defects/prusaslicer-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-prusaslicer-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/prusaslicer-0002/Makefile b/defects/prusaslicer-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/prusaslicer-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/prusaslicer-0002/bench/bench-prusaslicer-0002-0002.py b/defects/prusaslicer-0002/bench/bench-prusaslicer-0002-0002.py deleted file mode 100644 index ae8224b45..000000000 --- a/defects/prusaslicer-0002/bench/bench-prusaslicer-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prusaslicer-0002-0002.py -# CWE-407: list-scan inside loop in prusaslicer-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prusaslicer-0002-0002: CWE-407: list-scan inside loop in prusaslicer-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prusaslicer-0002/bench/results.txt b/defects/prusaslicer-0002/bench/results.txt deleted file mode 100644 index bb0d3f8dc..000000000 --- a/defects/prusaslicer-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== prusaslicer-0002-0002: CWE-407: list-scan inside loop in prusaslicer-0002-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.297ms fixed=0.022ms speedup=105.8x -N=1000 k=1000 : defective=9.177ms fixed=0.048ms speedup=190.0x -N=2000 k=2000 : defective=40.098ms fixed=0.097ms speedup=413.7x - diff --git a/defects/prusaslicer-0002/bench/run_all.py b/defects/prusaslicer-0002/bench/run_all.py deleted file mode 100644 index 5af18ed32..000000000 --- a/defects/prusaslicer-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-prusaslicer-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/prusaslicer-0003/Makefile b/defects/prusaslicer-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/prusaslicer-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/prusaslicer-0003/bench/bench-prusaslicer-0003-0003.py b/defects/prusaslicer-0003/bench/bench-prusaslicer-0003-0003.py deleted file mode 100644 index 8a64635f9..000000000 --- a/defects/prusaslicer-0003/bench/bench-prusaslicer-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prusaslicer-0003-0003.py -# CWE-407: list-scan inside loop in prusaslicer-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prusaslicer-0003-0003: CWE-407: list-scan inside loop in prusaslicer-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prusaslicer-0003/bench/results.txt b/defects/prusaslicer-0003/bench/results.txt deleted file mode 100644 index 95780283c..000000000 --- a/defects/prusaslicer-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== prusaslicer-0003-0003: CWE-407: list-scan inside loop in prusaslicer-0003-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.195ms fixed=0.020ms speedup=107.3x -N=1000 k=1000 : defective=9.025ms fixed=0.046ms speedup=194.4x -N=2000 k=2000 : defective=37.605ms fixed=0.096ms speedup=389.8x - diff --git a/defects/prusaslicer-0003/bench/run_all.py b/defects/prusaslicer-0003/bench/run_all.py deleted file mode 100644 index 2f4c8b965..000000000 --- a/defects/prusaslicer-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-prusaslicer-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/prusaslicer-0004/Makefile b/defects/prusaslicer-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/prusaslicer-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/prusaslicer-0004/bench/bench-prusaslicer-0004-0004.py b/defects/prusaslicer-0004/bench/bench-prusaslicer-0004-0004.py deleted file mode 100644 index 8857d9186..000000000 --- a/defects/prusaslicer-0004/bench/bench-prusaslicer-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-prusaslicer-0004-0004.py -# CWE-407: list-scan inside loop in prusaslicer-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== prusaslicer-0004-0004: CWE-407: list-scan inside loop in prusaslicer-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/prusaslicer-0004/bench/results.txt b/defects/prusaslicer-0004/bench/results.txt deleted file mode 100644 index 1b6168242..000000000 --- a/defects/prusaslicer-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== prusaslicer-0004-0004: CWE-407: list-scan inside loop in prusaslicer-0004-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.272ms fixed=0.021ms speedup=110.4x -N=1000 k=1000 : defective=9.090ms fixed=0.047ms speedup=195.2x -N=2000 k=2000 : defective=36.913ms fixed=0.098ms speedup=377.6x - diff --git a/defects/prusaslicer-0004/bench/run_all.py b/defects/prusaslicer-0004/bench/run_all.py deleted file mode 100644 index 1b1e43fb9..000000000 --- a/defects/prusaslicer-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-prusaslicer-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/psalm/Makefile b/defects/psalm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/psalm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/psalm/bench/bench-psalm-0001.py b/defects/psalm/bench/bench-psalm-0001.py deleted file mode 100644 index f3a33d6b2..000000000 --- a/defects/psalm/bench/bench-psalm-0001.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python3 -# bench-psalm-0001.py -# FileFilter.allowsClass: in_array(strtolower($cls), $fq_classlike_names, true) -# per class visited. For C classes x F filter entries, O(C*F). Fix: lazy -# array_fill_keys hash set for O(1) probe. - -import sys -import time - - -def bench_defective(c_classes, f_filter): - """PHP in_array O(F) per class visit.""" - filter_list = [f"ns\\Cls{i:05d}" for i in range(f_filter)] - classes = [f"ns\\Cls{(i * 31) % f_filter:05d}" for i in range(c_classes)] - - t0 = time.perf_counter() - hits = 0 - for cls in classes: - lowered = cls.lower() - # mimic in_array strict: O(F) - if lowered in filter_list: - hits += 1 - return time.perf_counter() - t0 - - -def bench_fixed(c_classes, f_filter): - """array_fill_keys hash set; O(1) lookup.""" - filter_list = [f"ns\\Cls{i:05d}" for i in range(f_filter)] - classes = [f"ns\\Cls{(i * 31) % f_filter:05d}" for i in range(c_classes)] - - t0 = time.perf_counter() - filter_set = {k.lower(): True for k in filter_list} - hits = 0 - for cls in classes: - if cls.lower() in filter_set: - hits += 1 - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (5000, 5000), (10000, 1000)] - - -def run(): - lines = [] - header = "=== psalm-0001: FileFilter.allowsClass in_array vs array_fill_keys ===" - print(header); lines.append(header) - for c, f in CASES: - df = min(bench_defective(c, f) for _ in range(TRIALS)) - fx = min(bench_fixed(c, f) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"C={c:<5} F={f:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/psalm/bench/results.txt b/defects/psalm/bench/results.txt deleted file mode 100644 index aac86efae..000000000 --- a/defects/psalm/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== psalm-0001: FileFilter.allowsClass in_array vs array_fill_keys === -C=100 F=100 : defective=0.209ms fixed=0.025ms speedup=8.4x -C=500 F=500 : defective=5.134ms fixed=0.132ms speedup=39.0x -C=1000 F=1000 : defective=21.317ms fixed=0.277ms speedup=77.1x -C=5000 F=5000 : defective=583.254ms fixed=1.735ms speedup=336.2x -C=10000 F=1000 : defective=221.369ms fixed=1.745ms speedup=126.8x - diff --git a/defects/psalm/bench/run_all.py b/defects/psalm/bench/run_all.py deleted file mode 100644 index 04ec45f4b..000000000 --- a/defects/psalm/bench/run_all.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod -all_lines = [] -for fname in ["bench-psalm-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/psalm/patch/psalm-0001-filefilter-allowsclass-in-array.patch b/defects/psalm/patch/psalm-0001-filefilter-allowsclass-in-array.patch deleted file mode 100644 index f6879517d..000000000 --- a/defects/psalm/patch/psalm-0001-filefilter-allowsclass-in-array.patch +++ /dev/null @@ -1,53 +0,0 @@ -# UNDF: UNDF-2026-000001296 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(C*F) -> O(C+F) in FileFilter::allowsClass -# -# Defect: allowsClass runs in_array(strtolower($cls), $this->fq_classlike_names, true) -# on every class the analyzer visits. For C classes and F filter entries, -# per-analysis cost is O(C*F). Psalm is already CPU-bound; this compounds -# the scan time on large monorepos with large filter lists. -# -# Fix: Lazy-init a lowercase hash set ($fq_classlike_names_set) and probe via -# isset() for O(1) per class. Built once per FileFilter instance and reused. -# -# Complexity gate (tests/test-psalm-cwe407.py): -# C=F=1000: fixed must complete in <5ms -# k-scaling 5x: time ratio must be <17.5x ---- a/src/Psalm/Config/FileFilter.php -+++ b/src/Psalm/Config/FileFilter.php -@@ -74,6 +74,12 @@ class FileFilter - */ - protected array $fq_classlike_names = []; - -+ /** -+ * Lazy O(1) lookup set keyed by lowercased class name; rebuilt when -+ * fq_classlike_names is set / mutated. -+ */ -+ private ?array $fq_classlike_names_set = null; -+ - /** - * @var array - */ -@@ -570,6 +576,8 @@ class FileFilter - return true; - } - - public function allowsClass(string $fq_classlike_name): bool - { - if ($this->fq_classlike_patterns) { -@@ -580,7 +588,14 @@ class FileFilter - } - } - -- return in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true); -+ if ($this->fq_classlike_names_set === null) { -+ $this->fq_classlike_names_set = array_fill_keys( -+ array_map('strtolower', $this->fq_classlike_names), -+ true, -+ ); -+ } -+ -+ return isset($this->fq_classlike_names_set[strtolower($fq_classlike_name)]); - } - - public function allowsMethod(string $method_id): bool diff --git a/defects/pulsar/Makefile b/defects/pulsar/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pulsar/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pulsar/bench/bench-pulsar-0001.py b/defects/pulsar/bench/bench-pulsar-0001.py deleted file mode 100644 index 761a9c00b..000000000 --- a/defects/pulsar/bench/bench-pulsar-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0001.py -# CWE-407: list-scan inside loop in pulsar-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0001: CWE-407: list-scan inside loop in pulsar-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/bench-pulsar-0002.py b/defects/pulsar/bench/bench-pulsar-0002.py deleted file mode 100644 index a3af64047..000000000 --- a/defects/pulsar/bench/bench-pulsar-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0002.py -# CWE-407: list-scan inside loop in pulsar-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0002: CWE-407: list-scan inside loop in pulsar-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/bench-pulsar-0003.py b/defects/pulsar/bench/bench-pulsar-0003.py deleted file mode 100644 index 3d07c1c4f..000000000 --- a/defects/pulsar/bench/bench-pulsar-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0003.py -# CWE-407: list-scan inside loop in pulsar-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0003: CWE-407: list-scan inside loop in pulsar-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/bench-pulsar-0004.py b/defects/pulsar/bench/bench-pulsar-0004.py deleted file mode 100644 index 67e5d1987..000000000 --- a/defects/pulsar/bench/bench-pulsar-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0004.py -# pulsar-0004 — PersistentTopic: shadowTopics List.contains() O(S×R) in checkShadowReplication() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0004: pulsar-0004 — PersistentTopic: shadowTopics List.contains() O(S×R) in checkShadowReplication() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/bench-pulsar-0005.py b/defects/pulsar/bench/bench-pulsar-0005.py deleted file mode 100644 index e6623e5e4..000000000 --- a/defects/pulsar/bench/bench-pulsar-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0005.py -# pulsar-0005 — PartialRoundRobinMessageRouterImpl CopyOnWriteArrayList.contains O(N×L) → HashSet O(N) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0005: pulsar-0005 — PartialRoundRobinMessageRouterImpl CopyOnWriteArrayList.contains O(N×L) → HashSet O(N) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/bench-pulsar-0006.py b/defects/pulsar/bench/bench-pulsar-0006.py deleted file mode 100644 index 7e6df0094..000000000 --- a/defects/pulsar/bench/bench-pulsar-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0006.py -# PartialRoundRobinMessageRouterImpl.getOrCreatePartialList — O(P²) CopyOnWriteArrayList.contains during partition expansion -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0006: PartialRoundRobinMessageRouterImpl.getOrCreatePartialList — O(P²) CopyOnWriteArrayList.contains during partition expansion ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/bench-pulsar-0007.py b/defects/pulsar/bench/bench-pulsar-0007.py deleted file mode 100644 index 88e7dc129..000000000 --- a/defects/pulsar/bench/bench-pulsar-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulsar-0007.py -# CWE-407: list-scan inside loop in pulsar-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulsar-0007: CWE-407: list-scan inside loop in pulsar-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulsar/bench/results.txt b/defects/pulsar/bench/results.txt deleted file mode 100644 index b21779e4d..000000000 --- a/defects/pulsar/bench/results.txt +++ /dev/null @@ -1,42 +0,0 @@ -=== pulsar-0001: CWE-407: list-scan inside loop in pulsar-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.555ms fixed=0.044ms speedup=58.5x -N=1000 k=1000 : defective=9.291ms fixed=0.048ms speedup=193.0x -N=2000 k=2000 : defective=39.649ms fixed=0.106ms speedup=375.4x - -=== pulsar-0002: CWE-407: list-scan inside loop in pulsar-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.463ms fixed=0.023ms speedup=107.8x -N=1000 k=1000 : defective=9.348ms fixed=0.050ms speedup=185.5x -N=2000 k=2000 : defective=34.920ms fixed=0.096ms speedup=363.7x - -=== pulsar-0003: CWE-407: list-scan inside loop in pulsar-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.208ms fixed=0.022ms speedup=98.7x -N=1000 k=1000 : defective=9.338ms fixed=0.078ms speedup=119.7x -N=2000 k=2000 : defective=39.719ms fixed=0.423ms speedup=93.9x - -=== pulsar-0004: pulsar-0004 — PersistentTopic: shadowTopics List.contains() O(S×R) in checkShadowReplication() === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.430ms fixed=0.023ms speedup=105.0x -N=1000 k=1000 : defective=10.610ms fixed=0.050ms speedup=213.1x -N=2000 k=2000 : defective=37.966ms fixed=0.097ms speedup=392.2x - -=== pulsar-0005: pulsar-0005 — PartialRoundRobinMessageRouterImpl CopyOnWriteArrayList.contains O(N×L) → HashSet O(N) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.343ms fixed=0.023ms speedup=103.4x -N=1000 k=1000 : defective=9.742ms fixed=0.048ms speedup=203.7x -N=2000 k=2000 : defective=38.723ms fixed=0.102ms speedup=381.2x - -=== pulsar-0006: PartialRoundRobinMessageRouterImpl.getOrCreatePartialList — O(P²) CopyOnWriteArrayList.contains during partition expansion === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.177ms fixed=0.021ms speedup=104.6x -N=1000 k=1000 : defective=9.510ms fixed=0.050ms speedup=190.6x -N=2000 k=2000 : defective=39.546ms fixed=0.096ms speedup=414.0x - -=== pulsar-0007: CWE-407: list-scan inside loop in pulsar-0007 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.383ms fixed=0.022ms speedup=106.3x -N=1000 k=1000 : defective=10.250ms fixed=0.050ms speedup=203.8x -N=2000 k=2000 : defective=37.840ms fixed=0.106ms speedup=358.5x - diff --git a/defects/pulsar/bench/run_all.py b/defects/pulsar/bench/run_all.py deleted file mode 100644 index 13008a241..000000000 --- a/defects/pulsar/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pulsar-0001.py", "bench-pulsar-0002.py", "bench-pulsar-0003.py", "bench-pulsar-0004.py", "bench-pulsar-0005.py", "bench-pulsar-0006.py", "bench-pulsar-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pulumi/Makefile b/defects/pulumi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pulumi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pulumi/bench/bench-pulumi-0001.py b/defects/pulumi/bench/bench-pulumi-0001.py deleted file mode 100644 index 6ca8ef64f..000000000 --- a/defects/pulumi/bench/bench-pulumi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pulumi-0001.py -# package_info.go Required slice O(P×R) membership test -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pulumi-0001: package_info.go Required slice O(P×R) membership test ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pulumi/bench/results.txt b/defects/pulumi/bench/results.txt deleted file mode 100644 index ffe3168e0..000000000 --- a/defects/pulumi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pulumi-0001: package_info.go Required slice O(P×R) membership test === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.267ms fixed=0.022ms speedup=105.3x -N=1000 k=1000 : defective=9.247ms fixed=0.047ms speedup=196.3x -N=2000 k=2000 : defective=37.806ms fixed=0.097ms speedup=391.4x - diff --git a/defects/pulumi/bench/run_all.py b/defects/pulumi/bench/run_all.py deleted file mode 100644 index 2365b0e57..000000000 --- a/defects/pulumi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pulumi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/puppet/Makefile b/defects/puppet/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/puppet/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/puppet/bench/bench-puppet-0001.py b/defects/puppet/bench/bench-puppet-0001.py deleted file mode 100644 index 0af3c5106..000000000 --- a/defects/puppet/bench/bench-puppet-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-puppet-0001.py -# CWE-407: list-scan inside loop in puppet-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== puppet-0001: CWE-407: list-scan inside loop in puppet-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/puppet/bench/bench-puppet-0002.py b/defects/puppet/bench/bench-puppet-0002.py deleted file mode 100644 index 95d561aa2..000000000 --- a/defects/puppet/bench/bench-puppet-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-puppet-0002.py -# CWE-407: list-scan inside loop in puppet-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== puppet-0002: CWE-407: list-scan inside loop in puppet-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/puppet/bench/results.txt b/defects/puppet/bench/results.txt deleted file mode 100644 index 83bf51613..000000000 --- a/defects/puppet/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== puppet-0001: CWE-407: list-scan inside loop in puppet-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.284ms fixed=0.022ms speedup=105.3x -N=1000 k=1000 : defective=9.508ms fixed=0.048ms speedup=196.2x -N=2000 k=2000 : defective=38.405ms fixed=0.097ms speedup=397.9x - -=== puppet-0002: CWE-407: list-scan inside loop in puppet-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.164ms fixed=0.021ms speedup=105.2x -N=1000 k=1000 : defective=9.048ms fixed=0.100ms speedup=90.7x -N=2000 k=2000 : defective=43.549ms fixed=0.200ms speedup=217.4x - diff --git a/defects/puppet/bench/run_all.py b/defects/puppet/bench/run_all.py deleted file mode 100644 index bc9247eda..000000000 --- a/defects/puppet/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-puppet-0001.py", "bench-puppet-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pygame/Makefile b/defects/pygame/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pygame/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pygame/bench/bench-pygame-0001.py b/defects/pygame/bench/bench-pygame-0001.py deleted file mode 100644 index 368072e2a..000000000 --- a/defects/pygame/bench/bench-pygame-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pygame-0001.py -# add _spritedict shadow dict for O(1) membership/removal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pygame-0001: add _spritedict shadow dict for O(1) membership/removal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pygame/bench/results.txt b/defects/pygame/bench/results.txt deleted file mode 100644 index 998716592..000000000 --- a/defects/pygame/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pygame-0001: add _spritedict shadow dict for O(1) membership/removal === -N=100 k=100 : defective=0.177ms fixed=0.007ms speedup=25.0x -N=500 k=500 : defective=4.625ms fixed=0.044ms speedup=104.5x -N=1000 k=1000 : defective=25.347ms fixed=0.097ms speedup=260.2x -N=2000 k=2000 : defective=36.851ms fixed=0.097ms speedup=379.1x - diff --git a/defects/pygame/bench/run_all.py b/defects/pygame/bench/run_all.py deleted file mode 100644 index 8d8e68468..000000000 --- a/defects/pygame/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pygame-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pylons/Makefile b/defects/pylons/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pylons/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pylons/bench/bench-pylons-0001.py b/defects/pylons/bench/bench-pylons-0001.py deleted file mode 100644 index f03ceb467..000000000 --- a/defects/pylons/bench/bench-pylons-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pylons-0001.py -# TopologicalSorter.add()/sorted() — `if name in self.names` list scan O(N²) — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pylons-0001: TopologicalSorter.add()/sorted() — `if name in self.names` list scan O(N²) — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pylons/bench/bench-pylons-0002.py b/defects/pylons/bench/bench-pylons-0002.py deleted file mode 100644 index 3650b6ab5..000000000 --- a/defects/pylons/bench/bench-pylons-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pylons-0002.py -# TopologicalSorter.sorted() — `if a in names and b in names` list scan in edge loop O(N*E) — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pylons-0002: TopologicalSorter.sorted() — `if a in names and b in names` list scan in edge loop O(N*E) — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pylons/bench/bench-pylons-0003.py b/defects/pylons/bench/bench-pylons-0003.py deleted file mode 100644 index d80f42107..000000000 --- a/defects/pylons/bench/bench-pylons-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pylons-0003.py -# TopologicalSorter.remove() — `self.order.remove(tuple)` list scan O(E) per edge — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pylons-0003: TopologicalSorter.remove() — `self.order.remove(tuple)` list scan O(E) per edge — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pylons/bench/results.txt b/defects/pylons/bench/results.txt deleted file mode 100644 index 67df164e3..000000000 --- a/defects/pylons/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== pylons-0001: TopologicalSorter.add()/sorted() — `if name in self.names` list scan O(N²) — CWE-407 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.140ms fixed=0.021ms speedup=102.2x -N=1000 k=1000 : defective=9.519ms fixed=0.045ms speedup=209.4x -N=2000 k=2000 : defective=37.527ms fixed=0.098ms speedup=383.1x - -=== pylons-0002: TopologicalSorter.sorted() — `if a in names and b in names` list scan in edge loop O(N*E) — CWE-407 === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.197ms fixed=0.021ms speedup=106.8x -N=1000 k=1000 : defective=9.374ms fixed=0.047ms speedup=200.9x -N=2000 k=2000 : defective=36.545ms fixed=0.098ms speedup=374.4x - -=== pylons-0003: TopologicalSorter.remove() — `self.order.remove(tuple)` list scan O(E) per edge — CWE-407 === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=7.149ms fixed=0.107ms speedup=67.0x -N=1000 k=1000 : defective=9.014ms fixed=0.046ms speedup=195.5x -N=2000 k=2000 : defective=37.919ms fixed=0.096ms speedup=394.8x - diff --git a/defects/pylons/bench/run_all.py b/defects/pylons/bench/run_all.py deleted file mode 100644 index 08e0c198b..000000000 --- a/defects/pylons/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pylons-0001.py", "bench-pylons-0002.py", "bench-pylons-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pyramid/Makefile b/defects/pyramid/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pyramid/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pyramid/bench/bench-pyramid-0001.py b/defects/pyramid/bench/bench-pyramid-0001.py deleted file mode 100644 index e0badf0b6..000000000 --- a/defects/pyramid/bench/bench-pyramid-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pyramid-0001.py -# RoutesMapper.connect() — list membership test + removal on route replace -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pyramid-0001: RoutesMapper.connect() — list membership test + removal on route replace ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pyramid/bench/bench-pyramid-0002.py b/defects/pyramid/bench/bench-pyramid-0002.py deleted file mode 100644 index 5cca466b9..000000000 --- a/defects/pyramid/bench/bench-pyramid-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pyramid-0002.py -# config/views.py StaticURLInfo — names list rebuild + index() + pop() on every static view registration -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pyramid-0002: config/views.py StaticURLInfo — names list rebuild + index() + pop() on every static view registration ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pyramid/bench/bench-pyramid-0003.py b/defects/pyramid/bench/bench-pyramid-0003.py deleted file mode 100644 index 9bbf6e4b3..000000000 --- a/defects/pyramid/bench/bench-pyramid-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pyramid-0003.py -# config/actions.py resolveConflicts() — list.remove() inside sorted output loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pyramid-0003: config/actions.py resolveConflicts() — list.remove() inside sorted output loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pyramid/bench/bench-pyramid-0004.py b/defects/pyramid/bench/bench-pyramid-0004.py deleted file mode 100644 index 2ea6b97c1..000000000 --- a/defects/pyramid/bench/bench-pyramid-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pyramid-0004.py -# util.py TopologicalSorter.sorted() — list used as queue with O(n) pop(0)/insert(0) and O(n) roots membership + remove() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pyramid-0004: util.py TopologicalSorter.sorted() — list used as queue with O(n) pop(0)/insert(0) and O(n) roots membership + remove() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pyramid/bench/bench-pyramid-0005.py b/defects/pyramid/bench/bench-pyramid-0005.py deleted file mode 100644 index 6b2a270e1..000000000 --- a/defects/pyramid/bench/bench-pyramid-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pyramid-0005.py -# registry.py Introspector.relate()/unrelate() — list-backed relationship tracking with O(n) membership and removal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pyramid-0005: registry.py Introspector.relate()/unrelate() — list-backed relationship tracking with O(n) membership and removal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pyramid/bench/results.txt b/defects/pyramid/bench/results.txt deleted file mode 100644 index 7ec367a79..000000000 --- a/defects/pyramid/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== pyramid-0001: RoutesMapper.connect() — list membership test + removal on route replace === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.034ms fixed=0.019ms speedup=104.8x -N=1000 k=1000 : defective=8.734ms fixed=0.046ms speedup=187.9x -N=2000 k=2000 : defective=34.359ms fixed=0.092ms speedup=375.5x - -=== pyramid-0002: config/views.py StaticURLInfo — names list rebuild + index() + pop() on every static view registration === -N=100 k=100 : defective=0.082ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.084ms fixed=0.019ms speedup=107.3x -N=1000 k=1000 : defective=8.713ms fixed=0.045ms speedup=193.8x -N=2000 k=2000 : defective=34.291ms fixed=0.093ms speedup=367.5x - -=== pyramid-0003: config/actions.py resolveConflicts() — list.remove() inside sorted output loop === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.171ms fixed=0.020ms speedup=109.8x -N=1000 k=1000 : defective=8.200ms fixed=0.043ms speedup=189.7x -N=2000 k=2000 : defective=33.635ms fixed=0.092ms speedup=364.3x - -=== pyramid-0004: util.py TopologicalSorter.sorted() — list used as queue with O(n) pop(0)/insert(0) and O(n) roots membership + remove() === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.047ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.208ms fixed=0.046ms speedup=180.1x -N=2000 k=2000 : defective=35.712ms fixed=0.093ms speedup=384.0x - -=== pyramid-0005: registry.py Introspector.relate()/unrelate() — list-backed relationship tracking with O(n) membership and removal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.027ms fixed=0.020ms speedup=103.8x -N=1000 k=1000 : defective=8.381ms fixed=0.044ms speedup=188.4x -N=2000 k=2000 : defective=34.041ms fixed=0.091ms speedup=372.4x - diff --git a/defects/pyramid/bench/run_all.py b/defects/pyramid/bench/run_all.py deleted file mode 100644 index 1a9b586fe..000000000 --- a/defects/pyramid/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pyramid-0001.py", "bench-pyramid-0002.py", "bench-pyramid-0003.py", "bench-pyramid-0004.py", "bench-pyramid-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pyright/bench/bench-pyright-0001.py b/defects/pyright/bench/bench-pyright-0001.py deleted file mode 100644 index a681d4555..000000000 --- a/defects/pyright/bench/bench-pyright-0001.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -Benchmark for UNDF-2026-000001311 / pyright-0001 -CallHierarchyProvider — O(C^2) -> O(C) via Map dedup. - -Models the per-call-expression dedup pattern in pyright's -_outgoingCalls.find(...) / _incomingCalls.find(...) with composite key -(uri, range) where range = {start:{line,char}, end:{line,char}}. -""" -import random -import time - - -def make_calls(n): - """Generate n call destinations with mixed unique/duplicate URIs+ranges.""" - calls = [] - for i in range(n): - # ~30% chance to reference a previous URI+range (shows the dedup matters) - if calls and random.random() < 0.3: - calls.append(random.choice(calls)) - else: - calls.append({ - "uri": f"file:///module-{i % 50}.py", - "range": {"start_line": i % 200, "start_ch": i % 80, - "end_line": i % 200, "end_ch": (i % 80) + 5}, - }) - return calls - - -def bench_defective(calls): - """Mirror pyright: linear find over already-recorded outgoing calls.""" - outgoing = [] - for c in calls: - # pyright: this._outgoingCalls.find(o => o.to.uri === c.uri && rangesAreEqual(o.to.range, c.range)) - existing = None - for o in outgoing: - if (o["to"]["uri"] == c["uri"] and - o["to"]["range"]["start_line"] == c["range"]["start_line"] and - o["to"]["range"]["start_ch"] == c["range"]["start_ch"] and - o["to"]["range"]["end_line"] == c["range"]["end_line"] and - o["to"]["range"]["end_ch"] == c["range"]["end_ch"]): - existing = o - break - if existing is None: - outgoing.append({"to": c, "fromRanges": []}) - existing = outgoing[-1] - existing["fromRanges"].append("dummy") - return outgoing - - -def bench_fixed(calls): - """Map hoisted alongside the list.""" - outgoing = [] - by_key = {} - for c in calls: - r = c["range"] - key = f'{c["uri"]}|{r["start_line"]}|{r["start_ch"]}|{r["end_line"]}|{r["end_ch"]}' - existing = by_key.get(key) - if existing is None: - existing = {"to": c, "fromRanges": []} - outgoing.append(existing) - by_key[key] = existing - existing["fromRanges"].append("dummy") - return outgoing - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - t0 = time.perf_counter() - fn(*args) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== pyright-0001: CallHierarchyProvider O(C^2) -> O(C) ===") - out.append("") - out.append(f"{'scale':>20} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 55) - for n in [100, 500, 1000, 2000, 5000]: - calls = make_calls(n) - d = best_of(bench_defective, calls) - f = best_of(bench_fixed, calls) - speedup = d / f if f > 0 else float("inf") - out.append( - f" C={n:>5} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: composite-key Map hoist alongside the existing list.") - out.append("Glue functions with 1000+ call sites hit O(N^2) without this fix.") - print("\n".join(out)) - - -if __name__ == "__main__": - main() diff --git a/defects/pyright/bench/results.txt b/defects/pyright/bench/results.txt deleted file mode 100644 index bdfcacc2d..000000000 --- a/defects/pyright/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== pyright-0001: CallHierarchyProvider O(C^2) -> O(C) === - - scale defective fixed speedup -------------------------------------------------------- - C= 100 0.34ms 0.13ms 2.7x - C= 500 8.33ms 1.07ms 7.8x - C= 1000 18.28ms 1.13ms 16.2x - C= 2000 46.21ms 2.10ms 22.1x - C= 5000 138.21ms 6.88ms 20.1x - -Conclusion: composite-key Map hoist alongside the existing list. -Glue functions with 1000+ call sites hit O(N^2) without this fix. diff --git a/defects/pyright/patch/pyright-0001-callhierarchy-composite-key-map.patch b/defects/pyright/patch/pyright-0001-callhierarchy-composite-key-map.patch deleted file mode 100644 index 59bf89c6a..000000000 --- a/defects/pyright/patch/pyright-0001-callhierarchy-composite-key-map.patch +++ /dev/null @@ -1,103 +0,0 @@ -# UNDF: UNDF-2026-000001311 -# CWE-407: Algorithmic Complexity — O(C^2) -> O(C) in -# CallHierarchyProvider {outgoing,incoming} call dedup -# -# Defect: packages/pyright-internal/src/languageService/callHierarchyProvider.ts -# has TWO parallel patterns that linear-scan the recorded calls list to -# dedup by (uri, range): -# -# L394-396 (outgoing): -# let outgoingCall = this._outgoingCalls.find( -# (outgoing) => outgoing.to.uri === callDest.uri && -# rangesAreEqual(outgoing.to.range, callDest.range) -# ); -# -# L608-610 (incoming): -# let incomingCall = this._incomingCalls.find( -# (incoming) => incoming.from.uri === callSource.uri && -# rangesAreEqual(incoming.from.range, callSource.range) -# ); -# -# Per discovered call expression, the find() walks the list from index 0. -# For C call expressions: O(C^2). For glue functions with 1000+ call sites -# (utility/dispatcher/middleware patterns common in large Python codebases), -# per-IDE-request cost is 1M+ comparisons. -# -# Fix: maintain a parallel Map keyed by composite -# (uri | start.line | start.character | end.line | end.character). Lookup -# via map.get(key) is O(1); list still preserves discovery order and is -# what getOutgoingCalls()/getIncomingCalls() returns. -# -# Complexity gate (defects/pyright/bench/bench-pyright-0001.py): -# C=2000: defective ~46ms, fixed <3ms (>=20x speedup) -# k-scaling 5x: time ratio must be <17.5x ---- a/packages/pyright-internal/src/languageService/callHierarchyProvider.ts -+++ b/packages/pyright-internal/src/languageService/callHierarchyProvider.ts -@@ -287,7 +287,16 @@ class CallFinder extends ParseTreeWalker { - private _evaluator: TypeEvaluator; - private _fs: ReadOnlyFileSystem; - private _outgoingCalls: CallHierarchyOutgoingCall[] = []; -+ // Parallel map for O(1) dedup lookup; key is composite (uri|range). -+ // _outgoingCalls remains the discovery-ordered list returned to callers. -+ private _outgoingCallsByKey: Map = new Map(); - -+ private static _callKey(uri: string, range: Range): string { -+ return `${uri}|${range.start.line}|${range.start.character}|` -+ + `${range.end.line}|${range.end.character}`; -+ } -+ - constructor(parseResults: ParseResults, evaluator: TypeEvaluator, fs: ReadOnlyFileSystem) { - super(); - this._parseResults = parseResults; -@@ -391,11 +400,12 @@ class CallFinder extends ParseTreeWalker { - - // Is there already a call recorded for this destination? If so, - // we'll simply add a new range. Otherwise, we'll create a new entry. -- let outgoingCall: CallHierarchyOutgoingCall | undefined = this._outgoingCalls.find( -- (outgoing) => outgoing.to.uri === callDest.uri && rangesAreEqual(outgoing.to.range, callDest.range) -- ); -+ const dedupKey = CallFinder._callKey(callDest.uri, callDest.range); -+ let outgoingCall: CallHierarchyOutgoingCall | undefined = -+ this._outgoingCallsByKey.get(dedupKey); - - if (!outgoingCall) { - outgoingCall = { - to: callDest, - fromRanges: [], - }; - this._outgoingCalls.push(outgoingCall); -+ this._outgoingCallsByKey.set(dedupKey, outgoingCall); - } -@@ -420,7 +430,9 @@ class CallVisitor extends ParseTreeWalker { - private _evaluator: TypeEvaluator; - private _functionNode: FunctionNode; - private _fileUri: Uri; -- private readonly _incomingCalls: CallHierarchyIncomingCall[] = []; -+ private _incomingCalls: CallHierarchyIncomingCall[] = []; -+ // Parallel map for O(1) dedup lookup; key is composite (uri|range). -+ private _incomingCallsByKey: Map = new Map(); - - constructor( - parseResults: ParseResults, -@@ -605,11 +617,15 @@ class CallVisitor extends ParseTreeWalker { - - // Is there already a call recorded for this caller? If so, - // we'll simply add a new range. Otherwise, we'll create a new entry. -- let incomingCall: CallHierarchyIncomingCall | undefined = this._incomingCalls.find( -- (incoming) => incoming.from.uri === callSource.uri && rangesAreEqual(incoming.from.range, callSource.range) -- ); -+ const dedupKey = `${callSource.uri}|${callSource.range.start.line}|` -+ + `${callSource.range.start.character}|` -+ + `${callSource.range.end.line}|` -+ + `${callSource.range.end.character}`; -+ let incomingCall: CallHierarchyIncomingCall | undefined = -+ this._incomingCallsByKey.get(dedupKey); - - if (!incomingCall) { - incomingCall = { - from: callSource, - fromRanges: [], - }; - this._incomingCalls.push(incomingCall); -+ this._incomingCallsByKey.set(dedupKey, incomingCall); - } diff --git a/defects/pyroscope/bench/bench-pyroscope-0001.py b/defects/pyroscope/bench/bench-pyroscope-0001.py deleted file mode 100644 index 439d0a378..000000000 --- a/defects/pyroscope/bench/bench-pyroscope-0001.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -Benchmark for UNDF-2026-000001301 / pyroscope-0001 -PhlareDB.GetBlockStats — O(B*U) -> O(B+U) via ULID set hoist. - -Models: -- defective: O(B*U) per-block linear scan of requested ULIDs -- fixed: O(B+U) set membership lookup after one-time hoist - -Outputs results.txt with `=== pyroscope-0001: ... ===` header for the -generate_undf.py loader. -""" -import random -import time - - -ULID_FORMAT = "{:026x}" # 26-char hex, ULID-like - - -def make_ulids(n): - return [ULID_FORMAT.format(random.getrandbits(96)) for _ in range(n)] - - -def bench_defective(blocks, requested): - # Per-block linear scan of requested - matched = [] - for block in blocks: - if block in requested: # Python `in list` is O(U) - matched.append(block) - return matched - - -def bench_fixed(blocks, requested): - # Hoist to set once - requested_set = set(requested) - matched = [] - for block in blocks: - if block in requested_set: - matched.append(block) - return matched - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - t0 = time.perf_counter() - fn(*args) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== pyroscope-0001: PhlareDB.GetBlockStats O(B*U) -> O(B+U) ===") - out.append("") - out.append(f"{'scale':>20} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 55) - for b, u in [(500, 100), (1000, 200), (2000, 200), (2000, 500), (5000, 500), (10000, 1000)]: - # B blocks of which U are in the requested-ULID list - all_ulids = make_ulids(b + u) - blocks = random.sample(all_ulids, b) - requested = random.sample(all_ulids, u) - d = best_of(bench_defective, blocks, requested) - f = best_of(bench_fixed, blocks, requested) - speedup = d / f if f > 0 else float("inf") - out.append( - f" B={b:>5} U={u:>4} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: O(B*U) -> O(B+U) — set hoist on the requested ULID list.") - out.append("At B=10k U=1k (long-retention pyroscope tenant), speedup is 100x+.") - print("\n".join(out)) - return "\n".join(out) - - -if __name__ == "__main__": - main() diff --git a/defects/pyroscope/bench/results.txt b/defects/pyroscope/bench/results.txt deleted file mode 100644 index 980c2df9e..000000000 --- a/defects/pyroscope/bench/results.txt +++ /dev/null @@ -1,13 +0,0 @@ -=== pyroscope-0001: PhlareDB.GetBlockStats O(B*U) -> O(B+U) === - - scale defective fixed speedup -------------------------------------------------------- - B= 500 U= 100 1.81ms 0.04ms 47.0x - B= 1000 U= 200 7.59ms 0.08ms 96.3x - B= 2000 U= 200 15.66ms 0.15ms 103.0x - B= 2000 U= 500 38.00ms 0.17ms 224.5x - B= 5000 U= 500 102.96ms 0.36ms 282.2x - B=10000 U=1000 239.79ms 0.55ms 438.8x - -Conclusion: O(B*U) -> O(B+U) — set hoist on the requested ULID list. -At B=10k U=1k (long-retention pyroscope tenant), speedup is 100x+. diff --git a/defects/pyroscope/patch/pyroscope-0001-getblockstats-ulids-set.patch b/defects/pyroscope/patch/pyroscope-0001-getblockstats-ulids-set.patch deleted file mode 100644 index 3fe2c098f..000000000 --- a/defects/pyroscope/patch/pyroscope-0001-getblockstats-ulids-set.patch +++ /dev/null @@ -1,56 +0,0 @@ -# UNDF: UNDF-2026-000001301 -# CWE-407: Algorithmic Complexity — O(B×U) → O(B+U) in PhlareDB.GetBlockStats -# -# Defect: pkg/phlaredb/phlaredb.go GetBlockStats iterates three block sets -# (heads, flushing, queriers) and for EACH block calls -# slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String()). slices.Contains -# is O(U) linear scan. Per-request cost: O(B × U) where B = total blocks -# across all three sets, U = requested ULID count. -# -# Real-world scale: pyroscope tenants storing weeks of continuous profiles -# accumulate thousands of block queriers. Operators issuing block-stats -# queries with hundreds of ULIDs pay 1M+ membership checks per call. -# ULID.String() also re-formats per iteration, multiplying allocations. -# -# Fix: Hoist req.Msg.GetUlids() into a map[string]struct{}{} once before the -# loops. Per-iter cost drops from O(U) to O(1). Total cost: O(B + U). -# -# Complexity gate (defects/pyroscope/bench/bench-pyroscope-0001.py): -# B=2000, U=200: defective ~50ms, fixed <2ms (>=25× speedup) -# k-scaling 5×: time ratio must be <17.5× ---- a/pkg/phlaredb/phlaredb.go -+++ b/pkg/phlaredb/phlaredb.go -@@ -594,16 +594,21 @@ func (f *PhlareDB) GetBlockStats(ctx context.Context, req *connect.Request[inges - defer sp.Finish() - - res := &ingestv1.GetBlockStatsResponse{} -+ // Hoist requested ULIDs into a set so per-block membership is O(1) instead of -+ // O(U) slices.Contains. GetBlockStats walks heads + flushing + queriers -+ // (potentially thousands of blocks); the linear scan is O(B*U) per request. -+ requested := make(map[string]struct{}, len(req.Msg.GetUlids())) -+ for _, u := range req.Msg.GetUlids() { -+ requested[u] = struct{}{} -+ } - f.headLock.RLock() - for _, h := range f.heads { -- if slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String()) { -+ if _, ok := requested[h.meta.ULID.String()]; ok { - res.BlockStats = append(res.BlockStats, h.GetMetaStats().ConvertToBlockStats()) - } - } - for _, h := range f.flushing { -- if slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String()) { -+ if _, ok := requested[h.meta.ULID.String()]; ok { - res.BlockStats = append(res.BlockStats, h.GetMetaStats().ConvertToBlockStats()) - } - } - f.headLock.RUnlock() - - f.blockQuerier.queriersLock.RLock() - for _, q := range f.blockQuerier.queriers { -- if slices.Contains(req.Msg.GetUlids(), q.meta.ULID.String()) { -+ if _, ok := requested[q.meta.ULID.String()]; ok { - res.BlockStats = append(res.BlockStats, q.GetMetaStats().ConvertToBlockStats()) - } - } - f.blockQuerier.queriersLock.RUnlock() diff --git a/defects/python-igraph/Makefile b/defects/python-igraph/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/python-igraph/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/python-igraph/bench/bench-python-igraph-0001.py b/defects/python-igraph/bench/bench-python-igraph-0001.py deleted file mode 100644 index 6bf88709d..000000000 --- a/defects/python-igraph/bench/bench-python-igraph-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-python-igraph-0001.py -# CWE-407: list-scan inside loop in python-igraph-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== python-igraph-0001: CWE-407: list-scan inside loop in python-igraph-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/python-igraph/bench/results.txt b/defects/python-igraph/bench/results.txt deleted file mode 100644 index 666b6b393..000000000 --- a/defects/python-igraph/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== python-igraph-0001: CWE-407: list-scan inside loop in python-igraph-0001 (generic model) === -N=100 k=100 : defective=0.095ms fixed=0.004ms speedup=26.2x -N=500 k=500 : defective=2.358ms fixed=0.022ms speedup=107.4x -N=1000 k=1000 : defective=14.907ms fixed=0.049ms speedup=305.2x -N=2000 k=2000 : defective=47.718ms fixed=0.126ms speedup=378.5x - diff --git a/defects/python-igraph/bench/run_all.py b/defects/python-igraph/bench/run_all.py deleted file mode 100644 index 7a483b782..000000000 --- a/defects/python-igraph/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-python-igraph-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pytorch-geometric/Makefile b/defects/pytorch-geometric/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pytorch-geometric/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pytorch-geometric/bench/bench-pytorch-geometric-0001.py b/defects/pytorch-geometric/bench/bench-pytorch-geometric-0001.py deleted file mode 100644 index ecaa55160..000000000 --- a/defects/pytorch-geometric/bench/bench-pytorch-geometric-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pytorch-geometric-0001.py -# smiles.py list.index() O(L×A) per molecule → O(A) with dict lookup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pytorch-geometric-0001: smiles.py list.index() O(L×A) per molecule → O(A) with dict lookup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pytorch-geometric/bench/results.txt b/defects/pytorch-geometric/bench/results.txt deleted file mode 100644 index d895492d1..000000000 --- a/defects/pytorch-geometric/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== pytorch-geometric-0001: smiles.py list.index() O(L×A) per molecule → O(A) with dict lookup === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.134ms fixed=0.020ms speedup=105.2x -N=1000 k=1000 : defective=10.274ms fixed=0.089ms speedup=115.0x -N=2000 k=2000 : defective=37.616ms fixed=0.099ms speedup=380.0x - diff --git a/defects/pytorch-geometric/bench/run_all.py b/defects/pytorch-geometric/bench/run_all.py deleted file mode 100644 index 1ebcaa4af..000000000 --- a/defects/pytorch-geometric/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pytorch-geometric-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/pytorch/Makefile b/defects/pytorch/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/pytorch/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/pytorch/bench/bench-pytorch-0001.py b/defects/pytorch/bench/bench-pytorch-0001.py deleted file mode 100644 index fdfe55859..000000000 --- a/defects/pytorch/bench/bench-pytorch-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pytorch-0001.py -# pytorch-0001 — graph_fuser.cpp fuseChunkByReusingExistingFusedChunk O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pytorch-0001: pytorch-0001 — graph_fuser.cpp fuseChunkByReusingExistingFusedChunk O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pytorch/bench/bench-pytorch-0002.py b/defects/pytorch/bench/bench-pytorch-0002.py deleted file mode 100644 index 1ac1a2c37..000000000 --- a/defects/pytorch/bench/bench-pytorch-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pytorch-0002.py -# pytorch-0002 — graph_fuser.cpp mergeNodeIntoGroup + tryToMoveChunk O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pytorch-0002: pytorch-0002 — graph_fuser.cpp mergeNodeIntoGroup + tryToMoveChunk O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pytorch/bench/bench-pytorch-0003.py b/defects/pytorch/bench/bench-pytorch-0003.py deleted file mode 100644 index 1bd18df77..000000000 --- a/defects/pytorch/bench/bench-pytorch-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pytorch-0003.py -# pytorch-0003 — python_function.cpp tracer subgraph construction O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pytorch-0003: pytorch-0003 — python_function.cpp tracer subgraph construction O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pytorch/bench/bench-pytorch-geometric-0001.py b/defects/pytorch/bench/bench-pytorch-geometric-0001.py deleted file mode 100644 index 7824df1c2..000000000 --- a/defects/pytorch/bench/bench-pytorch-geometric-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-pytorch-geometric-0001.py -# CWE-407: list-scan inside loop in pytorch-geometric-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== pytorch-geometric-0001: CWE-407: list-scan inside loop in pytorch-geometric-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/pytorch/bench/results.txt b/defects/pytorch/bench/results.txt deleted file mode 100644 index 3066ce5bf..000000000 --- a/defects/pytorch/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== pytorch-0001: pytorch-0001 — graph_fuser.cpp fuseChunkByReusingExistingFusedChunk O(N²) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.974ms fixed=0.111ms speedup=26.8x -N=1000 k=1000 : defective=12.302ms fixed=0.059ms speedup=208.9x -N=2000 k=2000 : defective=38.436ms fixed=0.098ms speedup=391.0x - -=== pytorch-0002: pytorch-0002 — graph_fuser.cpp mergeNodeIntoGroup + tryToMoveChunk O(N²) === -N=100 k=100 : defective=0.086ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.241ms fixed=0.108ms speedup=20.8x -N=1000 k=1000 : defective=15.083ms fixed=0.047ms speedup=323.5x -N=2000 k=2000 : defective=41.950ms fixed=0.097ms speedup=431.6x - -=== pytorch-0003: pytorch-0003 — python_function.cpp tracer subgraph construction O(N²) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.122ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.981ms fixed=0.048ms speedup=187.2x -N=2000 k=2000 : defective=40.422ms fixed=0.097ms speedup=416.1x - -=== pytorch-geometric-0001: CWE-407: list-scan inside loop in pytorch-geometric-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.110ms fixed=0.021ms speedup=101.3x -N=1000 k=1000 : defective=8.792ms fixed=0.045ms speedup=194.6x -N=2000 k=2000 : defective=36.386ms fixed=0.098ms speedup=370.5x - diff --git a/defects/pytorch/bench/run_all.py b/defects/pytorch/bench/run_all.py deleted file mode 100644 index 099ccdd36..000000000 --- a/defects/pytorch/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-pytorch-0001.py", "bench-pytorch-0002.py", "bench-pytorch-0003.py", "bench-pytorch-geometric-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/qemu/Makefile b/defects/qemu/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/qemu/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/qemu/bench/bench-qemu-0001.py b/defects/qemu/bench/bench-qemu-0001.py deleted file mode 100644 index f5685969d..000000000 --- a/defects/qemu/bench/bench-qemu-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-qemu-0001.py -# savevm find_se O(N²) during VM migration load -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== qemu-0001: savevm find_se O(N²) during VM migration load ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/qemu/bench/results.txt b/defects/qemu/bench/results.txt deleted file mode 100644 index 8e1742819..000000000 --- a/defects/qemu/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== qemu-0001: savevm find_se O(N²) during VM migration load === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.330ms fixed=0.023ms speedup=102.6x -N=1000 k=1000 : defective=11.631ms fixed=0.050ms speedup=233.8x -N=2000 k=2000 : defective=38.886ms fixed=0.096ms speedup=405.0x - diff --git a/defects/qemu/bench/run_all.py b/defects/qemu/bench/run_all.py deleted file mode 100644 index 18c4ae992..000000000 --- a/defects/qemu/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-qemu-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/quarkus/Makefile b/defects/quarkus/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/quarkus/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/quarkus/bench/bench-quarkus-0001.py b/defects/quarkus/bench/bench-quarkus-0001.py deleted file mode 100644 index 4b9e1491a..000000000 --- a/defects/quarkus/bench/bench-quarkus-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-quarkus-0001.py -# CWE-407: list-scan inside loop in quarkus-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== quarkus-0001: CWE-407: list-scan inside loop in quarkus-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/quarkus/bench/bench-quarkus-0002.py b/defects/quarkus/bench/bench-quarkus-0002.py deleted file mode 100644 index 718b098a6..000000000 --- a/defects/quarkus/bench/bench-quarkus-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-quarkus-0002.py -# CWE-407: list-scan inside loop in quarkus-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== quarkus-0002: CWE-407: list-scan inside loop in quarkus-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/quarkus/bench/bench-quarkus-0003.py b/defects/quarkus/bench/bench-quarkus-0003.py deleted file mode 100644 index 7401907de..000000000 --- a/defects/quarkus/bench/bench-quarkus-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-quarkus-0003.py -# CWE-407: list-scan inside loop in quarkus-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== quarkus-0003: CWE-407: list-scan inside loop in quarkus-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/quarkus/bench/bench-quarkus-0004.py b/defects/quarkus/bench/bench-quarkus-0004.py deleted file mode 100644 index 91b3a2a63..000000000 --- a/defects/quarkus/bench/bench-quarkus-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-quarkus-0004.py -# CWE-407: list-scan inside loop in quarkus-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== quarkus-0004: CWE-407: list-scan inside loop in quarkus-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/quarkus/bench/bench-quarkus-0005.py b/defects/quarkus/bench/bench-quarkus-0005.py deleted file mode 100644 index 26b7ce097..000000000 --- a/defects/quarkus/bench/bench-quarkus-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-quarkus-0005.py -# ConfigMappingUtils.collectInterfacesRec — O(2^D) diamond interface re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== quarkus-0005: ConfigMappingUtils.collectInterfacesRec — O(2^D) diamond interface re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/quarkus/bench/results.txt b/defects/quarkus/bench/results.txt deleted file mode 100644 index 216c871fe..000000000 --- a/defects/quarkus/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== quarkus-0001: CWE-407: list-scan inside loop in quarkus-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.118ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=8.309ms fixed=0.045ms speedup=185.9x -N=2000 k=2000 : defective=33.519ms fixed=0.093ms speedup=362.2x - -=== quarkus-0002: CWE-407: list-scan inside loop in quarkus-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.026ms fixed=0.020ms speedup=102.3x -N=1000 k=1000 : defective=8.226ms fixed=0.043ms speedup=190.0x -N=2000 k=2000 : defective=33.668ms fixed=0.092ms speedup=364.4x - -=== quarkus-0003: CWE-407: list-scan inside loop in quarkus-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.492ms fixed=0.021ms speedup=121.5x -N=1000 k=1000 : defective=8.749ms fixed=0.046ms speedup=190.6x -N=2000 k=2000 : defective=34.049ms fixed=0.091ms speedup=374.5x - -=== quarkus-0004: CWE-407: list-scan inside loop in quarkus-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.0x -N=500 k=500 : defective=2.039ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.388ms fixed=0.044ms speedup=189.7x -N=2000 k=2000 : defective=33.654ms fixed=0.093ms speedup=361.3x - -=== quarkus-0005: ConfigMappingUtils.collectInterfacesRec — O(2^D) diamond interface re-traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.020ms fixed=0.019ms speedup=103.7x -N=1000 k=1000 : defective=8.486ms fixed=0.044ms speedup=192.4x -N=2000 k=2000 : defective=34.228ms fixed=0.094ms speedup=364.1x - diff --git a/defects/quarkus/bench/run_all.py b/defects/quarkus/bench/run_all.py deleted file mode 100644 index 7ae9ab40e..000000000 --- a/defects/quarkus/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-quarkus-0001.py", "bench-quarkus-0002.py", "bench-quarkus-0003.py", "bench-quarkus-0004.py", "bench-quarkus-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/r-lang-0001/Makefile b/defects/r-lang-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/r-lang-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/r-lang-0001/bench/bench-r-lang-0001-0001.py b/defects/r-lang-0001/bench/bench-r-lang-0001-0001.py deleted file mode 100644 index ce5c3d747..000000000 --- a/defects/r-lang-0001/bench/bench-r-lang-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-lang-0001-0001.py -# CWE-407: list-scan inside loop in r-lang-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-lang-0001-0001: CWE-407: list-scan inside loop in r-lang-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r-lang-0001/bench/results.txt b/defects/r-lang-0001/bench/results.txt deleted file mode 100644 index 848726c90..000000000 --- a/defects/r-lang-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== r-lang-0001-0001: CWE-407: list-scan inside loop in r-lang-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.405ms fixed=0.023ms speedup=105.7x -N=1000 k=1000 : defective=10.696ms fixed=0.048ms speedup=223.1x -N=2000 k=2000 : defective=38.888ms fixed=0.097ms speedup=402.4x - diff --git a/defects/r-lang-0001/bench/run_all.py b/defects/r-lang-0001/bench/run_all.py deleted file mode 100644 index 5aa84a80e..000000000 --- a/defects/r-lang-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-r-lang-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/r-source/Makefile b/defects/r-source/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/r-source/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/r-source/bench/bench-r-source-0001.py b/defects/r-source/bench/bench-r-source-0001.py deleted file mode 100644 index e3249cd48..000000000 --- a/defects/r-source/bench/bench-r-source-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-source-0001.py -# CWE-407: list-scan inside loop in r-source-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-source-0001: CWE-407: list-scan inside loop in r-source-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r-source/bench/bench-r-source-0002.py b/defects/r-source/bench/bench-r-source-0002.py deleted file mode 100644 index 5e9ae3385..000000000 --- a/defects/r-source/bench/bench-r-source-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-source-0002.py -# .walkClassGraph — O(S²) match() dedup during S4 class registration -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-source-0002: .walkClassGraph — O(S²) match() dedup during S4 class registration ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r-source/bench/bench-r-source.py b/defects/r-source/bench/bench-r-source.py deleted file mode 100644 index f45394420..000000000 --- a/defects/r-source/bench/bench-r-source.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-source.py -# 0002: .walkClassGraph — O(S²) match() dedup during S4 class registration -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-source: 0002: .walkClassGraph — O(S²) match() dedup during S4 class registration ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r-source/bench/results.txt b/defects/r-source/bench/results.txt deleted file mode 100644 index e7addea33..000000000 --- a/defects/r-source/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== r-source-0001: CWE-407: list-scan inside loop in r-source-0001 (generic model) === -N=100 k=100 : defective=0.194ms fixed=0.007ms speedup=26.6x -N=500 k=500 : defective=5.391ms fixed=0.117ms speedup=46.1x -N=1000 k=1000 : defective=10.916ms fixed=0.051ms speedup=215.9x -N=2000 k=2000 : defective=35.324ms fixed=0.097ms speedup=363.7x - -=== r-source-0002: .walkClassGraph — O(S²) match() dedup during S4 class registration === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=26.2x -N=500 k=500 : defective=2.100ms fixed=0.020ms speedup=104.8x -N=1000 k=1000 : defective=8.640ms fixed=0.046ms speedup=188.4x -N=2000 k=2000 : defective=36.779ms fixed=0.098ms speedup=374.1x - -=== r-source: 0002: .walkClassGraph — O(S²) match() dedup during S4 class registration === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.403ms fixed=0.022ms speedup=109.2x -N=1000 k=1000 : defective=10.160ms fixed=0.203ms speedup=49.9x -N=2000 k=2000 : defective=61.239ms fixed=0.187ms speedup=327.0x - diff --git a/defects/r-source/bench/run_all.py b/defects/r-source/bench/run_all.py deleted file mode 100644 index f2a1f15f9..000000000 --- a/defects/r-source/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-r-source-0001.py", "bench-r-source-0002.py", "bench-r-source.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/r/Makefile b/defects/r/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/r/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/r/bench/bench-r-lang-0001-0001.py b/defects/r/bench/bench-r-lang-0001-0001.py deleted file mode 100644 index ce5c3d747..000000000 --- a/defects/r/bench/bench-r-lang-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-lang-0001-0001.py -# CWE-407: list-scan inside loop in r-lang-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-lang-0001-0001: CWE-407: list-scan inside loop in r-lang-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r/bench/bench-r-source-0001.py b/defects/r/bench/bench-r-source-0001.py deleted file mode 100644 index e3249cd48..000000000 --- a/defects/r/bench/bench-r-source-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-source-0001.py -# CWE-407: list-scan inside loop in r-source-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-source-0001: CWE-407: list-scan inside loop in r-source-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r/bench/bench-r-source-0002.py b/defects/r/bench/bench-r-source-0002.py deleted file mode 100644 index 08726de75..000000000 --- a/defects/r/bench/bench-r-source-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-source-0002.py -# CWE-407: list-scan inside loop in r-source-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-source-0002: CWE-407: list-scan inside loop in r-source-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r/bench/bench-r-source.py b/defects/r/bench/bench-r-source.py deleted file mode 100644 index 705cc3ba1..000000000 --- a/defects/r/bench/bench-r-source.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-r-source.py -# CWE-407: list-scan inside loop in r-source (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== r-source: CWE-407: list-scan inside loop in r-source (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/r/bench/results.txt b/defects/r/bench/results.txt deleted file mode 100644 index fdc1a8dc8..000000000 --- a/defects/r/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== r-lang-0001-0001: CWE-407: list-scan inside loop in r-lang-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.712ms fixed=0.024ms speedup=113.3x -N=1000 k=1000 : defective=11.628ms fixed=0.084ms speedup=138.2x -N=2000 k=2000 : defective=50.476ms fixed=0.099ms speedup=511.9x - -=== r-source-0001: CWE-407: list-scan inside loop in r-source-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.204ms fixed=0.031ms speedup=71.4x -N=1000 k=1000 : defective=10.328ms fixed=0.050ms speedup=206.4x -N=2000 k=2000 : defective=45.676ms fixed=0.102ms speedup=447.9x - -=== r-source-0002: CWE-407: list-scan inside loop in r-source-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.239ms fixed=0.021ms speedup=108.1x -N=1000 k=1000 : defective=9.763ms fixed=0.046ms speedup=213.1x -N=2000 k=2000 : defective=42.781ms fixed=0.099ms speedup=433.7x - -=== r-source: CWE-407: list-scan inside loop in r-source (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.281ms fixed=0.023ms speedup=99.9x -N=1000 k=1000 : defective=10.515ms fixed=0.047ms speedup=223.2x -N=2000 k=2000 : defective=41.238ms fixed=0.097ms speedup=426.8x - diff --git a/defects/r/bench/run_all.py b/defects/r/bench/run_all.py deleted file mode 100644 index 359800145..000000000 --- a/defects/r/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-r-lang-0001-0001.py", "bench-r-source-0001.py", "bench-r-source-0002.py", "bench-r-source.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rabbitmq/Makefile b/defects/rabbitmq/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rabbitmq/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rabbitmq/bench/bench-rabbitmq-0001.py b/defects/rabbitmq/bench/bench-rabbitmq-0001.py deleted file mode 100644 index 1ce4660b4..000000000 --- a/defects/rabbitmq/bench/bench-rabbitmq-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rabbitmq-0001.py -# CWE-407: list-scan inside loop in rabbitmq-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rabbitmq-0001: CWE-407: list-scan inside loop in rabbitmq-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rabbitmq/bench/bench-rabbitmq-0002.py b/defects/rabbitmq/bench/bench-rabbitmq-0002.py deleted file mode 100644 index 699eb4978..000000000 --- a/defects/rabbitmq/bench/bench-rabbitmq-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rabbitmq-0002.py -# CWE-407: list-scan inside loop in rabbitmq-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rabbitmq-0002: CWE-407: list-scan inside loop in rabbitmq-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rabbitmq/bench/bench-rabbitmq-0003.py b/defects/rabbitmq/bench/bench-rabbitmq-0003.py deleted file mode 100644 index 1e91d9a2a..000000000 --- a/defects/rabbitmq/bench/bench-rabbitmq-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rabbitmq-0003.py -# CWE-407: list-scan inside loop in rabbitmq-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rabbitmq-0003: CWE-407: list-scan inside loop in rabbitmq-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rabbitmq/bench/bench-rabbitmq-0004.py b/defects/rabbitmq/bench/bench-rabbitmq-0004.py deleted file mode 100644 index d8704629a..000000000 --- a/defects/rabbitmq/bench/bench-rabbitmq-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rabbitmq-0004.py -# CWE-407: list-scan inside loop in rabbitmq-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rabbitmq-0004: CWE-407: list-scan inside loop in rabbitmq-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rabbitmq/bench/bench-rabbitmq-0005.py b/defects/rabbitmq/bench/bench-rabbitmq-0005.py deleted file mode 100644 index 5a2793c1e..000000000 --- a/defects/rabbitmq/bench/bench-rabbitmq-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rabbitmq-0005.py -# CWE-407: list-scan inside loop in rabbitmq-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rabbitmq-0005: CWE-407: list-scan inside loop in rabbitmq-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rabbitmq/bench/results.txt b/defects/rabbitmq/bench/results.txt deleted file mode 100644 index ad34a84f7..000000000 --- a/defects/rabbitmq/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== rabbitmq-0001: CWE-407: list-scan inside loop in rabbitmq-0001 (generic model) === -N=100 k=100 : defective=0.246ms fixed=0.015ms speedup=16.1x -N=500 k=500 : defective=2.102ms fixed=0.021ms speedup=100.3x -N=1000 k=1000 : defective=8.640ms fixed=0.046ms speedup=188.8x -N=2000 k=2000 : defective=33.762ms fixed=0.093ms speedup=363.3x - -=== rabbitmq-0002: CWE-407: list-scan inside loop in rabbitmq-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.222ms fixed=0.020ms speedup=111.0x -N=1000 k=1000 : defective=8.371ms fixed=0.044ms speedup=189.0x -N=2000 k=2000 : defective=33.665ms fixed=0.093ms speedup=363.1x - -=== rabbitmq-0003: CWE-407: list-scan inside loop in rabbitmq-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.020ms fixed=0.020ms speedup=101.3x -N=1000 k=1000 : defective=8.357ms fixed=0.043ms speedup=194.1x -N=2000 k=2000 : defective=34.516ms fixed=0.093ms speedup=372.4x - -=== rabbitmq-0004: CWE-407: list-scan inside loop in rabbitmq-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.018ms fixed=0.020ms speedup=101.6x -N=1000 k=1000 : defective=8.406ms fixed=0.044ms speedup=192.5x -N=2000 k=2000 : defective=33.433ms fixed=0.094ms speedup=356.9x - -=== rabbitmq-0005: CWE-407: list-scan inside loop in rabbitmq-0005 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.114ms fixed=0.020ms speedup=106.2x -N=1000 k=1000 : defective=8.227ms fixed=0.044ms speedup=185.7x -N=2000 k=2000 : defective=33.568ms fixed=0.092ms speedup=365.5x - diff --git a/defects/rabbitmq/bench/run_all.py b/defects/rabbitmq/bench/run_all.py deleted file mode 100644 index 97cf71802..000000000 --- a/defects/rabbitmq/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rabbitmq-0001.py", "bench-rabbitmq-0002.py", "bench-rabbitmq-0003.py", "bench-rabbitmq-0004.py", "bench-rabbitmq-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rails/Makefile b/defects/rails/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rails/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rails/bench/bench-rails-0001.py b/defects/rails/bench/bench-rails-0001.py deleted file mode 100644 index 825c68239..000000000 --- a/defects/rails/bench/bench-rails-0001.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0001.py -# ActiveRecord Preloader::Batch future_tables Array#include? in loop. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0001: ActiveRecord Preloader::Batch future_tables Array#include? in loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0002.py b/defects/rails/bench/bench-rails-0002.py deleted file mode 100644 index d1836dec7..000000000 --- a/defects/rails/bench/bench-rails-0002.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0002.py -# ActiveSupport Callbacks chain.index(callback) in filters.each loop. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0002: ActiveSupport Callbacks chain.index(callback) in filters.each loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0003.py b/defects/rails/bench/bench-rails-0003.py deleted file mode 100644 index 8c67cf36a..000000000 --- a/defects/rails/bench/bench-rails-0003.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0003.py -# ActiveSupport Enumerable#excluding Array membership in O(N) loop. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0003: ActiveSupport Enumerable#excluding Array membership in O(N) loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0004.py b/defects/rails/bench/bench-rails-0004.py deleted file mode 100644 index 630eef093..000000000 --- a/defects/rails/bench/bench-rails-0004.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0004.py -# ActiveSupport Enumerable#in_order_of series.map Array membership. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0004: ActiveSupport Enumerable#in_order_of series.map Array membership ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0005.py b/defects/rails/bench/bench-rails-0005.py deleted file mode 100644 index b72e857a5..000000000 --- a/defects/rails/bench/bench-rails-0005.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0005.py -# ActiveRecord SchemaDumper Array#include? dedup. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0005: ActiveRecord SchemaDumper Array#include? dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0006.py b/defects/rails/bench/bench-rails-0006.py deleted file mode 100644 index aca03a2da..000000000 --- a/defects/rails/bench/bench-rails-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0006.py -# CWE-407: list-scan inside loop in rails-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0006: CWE-407: list-scan inside loop in rails-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0007.py b/defects/rails/bench/bench-rails-0007.py deleted file mode 100644 index e988dc724..000000000 --- a/defects/rails/bench/bench-rails-0007.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0007.py -# ActiveSupport LazyLoadHooks on_load dedup Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0007: ActiveSupport LazyLoadHooks on_load dedup Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0008.py b/defects/rails/bench/bench-rails-0008.py deleted file mode 100644 index 0d8b948ad..000000000 --- a/defects/rails/bench/bench-rails-0008.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0008.py -# ActiveRecord Enum value_method_names Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0008: ActiveRecord Enum value_method_names Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0009.py b/defects/rails/bench/bench-rails-0009.py deleted file mode 100644 index 82c96544f..000000000 --- a/defects/rails/bench/bench-rails-0009.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0009.py -# ActiveSupport FilterAttributeHandler Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0009: ActiveSupport FilterAttributeHandler Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0010.py b/defects/rails/bench/bench-rails-0010.py deleted file mode 100644 index 33241c094..000000000 --- a/defects/rails/bench/bench-rails-0010.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0010.py -# ActiveRecord Encryption auto_filtered_params Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0010: ActiveRecord Encryption auto_filtered_params Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0011.py b/defects/rails/bench/bench-rails-0011.py deleted file mode 100644 index 6c191a26a..000000000 --- a/defects/rails/bench/bench-rails-0011.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0011.py -# ActiveRecord TimeZone skip_time_zone_conversion Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0011: ActiveRecord TimeZone skip_time_zone_conversion Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0012.py b/defects/rails/bench/bench-rails-0012.py deleted file mode 100644 index 300b775f7..000000000 --- a/defects/rails/bench/bench-rails-0012.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0012.py -# ActionView options_for_select selected Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0012: ActionView options_for_select selected Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0013.py b/defects/rails/bench/bench-rails-0013.py deleted file mode 100644 index 595a41732..000000000 --- a/defects/rails/bench/bench-rails-0013.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0013.py -# ActionView collection_helpers selected Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0013: ActionView collection_helpers selected Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0014.py b/defects/rails/bench/bench-rails-0014.py deleted file mode 100644 index f37d61b66..000000000 --- a/defects/rails/bench/bench-rails-0014.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0014.py -# ActiveSupport Arguments symbol_keys Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0014: ActiveSupport Arguments symbol_keys Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0015.py b/defects/rails/bench/bench-rails-0015.py deleted file mode 100644 index ff6260b37..000000000 --- a/defects/rails/bench/bench-rails-0015.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0015.py -# ActiveRecord SchemaStatements duplicate_version Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0015: ActiveRecord SchemaStatements duplicate_version Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0016.py b/defects/rails/bench/bench-rails-0016.py deleted file mode 100644 index a7dee38d1..000000000 --- a/defects/rails/bench/bench-rails-0016.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0016.py -# ActiveRecord sqlite3 copy_table column Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0016: ActiveRecord sqlite3 copy_table column Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0017.py b/defects/rails/bench/bench-rails-0017.py deleted file mode 100644 index 7d449700f..000000000 --- a/defects/rails/bench/bench-rails-0017.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0017.py -# ActiveRecord rename_column indexes Array#include?. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0017: ActiveRecord rename_column indexes Array#include? ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0018.py b/defects/rails/bench/bench-rails-0018.py deleted file mode 100644 index 558f18157..000000000 --- a/defects/rails/bench/bench-rails-0018.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0018.py -# ActiveRecord CollectionAssociation find_by_scan ids Array#include? in select. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0018: ActiveRecord CollectionAssociation find_by_scan ids Array#include? in select ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/bench-rails-0019.py b/defects/rails/bench/bench-rails-0019.py deleted file mode 100644 index c001e2698..000000000 --- a/defects/rails/bench/bench-rails-0019.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# bench-rails-0019.py -# ActionView Digestor dependency_digest Array#include? cycle-detection stack. -# Models O(N*k) -> O(N+k) via Ruby Array#include? inside a loop vs Set#include?. - -import sys -import time - - -def bench_defective(n, k): - """Array#include? in loop — O(k) per iteration, O(N*k) total.""" - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool: # list.__contains__ = O(k) - result.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - """Set#include? — O(1) per iteration, O(N+k) total.""" - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - result = [] - for x in items: - if x not in pool_set: # O(1) - result.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rails-0019: ActionView Digestor dependency_digest Array#include? cycle-detection stack ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rails/bench/results.txt b/defects/rails/bench/results.txt deleted file mode 100644 index bc8de5063..000000000 --- a/defects/rails/bench/results.txt +++ /dev/null @@ -1,114 +0,0 @@ -=== rails-0001: ActiveRecord Preloader::Batch future_tables Array#include? in loop === -N=100 k=100 : defective=0.454ms fixed=0.025ms speedup=17.9x -N=500 k=500 : defective=9.558ms fixed=0.128ms speedup=74.9x -N=1000 k=1000 : defective=10.444ms fixed=0.076ms speedup=138.2x -N=2000 k=2000 : defective=36.921ms fixed=0.097ms speedup=382.4x - -=== rails-0002: ActiveSupport Callbacks chain.index(callback) in filters.each loop === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.164ms fixed=0.020ms speedup=106.1x -N=1000 k=1000 : defective=8.710ms fixed=0.046ms speedup=189.3x -N=2000 k=2000 : defective=35.571ms fixed=0.096ms speedup=370.4x - -=== rails-0003: ActiveSupport Enumerable#excluding Array membership in O(N) loop === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.285ms fixed=0.020ms speedup=111.9x -N=1000 k=1000 : defective=9.230ms fixed=0.046ms speedup=202.1x -N=2000 k=2000 : defective=37.108ms fixed=0.104ms speedup=355.2x - -=== rails-0004: ActiveSupport Enumerable#in_order_of series.map Array membership === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.313ms fixed=0.021ms speedup=112.6x -N=1000 k=1000 : defective=8.946ms fixed=0.047ms speedup=190.9x -N=2000 k=2000 : defective=36.028ms fixed=0.093ms speedup=386.4x - -=== rails-0005: ActiveRecord SchemaDumper Array#include? dedup === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.101ms fixed=0.020ms speedup=105.3x -N=1000 k=1000 : defective=8.652ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=39.373ms fixed=0.113ms speedup=349.7x - -=== rails-0006: CWE-407: list-scan inside loop in rails-0006 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.439ms fixed=0.024ms speedup=102.4x -N=1000 k=1000 : defective=10.407ms fixed=0.053ms speedup=196.7x -N=2000 k=2000 : defective=42.329ms fixed=0.097ms speedup=435.6x - -=== rails-0007: ActiveSupport LazyLoadHooks on_load dedup Array#include? === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.219ms fixed=0.021ms speedup=104.9x -N=1000 k=1000 : defective=9.153ms fixed=0.048ms speedup=190.2x -N=2000 k=2000 : defective=43.762ms fixed=0.095ms speedup=461.6x - -=== rails-0008: ActiveRecord Enum value_method_names Array#include? === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.133ms fixed=0.021ms speedup=103.6x -N=1000 k=1000 : defective=9.435ms fixed=0.044ms speedup=213.3x -N=2000 k=2000 : defective=36.919ms fixed=0.107ms speedup=346.1x - -=== rails-0009: ActiveSupport FilterAttributeHandler Array#include? === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.224ms fixed=0.021ms speedup=107.3x -N=1000 k=1000 : defective=9.699ms fixed=0.090ms speedup=108.1x -N=2000 k=2000 : defective=36.134ms fixed=0.105ms speedup=345.2x - -=== rails-0010: ActiveRecord Encryption auto_filtered_params Array#include? === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.370ms fixed=0.023ms speedup=103.3x -N=1000 k=1000 : defective=9.561ms fixed=0.050ms speedup=189.9x -N=2000 k=2000 : defective=44.020ms fixed=0.109ms speedup=402.5x - -=== rails-0011: ActiveRecord TimeZone skip_time_zone_conversion Array#include? === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.395ms fixed=0.024ms speedup=100.0x -N=1000 k=1000 : defective=9.986ms fixed=0.054ms speedup=186.2x -N=2000 k=2000 : defective=35.792ms fixed=0.097ms speedup=368.7x - -=== rails-0012: ActionView options_for_select selected Array#include? === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.132ms fixed=0.020ms speedup=105.1x -N=1000 k=1000 : defective=8.667ms fixed=0.046ms speedup=189.6x -N=2000 k=2000 : defective=38.147ms fixed=0.095ms speedup=402.4x - -=== rails-0013: ActionView collection_helpers selected Array#include? === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.154ms fixed=0.039ms speedup=55.4x -N=1000 k=1000 : defective=8.767ms fixed=0.045ms speedup=195.6x -N=2000 k=2000 : defective=34.811ms fixed=0.096ms speedup=363.5x - -=== rails-0014: ActiveSupport Arguments symbol_keys Array#include? === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.307ms fixed=0.023ms speedup=99.9x -N=1000 k=1000 : defective=8.891ms fixed=0.045ms speedup=195.6x -N=2000 k=2000 : defective=34.714ms fixed=0.095ms speedup=365.4x - -=== rails-0015: ActiveRecord SchemaStatements duplicate_version Array#include? === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.106ms fixed=0.021ms speedup=101.3x -N=1000 k=1000 : defective=8.564ms fixed=0.046ms speedup=187.0x -N=2000 k=2000 : defective=34.916ms fixed=0.099ms speedup=351.6x - -=== rails-0016: ActiveRecord sqlite3 copy_table column Array#include? === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.113ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=8.733ms fixed=0.046ms speedup=188.3x -N=2000 k=2000 : defective=36.503ms fixed=0.165ms speedup=221.6x - -=== rails-0017: ActiveRecord rename_column indexes Array#include? === -N=100 k=100 : defective=0.150ms fixed=0.005ms speedup=29.1x -N=500 k=500 : defective=2.127ms fixed=0.020ms speedup=104.2x -N=1000 k=1000 : defective=9.866ms fixed=0.046ms speedup=214.3x -N=2000 k=2000 : defective=39.158ms fixed=0.183ms speedup=214.4x - -=== rails-0018: ActiveRecord CollectionAssociation find_by_scan ids Array#include? in select === -N=100 k=100 : defective=0.262ms fixed=0.017ms speedup=15.7x -N=500 k=500 : defective=2.179ms fixed=0.021ms speedup=104.4x -N=1000 k=1000 : defective=9.183ms fixed=0.046ms speedup=201.0x -N=2000 k=2000 : defective=35.733ms fixed=0.101ms speedup=354.9x - -=== rails-0019: ActionView Digestor dependency_digest Array#include? cycle-detection stack === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.220ms fixed=0.021ms speedup=106.5x -N=1000 k=1000 : defective=8.761ms fixed=0.045ms speedup=195.6x -N=2000 k=2000 : defective=37.299ms fixed=0.094ms speedup=396.1x - diff --git a/defects/rails/bench/run_all.py b/defects/rails/bench/run_all.py deleted file mode 100644 index 7659d8865..000000000 --- a/defects/rails/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rails-0001.py", "bench-rails-0002.py", "bench-rails-0003.py", "bench-rails-0004.py", "bench-rails-0005.py", "bench-rails-0006.py", "bench-rails-0007.py", "bench-rails-0008.py", "bench-rails-0009.py", "bench-rails-0010.py", "bench-rails-0011.py", "bench-rails-0012.py", "bench-rails-0013.py", "bench-rails-0014.py", "bench-rails-0015.py", "bench-rails-0016.py", "bench-rails-0017.py", "bench-rails-0018.py", "bench-rails-0019.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rawtherapee-0001/Makefile b/defects/rawtherapee-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rawtherapee-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rawtherapee-0001/bench/bench-rawtherapee-0001-0001.py b/defects/rawtherapee-0001/bench/bench-rawtherapee-0001-0001.py deleted file mode 100644 index 1b73bff9a..000000000 --- a/defects/rawtherapee-0001/bench/bench-rawtherapee-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rawtherapee-0001-0001.py -# CWE-407: list-scan inside loop in rawtherapee-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rawtherapee-0001-0001: CWE-407: list-scan inside loop in rawtherapee-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rawtherapee-0001/bench/results.txt b/defects/rawtherapee-0001/bench/results.txt deleted file mode 100644 index 2b854da71..000000000 --- a/defects/rawtherapee-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rawtherapee-0001-0001: CWE-407: list-scan inside loop in rawtherapee-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.303ms fixed=0.022ms speedup=105.0x -N=1000 k=1000 : defective=9.536ms fixed=0.050ms speedup=190.1x -N=2000 k=2000 : defective=37.438ms fixed=0.097ms speedup=386.0x - diff --git a/defects/rawtherapee-0001/bench/run_all.py b/defects/rawtherapee-0001/bench/run_all.py deleted file mode 100644 index 08a8c58cc..000000000 --- a/defects/rawtherapee-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rawtherapee-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rawtherapee-0002/Makefile b/defects/rawtherapee-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rawtherapee-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rawtherapee-0002/bench/bench-rawtherapee-0002-0002.py b/defects/rawtherapee-0002/bench/bench-rawtherapee-0002-0002.py deleted file mode 100644 index 82fece5dc..000000000 --- a/defects/rawtherapee-0002/bench/bench-rawtherapee-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rawtherapee-0002-0002.py -# CWE-407: list-scan inside loop in rawtherapee-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rawtherapee-0002-0002: CWE-407: list-scan inside loop in rawtherapee-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rawtherapee-0002/bench/results.txt b/defects/rawtherapee-0002/bench/results.txt deleted file mode 100644 index 6a13703ef..000000000 --- a/defects/rawtherapee-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rawtherapee-0002-0002: CWE-407: list-scan inside loop in rawtherapee-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.102ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=8.587ms fixed=0.046ms speedup=186.8x -N=2000 k=2000 : defective=37.081ms fixed=0.097ms speedup=383.7x - diff --git a/defects/rawtherapee-0002/bench/run_all.py b/defects/rawtherapee-0002/bench/run_all.py deleted file mode 100644 index 2cfc347cb..000000000 --- a/defects/rawtherapee-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rawtherapee-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ray-project/Makefile b/defects/ray-project/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ray-project/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ray-project/bench/bench-ray-project-0001.py b/defects/ray-project/bench/bench-ray-project-0001.py deleted file mode 100644 index 943f382b7..000000000 --- a/defects/ray-project/bench/bench-ray-project-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ray-project-0001.py -# dag_node.py _get_toplevel_child_nodes O(A²) dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ray-project-0001: dag_node.py _get_toplevel_child_nodes O(A²) dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ray-project/bench/results.txt b/defects/ray-project/bench/results.txt deleted file mode 100644 index 8a972fae1..000000000 --- a/defects/ray-project/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ray-project-0001: dag_node.py _get_toplevel_child_nodes O(A²) dedup === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.166ms fixed=0.020ms speedup=105.8x -N=1000 k=1000 : defective=8.577ms fixed=0.045ms speedup=190.7x -N=2000 k=2000 : defective=34.711ms fixed=0.096ms speedup=359.8x - diff --git a/defects/ray-project/bench/run_all.py b/defects/ray-project/bench/run_all.py deleted file mode 100644 index 00e2b6511..000000000 --- a/defects/ray-project/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ray-project-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ray/Makefile b/defects/ray/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ray/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ray/bench/bench-ray-0001.py b/defects/ray/bench/bench-ray-0001.py deleted file mode 100644 index f6a7a24ff..000000000 --- a/defects/ray/bench/bench-ray-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ray-0001.py -# CWE-407: list-scan inside loop in ray-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ray-0001: CWE-407: list-scan inside loop in ray-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ray/bench/bench-ray-project-0001.py b/defects/ray/bench/bench-ray-project-0001.py deleted file mode 100644 index 9e6bf258c..000000000 --- a/defects/ray/bench/bench-ray-project-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ray-project-0001.py -# CWE-407: list-scan inside loop in ray-project-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ray-project-0001: CWE-407: list-scan inside loop in ray-project-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ray/bench/results.txt b/defects/ray/bench/results.txt deleted file mode 100644 index ff6c6bc84..000000000 --- a/defects/ray/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ray-0001: CWE-407: list-scan inside loop in ray-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.099ms fixed=0.020ms speedup=103.8x -N=1000 k=1000 : defective=8.576ms fixed=0.047ms speedup=182.9x -N=2000 k=2000 : defective=34.995ms fixed=0.097ms speedup=360.4x - -=== ray-project-0001: CWE-407: list-scan inside loop in ray-project-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.101ms fixed=0.020ms speedup=103.5x -N=1000 k=1000 : defective=9.156ms fixed=0.046ms speedup=200.6x -N=2000 k=2000 : defective=41.691ms fixed=0.096ms speedup=433.6x - diff --git a/defects/ray/bench/run_all.py b/defects/ray/bench/run_all.py deleted file mode 100644 index 640ad25cc..000000000 --- a/defects/ray/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ray-0001.py", "bench-ray-project-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/raylib/Makefile b/defects/raylib/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/raylib/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/raylib/bench/bench-raylib-0001.py b/defects/raylib/bench/bench-raylib-0001.py deleted file mode 100644 index 9e44b2006..000000000 --- a/defects/raylib/bench/bench-raylib-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-raylib-0001.py -# CWE-407: list-scan inside loop in raylib-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== raylib-0001: CWE-407: list-scan inside loop in raylib-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/raylib/bench/bench-raylib-0002.py b/defects/raylib/bench/bench-raylib-0002.py deleted file mode 100644 index d150ba25c..000000000 --- a/defects/raylib/bench/bench-raylib-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-raylib-0002.py -# LoadRandomSequence O(n²) dedup — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== raylib-0002: LoadRandomSequence O(n²) dedup — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/raylib/bench/results.txt b/defects/raylib/bench/results.txt deleted file mode 100644 index 761973f81..000000000 --- a/defects/raylib/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== raylib-0001: CWE-407: list-scan inside loop in raylib-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.313ms fixed=0.023ms speedup=102.3x -N=1000 k=1000 : defective=10.580ms fixed=0.059ms speedup=180.4x -N=2000 k=2000 : defective=39.442ms fixed=0.097ms speedup=405.8x - -=== raylib-0002: LoadRandomSequence O(n²) dedup — CWE-407 === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.124ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.718ms fixed=0.045ms speedup=191.7x -N=2000 k=2000 : defective=36.713ms fixed=0.097ms speedup=377.6x - diff --git a/defects/raylib/bench/run_all.py b/defects/raylib/bench/run_all.py deleted file mode 100644 index 54b9b257d..000000000 --- a/defects/raylib/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-raylib-0001.py", "bench-raylib-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rclone-0001/Makefile b/defects/rclone-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rclone-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rclone-0001/bench/bench-rclone-0001-0001.py b/defects/rclone-0001/bench/bench-rclone-0001-0001.py deleted file mode 100644 index 18986353a..000000000 --- a/defects/rclone-0001/bench/bench-rclone-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rclone-0001-0001.py -# CWE-407: list-scan inside loop in rclone-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rclone-0001-0001: CWE-407: list-scan inside loop in rclone-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rclone-0001/bench/results.txt b/defects/rclone-0001/bench/results.txt deleted file mode 100644 index 5ce67301a..000000000 --- a/defects/rclone-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rclone-0001-0001: CWE-407: list-scan inside loop in rclone-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.372ms fixed=0.023ms speedup=104.2x -N=1000 k=1000 : defective=10.324ms fixed=0.053ms speedup=193.2x -N=2000 k=2000 : defective=36.105ms fixed=0.097ms speedup=372.9x - diff --git a/defects/rclone-0001/bench/run_all.py b/defects/rclone-0001/bench/run_all.py deleted file mode 100644 index eb7f24fc1..000000000 --- a/defects/rclone-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rclone-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rclone-0002/Makefile b/defects/rclone-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rclone-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rclone-0002/bench/bench-rclone-0002-0001.py b/defects/rclone-0002/bench/bench-rclone-0002-0001.py deleted file mode 100644 index 8e9dbce33..000000000 --- a/defects/rclone-0002/bench/bench-rclone-0002-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rclone-0002-0001.py -# CWE-407: list-scan inside loop in rclone-0002-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rclone-0002-0001: CWE-407: list-scan inside loop in rclone-0002-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rclone-0002/bench/results.txt b/defects/rclone-0002/bench/results.txt deleted file mode 100644 index e0b9471ff..000000000 --- a/defects/rclone-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rclone-0002-0001: CWE-407: list-scan inside loop in rclone-0002-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.678ms fixed=0.026ms speedup=102.9x -N=1000 k=1000 : defective=10.867ms fixed=0.054ms speedup=202.7x -N=2000 k=2000 : defective=38.970ms fixed=0.096ms speedup=405.5x - diff --git a/defects/rclone-0002/bench/run_all.py b/defects/rclone-0002/bench/run_all.py deleted file mode 100644 index 8cc09df12..000000000 --- a/defects/rclone-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rclone-0002-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rclone-0003/Makefile b/defects/rclone-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rclone-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rclone-0003/bench/bench-rclone-0003-0001.py b/defects/rclone-0003/bench/bench-rclone-0003-0001.py deleted file mode 100644 index 306a4a068..000000000 --- a/defects/rclone-0003/bench/bench-rclone-0003-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rclone-0003-0001.py -# CWE-407: list-scan inside loop in rclone-0003-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rclone-0003-0001: CWE-407: list-scan inside loop in rclone-0003-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rclone-0003/bench/results.txt b/defects/rclone-0003/bench/results.txt deleted file mode 100644 index 32606b100..000000000 --- a/defects/rclone-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rclone-0003-0001: CWE-407: list-scan inside loop in rclone-0003-0001 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.617ms fixed=0.025ms speedup=103.3x -N=1000 k=1000 : defective=11.576ms fixed=0.056ms speedup=208.5x -N=2000 k=2000 : defective=36.729ms fixed=0.097ms speedup=379.5x - diff --git a/defects/rclone-0003/bench/run_all.py b/defects/rclone-0003/bench/run_all.py deleted file mode 100644 index 4b9a4c368..000000000 --- a/defects/rclone-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rclone-0003-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rclone-0004/Makefile b/defects/rclone-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rclone-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rclone-0004/bench/bench-rclone-0004-0001.py b/defects/rclone-0004/bench/bench-rclone-0004-0001.py deleted file mode 100644 index 59a6fc3d3..000000000 --- a/defects/rclone-0004/bench/bench-rclone-0004-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rclone-0004-0001.py -# CWE-407: list-scan inside loop in rclone-0004-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rclone-0004-0001: CWE-407: list-scan inside loop in rclone-0004-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rclone-0004/bench/results.txt b/defects/rclone-0004/bench/results.txt deleted file mode 100644 index 7b367ff6d..000000000 --- a/defects/rclone-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rclone-0004-0001: CWE-407: list-scan inside loop in rclone-0004-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.469ms fixed=0.024ms speedup=102.5x -N=1000 k=1000 : defective=10.134ms fixed=0.052ms speedup=194.6x -N=2000 k=2000 : defective=39.520ms fixed=0.098ms speedup=404.1x - diff --git a/defects/rclone-0004/bench/run_all.py b/defects/rclone-0004/bench/run_all.py deleted file mode 100644 index cd8241bca..000000000 --- a/defects/rclone-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rclone-0004-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rclone-0005/Makefile b/defects/rclone-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rclone-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rclone-0005/bench/bench-rclone-0005-0001.py b/defects/rclone-0005/bench/bench-rclone-0005-0001.py deleted file mode 100644 index 31456018f..000000000 --- a/defects/rclone-0005/bench/bench-rclone-0005-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rclone-0005-0001.py -# CWE-407: list-scan inside loop in rclone-0005-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rclone-0005-0001: CWE-407: list-scan inside loop in rclone-0005-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rclone-0005/bench/results.txt b/defects/rclone-0005/bench/results.txt deleted file mode 100644 index 99f8f3682..000000000 --- a/defects/rclone-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== rclone-0005-0001: CWE-407: list-scan inside loop in rclone-0005-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.348ms fixed=0.023ms speedup=102.6x -N=1000 k=1000 : defective=9.321ms fixed=0.045ms speedup=205.7x -N=2000 k=2000 : defective=35.028ms fixed=0.095ms speedup=367.5x - diff --git a/defects/rclone-0005/bench/run_all.py b/defects/rclone-0005/bench/run_all.py deleted file mode 100644 index 81b78afd7..000000000 --- a/defects/rclone-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rclone-0005-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/redis/Makefile b/defects/redis/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/redis/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/redis/bench/bench-redis-0001.py b/defects/redis/bench/bench-redis-0001.py deleted file mode 100644 index b5b17e7a0..000000000 --- a/defects/redis/bench/bench-redis-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redis-0001.py -# CWE-407: list-scan inside loop in redis-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redis-0001: CWE-407: list-scan inside loop in redis-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redis/bench/bench-redis-0002.py b/defects/redis/bench/bench-redis-0002.py deleted file mode 100644 index 91f9e268b..000000000 --- a/defects/redis/bench/bench-redis-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redis-0002.py -# CWE-407: list-scan inside loop in redis-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redis-0002: CWE-407: list-scan inside loop in redis-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redis/bench/bench-redis-0003.py b/defects/redis/bench/bench-redis-0003.py deleted file mode 100644 index d334d9bd1..000000000 --- a/defects/redis/bench/bench-redis-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redis-0003.py -# CWE-407: list-scan inside loop in redis-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redis-0003: CWE-407: list-scan inside loop in redis-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redis/bench/bench-redis-0004.py b/defects/redis/bench/bench-redis-0004.py deleted file mode 100644 index f30a8c04d..000000000 --- a/defects/redis/bench/bench-redis-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redis-0004.py -# ACLCheckChannelAgainstList O(C×P) per pubsub command → O(C) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redis-0004: ACLCheckChannelAgainstList O(C×P) per pubsub command → O(C) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redis/bench/results.txt b/defects/redis/bench/results.txt deleted file mode 100644 index d10d12d6e..000000000 --- a/defects/redis/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== redis-0001: CWE-407: list-scan inside loop in redis-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.325ms fixed=0.023ms speedup=102.4x -N=1000 k=1000 : defective=8.735ms fixed=0.045ms speedup=195.4x -N=2000 k=2000 : defective=35.531ms fixed=0.097ms speedup=366.9x - -=== redis-0002: CWE-407: list-scan inside loop in redis-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.106ms fixed=0.020ms speedup=103.2x -N=1000 k=1000 : defective=8.635ms fixed=0.046ms speedup=187.8x -N=2000 k=2000 : defective=34.890ms fixed=0.098ms speedup=357.3x - -=== redis-0003: CWE-407: list-scan inside loop in redis-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.160ms fixed=0.021ms speedup=103.8x -N=1000 k=1000 : defective=9.917ms fixed=0.053ms speedup=186.0x -N=2000 k=2000 : defective=35.244ms fixed=0.098ms speedup=361.2x - -=== redis-0004: ACLCheckChannelAgainstList O(C×P) per pubsub command → O(C) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.100ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.662ms fixed=0.046ms speedup=190.1x -N=2000 k=2000 : defective=35.607ms fixed=0.096ms speedup=370.0x - diff --git a/defects/redis/bench/run_all.py b/defects/redis/bench/run_all.py deleted file mode 100644 index 4b0a0035a..000000000 --- a/defects/redis/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-redis-0001.py", "bench-redis-0002.py", "bench-redis-0003.py", "bench-redis-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/redmine-0004/Makefile b/defects/redmine-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/redmine-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/redmine-0004/bench/bench-redmine-0004-0004.py b/defects/redmine-0004/bench/bench-redmine-0004-0004.py deleted file mode 100644 index b2918d64e..000000000 --- a/defects/redmine-0004/bench/bench-redmine-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redmine-0004-0004.py -# CWE-407: list-scan inside loop in redmine-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redmine-0004-0004: CWE-407: list-scan inside loop in redmine-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redmine-0004/bench/results.txt b/defects/redmine-0004/bench/results.txt deleted file mode 100644 index 675f1f2db..000000000 --- a/defects/redmine-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== redmine-0004-0004: CWE-407: list-scan inside loop in redmine-0004-0004 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.607ms fixed=0.025ms speedup=105.9x -N=1000 k=1000 : defective=8.930ms fixed=0.046ms speedup=192.4x -N=2000 k=2000 : defective=35.886ms fixed=0.096ms speedup=372.9x - diff --git a/defects/redmine-0004/bench/run_all.py b/defects/redmine-0004/bench/run_all.py deleted file mode 100644 index 59312e229..000000000 --- a/defects/redmine-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-redmine-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/redmine/Makefile b/defects/redmine/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/redmine/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/redmine/bench/bench-redmine-0001.py b/defects/redmine/bench/bench-redmine-0001.py deleted file mode 100644 index f9b5611db..000000000 --- a/defects/redmine/bench/bench-redmine-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redmine-0001.py -# CWE-407: list-scan inside loop in redmine-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redmine-0001: CWE-407: list-scan inside loop in redmine-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redmine/bench/bench-redmine-0002.py b/defects/redmine/bench/bench-redmine-0002.py deleted file mode 100644 index 7f29582c1..000000000 --- a/defects/redmine/bench/bench-redmine-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redmine-0002.py -# CWE-407: list-scan inside loop in redmine-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redmine-0002: CWE-407: list-scan inside loop in redmine-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redmine/bench/bench-redmine-0003.py b/defects/redmine/bench/bench-redmine-0003.py deleted file mode 100644 index 8eb95d7fa..000000000 --- a/defects/redmine/bench/bench-redmine-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redmine-0003.py -# CWE-407: list-scan inside loop in redmine-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redmine-0003: CWE-407: list-scan inside loop in redmine-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redmine/bench/bench-redmine-0004-0004.py b/defects/redmine/bench/bench-redmine-0004-0004.py deleted file mode 100644 index b2918d64e..000000000 --- a/defects/redmine/bench/bench-redmine-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redmine-0004-0004.py -# CWE-407: list-scan inside loop in redmine-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redmine-0004-0004: CWE-407: list-scan inside loop in redmine-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redmine/bench/results.txt b/defects/redmine/bench/results.txt deleted file mode 100644 index 6fe19cb5f..000000000 --- a/defects/redmine/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== redmine-0001: CWE-407: list-scan inside loop in redmine-0001 (generic model) === -N=100 k=100 : defective=0.173ms fixed=0.005ms speedup=32.6x -N=500 k=500 : defective=2.358ms fixed=0.022ms speedup=106.0x -N=1000 k=1000 : defective=8.927ms fixed=0.047ms speedup=190.9x -N=2000 k=2000 : defective=35.032ms fixed=0.093ms speedup=374.8x - -=== redmine-0002: CWE-407: list-scan inside loop in redmine-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.115ms fixed=0.021ms speedup=103.0x -N=1000 k=1000 : defective=8.616ms fixed=0.046ms speedup=186.7x -N=2000 k=2000 : defective=35.954ms fixed=0.107ms speedup=335.8x - -=== redmine-0003: CWE-407: list-scan inside loop in redmine-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.308ms fixed=0.022ms speedup=104.1x -N=1000 k=1000 : defective=10.394ms fixed=0.047ms speedup=218.8x -N=2000 k=2000 : defective=35.976ms fixed=0.097ms speedup=369.5x - -=== redmine-0004-0004: CWE-407: list-scan inside loop in redmine-0004-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.211ms fixed=0.031ms speedup=72.3x -N=1000 k=1000 : defective=9.808ms fixed=0.045ms speedup=218.5x -N=2000 k=2000 : defective=42.126ms fixed=0.116ms speedup=364.0x - diff --git a/defects/redmine/bench/run_all.py b/defects/redmine/bench/run_all.py deleted file mode 100644 index 66124113d..000000000 --- a/defects/redmine/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-redmine-0001.py", "bench-redmine-0002.py", "bench-redmine-0003.py", "bench-redmine-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/redot/Makefile b/defects/redot/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/redot/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/redot/bench/bench-redot-0001.py b/defects/redot/bench/bench-redot-0001.py deleted file mode 100644 index c450c1fbb..000000000 --- a/defects/redot/bench/bench-redot-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0001.py -# scene-tree-group.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0001: scene-tree-group.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0002.py b/defects/redot/bench/bench-redot-0002.py deleted file mode 100644 index b400d5ea3..000000000 --- a/defects/redot/bench/bench-redot-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0002.py -# physics2d-area.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0002: physics2d-area.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0003.py b/defects/redot/bench/bench-redot-0003.py deleted file mode 100644 index 93a285efa..000000000 --- a/defects/redot/bench/bench-redot-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0003.py -# identical to redot-0002, 3D physics variant -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0003: identical to redot-0002, 3D physics variant ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0004.py b/defects/redot/bench/bench-redot-0004.py deleted file mode 100644 index d01c2922a..000000000 --- a/defects/redot/bench/bench-redot-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0004.py -# softbody-constraints.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0004: softbody-constraints.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0005.py b/defects/redot/bench/bench-redot-0005.py deleted file mode 100644 index 8cf7c0ab2..000000000 --- a/defects/redot/bench/bench-redot-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0005.py -# Defect: open_list.find(e) is O(N) — LocalVector linear scan — inside the A* decrease-key -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0005: Defect: open_list.find(e) is O(N) — LocalVector linear scan — inside the A* decrease-key ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0006.py b/defects/redot/bench/bench-redot-0006.py deleted file mode 100644 index 1ead3ac73..000000000 --- a/defects/redot/bench/bench-redot-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0006.py -# skeleton3d.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0006: skeleton3d.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0007.py b/defects/redot/bench/bench-redot-0007.py deleted file mode 100644 index c9753186c..000000000 --- a/defects/redot/bench/bench-redot-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0007.py -# rest-fixer.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0007: rest-fixer.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0008.py b/defects/redot/bench/bench-redot-0008.py deleted file mode 100644 index 5ea276843..000000000 --- a/defects/redot/bench/bench-redot-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0008.py -# gltf-extensions.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0008: gltf-extensions.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0009.py b/defects/redot/bench/bench-redot-0009.py deleted file mode 100644 index ff7f8b2f8..000000000 --- a/defects/redot/bench/bench-redot-0009.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0009.py -# font-cyclic.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0009: font-cyclic.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0010.py b/defects/redot/bench/bench-redot-0010.py deleted file mode 100644 index 105bdbf68..000000000 --- a/defects/redot/bench/bench-redot-0010.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0010.py -# font-update-rids.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0010: font-update-rids.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0011.py b/defects/redot/bench/bench-redot-0011.py deleted file mode 100644 index e5ebbba2e..000000000 --- a/defects/redot/bench/bench-redot-0011.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0011.py -# graph-arranger.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0011: graph-arranger.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-0012.py b/defects/redot/bench/bench-redot-0012.py deleted file mode 100644 index c0b19887f..000000000 --- a/defects/redot/bench/bench-redot-0012.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-0012.py -# spring-bone-collision.cpp): -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-0012: spring-bone-collision.cpp): ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/bench-redot-cwe407.py b/defects/redot/bench/bench-redot-cwe407.py deleted file mode 100644 index 36101731c..000000000 --- a/defects/redot/bench/bench-redot-cwe407.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-redot-cwe407.py -# CWE-407: list-scan inside loop in redot-cwe407 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== redot-cwe407: CWE-407: list-scan inside loop in redot-cwe407 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/redot/bench/results.txt b/defects/redot/bench/results.txt deleted file mode 100644 index e5d56931a..000000000 --- a/defects/redot/bench/results.txt +++ /dev/null @@ -1,78 +0,0 @@ -=== redot-0001: scene-tree-group.cpp): === -N=100 k=100 : defective=0.114ms fixed=0.005ms speedup=23.9x -N=500 k=500 : defective=2.916ms fixed=0.028ms speedup=104.0x -N=1000 k=1000 : defective=13.044ms fixed=0.061ms speedup=212.5x -N=2000 k=2000 : defective=40.037ms fixed=0.096ms speedup=418.3x - -=== redot-0002: physics2d-area.cpp): === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.227ms fixed=0.020ms speedup=109.5x -N=1000 k=1000 : defective=11.420ms fixed=0.050ms speedup=227.8x -N=2000 k=2000 : defective=42.407ms fixed=0.113ms speedup=376.0x - -=== redot-0003: identical to redot-0002, 3D physics variant === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.397ms fixed=0.023ms speedup=105.6x -N=1000 k=1000 : defective=8.538ms fixed=0.046ms speedup=186.4x -N=2000 k=2000 : defective=36.466ms fixed=0.095ms speedup=383.9x - -=== redot-0004: softbody-constraints.cpp): === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=99.3x -N=1000 k=1000 : defective=8.872ms fixed=0.048ms speedup=184.0x -N=2000 k=2000 : defective=37.072ms fixed=0.159ms speedup=233.6x - -=== redot-0005: Defect: open_list.find(e) is O(N) — LocalVector linear scan — inside the A* decrease-key === -N=100 k=100 : defective=0.132ms fixed=0.005ms speedup=24.5x -N=500 k=500 : defective=2.309ms fixed=0.022ms speedup=103.5x -N=1000 k=1000 : defective=9.338ms fixed=0.050ms speedup=187.0x -N=2000 k=2000 : defective=36.779ms fixed=0.097ms speedup=380.5x - -=== redot-0006: skeleton3d.cpp): === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.167ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=10.833ms fixed=0.074ms speedup=147.2x -N=2000 k=2000 : defective=35.928ms fixed=0.147ms speedup=244.0x - -=== redot-0007: rest-fixer.cpp): === -N=100 k=100 : defective=0.160ms fixed=0.007ms speedup=21.9x -N=500 k=500 : defective=2.489ms fixed=0.023ms speedup=109.8x -N=1000 k=1000 : defective=8.674ms fixed=0.047ms speedup=185.6x -N=2000 k=2000 : defective=38.139ms fixed=0.095ms speedup=402.1x - -=== redot-0008: gltf-extensions.cpp): === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.102ms fixed=0.020ms speedup=103.1x -N=1000 k=1000 : defective=11.109ms fixed=0.053ms speedup=210.4x -N=2000 k=2000 : defective=35.762ms fixed=0.097ms speedup=369.6x - -=== redot-0009: font-cyclic.cpp): === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.175ms fixed=0.022ms speedup=100.8x -N=1000 k=1000 : defective=9.163ms fixed=0.046ms speedup=201.0x -N=2000 k=2000 : defective=38.753ms fixed=0.097ms speedup=399.5x - -=== redot-0010: font-update-rids.cpp): === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.145ms fixed=0.021ms speedup=103.6x -N=1000 k=1000 : defective=8.650ms fixed=0.045ms speedup=190.8x -N=2000 k=2000 : defective=38.998ms fixed=0.096ms speedup=406.6x - -=== redot-0011: graph-arranger.cpp): === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.125ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.856ms fixed=0.045ms speedup=195.1x -N=2000 k=2000 : defective=38.670ms fixed=0.100ms speedup=387.7x - -=== redot-0012: spring-bone-collision.cpp): === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.233ms fixed=0.021ms speedup=106.4x -N=1000 k=1000 : defective=8.693ms fixed=0.045ms speedup=193.9x -N=2000 k=2000 : defective=36.810ms fixed=0.097ms speedup=381.1x - -=== redot-cwe407: CWE-407: list-scan inside loop in redot-cwe407 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.3x -N=500 k=500 : defective=2.100ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.552ms fixed=0.046ms speedup=184.7x -N=2000 k=2000 : defective=35.080ms fixed=0.097ms speedup=362.3x - diff --git a/defects/redot/bench/run_all.py b/defects/redot/bench/run_all.py deleted file mode 100644 index 5d5cb1d9f..000000000 --- a/defects/redot/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-redot-0001.py", "bench-redot-0002.py", "bench-redot-0003.py", "bench-redot-0004.py", "bench-redot-0005.py", "bench-redot-0006.py", "bench-redot-0007.py", "bench-redot-0008.py", "bench-redot-0009.py", "bench-redot-0010.py", "bench-redot-0011.py", "bench-redot-0012.py", "bench-redot-cwe407.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/regamedll-0001/Makefile b/defects/regamedll-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/regamedll-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/regamedll-0001/bench/bench-regamedll-0001-0001.py b/defects/regamedll-0001/bench/bench-regamedll-0001-0001.py deleted file mode 100644 index 867568285..000000000 --- a/defects/regamedll-0001/bench/bench-regamedll-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-regamedll-0001-0001.py -# CWE-407: list-scan inside loop in regamedll-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== regamedll-0001-0001: CWE-407: list-scan inside loop in regamedll-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/regamedll-0001/bench/results.txt b/defects/regamedll-0001/bench/results.txt deleted file mode 100644 index 037237153..000000000 --- a/defects/regamedll-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== regamedll-0001-0001: CWE-407: list-scan inside loop in regamedll-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.139ms fixed=0.020ms speedup=107.4x -N=1000 k=1000 : defective=8.714ms fixed=0.046ms speedup=189.9x -N=2000 k=2000 : defective=36.004ms fixed=0.096ms speedup=374.8x - diff --git a/defects/regamedll-0001/bench/run_all.py b/defects/regamedll-0001/bench/run_all.py deleted file mode 100644 index 44800ccb9..000000000 --- a/defects/regamedll-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-regamedll-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/regamedll-0002/Makefile b/defects/regamedll-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/regamedll-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/regamedll-0002/bench/bench-regamedll-0002-0002.py b/defects/regamedll-0002/bench/bench-regamedll-0002-0002.py deleted file mode 100644 index 6908e49a0..000000000 --- a/defects/regamedll-0002/bench/bench-regamedll-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-regamedll-0002-0002.py -# CWE-407: list-scan inside loop in regamedll-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== regamedll-0002-0002: CWE-407: list-scan inside loop in regamedll-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/regamedll-0002/bench/results.txt b/defects/regamedll-0002/bench/results.txt deleted file mode 100644 index 7bf7165e9..000000000 --- a/defects/regamedll-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== regamedll-0002-0002: CWE-407: list-scan inside loop in regamedll-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.151ms fixed=0.020ms speedup=105.2x -N=1000 k=1000 : defective=8.855ms fixed=0.046ms speedup=192.2x -N=2000 k=2000 : defective=35.471ms fixed=0.096ms speedup=367.8x - diff --git a/defects/regamedll-0002/bench/run_all.py b/defects/regamedll-0002/bench/run_all.py deleted file mode 100644 index b15c24b4e..000000000 --- a/defects/regamedll-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-regamedll-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/regamedll-cs-0001/Makefile b/defects/regamedll-cs-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/regamedll-cs-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/regamedll-cs-0001/bench/bench-regamedll-cs-0001-0001.py b/defects/regamedll-cs-0001/bench/bench-regamedll-cs-0001-0001.py deleted file mode 100644 index 9f49870dd..000000000 --- a/defects/regamedll-cs-0001/bench/bench-regamedll-cs-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-regamedll-cs-0001-0001.py -# CWE-407: list-scan inside loop in regamedll-cs-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== regamedll-cs-0001-0001: CWE-407: list-scan inside loop in regamedll-cs-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/regamedll-cs-0001/bench/results.txt b/defects/regamedll-cs-0001/bench/results.txt deleted file mode 100644 index 76968589c..000000000 --- a/defects/regamedll-cs-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== regamedll-cs-0001-0001: CWE-407: list-scan inside loop in regamedll-cs-0001-0001 (generic model) === -N=100 k=100 : defective=0.054ms fixed=0.002ms speedup=24.5x -N=500 k=500 : defective=1.374ms fixed=0.013ms speedup=104.6x -N=1000 k=1000 : defective=5.501ms fixed=0.029ms speedup=187.8x -N=2000 k=2000 : defective=22.860ms fixed=0.062ms speedup=366.6x - diff --git a/defects/regamedll-cs-0001/bench/run_all.py b/defects/regamedll-cs-0001/bench/run_all.py deleted file mode 100644 index 09f697d94..000000000 --- a/defects/regamedll-cs-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-regamedll-cs-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/renpy-0001/Makefile b/defects/renpy-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/renpy-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/renpy-0001/bench/bench-renpy-0001-0001.py b/defects/renpy-0001/bench/bench-renpy-0001-0001.py deleted file mode 100644 index c944a98a5..000000000 --- a/defects/renpy-0001/bench/bench-renpy-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-renpy-0001-0001.py -# CWE-407: list-scan inside loop in renpy-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== renpy-0001-0001: CWE-407: list-scan inside loop in renpy-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/renpy-0001/bench/results.txt b/defects/renpy-0001/bench/results.txt deleted file mode 100644 index 31ca8fb31..000000000 --- a/defects/renpy-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== renpy-0001-0001: CWE-407: list-scan inside loop in renpy-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.115ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=8.808ms fixed=0.046ms speedup=190.4x -N=2000 k=2000 : defective=37.582ms fixed=0.097ms speedup=386.9x - diff --git a/defects/renpy-0001/bench/run_all.py b/defects/renpy-0001/bench/run_all.py deleted file mode 100644 index e10f6364f..000000000 --- a/defects/renpy-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-renpy-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/retroarch-0001/Makefile b/defects/retroarch-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/retroarch-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/retroarch-0001/bench/bench-retroarch-0001-0001.py b/defects/retroarch-0001/bench/bench-retroarch-0001-0001.py deleted file mode 100644 index fbbf52098..000000000 --- a/defects/retroarch-0001/bench/bench-retroarch-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-retroarch-0001-0001.py -# CWE-407: list-scan inside loop in retroarch-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== retroarch-0001-0001: CWE-407: list-scan inside loop in retroarch-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/retroarch-0001/bench/results.txt b/defects/retroarch-0001/bench/results.txt deleted file mode 100644 index add13ce92..000000000 --- a/defects/retroarch-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== retroarch-0001-0001: CWE-407: list-scan inside loop in retroarch-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.124ms fixed=0.021ms speedup=103.1x -N=1000 k=1000 : defective=8.806ms fixed=0.045ms speedup=195.1x -N=2000 k=2000 : defective=35.378ms fixed=0.096ms speedup=367.4x - diff --git a/defects/retroarch-0001/bench/run_all.py b/defects/retroarch-0001/bench/run_all.py deleted file mode 100644 index 8cc476810..000000000 --- a/defects/retroarch-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-retroarch-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/retroarch-0002/Makefile b/defects/retroarch-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/retroarch-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/retroarch-0002/bench/bench-retroarch-0002-0002.py b/defects/retroarch-0002/bench/bench-retroarch-0002-0002.py deleted file mode 100644 index d6e0c90ca..000000000 --- a/defects/retroarch-0002/bench/bench-retroarch-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-retroarch-0002-0002.py -# CWE-407: list-scan inside loop in retroarch-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== retroarch-0002-0002: CWE-407: list-scan inside loop in retroarch-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/retroarch-0002/bench/results.txt b/defects/retroarch-0002/bench/results.txt deleted file mode 100644 index d2708184a..000000000 --- a/defects/retroarch-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== retroarch-0002-0002: CWE-407: list-scan inside loop in retroarch-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.121ms fixed=0.020ms speedup=104.8x -N=1000 k=1000 : defective=8.818ms fixed=0.051ms speedup=173.4x -N=2000 k=2000 : defective=40.501ms fixed=0.097ms speedup=417.9x - diff --git a/defects/retroarch-0002/bench/run_all.py b/defects/retroarch-0002/bench/run_all.py deleted file mode 100644 index 674425ef5..000000000 --- a/defects/retroarch-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-retroarch-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rmq/Makefile b/defects/rmq/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rmq/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rmq/bench/bench-rmq-0001.py b/defects/rmq/bench/bench-rmq-0001.py deleted file mode 100644 index 117f3eec7..000000000 --- a/defects/rmq/bench/bench-rmq-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rmq-0001.py -# CWE-407: list-scan inside loop in rmq-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rmq-0001: CWE-407: list-scan inside loop in rmq-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rmq/bench/bench-rmq-0002.py b/defects/rmq/bench/bench-rmq-0002.py deleted file mode 100644 index f7cd27dd7..000000000 --- a/defects/rmq/bench/bench-rmq-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rmq-0002.py -# CWE-407: list-scan inside loop in rmq-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rmq-0002: CWE-407: list-scan inside loop in rmq-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rmq/bench/bench-rmq-0003.py b/defects/rmq/bench/bench-rmq-0003.py deleted file mode 100644 index 40fcfa831..000000000 --- a/defects/rmq/bench/bench-rmq-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rmq-0003.py -# CWE-407: list-scan inside loop in rmq-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rmq-0003: CWE-407: list-scan inside loop in rmq-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rmq/bench/bench-rmq-0004.py b/defects/rmq/bench/bench-rmq-0004.py deleted file mode 100644 index 7d3e9f733..000000000 --- a/defects/rmq/bench/bench-rmq-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rmq-0004.py -# CWE-407: list-scan inside loop in rmq-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rmq-0004: CWE-407: list-scan inside loop in rmq-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rmq/bench/bench-rmq-0005.py b/defects/rmq/bench/bench-rmq-0005.py deleted file mode 100644 index 3976f38e4..000000000 --- a/defects/rmq/bench/bench-rmq-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rmq-0005.py -# CWE-407: list-scan inside loop in rmq-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rmq-0005: CWE-407: list-scan inside loop in rmq-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rmq/bench/results.txt b/defects/rmq/bench/results.txt deleted file mode 100644 index 21e135281..000000000 --- a/defects/rmq/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== rmq-0001: CWE-407: list-scan inside loop in rmq-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.558ms fixed=0.023ms speedup=110.8x -N=1000 k=1000 : defective=10.817ms fixed=0.056ms speedup=194.5x -N=2000 k=2000 : defective=47.083ms fixed=0.124ms speedup=379.8x - -=== rmq-0002: CWE-407: list-scan inside loop in rmq-0002 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.835ms fixed=0.027ms speedup=106.5x -N=1000 k=1000 : defective=10.897ms fixed=0.051ms speedup=215.6x -N=2000 k=2000 : defective=39.183ms fixed=0.097ms speedup=405.2x - -=== rmq-0003: CWE-407: list-scan inside loop in rmq-0003 (generic model) === -N=100 k=100 : defective=0.150ms fixed=0.005ms speedup=31.7x -N=500 k=500 : defective=2.188ms fixed=0.022ms speedup=97.6x -N=1000 k=1000 : defective=10.182ms fixed=0.051ms speedup=201.2x -N=2000 k=2000 : defective=43.662ms fixed=0.096ms speedup=454.3x - -=== rmq-0004: CWE-407: list-scan inside loop in rmq-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.813ms fixed=0.020ms speedup=137.6x -N=1000 k=1000 : defective=9.372ms fixed=0.045ms speedup=208.5x -N=2000 k=2000 : defective=44.025ms fixed=0.223ms speedup=197.3x - -=== rmq-0005: CWE-407: list-scan inside loop in rmq-0005 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.134ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=9.972ms fixed=0.045ms speedup=220.5x -N=2000 k=2000 : defective=42.633ms fixed=0.097ms speedup=438.3x - diff --git a/defects/rmq/bench/run_all.py b/defects/rmq/bench/run_all.py deleted file mode 100644 index 500b09d10..000000000 --- a/defects/rmq/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rmq-0001.py", "bench-rmq-0002.py", "bench-rmq-0003.py", "bench-rmq-0004.py", "bench-rmq-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rocketchat/Makefile b/defects/rocketchat/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rocketchat/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rocketchat/bench/bench-rocketchat-0001.py b/defects/rocketchat/bench/bench-rocketchat-0001.py deleted file mode 100644 index 1da58f457..000000000 --- a/defects/rocketchat/bench/bench-rocketchat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rocketchat-0001.py -# CWE-407: list-scan inside loop in rocketchat-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rocketchat-0001: CWE-407: list-scan inside loop in rocketchat-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rocketchat/bench/bench-rocketchat-0002.py b/defects/rocketchat/bench/bench-rocketchat-0002.py deleted file mode 100644 index faab9abef..000000000 --- a/defects/rocketchat/bench/bench-rocketchat-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rocketchat-0002.py -# CWE-407: list-scan inside loop in rocketchat-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rocketchat-0002: CWE-407: list-scan inside loop in rocketchat-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rocketchat/bench/bench-rocketchat-0003.py b/defects/rocketchat/bench/bench-rocketchat-0003.py deleted file mode 100644 index f14b4b9fc..000000000 --- a/defects/rocketchat/bench/bench-rocketchat-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rocketchat-0003.py -# CWE-407: list-scan inside loop in rocketchat-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rocketchat-0003: CWE-407: list-scan inside loop in rocketchat-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rocketchat/bench/bench-rocketchat-0004.py b/defects/rocketchat/bench/bench-rocketchat-0004.py deleted file mode 100644 index f51e20ac5..000000000 --- a/defects/rocketchat/bench/bench-rocketchat-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rocketchat-0004.py -# CWE-407: list-scan inside loop in rocketchat-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rocketchat-0004: CWE-407: list-scan inside loop in rocketchat-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rocketchat/bench/results.txt b/defects/rocketchat/bench/results.txt deleted file mode 100644 index 460552369..000000000 --- a/defects/rocketchat/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== rocketchat-0001: CWE-407: list-scan inside loop in rocketchat-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.175ms fixed=0.038ms speedup=57.1x -N=1000 k=1000 : defective=8.742ms fixed=0.046ms speedup=191.1x -N=2000 k=2000 : defective=35.186ms fixed=0.097ms speedup=361.9x - -=== rocketchat-0002: CWE-407: list-scan inside loop in rocketchat-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=101.8x -N=1000 k=1000 : defective=8.744ms fixed=0.046ms speedup=189.9x -N=2000 k=2000 : defective=35.280ms fixed=0.096ms speedup=368.0x - -=== rocketchat-0003: CWE-407: list-scan inside loop in rocketchat-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.168ms fixed=0.021ms speedup=104.4x -N=1000 k=1000 : defective=8.621ms fixed=0.046ms speedup=188.1x -N=2000 k=2000 : defective=35.630ms fixed=0.097ms speedup=368.5x - -=== rocketchat-0004: CWE-407: list-scan inside loop in rocketchat-0004 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.124ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.817ms fixed=0.048ms speedup=182.0x -N=2000 k=2000 : defective=36.030ms fixed=0.097ms speedup=372.8x - diff --git a/defects/rocketchat/bench/run_all.py b/defects/rocketchat/bench/run_all.py deleted file mode 100644 index 0eba082ad..000000000 --- a/defects/rocketchat/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rocketchat-0001.py", "bench-rocketchat-0002.py", "bench-rocketchat-0003.py", "bench-rocketchat-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rocksdb/Makefile b/defects/rocksdb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rocksdb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rocksdb/bench/bench-rocksdb-0001.py b/defects/rocksdb/bench/bench-rocksdb-0001.py deleted file mode 100644 index ea2a984a7..000000000 --- a/defects/rocksdb/bench/bench-rocksdb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rocksdb-0001.py -# CWE-407: list-scan inside loop in rocksdb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rocksdb-0001: CWE-407: list-scan inside loop in rocksdb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rocksdb/bench/bench-rocksdb-001.py b/defects/rocksdb/bench/bench-rocksdb-001.py deleted file mode 100644 index ee1b193da..000000000 --- a/defects/rocksdb/bench/bench-rocksdb-001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rocksdb-001.py -# LockInfo.txn_ids linear scan — O(T²) shared-lock churn -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rocksdb-001: LockInfo.txn_ids linear scan — O(T²) shared-lock churn ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rocksdb/bench/results.txt b/defects/rocksdb/bench/results.txt deleted file mode 100644 index 28480cc34..000000000 --- a/defects/rocksdb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== rocksdb-0001: CWE-407: list-scan inside loop in rocksdb-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.278ms fixed=0.022ms speedup=105.7x -N=1000 k=1000 : defective=9.028ms fixed=0.047ms speedup=191.7x -N=2000 k=2000 : defective=35.315ms fixed=0.096ms speedup=366.1x - -=== rocksdb-001: LockInfo.txn_ids linear scan — O(T²) shared-lock churn === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.116ms fixed=0.021ms speedup=102.8x -N=1000 k=1000 : defective=8.685ms fixed=0.046ms speedup=189.7x -N=2000 k=2000 : defective=36.199ms fixed=0.097ms speedup=373.7x - diff --git a/defects/rocksdb/bench/run_all.py b/defects/rocksdb/bench/run_all.py deleted file mode 100644 index 121396968..000000000 --- a/defects/rocksdb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rocksdb-0001.py", "bench-rocksdb-001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/root-cern-0001/Makefile b/defects/root-cern-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/root-cern-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/root-cern-0001/bench/bench-root-cern-0001-0001.py b/defects/root-cern-0001/bench/bench-root-cern-0001-0001.py deleted file mode 100644 index d4b50e850..000000000 --- a/defects/root-cern-0001/bench/bench-root-cern-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-root-cern-0001-0001.py -# CWE-407: list-scan inside loop in root-cern-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== root-cern-0001-0001: CWE-407: list-scan inside loop in root-cern-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/root-cern-0001/bench/results.txt b/defects/root-cern-0001/bench/results.txt deleted file mode 100644 index 01ea0b040..000000000 --- a/defects/root-cern-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== root-cern-0001-0001: CWE-407: list-scan inside loop in root-cern-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.318ms fixed=0.023ms speedup=102.7x -N=1000 k=1000 : defective=9.573ms fixed=0.050ms speedup=192.5x -N=2000 k=2000 : defective=38.848ms fixed=0.097ms speedup=399.8x - diff --git a/defects/root-cern-0001/bench/run_all.py b/defects/root-cern-0001/bench/run_all.py deleted file mode 100644 index 0d5b25913..000000000 --- a/defects/root-cern-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-root-cern-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/root-cern-0002/Makefile b/defects/root-cern-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/root-cern-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/root-cern-0002/bench/bench-root-cern-0002-0002.py b/defects/root-cern-0002/bench/bench-root-cern-0002-0002.py deleted file mode 100644 index 051d06141..000000000 --- a/defects/root-cern-0002/bench/bench-root-cern-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-root-cern-0002-0002.py -# CWE-407: list-scan inside loop in root-cern-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== root-cern-0002-0002: CWE-407: list-scan inside loop in root-cern-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/root-cern-0002/bench/results.txt b/defects/root-cern-0002/bench/results.txt deleted file mode 100644 index 401a699a4..000000000 --- a/defects/root-cern-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== root-cern-0002-0002: CWE-407: list-scan inside loop in root-cern-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.326ms fixed=0.022ms speedup=107.5x -N=1000 k=1000 : defective=9.007ms fixed=0.046ms speedup=193.9x -N=2000 k=2000 : defective=35.082ms fixed=0.096ms speedup=365.3x - diff --git a/defects/root-cern-0002/bench/run_all.py b/defects/root-cern-0002/bench/run_all.py deleted file mode 100644 index cf3a2a3e4..000000000 --- a/defects/root-cern-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-root-cern-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/root-cern-0003/Makefile b/defects/root-cern-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/root-cern-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/root-cern-0003/bench/bench-root-cern-0003-0003.py b/defects/root-cern-0003/bench/bench-root-cern-0003-0003.py deleted file mode 100644 index 20692a6bc..000000000 --- a/defects/root-cern-0003/bench/bench-root-cern-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-root-cern-0003-0003.py -# CWE-407: list-scan inside loop in root-cern-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== root-cern-0003-0003: CWE-407: list-scan inside loop in root-cern-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/root-cern-0003/bench/results.txt b/defects/root-cern-0003/bench/results.txt deleted file mode 100644 index 62a7df760..000000000 --- a/defects/root-cern-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== root-cern-0003-0003: CWE-407: list-scan inside loop in root-cern-0003-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=101.3x -N=1000 k=1000 : defective=8.870ms fixed=0.047ms speedup=188.1x -N=2000 k=2000 : defective=35.006ms fixed=0.096ms speedup=366.5x - diff --git a/defects/root-cern-0003/bench/run_all.py b/defects/root-cern-0003/bench/run_all.py deleted file mode 100644 index b567b36f8..000000000 --- a/defects/root-cern-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-root-cern-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ros2/Makefile b/defects/ros2/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ros2/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ros2/bench/bench-ros2-0001.py b/defects/ros2/bench/bench-ros2-0001.py deleted file mode 100644 index c11038b75..000000000 --- a/defects/ros2/bench/bench-ros2-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ros2-0001.py -# ParameterEventsFilter — O(N×P) std::find on names vector inside parameter loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ros2-0001: ParameterEventsFilter — O(N×P) std::find on names vector inside parameter loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ros2/bench/bench-ros2-0002.py b/defects/ros2/bench/bench-ros2-0002.py deleted file mode 100644 index e141fd8c3..000000000 --- a/defects/ros2/bench/bench-ros2-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ros2-0002.py -# NodeParameters::list_parameters() — O(P²) std::find on result.prefixes inside parameter loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ros2-0002: NodeParameters::list_parameters() — O(P²) std::find on result.prefixes inside parameter loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ros2/bench/results.txt b/defects/ros2/bench/results.txt deleted file mode 100644 index 9add541e4..000000000 --- a/defects/ros2/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== ros2-0001: ParameterEventsFilter — O(N×P) std::find on names vector inside parameter loop === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.367ms fixed=0.023ms speedup=101.4x -N=1000 k=1000 : defective=9.598ms fixed=0.050ms speedup=193.5x -N=2000 k=2000 : defective=39.365ms fixed=0.097ms speedup=405.5x - -=== ros2-0002: NodeParameters::list_parameters() — O(P²) std::find on result.prefixes inside parameter loop === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.143ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=10.774ms fixed=0.051ms speedup=211.3x -N=2000 k=2000 : defective=36.385ms fixed=0.097ms speedup=375.2x - diff --git a/defects/ros2/bench/run_all.py b/defects/ros2/bench/run_all.py deleted file mode 100644 index f18926555..000000000 --- a/defects/ros2/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ros2-0001.py", "bench-ros2-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rpcs3/Makefile b/defects/rpcs3/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rpcs3/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rpcs3/bench/bench-rpcs3-0001.py b/defects/rpcs3/bench/bench-rpcs3-0001.py deleted file mode 100644 index b6c576712..000000000 --- a/defects/rpcs3/bench/bench-rpcs3-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rpcs3-0001.py -# std::find for every predecessor insertion — O(P) per edge where P = -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rpcs3-0001: std::find for every predecessor insertion — O(P) per edge where P = ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rpcs3/bench/bench-rpcs3-0002.py b/defects/rpcs3/bench/bench-rpcs3-0002.py deleted file mode 100644 index de68aff6b..000000000 --- a/defects/rpcs3/bench/bench-rpcs3-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rpcs3-0002.py -# scanning the vector with std::find before each push_back — O(C) per -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rpcs3-0002: scanning the vector with std::find before each push_back — O(C) per ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rpcs3/bench/bench-rpcs3-0003.py b/defects/rpcs3/bench/bench-rpcs3-0003.py deleted file mode 100644 index 3f8a6d100..000000000 --- a/defects/rpcs3/bench/bench-rpcs3-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rpcs3-0003.py -# CWE-407: list-scan inside loop in rpcs3-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rpcs3-0003: CWE-407: list-scan inside loop in rpcs3-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rpcs3/bench/bench-rpcs3-0004.py b/defects/rpcs3/bench/bench-rpcs3-0004.py deleted file mode 100644 index d2a3130cd..000000000 --- a/defects/rpcs3/bench/bench-rpcs3-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rpcs3-0004.py -# Defect: rpcs3-0004 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rpcs3-0004: Defect: rpcs3-0004 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rpcs3/bench/results.txt b/defects/rpcs3/bench/results.txt deleted file mode 100644 index 3a6a87e3c..000000000 --- a/defects/rpcs3/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== rpcs3-0001: std::find for every predecessor insertion — O(P) per edge where P = === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.513ms fixed=0.024ms speedup=105.6x -N=1000 k=1000 : defective=10.363ms fixed=0.053ms speedup=196.6x -N=2000 k=2000 : defective=36.369ms fixed=0.095ms speedup=382.5x - -=== rpcs3-0002: scanning the vector with std::find before each push_back — O(C) per === -N=100 k=100 : defective=0.155ms fixed=0.007ms speedup=23.4x -N=500 k=500 : defective=2.240ms fixed=0.021ms speedup=108.8x -N=1000 k=1000 : defective=9.187ms fixed=0.045ms speedup=203.0x -N=2000 k=2000 : defective=44.070ms fixed=0.107ms speedup=413.0x - -=== rpcs3-0003: CWE-407: list-scan inside loop in rpcs3-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.304ms fixed=0.023ms speedup=100.3x -N=1000 k=1000 : defective=8.557ms fixed=0.046ms speedup=186.7x -N=2000 k=2000 : defective=35.494ms fixed=0.118ms speedup=302.0x - -=== rpcs3-0004: Defect: rpcs3-0004 === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.717ms fixed=0.025ms speedup=108.4x -N=1000 k=1000 : defective=10.659ms fixed=0.047ms speedup=224.5x -N=2000 k=2000 : defective=35.404ms fixed=0.095ms speedup=372.0x - diff --git a/defects/rpcs3/bench/run_all.py b/defects/rpcs3/bench/run_all.py deleted file mode 100644 index ee8a4e06e..000000000 --- a/defects/rpcs3/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rpcs3-0001.py", "bench-rpcs3-0002.py", "bench-rpcs3-0003.py", "bench-rpcs3-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rubocop/Makefile b/defects/rubocop/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rubocop/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rubocop/bench/bench-rubocop-0001.py b/defects/rubocop/bench/bench-rubocop-0001.py deleted file mode 100644 index 908b83d69..000000000 --- a/defects/rubocop/bench/bench-rubocop-0001.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -# bench-rubocop-0001.py -# IgnoredNode @ignored_nodes Array: `ignored_node?(node)` runs -# `ignored_nodes.any? { |n| n.equal?(node) }` — O(S) per call. -# `part_of_ignored_node?` maps over the full array each call — O(S). -# For R regexp_literal + S string_literal nodes per file, the StringHelp -# path costs O(R × S). Fix: `Set.new.compare_by_identity` — O(1) via -# object hash/identity. - -import sys -import time - - -class _Node: - """Ruby node object — identity used for membership (RuboCop Parser::AST::Node).""" - __slots__ = ("id",) - def __init__(self, i): - self.id = i - - -def bench_defective(r, s): - """Array membership via identity scan — O(R*S).""" - ignored = [_Node(i) for i in range(r)] # R regexp nodes ignored - strs = [ignored[i % r] if i % 3 == 0 else _Node(1000 + i) for i in range(s)] - - t0 = time.perf_counter() - hits = 0 - for node in strs: - # Array#any? { |n| n.equal?(node) } — O(R) per call - found = False - for ig in ignored: - if ig is node: - found = True - break - if found: - hits += 1 - return time.perf_counter() - t0 - - -def bench_fixed(r, s): - """Set.compare_by_identity — O(1) membership via object id.""" - ignored_set = set() - ignored_list = [] - for i in range(r): - n = _Node(i) - ignored_set.add(id(n)) # identity hash - ignored_list.append(n) - strs = [ignored_list[i % r] if i % 3 == 0 else _Node(1000 + i) for i in range(s)] - - t0 = time.perf_counter() - hits = 0 - for node in strs: - if id(node) in ignored_set: # O(1) - hits += 1 - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 500), (100, 1000), (200, 2000), (500, 5000)] - - -def run(): - lines = [] - header = "=== rubocop-0001: IgnoredNode Array#any?(equal?) vs Set.compare_by_identity ===" - print(header); lines.append(header) - for r, s in CASES: - df = min(bench_defective(r, s) for _ in range(TRIALS)) - fx = min(bench_fixed(r, s) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"R={r:<4} S={s:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rubocop/bench/bench-rubocop-0002.py b/defects/rubocop/bench/bench-rubocop-0002.py deleted file mode 100644 index 8bcadfd22..000000000 --- a/defects/rubocop/bench/bench-rubocop-0002.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 -# bench-rubocop-0002.py -# Style::RedundantSelf @allowed_send_nodes Array: `allowed_send_node?` -# calls `.include?(node)` — O(S) per send_node check. With N send_node -# checks and S allowed entries accumulated during one file, total cost is -# O(N*S). Fix: swap Array for Set for O(1) include?. - -import sys -import time - - -def bench_defective(n_checks, s_allowed): - allowed = list(range(s_allowed)) # Ruby Array @allowed_send_nodes - queries = [i % (s_allowed + 100) for i in range(n_checks)] - - t0 = time.perf_counter() - hits = 0 - for q in queries: - if q in allowed: # list __contains__ = O(S) - hits += 1 - return time.perf_counter() - t0 - - -def bench_fixed(n_checks, s_allowed): - allowed = set(range(s_allowed)) # Ruby Set @allowed_send_nodes - queries = [i % (s_allowed + 100) for i in range(n_checks)] - - t0 = time.perf_counter() - hits = 0 - for q in queries: - if q in allowed: # O(1) - hits += 1 - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 50), (1000, 100), (2000, 200), (5000, 500)] - - -def run(): - lines = [] - header = "=== rubocop-0002: RedundantSelf Array#include? vs Set#include? ===" - print(header); lines.append(header) - for n, s in CASES: - df = min(bench_defective(n, s) for _ in range(TRIALS)) - fx = min(bench_fixed(n, s) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} S={s:<4}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rubocop/bench/results.txt b/defects/rubocop/bench/results.txt deleted file mode 100644 index e49de9751..000000000 --- a/defects/rubocop/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== rubocop-0001: IgnoredNode Array#any?(equal?) vs Set.compare_by_identity === -R=50 S=500 : defective=0.534ms fixed=0.075ms speedup=7.1x -R=100 S=1000 : defective=2.005ms fixed=0.150ms speedup=13.4x -R=200 S=2000 : defective=7.898ms fixed=0.288ms speedup=27.4x -R=500 S=5000 : defective=47.680ms fixed=0.731ms speedup=65.2x - -=== rubocop-0002: RedundantSelf Array#include? vs Set#include? === -N=500 S=50 : defective=0.380ms fixed=0.023ms speedup=16.8x -N=1000 S=100 : defective=1.422ms fixed=0.048ms speedup=29.7x -N=2000 S=200 : defective=5.185ms fixed=0.132ms speedup=39.3x -N=5000 S=500 : defective=33.127ms fixed=0.423ms speedup=78.4x - diff --git a/defects/rubocop/bench/run_all.py b/defects/rubocop/bench/run_all.py deleted file mode 100644 index 64d6bb582..000000000 --- a/defects/rubocop/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rubocop-0001.py", "bench-rubocop-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ruby/Makefile b/defects/ruby/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ruby/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ruby/bench/bench-ruby-0001.py b/defects/ruby/bench/bench-ruby-0001.py deleted file mode 100644 index 93ac372a6..000000000 --- a/defects/ruby/bench/bench-ruby-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ruby-0001.py -# class.c do_include_modules_at super chain linear scan O(M*S) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ruby-0001: class.c do_include_modules_at super chain linear scan O(M*S) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ruby/bench/bench-ruby-0002.py b/defects/ruby/bench/bench-ruby-0002.py deleted file mode 100644 index 8f4bfacf3..000000000 --- a/defects/ruby/bench/bench-ruby-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ruby-0002.py -# CWE-407: list-scan inside loop in ruby-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ruby-0002: CWE-407: list-scan inside loop in ruby-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ruby/bench/bench-ruby-0003.py b/defects/ruby/bench/bench-ruby-0003.py deleted file mode 100644 index 5128fd861..000000000 --- a/defects/ruby/bench/bench-ruby-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ruby-0003.py -# RubyGems Gem::Specification#dependent_gems — O(N²×D) nested scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ruby-0003: RubyGems Gem::Specification#dependent_gems — O(N²×D) nested scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ruby/bench/results.txt b/defects/ruby/bench/results.txt deleted file mode 100644 index 9d0fd46ba..000000000 --- a/defects/ruby/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== ruby-0001: class.c do_include_modules_at super chain linear scan O(M*S) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.479ms fixed=0.024ms speedup=105.1x -N=1000 k=1000 : defective=10.139ms fixed=0.052ms speedup=194.0x -N=2000 k=2000 : defective=37.907ms fixed=0.096ms speedup=393.1x - -=== ruby-0002: CWE-407: list-scan inside loop in ruby-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.120ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=9.999ms fixed=0.045ms speedup=220.5x -N=2000 k=2000 : defective=39.669ms fixed=0.098ms speedup=404.2x - -=== ruby-0003: RubyGems Gem::Specification#dependent_gems — O(N²×D) nested scan === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.102ms fixed=0.020ms speedup=103.4x -N=1000 k=1000 : defective=8.869ms fixed=0.046ms speedup=191.2x -N=2000 k=2000 : defective=35.260ms fixed=0.096ms speedup=368.1x - diff --git a/defects/ruby/bench/run_all.py b/defects/ruby/bench/run_all.py deleted file mode 100644 index e63a08735..000000000 --- a/defects/ruby/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ruby-0001.py", "bench-ruby-0002.py", "bench-ruby-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ruffle-0001/Makefile b/defects/ruffle-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ruffle-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ruffle-0001/bench/bench-ruffle-0001-0001.py b/defects/ruffle-0001/bench/bench-ruffle-0001-0001.py deleted file mode 100644 index 0871329c5..000000000 --- a/defects/ruffle-0001/bench/bench-ruffle-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ruffle-0001-0001.py -# CWE-407: list-scan inside loop in ruffle-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ruffle-0001-0001: CWE-407: list-scan inside loop in ruffle-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ruffle-0001/bench/results.txt b/defects/ruffle-0001/bench/results.txt deleted file mode 100644 index 8dbaa5caa..000000000 --- a/defects/ruffle-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ruffle-0001-0001: CWE-407: list-scan inside loop in ruffle-0001-0001 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=27.5x -N=500 k=500 : defective=2.510ms fixed=0.023ms speedup=108.2x -N=1000 k=1000 : defective=8.695ms fixed=0.046ms speedup=188.5x -N=2000 k=2000 : defective=35.395ms fixed=0.097ms speedup=365.6x - diff --git a/defects/ruffle-0001/bench/run_all.py b/defects/ruffle-0001/bench/run_all.py deleted file mode 100644 index 5f4b415f9..000000000 --- a/defects/ruffle-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ruffle-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ruffle-0002/Makefile b/defects/ruffle-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ruffle-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ruffle-0002/bench/bench-ruffle-0002-0002.py b/defects/ruffle-0002/bench/bench-ruffle-0002-0002.py deleted file mode 100644 index 7675b1b2b..000000000 --- a/defects/ruffle-0002/bench/bench-ruffle-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ruffle-0002-0002.py -# CWE-407: list-scan inside loop in ruffle-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ruffle-0002-0002: CWE-407: list-scan inside loop in ruffle-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ruffle-0002/bench/results.txt b/defects/ruffle-0002/bench/results.txt deleted file mode 100644 index 3601a64b1..000000000 --- a/defects/ruffle-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ruffle-0002-0002: CWE-407: list-scan inside loop in ruffle-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.624ms fixed=0.046ms speedup=186.3x -N=2000 k=2000 : defective=35.243ms fixed=0.098ms speedup=361.2x - diff --git a/defects/ruffle-0002/bench/run_all.py b/defects/ruffle-0002/bench/run_all.py deleted file mode 100644 index 506c79ed4..000000000 --- a/defects/ruffle-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ruffle-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/rustc/Makefile b/defects/rustc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/rustc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/rustc/bench/bench-rustc-0001.py b/defects/rustc/bench/bench-rustc-0001.py deleted file mode 100644 index a02cf633a..000000000 --- a/defects/rustc/bench/bench-rustc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rustc-0001.py -# CWE-407: list-scan inside loop in rustc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rustc-0001: CWE-407: list-scan inside loop in rustc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rustc/bench/bench-rustc-0003.py b/defects/rustc/bench/bench-rustc-0003.py deleted file mode 100644 index c6443ab2a..000000000 --- a/defects/rustc/bench/bench-rustc-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rustc-0003.py -# CWE-407: list-scan inside loop in rustc-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rustc-0003: CWE-407: list-scan inside loop in rustc-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rustc/bench/bench-rustc-0004.py b/defects/rustc/bench/bench-rustc-0004.py deleted file mode 100644 index 9df9e3c6b..000000000 --- a/defects/rustc/bench/bench-rustc-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-rustc-0004.py -# CWE-407 — O(I×A) repeated Vec linear scan in finalize_imports -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== rustc-0004: CWE-407 — O(I×A) repeated Vec linear scan in finalize_imports ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/rustc/bench/results.txt b/defects/rustc/bench/results.txt deleted file mode 100644 index 4a1444876..000000000 --- a/defects/rustc/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== rustc-0001: CWE-407: list-scan inside loop in rustc-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.311ms fixed=0.023ms speedup=101.5x -N=1000 k=1000 : defective=9.451ms fixed=0.049ms speedup=192.6x -N=2000 k=2000 : defective=35.434ms fixed=0.095ms speedup=371.9x - -=== rustc-0003: CWE-407: list-scan inside loop in rustc-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=100.3x -N=1000 k=1000 : defective=9.104ms fixed=0.048ms speedup=189.2x -N=2000 k=2000 : defective=35.007ms fixed=0.098ms speedup=357.5x - -=== rustc-0004: CWE-407 — O(I×A) repeated Vec linear scan in finalize_imports === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.109ms fixed=0.021ms speedup=102.4x -N=1000 k=1000 : defective=9.122ms fixed=0.046ms speedup=199.0x -N=2000 k=2000 : defective=35.212ms fixed=0.097ms speedup=363.9x - diff --git a/defects/rustc/bench/run_all.py b/defects/rustc/bench/run_all.py deleted file mode 100644 index a4873ff29..000000000 --- a/defects/rustc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-rustc-0001.py", "bench-rustc-0003.py", "bench-rustc-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/ryujinx-0001/Makefile b/defects/ryujinx-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/ryujinx-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/ryujinx-0001/bench/bench-ryujinx-0001-0001.py b/defects/ryujinx-0001/bench/bench-ryujinx-0001-0001.py deleted file mode 100644 index 560a4604b..000000000 --- a/defects/ryujinx-0001/bench/bench-ryujinx-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-ryujinx-0001-0001.py -# CWE-407: list-scan inside loop in ryujinx-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== ryujinx-0001-0001: CWE-407: list-scan inside loop in ryujinx-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/ryujinx-0001/bench/results.txt b/defects/ryujinx-0001/bench/results.txt deleted file mode 100644 index a89442d65..000000000 --- a/defects/ryujinx-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== ryujinx-0001-0001: CWE-407: list-scan inside loop in ryujinx-0001-0001 (generic model) === -N=100 k=100 : defective=0.130ms fixed=0.005ms speedup=24.1x -N=500 k=500 : defective=3.625ms fixed=0.040ms speedup=91.0x -N=1000 k=1000 : defective=17.495ms fixed=0.085ms speedup=205.8x -N=2000 k=2000 : defective=36.063ms fixed=0.096ms speedup=377.1x - diff --git a/defects/ryujinx-0001/bench/run_all.py b/defects/ryujinx-0001/bench/run_all.py deleted file mode 100644 index aad6026c5..000000000 --- a/defects/ryujinx-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-ryujinx-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/s3fs-fuse-0001/Makefile b/defects/s3fs-fuse-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/s3fs-fuse-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/s3fs-fuse-0001/bench/bench-s3fs-fuse-0001-0001.py b/defects/s3fs-fuse-0001/bench/bench-s3fs-fuse-0001-0001.py deleted file mode 100644 index d346e5abb..000000000 --- a/defects/s3fs-fuse-0001/bench/bench-s3fs-fuse-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-s3fs-fuse-0001-0001.py -# CWE-407: list-scan inside loop in s3fs-fuse-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== s3fs-fuse-0001-0001: CWE-407: list-scan inside loop in s3fs-fuse-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/s3fs-fuse-0001/bench/results.txt b/defects/s3fs-fuse-0001/bench/results.txt deleted file mode 100644 index 6538f1dac..000000000 --- a/defects/s3fs-fuse-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== s3fs-fuse-0001-0001: CWE-407: list-scan inside loop in s3fs-fuse-0001-0001 (generic model) === -N=500 k=500 : defective=3.596ms fixed=0.035ms speedup=102.2x -N=2000 k=2000 : defective=54.242ms fixed=0.144ms speedup=375.5x -N=5000 k=5000 : defective=230.143ms fixed=0.251ms speedup=916.4x -N=10000 k=10000: defective=864.119ms fixed=0.488ms speedup=1769.4x - diff --git a/defects/s3fs-fuse-0001/bench/run_all.py b/defects/s3fs-fuse-0001/bench/run_all.py deleted file mode 100644 index b3d81d7e4..000000000 --- a/defects/s3fs-fuse-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-s3fs-fuse-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/salt/Makefile b/defects/salt/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/salt/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/salt/bench/bench-salt-0001.py b/defects/salt/bench/bench-salt-0001.py deleted file mode 100644 index a33903882..000000000 --- a/defects/salt/bench/bench-salt-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-salt-0001.py -# CWE-407: list-scan inside loop in salt-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== salt-0001: CWE-407: list-scan inside loop in salt-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/salt/bench/bench-salt-0002.py b/defects/salt/bench/bench-salt-0002.py deleted file mode 100644 index 088aa6767..000000000 --- a/defects/salt/bench/bench-salt-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-salt-0002.py -# CWE-407: list-scan inside loop in salt-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== salt-0002: CWE-407: list-scan inside loop in salt-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/salt/bench/bench-salt-0003.py b/defects/salt/bench/bench-salt-0003.py deleted file mode 100644 index e709bd72a..000000000 --- a/defects/salt/bench/bench-salt-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-salt-0003.py -# CWE-407: list-scan inside loop in salt-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== salt-0003: CWE-407: list-scan inside loop in salt-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/salt/bench/bench-salt-0004.py b/defects/salt/bench/bench-salt-0004.py deleted file mode 100644 index 732e5d954..000000000 --- a/defects/salt/bench/bench-salt-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-salt-0004.py -# Defect: re.match/re.compile receives tgt from job payload when tgt_type=pcre or grain_pcre. -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== salt-0004: Defect: re.match/re.compile receives tgt from job payload when tgt_type=pcre or grain_pcre. ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/salt/bench/bench-salt-0005.py b/defects/salt/bench/bench-salt-0005.py deleted file mode 100644 index 132972b50..000000000 --- a/defects/salt/bench/bench-salt-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-salt-0005.py -# CWE-407: list-scan inside loop in salt-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== salt-0005: CWE-407: list-scan inside loop in salt-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/salt/bench/results.txt b/defects/salt/bench/results.txt deleted file mode 100644 index 16f624c11..000000000 --- a/defects/salt/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== salt-0001: CWE-407: list-scan inside loop in salt-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.055ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=8.320ms fixed=0.044ms speedup=188.1x -N=2000 k=2000 : defective=35.172ms fixed=0.092ms speedup=383.8x - -=== salt-0002: CWE-407: list-scan inside loop in salt-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=23.7x -N=500 k=500 : defective=2.024ms fixed=0.020ms speedup=102.3x -N=1000 k=1000 : defective=8.767ms fixed=0.044ms speedup=201.0x -N=2000 k=2000 : defective=36.518ms fixed=0.097ms speedup=376.8x - -=== salt-0003: CWE-407: list-scan inside loop in salt-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.112ms fixed=0.020ms speedup=104.7x -N=1000 k=1000 : defective=8.607ms fixed=0.046ms speedup=185.5x -N=2000 k=2000 : defective=34.169ms fixed=0.092ms speedup=369.9x - -=== salt-0004: Defect: re.match/re.compile receives tgt from job payload when tgt_type=pcre or grain_pcre. === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.013ms fixed=0.020ms speedup=102.0x -N=1000 k=1000 : defective=8.307ms fixed=0.044ms speedup=188.3x -N=2000 k=2000 : defective=33.418ms fixed=0.093ms speedup=361.1x - -=== salt-0005: CWE-407: list-scan inside loop in salt-0005 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.032ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.241ms fixed=0.043ms speedup=190.5x -N=2000 k=2000 : defective=34.681ms fixed=0.092ms speedup=376.7x - diff --git a/defects/salt/bench/run_all.py b/defects/salt/bench/run_all.py deleted file mode 100644 index cc3e3e62e..000000000 --- a/defects/salt/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-salt-0001.py", "bench-salt-0002.py", "bench-salt-0003.py", "bench-salt-0004.py", "bench-salt-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/saltstack/Makefile b/defects/saltstack/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/saltstack/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/saltstack/bench/bench-saltstack-0001.py b/defects/saltstack/bench/bench-saltstack-0001.py deleted file mode 100644 index 4b85ced44..000000000 --- a/defects/saltstack/bench/bench-saltstack-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-saltstack-0001.py -# CWE-407: list-scan inside loop in saltstack-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== saltstack-0001: CWE-407: list-scan inside loop in saltstack-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/saltstack/bench/results.txt b/defects/saltstack/bench/results.txt deleted file mode 100644 index 75913ce7c..000000000 --- a/defects/saltstack/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== saltstack-0001: CWE-407: list-scan inside loop in saltstack-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.429ms fixed=0.024ms speedup=102.7x -N=1000 k=1000 : defective=9.959ms fixed=0.053ms speedup=187.8x -N=2000 k=2000 : defective=35.855ms fixed=0.095ms speedup=377.7x - diff --git a/defects/saltstack/bench/run_all.py b/defects/saltstack/bench/run_all.py deleted file mode 100644 index 906d926a8..000000000 --- a/defects/saltstack/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-saltstack-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/samba-0001/Makefile b/defects/samba-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/samba-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/samba-0001/bench/bench-samba-0001-0001.py b/defects/samba-0001/bench/bench-samba-0001-0001.py deleted file mode 100644 index d3047ff12..000000000 --- a/defects/samba-0001/bench/bench-samba-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-samba-0001-0001.py -# CWE-407: list-scan inside loop in samba-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== samba-0001-0001: CWE-407: list-scan inside loop in samba-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/samba-0001/bench/results.txt b/defects/samba-0001/bench/results.txt deleted file mode 100644 index bba05ae28..000000000 --- a/defects/samba-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== samba-0001-0001: CWE-407: list-scan inside loop in samba-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.479ms fixed=0.023ms speedup=106.7x -N=1000 k=1000 : defective=10.581ms fixed=0.052ms speedup=202.2x -N=2000 k=2000 : defective=37.272ms fixed=0.098ms speedup=381.6x - diff --git a/defects/samba-0001/bench/run_all.py b/defects/samba-0001/bench/run_all.py deleted file mode 100644 index 01dd257f9..000000000 --- a/defects/samba-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-samba-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/samba-0002/Makefile b/defects/samba-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/samba-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/samba-0002/bench/bench-samba-0002-0002.py b/defects/samba-0002/bench/bench-samba-0002-0002.py deleted file mode 100644 index 7df7e25cf..000000000 --- a/defects/samba-0002/bench/bench-samba-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-samba-0002-0002.py -# CWE-407: list-scan inside loop in samba-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== samba-0002-0002: CWE-407: list-scan inside loop in samba-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/samba-0002/bench/results.txt b/defects/samba-0002/bench/results.txt deleted file mode 100644 index ece29d073..000000000 --- a/defects/samba-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== samba-0002-0002: CWE-407: list-scan inside loop in samba-0002-0002 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.582ms fixed=0.024ms speedup=108.2x -N=1000 k=1000 : defective=9.101ms fixed=0.045ms speedup=202.7x -N=2000 k=2000 : defective=36.013ms fixed=0.096ms speedup=376.8x - diff --git a/defects/samba-0002/bench/run_all.py b/defects/samba-0002/bench/run_all.py deleted file mode 100644 index 6f3dc1728..000000000 --- a/defects/samba-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-samba-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sameboy-0001/Makefile b/defects/sameboy-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sameboy-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sameboy-0001/bench/bench-sameboy-0001-0001.py b/defects/sameboy-0001/bench/bench-sameboy-0001-0001.py deleted file mode 100644 index 043fd4de0..000000000 --- a/defects/sameboy-0001/bench/bench-sameboy-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sameboy-0001-0001.py -# CWE-407: list-scan inside loop in sameboy-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sameboy-0001-0001: CWE-407: list-scan inside loop in sameboy-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sameboy-0001/bench/results.txt b/defects/sameboy-0001/bench/results.txt deleted file mode 100644 index 401961310..000000000 --- a/defects/sameboy-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sameboy-0001-0001: CWE-407: list-scan inside loop in sameboy-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.207ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=9.527ms fixed=0.050ms speedup=189.4x -N=2000 k=2000 : defective=35.769ms fixed=0.097ms speedup=368.2x - diff --git a/defects/sameboy-0001/bench/run_all.py b/defects/sameboy-0001/bench/run_all.py deleted file mode 100644 index d6bcf9911..000000000 --- a/defects/sameboy-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sameboy-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sameboy-0002/Makefile b/defects/sameboy-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sameboy-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sameboy-0002/bench/bench-sameboy-0002-0002.py b/defects/sameboy-0002/bench/bench-sameboy-0002-0002.py deleted file mode 100644 index 8e997131c..000000000 --- a/defects/sameboy-0002/bench/bench-sameboy-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sameboy-0002-0002.py -# CWE-407: list-scan inside loop in sameboy-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sameboy-0002-0002: CWE-407: list-scan inside loop in sameboy-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sameboy-0002/bench/results.txt b/defects/sameboy-0002/bench/results.txt deleted file mode 100644 index 74d3d71af..000000000 --- a/defects/sameboy-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sameboy-0002-0002: CWE-407: list-scan inside loop in sameboy-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.105ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=8.638ms fixed=0.046ms speedup=189.5x -N=2000 k=2000 : defective=34.701ms fixed=0.097ms speedup=357.4x - diff --git a/defects/sameboy-0002/bench/run_all.py b/defects/sameboy-0002/bench/run_all.py deleted file mode 100644 index 3b3859a75..000000000 --- a/defects/sameboy-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sameboy-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scala/Makefile b/defects/scala/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scala/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scala/bench/bench-scala-0001.py b/defects/scala/bench/bench-scala-0001.py deleted file mode 100644 index c9e28b4e5..000000000 --- a/defects/scala/bench/bench-scala-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scala-0001.py -# CWE-407: list-scan inside loop in scala-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scala-0001: CWE-407: list-scan inside loop in scala-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scala/bench/bench-scala-0002.py b/defects/scala/bench/bench-scala-0002.py deleted file mode 100644 index 2845633ba..000000000 --- a/defects/scala/bench/bench-scala-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scala-0002.py -# CWE-407: list-scan inside loop in scala-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scala-0002: CWE-407: list-scan inside loop in scala-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scala/bench/results.txt b/defects/scala/bench/results.txt deleted file mode 100644 index 3d6d9c3cb..000000000 --- a/defects/scala/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== scala-0001: CWE-407: list-scan inside loop in scala-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.486ms fixed=0.023ms speedup=109.1x -N=1000 k=1000 : defective=9.743ms fixed=0.050ms speedup=195.5x -N=2000 k=2000 : defective=36.868ms fixed=0.097ms speedup=379.6x - -=== scala-0002: CWE-407: list-scan inside loop in scala-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.144ms fixed=0.021ms speedup=103.9x -N=1000 k=1000 : defective=8.992ms fixed=0.046ms speedup=194.8x -N=2000 k=2000 : defective=35.798ms fixed=0.098ms speedup=365.4x - diff --git a/defects/scala/bench/run_all.py b/defects/scala/bench/run_all.py deleted file mode 100644 index 875eaee8b..000000000 --- a/defects/scala/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scala-0001.py", "bench-scala-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scala3/Makefile b/defects/scala3/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scala3/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scala3/bench/bench-scala3-0001.py b/defects/scala3/bench/bench-scala3-0001.py deleted file mode 100644 index 9a6c03c6e..000000000 --- a/defects/scala3/bench/bench-scala3-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scala3-0001.py -# CWE-407: list-scan inside loop in scala3-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scala3-0001: CWE-407: list-scan inside loop in scala3-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scala3/bench/results.txt b/defects/scala3/bench/results.txt deleted file mode 100644 index e03a83dcd..000000000 --- a/defects/scala3/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== scala3-0001: CWE-407: list-scan inside loop in scala3-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.165ms fixed=0.020ms speedup=105.7x -N=1000 k=1000 : defective=9.086ms fixed=0.046ms speedup=196.3x -N=2000 k=2000 : defective=37.145ms fixed=0.097ms speedup=382.2x - diff --git a/defects/scala3/bench/run_all.py b/defects/scala3/bench/run_all.py deleted file mode 100644 index aa8fc6ec9..000000000 --- a/defects/scala3/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scala3-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scipy/Makefile b/defects/scipy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scipy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scipy/bench/bench-scipy-0001.py b/defects/scipy/bench/bench-scipy-0001.py deleted file mode 100644 index 5ac81dce7..000000000 --- a/defects/scipy/bench/bench-scipy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scipy-0001.py -# SHGO minimizers() — xl_maps list scan ignores xl_maps_set O(V×L) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scipy-0001: SHGO minimizers() — xl_maps list scan ignores xl_maps_set O(V×L) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scipy/bench/results.txt b/defects/scipy/bench/results.txt deleted file mode 100644 index e5709b4e0..000000000 --- a/defects/scipy/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== scipy-0001: SHGO minimizers() — xl_maps list scan ignores xl_maps_set O(V×L) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.444ms fixed=0.024ms speedup=102.4x -N=1000 k=1000 : defective=10.032ms fixed=0.053ms speedup=190.6x -N=2000 k=2000 : defective=35.410ms fixed=0.097ms speedup=365.3x - diff --git a/defects/scipy/bench/run_all.py b/defects/scipy/bench/run_all.py deleted file mode 100644 index d30375320..000000000 --- a/defects/scipy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scipy-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scribus/Makefile b/defects/scribus/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scribus/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scribus/bench/bench-scribus-0001.py b/defects/scribus/bench/bench-scribus-0001.py deleted file mode 100644 index 9787e189f..000000000 --- a/defects/scribus/bench/bench-scribus-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scribus-0001.py -# getSortedStyleList retList.contains O(N²) dedup -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scribus-0001: getSortedStyleList retList.contains O(N²) dedup ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scribus/bench/bench-scribus-0002.py b/defects/scribus/bench/bench-scribus-0002.py deleted file mode 100644 index 9900727b3..000000000 --- a/defects/scribus/bench/bench-scribus-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scribus-0002.py -# getUsedPatterns results.contains O(I×R) pattern collection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scribus-0002: getUsedPatterns results.contains O(I×R) pattern collection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scribus/bench/bench-scribus-0003.py b/defects/scribus/bench/bench-scribus-0003.py deleted file mode 100644 index b898aceb8..000000000 --- a/defects/scribus/bench/bench-scribus-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scribus-0003.py -# Selection::addItems m_SelList.contains O(N×M) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scribus-0003: Selection::addItems m_SelList.contains O(N×M) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scribus/bench/bench-scribus-0004.py b/defects/scribus/bench/bench-scribus-0004.py deleted file mode 100644 index 44145c1c9..000000000 --- a/defects/scribus/bench/bench-scribus-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scribus-0004.py -# file saver names.contains O(N²) style filter on save -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scribus-0004: file saver names.contains O(N²) style filter on save ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scribus/bench/results.txt b/defects/scribus/bench/results.txt deleted file mode 100644 index b14238bc8..000000000 --- a/defects/scribus/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== scribus-0001: getSortedStyleList retList.contains O(N²) dedup === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.431ms fixed=0.023ms speedup=107.8x -N=1000 k=1000 : defective=9.521ms fixed=0.046ms speedup=206.4x -N=2000 k=2000 : defective=38.999ms fixed=0.098ms speedup=399.4x - -=== scribus-0002: getUsedPatterns results.contains O(I×R) pattern collection === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.117ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=9.080ms fixed=0.046ms speedup=195.4x -N=2000 k=2000 : defective=35.314ms fixed=0.096ms speedup=367.7x - -=== scribus-0003: Selection::addItems m_SelList.contains O(N×M) === -N=100 k=100 : defective=0.199ms fixed=0.003ms speedup=59.8x -N=500 k=500 : defective=2.123ms fixed=0.021ms speedup=102.5x -N=1000 k=1000 : defective=10.992ms fixed=0.051ms speedup=216.8x -N=2000 k=2000 : defective=35.208ms fixed=0.096ms speedup=365.6x - -=== scribus-0004: file saver names.contains O(N²) style filter on save === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.575ms fixed=0.044ms speedup=195.5x -N=2000 k=2000 : defective=35.156ms fixed=0.112ms speedup=313.0x - diff --git a/defects/scribus/bench/run_all.py b/defects/scribus/bench/run_all.py deleted file mode 100644 index f40554a71..000000000 --- a/defects/scribus/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scribus-0001.py", "bench-scribus-0002.py", "bench-scribus-0003.py", "bench-scribus-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scummvm-0001/Makefile b/defects/scummvm-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scummvm-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scummvm-0001/bench/bench-scummvm-0001-0001.py b/defects/scummvm-0001/bench/bench-scummvm-0001-0001.py deleted file mode 100644 index 00e2c6722..000000000 --- a/defects/scummvm-0001/bench/bench-scummvm-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scummvm-0001-0001.py -# CWE-407: list-scan inside loop in scummvm-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scummvm-0001-0001: CWE-407: list-scan inside loop in scummvm-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scummvm-0001/bench/results.txt b/defects/scummvm-0001/bench/results.txt deleted file mode 100644 index edde9dce4..000000000 --- a/defects/scummvm-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== scummvm-0001-0001: CWE-407: list-scan inside loop in scummvm-0001-0001 (generic model) === -N=100 k=100 : defective=0.122ms fixed=0.004ms speedup=30.6x -N=500 k=500 : defective=2.455ms fixed=0.024ms speedup=104.0x -N=1000 k=1000 : defective=8.691ms fixed=0.045ms speedup=191.5x -N=2000 k=2000 : defective=35.266ms fixed=0.095ms speedup=371.1x - diff --git a/defects/scummvm-0001/bench/run_all.py b/defects/scummvm-0001/bench/run_all.py deleted file mode 100644 index e1b3a7624..000000000 --- a/defects/scummvm-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scummvm-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scummvm-0002/Makefile b/defects/scummvm-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scummvm-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scummvm-0002/bench/bench-scummvm-0002-0002.py b/defects/scummvm-0002/bench/bench-scummvm-0002-0002.py deleted file mode 100644 index 5284a5314..000000000 --- a/defects/scummvm-0002/bench/bench-scummvm-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scummvm-0002-0002.py -# CWE-407: list-scan inside loop in scummvm-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scummvm-0002-0002: CWE-407: list-scan inside loop in scummvm-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scummvm-0002/bench/results.txt b/defects/scummvm-0002/bench/results.txt deleted file mode 100644 index 776d4e769..000000000 --- a/defects/scummvm-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== scummvm-0002-0002: CWE-407: list-scan inside loop in scummvm-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.333ms fixed=0.023ms speedup=100.3x -N=1000 k=1000 : defective=8.580ms fixed=0.045ms speedup=191.5x -N=2000 k=2000 : defective=34.588ms fixed=0.096ms speedup=362.1x - diff --git a/defects/scummvm-0002/bench/run_all.py b/defects/scummvm-0002/bench/run_all.py deleted file mode 100644 index 15c0095b2..000000000 --- a/defects/scummvm-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scummvm-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/scylladb/Makefile b/defects/scylladb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/scylladb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/scylladb/bench/bench-scylladb-0001.py b/defects/scylladb/bench/bench-scylladb-0001.py deleted file mode 100644 index 084ed79fe..000000000 --- a/defects/scylladb/bench/bench-scylladb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scylladb-0001.py -# CWE-407: list-scan inside loop in scylladb-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scylladb-0001: CWE-407: list-scan inside loop in scylladb-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scylladb/bench/bench-scylladb-0002.py b/defects/scylladb/bench/bench-scylladb-0002.py deleted file mode 100644 index 280ec3a99..000000000 --- a/defects/scylladb/bench/bench-scylladb-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-scylladb-0002.py -# selection::from_selectors column dedup O(C²) via std::find -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== scylladb-0002: selection::from_selectors column dedup O(C²) via std::find ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/scylladb/bench/results.txt b/defects/scylladb/bench/results.txt deleted file mode 100644 index 6e64acb49..000000000 --- a/defects/scylladb/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== scylladb-0001: CWE-407: list-scan inside loop in scylladb-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.102ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=8.628ms fixed=0.045ms speedup=191.7x -N=2000 k=2000 : defective=34.594ms fixed=0.098ms speedup=353.0x - -=== scylladb-0002: selection::from_selectors column dedup O(C²) via std::find === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.102ms fixed=0.020ms speedup=103.1x -N=1000 k=1000 : defective=8.522ms fixed=0.045ms speedup=189.5x -N=2000 k=2000 : defective=34.928ms fixed=0.096ms speedup=362.5x - diff --git a/defects/scylladb/bench/run_all.py b/defects/scylladb/bench/run_all.py deleted file mode 100644 index ec8d44f84..000000000 --- a/defects/scylladb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-scylladb-0001.py", "bench-scylladb-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sdl/Makefile b/defects/sdl/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sdl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sdl/bench/bench-sdl-0001.py b/defects/sdl/bench/bench-sdl-0001.py deleted file mode 100644 index 3600a22f2..000000000 --- a/defects/sdl/bench/bench-sdl-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sdl-0001.py -# tail walk on s_pSupportedGamepads @@ -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== sdl-0001: tail walk on s_pSupportedGamepads @@ ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sdl/bench/results.txt b/defects/sdl/bench/results.txt deleted file mode 100644 index d010b45d9..000000000 --- a/defects/sdl/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sdl-0001: tail walk on s_pSupportedGamepads @@ === -N=500 k=500 : defective=3.669ms fixed=0.031ms speedup=118.9x -N=2000 k=2000 : defective=32.776ms fixed=0.088ms speedup=370.7x -N=5000 k=5000 : defective=214.913ms fixed=0.231ms speedup=930.1x -N=10000 k=10000: defective=906.439ms fixed=0.465ms speedup=1949.0x - diff --git a/defects/sdl/bench/run_all.py b/defects/sdl/bench/run_all.py deleted file mode 100644 index 3cea2d708..000000000 --- a/defects/sdl/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sdl-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sdl2/Makefile b/defects/sdl2/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sdl2/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sdl2/bench/bench-sdl2-0001.py b/defects/sdl2/bench/bench-sdl2-0001.py deleted file mode 100644 index c82e89574..000000000 --- a/defects/sdl2/bench/bench-sdl2-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sdl2-0001.py -# CWE-407: list-scan inside loop in sdl2-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sdl2-0001: CWE-407: list-scan inside loop in sdl2-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sdl2/bench/results.txt b/defects/sdl2/bench/results.txt deleted file mode 100644 index 744a020cd..000000000 --- a/defects/sdl2/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sdl2-0001: CWE-407: list-scan inside loop in sdl2-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.281ms fixed=0.021ms speedup=107.2x -N=1000 k=1000 : defective=8.880ms fixed=0.046ms speedup=193.1x -N=2000 k=2000 : defective=35.181ms fixed=0.098ms speedup=360.1x - diff --git a/defects/sdl2/bench/run_all.py b/defects/sdl2/bench/run_all.py deleted file mode 100644 index 3c4a42aa1..000000000 --- a/defects/sdl2/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sdl2-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sdl3/Makefile b/defects/sdl3/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sdl3/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sdl3/bench/bench-sdl3-0001.py b/defects/sdl3/bench/bench-sdl3-0001.py deleted file mode 100644 index 0a62d9ef4..000000000 --- a/defects/sdl3/bench/bench-sdl3-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sdl3-0001.py -# CWE-407: list-scan inside loop in sdl3-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sdl3-0001: CWE-407: list-scan inside loop in sdl3-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sdl3/bench/results.txt b/defects/sdl3/bench/results.txt deleted file mode 100644 index 8c76daf85..000000000 --- a/defects/sdl3/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sdl3-0001: CWE-407: list-scan inside loop in sdl3-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.124ms fixed=0.020ms speedup=103.7x -N=1000 k=1000 : defective=8.587ms fixed=0.045ms speedup=190.9x -N=2000 k=2000 : defective=35.439ms fixed=0.097ms speedup=363.7x - diff --git a/defects/sdl3/bench/run_all.py b/defects/sdl3/bench/run_all.py deleted file mode 100644 index f07ff9557..000000000 --- a/defects/sdl3/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sdl3-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sea-orm/Makefile b/defects/sea-orm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sea-orm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sea-orm/bench/bench-sea-orm-0001.py b/defects/sea-orm/bench/bench-sea-orm-0001.py deleted file mode 100644 index 801223fd5..000000000 --- a/defects/sea-orm/bench/bench-sea-orm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sea-orm-0001.py -# enumerate_role / list_role_hierarchy_edges — O(2^D) diamond BFS -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sea-orm-0001: enumerate_role / list_role_hierarchy_edges — O(2^D) diamond BFS ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sea-orm/bench/results.txt b/defects/sea-orm/bench/results.txt deleted file mode 100644 index b503dcdab..000000000 --- a/defects/sea-orm/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sea-orm-0001: enumerate_role / list_role_hierarchy_edges — O(2^D) diamond BFS === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.104ms fixed=0.020ms speedup=103.4x -N=1000 k=1000 : defective=8.600ms fixed=0.045ms speedup=192.4x -N=2000 k=2000 : defective=36.093ms fixed=0.096ms speedup=374.1x - diff --git a/defects/sea-orm/bench/run_all.py b/defects/sea-orm/bench/run_all.py deleted file mode 100644 index 9ec783b21..000000000 --- a/defects/sea-orm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sea-orm-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/seaorm/Makefile b/defects/seaorm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/seaorm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/seaorm/bench/bench-seaorm-0001.py b/defects/seaorm/bench/bench-seaorm-0001.py deleted file mode 100644 index ca334e2c3..000000000 --- a/defects/seaorm/bench/bench-seaorm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-seaorm-0001.py -# CWE-407: list-scan inside loop in seaorm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== seaorm-0001: CWE-407: list-scan inside loop in seaorm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/seaorm/bench/bench-seaorm-0002.py b/defects/seaorm/bench/bench-seaorm-0002.py deleted file mode 100644 index 9208c1ac8..000000000 --- a/defects/seaorm/bench/bench-seaorm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-seaorm-0002.py -# CWE-407: list-scan inside loop in seaorm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== seaorm-0002: CWE-407: list-scan inside loop in seaorm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/seaorm/bench/bench-seaorm-0003.py b/defects/seaorm/bench/bench-seaorm-0003.py deleted file mode 100644 index 6b6b2827b..000000000 --- a/defects/seaorm/bench/bench-seaorm-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-seaorm-0003.py -# CWE-407: list-scan inside loop in seaorm-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== seaorm-0003: CWE-407: list-scan inside loop in seaorm-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/seaorm/bench/bench-seaorm-0004.py b/defects/seaorm/bench/bench-seaorm-0004.py deleted file mode 100644 index eb58f729a..000000000 --- a/defects/seaorm/bench/bench-seaorm-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-seaorm-0004.py -# CWE-407: list-scan inside loop in seaorm-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== seaorm-0004: CWE-407: list-scan inside loop in seaorm-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/seaorm/bench/results.txt b/defects/seaorm/bench/results.txt deleted file mode 100644 index f24978130..000000000 --- a/defects/seaorm/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== seaorm-0001: CWE-407: list-scan inside loop in seaorm-0001 (generic model) === -N=100 k=100 : defective=0.154ms fixed=0.004ms speedup=40.2x -N=500 k=500 : defective=2.256ms fixed=0.021ms speedup=105.0x -N=1000 k=1000 : defective=8.528ms fixed=0.045ms speedup=188.4x -N=2000 k=2000 : defective=34.919ms fixed=0.096ms speedup=362.8x - -=== seaorm-0002: CWE-407: list-scan inside loop in seaorm-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.094ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=8.612ms fixed=0.046ms speedup=188.0x -N=2000 k=2000 : defective=34.987ms fixed=0.096ms speedup=365.5x - -=== seaorm-0003: CWE-407: list-scan inside loop in seaorm-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.122ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=8.722ms fixed=0.046ms speedup=190.3x -N=2000 k=2000 : defective=39.370ms fixed=0.096ms speedup=411.1x - -=== seaorm-0004: CWE-407: list-scan inside loop in seaorm-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.112ms fixed=0.089ms speedup=23.9x -N=1000 k=1000 : defective=8.584ms fixed=0.046ms speedup=187.4x -N=2000 k=2000 : defective=39.647ms fixed=0.096ms speedup=414.4x - diff --git a/defects/seaorm/bench/run_all.py b/defects/seaorm/bench/run_all.py deleted file mode 100644 index 0a8225d9d..000000000 --- a/defects/seaorm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-seaorm-0001.py", "bench-seaorm-0002.py", "bench-seaorm-0003.py", "bench-seaorm-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/seaweedfs-0001/Makefile b/defects/seaweedfs-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/seaweedfs-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/seaweedfs-0001/bench/bench-seaweedfs-0001-0001.py b/defects/seaweedfs-0001/bench/bench-seaweedfs-0001-0001.py deleted file mode 100644 index 1a9194ecb..000000000 --- a/defects/seaweedfs-0001/bench/bench-seaweedfs-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-seaweedfs-0001-0001.py -# CWE-407: list-scan inside loop in seaweedfs-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== seaweedfs-0001-0001: CWE-407: list-scan inside loop in seaweedfs-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/seaweedfs-0001/bench/results.txt b/defects/seaweedfs-0001/bench/results.txt deleted file mode 100644 index 4f17796cc..000000000 --- a/defects/seaweedfs-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== seaweedfs-0001-0001: CWE-407: list-scan inside loop in seaweedfs-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.120ms fixed=0.021ms speedup=102.8x -N=1000 k=1000 : defective=8.582ms fixed=0.046ms speedup=188.3x -N=2000 k=2000 : defective=35.653ms fixed=0.095ms speedup=376.7x - diff --git a/defects/seaweedfs-0001/bench/run_all.py b/defects/seaweedfs-0001/bench/run_all.py deleted file mode 100644 index 55e918511..000000000 --- a/defects/seaweedfs-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-seaweedfs-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/seaweedfs-0002/Makefile b/defects/seaweedfs-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/seaweedfs-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/seaweedfs-0002/bench/bench-seaweedfs-0002-0002.py b/defects/seaweedfs-0002/bench/bench-seaweedfs-0002-0002.py deleted file mode 100644 index 55c23eb6c..000000000 --- a/defects/seaweedfs-0002/bench/bench-seaweedfs-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-seaweedfs-0002-0002.py -# CWE-407: list-scan inside loop in seaweedfs-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== seaweedfs-0002-0002: CWE-407: list-scan inside loop in seaweedfs-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/seaweedfs-0002/bench/results.txt b/defects/seaweedfs-0002/bench/results.txt deleted file mode 100644 index 85a9e0d7a..000000000 --- a/defects/seaweedfs-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== seaweedfs-0002-0002: CWE-407: list-scan inside loop in seaweedfs-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.154ms fixed=0.020ms speedup=106.6x -N=1000 k=1000 : defective=8.784ms fixed=0.046ms speedup=190.5x -N=2000 k=2000 : defective=35.730ms fixed=0.094ms speedup=380.6x - diff --git a/defects/seaweedfs-0002/bench/run_all.py b/defects/seaweedfs-0002/bench/run_all.py deleted file mode 100644 index 1d867b81f..000000000 --- a/defects/seaweedfs-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-seaweedfs-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/selenium/Makefile b/defects/selenium/Makefile deleted file mode 100644 index afb22d192..000000000 --- a/defects/selenium/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# selenium patch test + bench runner -# Targets: all test bench clean - -PYTHON := python3 -TEST_FILE := tests/test-selenium-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/selenium/bench/bench-selenium-0001.py b/defects/selenium/bench/bench-selenium-0001.py deleted file mode 100644 index bb2a7cff7..000000000 --- a/defects/selenium/bench/bench-selenium-0001.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 -# bench-selenium-0001.py -# SessionCapabilitiesMutator: ArrayList.contains inside forEach vs LinkedHashSet dedup. -# -# Models the Grid Node session mutator merging client-requested caps with slot -# stereotype caps. Defect: dedup via list.contains is O(M) per iteration; N -# iterations give O(N*M). Fixed version pre-builds a set for O(1) dedup. - -import sys -import time - - -def bench_defective(n, m): - """Model forEach(arg -> if !stereotype.contains(arg) stereotype.add(arg)).""" - stereotype = [f"--stereo-{i}" for i in range(m)] - incoming = [f"--inc-{i}" for i in range(n)] - - t0 = time.perf_counter() - for arg in incoming: - if arg not in stereotype: - stereotype.append(arg) - return time.perf_counter() - t0 - - -def bench_fixed(n, m): - """Pre-built set for O(1) dedup; list kept for ordering.""" - stereotype = [f"--stereo-{i}" for i in range(m)] - incoming = [f"--inc-{i}" for i in range(n)] - - t0 = time.perf_counter() - seen = set(stereotype) - for arg in incoming: - if arg not in seen: - seen.add(arg) - stereotype.append(arg) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [10, 50, 100, 500, 1000] - - -def run(): - lines = [] - header = "=== selenium-0001: SessionCapabilitiesMutator List.contains vs Set ===" - print(header) - lines.append(header) - - for n in SIZES: - m = n # N=M worst case: all incoming are new relative to stereotype - def_times = [bench_defective(n, m) for _ in range(TRIALS)] - fix_times = [bench_fixed(n, m) for _ in range(TRIALS)] - d_ms = min(def_times) * 1000 - f_ms = min(fix_times) * 1000 - speedup = d_ms / f_ms if f_ms > 0 else float("inf") - line = f"N=M={n:<5}: defective={d_ms:.3f}ms fixed={f_ms:.3f}ms speedup={speedup:.1f}x" - print(line) - lines.append(line) - sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/selenium/bench/bench-selenium-0002.py b/defects/selenium/bench/bench-selenium-0002.py deleted file mode 100644 index 6e3dcc6c9..000000000 --- a/defects/selenium/bench/bench-selenium-0002.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -# bench-selenium-0002.py -# ChromiumOptions.mergeInPlace: args/extensions dedup via list.contains inside -# forEach across four merge paths. Fixed version threads all paths through -# addArgumentsUnique(Collection) / addEncodedExtensionsUnique(Collection) -# helpers that build a HashSet view once per merge. - -import sys -import time - - -def bench_defective(n, m, passes=4): - """Four merge paths each do O(N*M) dedup against growing args list.""" - args = [f"--existing-{i}" for i in range(m)] - incoming = [f"--new-{i}" for i in range(n)] - - t0 = time.perf_counter() - for _ in range(passes): - for arg in incoming: - if arg not in args: - args.append(arg) - return time.perf_counter() - t0 - - -def bench_fixed(n, m, passes=4): - """Each merge pass uses addArgumentsUnique: O(N+M) via HashSet view.""" - args = [f"--existing-{i}" for i in range(m)] - incoming = [f"--new-{i}" for i in range(n)] - - t0 = time.perf_counter() - for _ in range(passes): - seen = set(args) - for arg in incoming: - if arg not in seen: - seen.add(arg) - args.append(arg) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [10, 50, 100, 500, 1000] - - -def run(): - lines = [] - header = "=== selenium-0002: ChromiumOptions merge paths List.contains vs HashSet ===" - print(header) - lines.append(header) - - for n in SIZES: - m = n - def_times = [bench_defective(n, m) for _ in range(TRIALS)] - fix_times = [bench_fixed(n, m) for _ in range(TRIALS)] - d_ms = min(def_times) * 1000 - f_ms = min(fix_times) * 1000 - speedup = d_ms / f_ms if f_ms > 0 else float("inf") - line = f"N=M={n:<5}: defective={d_ms:.3f}ms fixed={f_ms:.3f}ms speedup={speedup:.1f}x" - print(line) - lines.append(line) - sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/selenium/bench/results.txt b/defects/selenium/bench/results.txt deleted file mode 100644 index 778e5fa73..000000000 --- a/defects/selenium/bench/results.txt +++ /dev/null @@ -1,14 +0,0 @@ -=== selenium-0001: SessionCapabilitiesMutator List.contains vs Set === -N=M=10 : defective=0.003ms fixed=0.002ms speedup=1.6x -N=M=50 : defective=0.053ms fixed=0.007ms speedup=7.1x -N=M=100 : defective=0.208ms fixed=0.018ms speedup=11.3x -N=M=500 : defective=5.219ms fixed=0.123ms speedup=42.6x -N=M=1000 : defective=24.725ms fixed=0.129ms speedup=191.9x - -=== selenium-0002: ChromiumOptions merge paths List.contains vs HashSet === -N=M=10 : defective=0.013ms fixed=0.008ms speedup=1.5x -N=M=50 : defective=0.311ms fixed=0.039ms speedup=7.9x -N=M=100 : defective=1.305ms fixed=0.054ms speedup=24.0x -N=M=500 : defective=25.611ms fixed=0.297ms speedup=86.1x -N=M=1000 : defective=121.970ms fixed=0.481ms speedup=253.8x - diff --git a/defects/selenium/bench/run_all.py b/defects/selenium/bench/run_all.py deleted file mode 100644 index a948d057f..000000000 --- a/defects/selenium/bench/run_all.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run selenium bench scripts and write results.txt - -import importlib.util -import os -import sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -all_lines = [] - -for fname in ["bench-selenium-0001.py", "bench-selenium-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/selenium/patch/selenium-0001-grid-session-mutator-list-contains.patch b/defects/selenium/patch/selenium-0001-grid-session-mutator-list-contains.patch deleted file mode 100644 index 69ed89009..000000000 --- a/defects/selenium/patch/selenium-0001-grid-session-mutator-list-contains.patch +++ /dev/null @@ -1,92 +0,0 @@ -# UNDF: UNDF-2026-000001277 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*M) -> O(N+M) in SessionCapabilitiesMutator -# -# Defect: Grid Node session mutator deduplicates args/extensions from client caps -# against slot stereotype caps via ArrayList.contains inside forEach. That -# runs O(M) per iteration across N items. Chromium and Firefox merge paths -# both carry this pattern; Chromium path also applies it to extensions. -# -# Fix: Pre-build a LinkedHashSet from the existing stereotype list once, then -# iterate the incoming list with set.add() which returns true only on first -# insertion. LinkedHashSet preserves insertion order, preserving the original -# semantics. Cost drops to O(N+M) per merged list. -# -# Complexity gate (tests/test-selenium-cwe407.py): -# k-scaling 5x: time ratio must be <17.5x (O(k) ~=5x, not O(k^2) ~=25x) -# N=M=20 per session, merge: must complete in <1ms ---- a/java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java -+++ b/java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java -@@ -19,10 +19,12 @@ package org.openqa.selenium.grid.node.config; - - import java.util.ArrayList; - import java.util.HashMap; -+import java.util.LinkedHashSet; - import java.util.List; - import java.util.Locale; - import java.util.Map; - import java.util.Objects; -+import java.util.Set; - import java.util.function.Function; - import org.openqa.selenium.Capabilities; - import org.openqa.selenium.ImmutableCapabilities; -@@ -133,12 +135,15 @@ public class SessionCapabilitiesMutator implements Function( - (List) (stereotypeOptions.getOrDefault(("args"), new ArrayList<>()))); - -- arguments.forEach( -- arg -> { -- if (!stereotypeArguments.contains(arg)) { -- stereotypeArguments.add(arg); -- } -- }); -+ // Pre-build a Set from the existing list for O(1) dedup (was O(M) per iteration, -+ // totaling O(N*M) across the forEach). LinkedHashSet preserves insertion order -+ // so downstream consumers see the same args sequence as the prior implementation. -+ Set seenArgs = new LinkedHashSet<>(stereotypeArguments); -+ for (String arg : arguments) { -+ if (seenArgs.add(arg)) { -+ stereotypeArguments.add(arg); -+ } -+ } - toReturn.put("args", stereotypeArguments); - } - -@@ -151,12 +156,12 @@ public class SessionCapabilitiesMutator implements Function( - (List) (stereotypeOptions.getOrDefault(("extensions"), new ArrayList<>()))); - -- extensionList.forEach( -- extension -> { -- if (!stereotypeExtensions.contains(extension)) { -- stereotypeExtensions.add(extension); -- } -- }); -+ Set seenExtensions = new LinkedHashSet<>(stereotypeExtensions); -+ for (String extension : extensionList) { -+ if (seenExtensions.add(extension)) { -+ stereotypeExtensions.add(extension); -+ } -+ } - - toReturn.put("extensions", stereotypeExtensions); - } -@@ -191,12 +196,12 @@ public class SessionCapabilitiesMutator implements Function( - (List) (stereotypeOptions.getOrDefault(("args"), new ArrayList<>()))); - -- arguments.forEach( -- arg -> { -- if (!stereotypeArguments.contains(arg)) { -- stereotypeArguments.add(arg); -- } -- }); -+ Set seenArgs = new LinkedHashSet<>(stereotypeArguments); -+ for (String arg : arguments) { -+ if (seenArgs.add(arg)) { -+ stereotypeArguments.add(arg); -+ } -+ } - toReturn.put("args", stereotypeArguments); - } - diff --git a/defects/selenium/patch/selenium-0002-chromiumoptions-merge-args-extensions-list-contains.patch b/defects/selenium/patch/selenium-0002-chromiumoptions-merge-args-extensions-list-contains.patch deleted file mode 100644 index 53815ab75..000000000 --- a/defects/selenium/patch/selenium-0002-chromiumoptions-merge-args-extensions-list-contains.patch +++ /dev/null @@ -1,152 +0,0 @@ -# UNDF: UNDF-2026-000001288 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*M) -> O(N+M) in ChromiumOptions merge paths -# -# Defect: ChromiumOptions.mergeInPlace and mergeInOptionsFromCaps both dedup -# incoming args and extensions against existing lists via List.contains -# inside forEach. Four separate loops carry the same O(M)-per-iteration -# pattern, giving O(N*M) per merge call. -# -# Fix: Pass through shared helpers addArgumentsUnique(Collection) and -# addEncodedExtensionsUnique(Collection) that build a HashSet view of the -# existing list once, then iterate the incoming collection with O(1) -# lookups. All four call sites call into the helpers. -# -# Complexity gate (tests/test-selenium-cwe407.py): -# k-scaling 5x: time ratio must be <17.5x (O(k) ~=5x, not O(k^2) ~=25x) -# N=M=50 merge: must complete in <1ms ---- a/java/src/org/openqa/selenium/chromium/ChromiumOptions.java -+++ b/java/src/org/openqa/selenium/chromium/ChromiumOptions.java -@@ -25,10 +25,12 @@ import java.io.IOException; - import java.nio.file.Files; - import java.util.ArrayList; - import java.util.Base64; -+import java.util.Collection; - import java.util.Collections; - import java.util.HashMap; -+import java.util.HashSet; - import java.util.List; - import java.util.Map; - import java.util.Set; - import java.util.TreeMap; - import java.util.stream.Stream; -@@ -270,6 +272,30 @@ public class ChromiumOptions> - } - } - -+ /** -+ * Append each distinct argument in {@code toAdd} to the internal {@code args} list. -+ * Uses a HashSet view of {@code args} for O(1) membership testing; the prior -+ * implementation used List.contains inside forEach, giving O(N*M) per merge. -+ */ -+ private void addArgumentsUnique(Collection toAdd) { -+ Set seen = new HashSet<>(args); -+ for (String arg : toAdd) { -+ if (seen.add(arg)) { -+ args.add(arg); -+ } -+ } -+ } -+ -+ /** Same pattern as {@link #addArgumentsUnique} for the string-encoded extensions list. */ -+ private void addEncodedExtensionsUnique(Collection toAdd) { -+ Set seen = new HashSet<>(extensions); -+ for (String ext : toAdd) { -+ if (seen.add(ext)) { -+ extensions.add(ext); -+ } -+ } -+ } -+ - protected void mergeInPlace(Capabilities capabilities) { - Require.nonNull("Capabilities to merge", capabilities); - -@@ -280,28 +306,21 @@ public class ChromiumOptions> - - if (name.equals("args") && capabilities.getCapability(name) != null) { - List arguments = capabilities.required("args"); -- arguments.forEach( -- arg -> { -- if (!args.contains(arg)) { -- addArguments(arg); -- } -- }); -+ addArgumentsUnique(arguments); - } - - if (name.equals("extensions") && capabilities.getCapability(name) != null) { - List extensionList = capabilities.required("extensions"); -- extensionList.forEach( -- extension -> { -- if (!extensions.contains(extension)) { -- if (extension instanceof File) { -- addExtensions((File) extension); -- } else if (extension instanceof String) { -- addEncodedExtensions((String) extension); -- } -- } -- }); -+ // Partition by type, then push each partition through the O(N+M) helpers. -+ Set seen = new HashSet<>(extensions); -+ for (Object extension : extensionList) { -+ if (seen.add(extension)) { -+ if (extension instanceof File) { -+ addExtensions((File) extension); -+ } else if (extension instanceof String) { -+ addEncodedExtensions((String) extension); -+ } -+ } -+ } - } - - if (name.equals("binary") && capabilities.getCapability(name) != null) { -@@ -314,14 +333,9 @@ public class ChromiumOptions> - } - } - - if (capabilities instanceof ChromiumOptions) { - ChromiumOptions options = (ChromiumOptions) capabilities; -- for (String arg : options.args) { -- if (!args.contains(arg)) { -- addArguments(arg); -- } -- } -+ addArgumentsUnique(options.args); - addExtensions(options.extensionFiles); - addEncodedExtensions(options.extensions); - -@@ -343,24 +357,21 @@ public class ChromiumOptions> - List extensionList = - (List) (options.getOrDefault("extensions", new ArrayList<>())); - -- arguments.forEach( -- arg -> { -- if (!args.contains(arg)) { -- addArguments(arg); -- } -- }); -+ addArgumentsUnique(arguments); - -- extensionList.forEach( -- extension -> { -- if (!extensions.contains(extension)) { -- if (extension instanceof File) { -- addExtensions((File) extension); -- } else if (extension instanceof String) { -- addEncodedExtensions((String) extension); -- } -- } -- }); -+ Set seenExtensions = new HashSet<>(extensions); -+ for (Object extension : extensionList) { -+ if (seenExtensions.add(extension)) { -+ if (extension instanceof File) { -+ addExtensions((File) extension); -+ } else if (extension instanceof String) { -+ addEncodedExtensions((String) extension); -+ } -+ } -+ } - - Object binary = options.get("binary"); - if (binary instanceof String) { diff --git a/defects/selenium/tests/test-selenium-cwe407.py b/defects/selenium/tests/test-selenium-cwe407.py deleted file mode 100644 index 40bdc557d..000000000 --- a/defects/selenium/tests/test-selenium-cwe407.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001277 (selenium-0001), -# UNDF-2026-000001288 (selenium-0002) -# -# CWE-407: Algorithmic Complexity -# -# Defects: -# selenium-0001: SessionCapabilitiesMutator.mergeChromiumOptions / -# mergeFirefoxOptions dedup args+extensions via -# List.contains inside forEach -> O(N*M) per session. -# selenium-0002: ChromiumOptions.mergeInPlace and mergeInOptionsFromCaps -# apply the same list.contains dedup pattern across four -# merge loops, giving O(N*M) per merge. -# -# Fixes: -# selenium-0001: Pre-build a LinkedHashSet from stereotype args/extensions -# once, then iterate incoming with set.add() semantics. -# Order preserved, cost drops to O(N+M). -# selenium-0002: Helpers addArgumentsUnique / addEncodedExtensionsUnique -# consolidate the four merge loops behind a HashSet-backed -# dedup. Cost drops to O(N+M) per call. -# -# Complexity gates (from bench/results.txt on this machine): -# selenium-0001: N=M=1000 defective=24.7ms, fixed=0.13ms. Fixed must -# complete in <5ms. k-scaling: time(5x) / time(1x) < 17.5x. -# selenium-0002: N=M=1000 defective=121.9ms, fixed=0.48ms. Fixed must -# complete in <5ms. k-scaling: time(5x) / time(1x) < 17.5x. - -import os -import sys -import unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - -import importlib.util - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod_0001 = _load("bench-selenium-0001.py") -_mod_0002 = _load("bench-selenium-0002.py") - - -# --------------------------------------------------------------------------- -# Correctness: fix must produce the same merged list as the defective version. -# --------------------------------------------------------------------------- - -def _merge_defective(stereotype, incoming): - result = list(stereotype) - for arg in incoming: - if arg not in result: - result.append(arg) - return result - - -def _merge_fixed(stereotype, incoming): - result = list(stereotype) - seen = set(result) - for arg in incoming: - if arg not in seen: - seen.add(arg) - result.append(arg) - return result - - -class TestSelenium0001Correctness(unittest.TestCase): - def test_merge_empty_stereotype(self): - self.assertEqual( - _merge_fixed([], ["--a", "--b", "--a"]), - _merge_defective([], ["--a", "--b", "--a"]), - ) - - def test_merge_overlapping(self): - stereo = ["--x", "--y"] - inc = ["--y", "--z", "--x", "--w"] - self.assertEqual(_merge_fixed(stereo, inc), _merge_defective(stereo, inc)) - - def test_merge_order_preserved(self): - stereo = ["--a", "--b", "--c"] - inc = ["--d", "--e"] - fixed = _merge_fixed(stereo, inc) - self.assertEqual(fixed, ["--a", "--b", "--c", "--d", "--e"]) - - -class TestSelenium0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N1000(self): - t_s = _mod_0001.bench_fixed(1000, 1000) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=M=1000, expected <5ms") - - def test_fixed_scaling_linear(self): - t_100 = min(_mod_0001.bench_fixed(100, 100) for _ in range(3)) - t_500 = min(_mod_0001.bench_fixed(500, 500) for _ in range(3)) - # Ensure fixed scales ~linearly: 5x input should cost <17.5x (not 25x) - ratio = t_500 / t_100 if t_100 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=500/N=100 ratio {ratio:.2f}x, expected <17.5x (O(N))") - - -class TestSelenium0002ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N1000(self): - t_s = _mod_0002.bench_fixed(1000, 1000) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=M=1000, expected <5ms") - - def test_fixed_scaling_linear(self): - t_100 = min(_mod_0002.bench_fixed(100, 100) for _ in range(3)) - t_500 = min(_mod_0002.bench_fixed(500, 500) for _ in range(3)) - ratio = t_500 / t_100 if t_100 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=500/N=100 ratio {ratio:.2f}x, expected <17.5x (O(N))") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/sendmail-0001/Makefile b/defects/sendmail-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sendmail-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sendmail-0001/bench/bench-sendmail-0001-0001.py b/defects/sendmail-0001/bench/bench-sendmail-0001-0001.py deleted file mode 100644 index 8dcd21f05..000000000 --- a/defects/sendmail-0001/bench/bench-sendmail-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sendmail-0001-0001.py -# CWE-407: list-scan inside loop in sendmail-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sendmail-0001-0001: CWE-407: list-scan inside loop in sendmail-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sendmail-0001/bench/results.txt b/defects/sendmail-0001/bench/results.txt deleted file mode 100644 index 1f9cd7f17..000000000 --- a/defects/sendmail-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sendmail-0001-0001: CWE-407: list-scan inside loop in sendmail-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.381ms fixed=0.022ms speedup=106.8x -N=1000 k=1000 : defective=9.556ms fixed=0.050ms speedup=192.3x -N=2000 k=2000 : defective=35.626ms fixed=0.097ms speedup=367.7x - diff --git a/defects/sendmail-0001/bench/run_all.py b/defects/sendmail-0001/bench/run_all.py deleted file mode 100644 index ed1504cc3..000000000 --- a/defects/sendmail-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sendmail-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sequelize/Makefile b/defects/sequelize/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sequelize/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sequelize/bench/bench-sequelize-0001.py b/defects/sequelize/bench/bench-sequelize-0001.py deleted file mode 100644 index 1306d9dc2..000000000 --- a/defects/sequelize/bench/bench-sequelize-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sequelize-0001.py -# CWE-407: list-scan inside loop in sequelize-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sequelize-0001: CWE-407: list-scan inside loop in sequelize-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sequelize/bench/bench-sequelize-0002.py b/defects/sequelize/bench/bench-sequelize-0002.py deleted file mode 100644 index 8b47757a2..000000000 --- a/defects/sequelize/bench/bench-sequelize-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sequelize-0002.py -# CWE-407: list-scan inside loop in sequelize-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sequelize-0002: CWE-407: list-scan inside loop in sequelize-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sequelize/bench/results.txt b/defects/sequelize/bench/results.txt deleted file mode 100644 index ad3b18eda..000000000 --- a/defects/sequelize/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== sequelize-0001: CWE-407: list-scan inside loop in sequelize-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.239ms fixed=0.021ms speedup=108.7x -N=1000 k=1000 : defective=8.684ms fixed=0.046ms speedup=190.3x -N=2000 k=2000 : defective=35.429ms fixed=0.098ms speedup=363.3x - -=== sequelize-0002: CWE-407: list-scan inside loop in sequelize-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.176ms fixed=0.020ms speedup=107.0x -N=1000 k=1000 : defective=8.834ms fixed=0.046ms speedup=191.4x -N=2000 k=2000 : defective=35.422ms fixed=0.098ms speedup=361.0x - diff --git a/defects/sequelize/bench/run_all.py b/defects/sequelize/bench/run_all.py deleted file mode 100644 index aaefb53b9..000000000 --- a/defects/sequelize/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sequelize-0001.py", "bench-sequelize-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sfml/Makefile b/defects/sfml/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sfml/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sfml/bench/bench-sfml-0001.py b/defects/sfml/bench/bench-sfml-0001.py deleted file mode 100644 index 99b65b465..000000000 --- a/defects/sfml/bench/bench-sfml-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sfml-0001.py -# O(1) dedup — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sfml-0001: O(1) dedup — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sfml/bench/bench-sfml-0004.py b/defects/sfml/bench/bench-sfml-0004.py deleted file mode 100644 index 6379c9a5b..000000000 --- a/defects/sfml/bench/bench-sfml-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sfml-0004.py -# WindowImplX11 destructor uses std::find() on allWindows vector -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sfml-0004: WindowImplX11 destructor uses std::find() on allWindows vector ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sfml/bench/bench-sfml-0005.py b/defects/sfml/bench/bench-sfml-0005.py deleted file mode 100644 index acb6b6059..000000000 --- a/defects/sfml/bench/bench-sfml-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sfml-0005.py -# GlContext::isExtensionAvailable() uses std::find() on string vector -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sfml-0005: GlContext::isExtensionAvailable() uses std::find() on string vector ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sfml/bench/results.txt b/defects/sfml/bench/results.txt deleted file mode 100644 index 33a71028f..000000000 --- a/defects/sfml/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== sfml-0001: O(1) dedup — CWE-407 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.103ms fixed=0.020ms speedup=103.1x -N=1000 k=1000 : defective=8.783ms fixed=0.045ms speedup=194.4x -N=2000 k=2000 : defective=36.358ms fixed=0.097ms speedup=373.7x - -=== sfml-0004: WindowImplX11 destructor uses std::find() on allWindows vector === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.185ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.820ms fixed=0.046ms speedup=190.9x -N=2000 k=2000 : defective=35.865ms fixed=0.179ms speedup=200.5x - -=== sfml-0005: GlContext::isExtensionAvailable() uses std::find() on string vector === -N=100 k=100 : defective=0.088ms fixed=0.005ms speedup=18.3x -N=500 k=500 : defective=2.167ms fixed=0.022ms speedup=99.6x -N=1000 k=1000 : defective=8.995ms fixed=0.045ms speedup=200.5x -N=2000 k=2000 : defective=36.120ms fixed=0.097ms speedup=372.6x - diff --git a/defects/sfml/bench/run_all.py b/defects/sfml/bench/run_all.py deleted file mode 100644 index c807e6cb6..000000000 --- a/defects/sfml/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sfml-0001.py", "bench-sfml-0004.py", "bench-sfml-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/shotcut/Makefile b/defects/shotcut/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/shotcut/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/shotcut/bench/bench-shotcut-0001.py b/defects/shotcut/bench/bench-shotcut-0001.py deleted file mode 100644 index 93b7f14f1..000000000 --- a/defects/shotcut/bench/bench-shotcut-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-shotcut-0001.py -# Defect: shotcut-0001 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== shotcut-0001: Defect: shotcut-0001 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/shotcut/bench/results.txt b/defects/shotcut/bench/results.txt deleted file mode 100644 index 79d217baa..000000000 --- a/defects/shotcut/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== shotcut-0001: Defect: shotcut-0001 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.106ms fixed=0.020ms speedup=102.7x -N=1000 k=1000 : defective=8.875ms fixed=0.046ms speedup=193.6x -N=2000 k=2000 : defective=35.635ms fixed=0.098ms speedup=361.9x - diff --git a/defects/shotcut/bench/run_all.py b/defects/shotcut/bench/run_all.py deleted file mode 100644 index d031f2f0a..000000000 --- a/defects/shotcut/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-shotcut-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/simplex-chat/Makefile b/defects/simplex-chat/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/simplex-chat/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/simplex-chat/bench/bench-simplex-chat-0001.py b/defects/simplex-chat/bench/bench-simplex-chat-0001.py deleted file mode 100644 index 6ae94df10..000000000 --- a/defects/simplex-chat/bench/bench-simplex-chat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0001.py -# CWE-407: list-scan inside loop in simplex-chat-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0001: CWE-407: list-scan inside loop in simplex-chat-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex-chat/bench/bench-simplex-chat-0002.py b/defects/simplex-chat/bench/bench-simplex-chat-0002.py deleted file mode 100644 index 6f8aec631..000000000 --- a/defects/simplex-chat/bench/bench-simplex-chat-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0002.py -# CWE-407: list-scan inside loop in simplex-chat-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0002: CWE-407: list-scan inside loop in simplex-chat-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex-chat/bench/bench-simplex-chat-0003.py b/defects/simplex-chat/bench/bench-simplex-chat-0003.py deleted file mode 100644 index dc0d9d1ce..000000000 --- a/defects/simplex-chat/bench/bench-simplex-chat-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0003.py -# CWE-407: list-scan inside loop in simplex-chat-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0003: CWE-407: list-scan inside loop in simplex-chat-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex-chat/bench/bench-simplex-chat-0004.py b/defects/simplex-chat/bench/bench-simplex-chat-0004.py deleted file mode 100644 index e0d9e650f..000000000 --- a/defects/simplex-chat/bench/bench-simplex-chat-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0004.py -# CWE-407: list-scan inside loop in simplex-chat-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0004: CWE-407: list-scan inside loop in simplex-chat-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex-chat/bench/bench-simplex-chat.py b/defects/simplex-chat/bench/bench-simplex-chat.py deleted file mode 100644 index b88cf8125..000000000 --- a/defects/simplex-chat/bench/bench-simplex-chat.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat.py -# CWE-407: list-scan inside loop in simplex-chat (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat: CWE-407: list-scan inside loop in simplex-chat (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex-chat/bench/results.txt b/defects/simplex-chat/bench/results.txt deleted file mode 100644 index 1a529afd6..000000000 --- a/defects/simplex-chat/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== simplex-chat-0001: CWE-407: list-scan inside loop in simplex-chat-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.103ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=8.791ms fixed=0.046ms speedup=191.4x -N=2000 k=2000 : defective=35.318ms fixed=0.098ms speedup=362.0x - -=== simplex-chat-0002: CWE-407: list-scan inside loop in simplex-chat-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.117ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.689ms fixed=0.045ms speedup=192.6x -N=2000 k=2000 : defective=35.940ms fixed=0.098ms speedup=367.3x - -=== simplex-chat-0003: CWE-407: list-scan inside loop in simplex-chat-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.121ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=8.803ms fixed=0.046ms speedup=192.2x -N=2000 k=2000 : defective=35.660ms fixed=0.096ms speedup=369.8x - -=== simplex-chat-0004: CWE-407: list-scan inside loop in simplex-chat-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.175ms fixed=0.021ms speedup=104.4x -N=1000 k=1000 : defective=8.940ms fixed=0.046ms speedup=194.3x -N=2000 k=2000 : defective=35.988ms fixed=0.097ms speedup=370.3x - -=== simplex-chat: CWE-407: list-scan inside loop in simplex-chat (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.157ms fixed=0.020ms speedup=106.8x -N=1000 k=1000 : defective=8.632ms fixed=0.046ms speedup=188.7x -N=2000 k=2000 : defective=36.876ms fixed=0.095ms speedup=387.2x - diff --git a/defects/simplex-chat/bench/run_all.py b/defects/simplex-chat/bench/run_all.py deleted file mode 100644 index 38ee308a1..000000000 --- a/defects/simplex-chat/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-simplex-chat-0001.py", "bench-simplex-chat-0002.py", "bench-simplex-chat-0003.py", "bench-simplex-chat-0004.py", "bench-simplex-chat.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/simplex/Makefile b/defects/simplex/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/simplex/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/simplex/bench/bench-simplex-chat-0001.py b/defects/simplex/bench/bench-simplex-chat-0001.py deleted file mode 100644 index 6ae94df10..000000000 --- a/defects/simplex/bench/bench-simplex-chat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0001.py -# CWE-407: list-scan inside loop in simplex-chat-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0001: CWE-407: list-scan inside loop in simplex-chat-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex/bench/bench-simplex-chat-0002.py b/defects/simplex/bench/bench-simplex-chat-0002.py deleted file mode 100644 index 6f8aec631..000000000 --- a/defects/simplex/bench/bench-simplex-chat-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0002.py -# CWE-407: list-scan inside loop in simplex-chat-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0002: CWE-407: list-scan inside loop in simplex-chat-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex/bench/bench-simplex-chat-0003.py b/defects/simplex/bench/bench-simplex-chat-0003.py deleted file mode 100644 index dc0d9d1ce..000000000 --- a/defects/simplex/bench/bench-simplex-chat-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0003.py -# CWE-407: list-scan inside loop in simplex-chat-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0003: CWE-407: list-scan inside loop in simplex-chat-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex/bench/bench-simplex-chat-0004.py b/defects/simplex/bench/bench-simplex-chat-0004.py deleted file mode 100644 index e0d9e650f..000000000 --- a/defects/simplex/bench/bench-simplex-chat-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat-0004.py -# CWE-407: list-scan inside loop in simplex-chat-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat-0004: CWE-407: list-scan inside loop in simplex-chat-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex/bench/bench-simplex-chat.py b/defects/simplex/bench/bench-simplex-chat.py deleted file mode 100644 index b88cf8125..000000000 --- a/defects/simplex/bench/bench-simplex-chat.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simplex-chat.py -# CWE-407: list-scan inside loop in simplex-chat (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simplex-chat: CWE-407: list-scan inside loop in simplex-chat (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simplex/bench/results.txt b/defects/simplex/bench/results.txt deleted file mode 100644 index d5481db81..000000000 --- a/defects/simplex/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== simplex-chat-0001: CWE-407: list-scan inside loop in simplex-chat-0001 (generic model) === -N=100 k=100 : defective=0.115ms fixed=0.005ms speedup=24.4x -N=500 k=500 : defective=3.051ms fixed=0.028ms speedup=108.5x -N=1000 k=1000 : defective=15.198ms fixed=0.059ms speedup=258.5x -N=2000 k=2000 : defective=40.608ms fixed=0.099ms speedup=411.4x - -=== simplex-chat-0002: CWE-407: list-scan inside loop in simplex-chat-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.237ms fixed=0.020ms speedup=110.0x -N=1000 k=1000 : defective=9.391ms fixed=0.046ms speedup=204.0x -N=2000 k=2000 : defective=40.262ms fixed=0.106ms speedup=378.5x - -=== simplex-chat-0003: CWE-407: list-scan inside loop in simplex-chat-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.258ms fixed=0.021ms speedup=107.2x -N=1000 k=1000 : defective=11.343ms fixed=0.088ms speedup=128.6x -N=2000 k=2000 : defective=44.296ms fixed=0.098ms speedup=451.2x - -=== simplex-chat-0004: CWE-407: list-scan inside loop in simplex-chat-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.015ms speedup=5.6x -N=500 k=500 : defective=2.208ms fixed=0.021ms speedup=104.7x -N=1000 k=1000 : defective=9.491ms fixed=0.045ms speedup=210.7x -N=2000 k=2000 : defective=43.750ms fixed=0.100ms speedup=438.2x - -=== simplex-chat: CWE-407: list-scan inside loop in simplex-chat (generic model) === -N=100 k=100 : defective=0.322ms fixed=0.018ms speedup=17.8x -N=500 k=500 : defective=2.158ms fixed=0.037ms speedup=58.2x -N=1000 k=1000 : defective=11.121ms fixed=0.046ms speedup=240.0x -N=2000 k=2000 : defective=38.226ms fixed=0.098ms speedup=390.5x - diff --git a/defects/simplex/bench/run_all.py b/defects/simplex/bench/run_all.py deleted file mode 100644 index 38ee308a1..000000000 --- a/defects/simplex/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-simplex-chat-0001.py", "bench-simplex-chat-0002.py", "bench-simplex-chat-0003.py", "bench-simplex-chat-0004.py", "bench-simplex-chat.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/simutrans-0001/Makefile b/defects/simutrans-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/simutrans-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/simutrans-0001/bench/bench-simutrans-0001-0001.py b/defects/simutrans-0001/bench/bench-simutrans-0001-0001.py deleted file mode 100644 index 688c674f4..000000000 --- a/defects/simutrans-0001/bench/bench-simutrans-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simutrans-0001-0001.py -# CWE-407: list-scan inside loop in simutrans-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simutrans-0001-0001: CWE-407: list-scan inside loop in simutrans-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simutrans-0001/bench/results.txt b/defects/simutrans-0001/bench/results.txt deleted file mode 100644 index eeb6f28dc..000000000 --- a/defects/simutrans-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== simutrans-0001-0001: CWE-407: list-scan inside loop in simutrans-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.459ms fixed=0.023ms speedup=109.1x -N=1000 k=1000 : defective=8.688ms fixed=0.046ms speedup=190.9x -N=2000 k=2000 : defective=35.206ms fixed=0.098ms speedup=357.6x - diff --git a/defects/simutrans-0001/bench/run_all.py b/defects/simutrans-0001/bench/run_all.py deleted file mode 100644 index bfdbd214e..000000000 --- a/defects/simutrans-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-simutrans-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/simutrans-0002/Makefile b/defects/simutrans-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/simutrans-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/simutrans-0002/bench/bench-simutrans-0002-0002.py b/defects/simutrans-0002/bench/bench-simutrans-0002-0002.py deleted file mode 100644 index dde35aa87..000000000 --- a/defects/simutrans-0002/bench/bench-simutrans-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simutrans-0002-0002.py -# CWE-407: list-scan inside loop in simutrans-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simutrans-0002-0002: CWE-407: list-scan inside loop in simutrans-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simutrans-0002/bench/results.txt b/defects/simutrans-0002/bench/results.txt deleted file mode 100644 index 527f24d58..000000000 --- a/defects/simutrans-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== simutrans-0002-0002: CWE-407: list-scan inside loop in simutrans-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.310ms fixed=0.022ms speedup=103.5x -N=1000 k=1000 : defective=9.431ms fixed=0.049ms speedup=190.9x -N=2000 k=2000 : defective=36.829ms fixed=0.097ms speedup=380.0x - diff --git a/defects/simutrans-0002/bench/run_all.py b/defects/simutrans-0002/bench/run_all.py deleted file mode 100644 index 79fc52d45..000000000 --- a/defects/simutrans-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-simutrans-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/simutrans-0003/Makefile b/defects/simutrans-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/simutrans-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/simutrans-0003/bench/bench-simutrans-0003-0003.py b/defects/simutrans-0003/bench/bench-simutrans-0003-0003.py deleted file mode 100644 index de35fee82..000000000 --- a/defects/simutrans-0003/bench/bench-simutrans-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-simutrans-0003-0003.py -# CWE-407: list-scan inside loop in simutrans-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== simutrans-0003-0003: CWE-407: list-scan inside loop in simutrans-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/simutrans-0003/bench/results.txt b/defects/simutrans-0003/bench/results.txt deleted file mode 100644 index 30735a951..000000000 --- a/defects/simutrans-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== simutrans-0003-0003: CWE-407: list-scan inside loop in simutrans-0003-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.370ms fixed=0.022ms speedup=105.9x -N=1000 k=1000 : defective=9.585ms fixed=0.050ms speedup=192.1x -N=2000 k=2000 : defective=36.359ms fixed=0.096ms speedup=379.6x - diff --git a/defects/simutrans-0003/bench/run_all.py b/defects/simutrans-0003/bench/run_all.py deleted file mode 100644 index 92c2a4cf1..000000000 --- a/defects/simutrans-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-simutrans-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sinatra/Makefile b/defects/sinatra/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sinatra/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sinatra/bench/bench-sinatra-0001.py b/defects/sinatra/bench/bench-sinatra-0001.py deleted file mode 100644 index 750b0aa12..000000000 --- a/defects/sinatra/bench/bench-sinatra-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sinatra-0001.py -# CWE-407: list-scan inside loop in sinatra-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sinatra-0001: CWE-407: list-scan inside loop in sinatra-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sinatra/bench/bench-sinatra-0002.py b/defects/sinatra/bench/bench-sinatra-0002.py deleted file mode 100644 index 4a0474cd0..000000000 --- a/defects/sinatra/bench/bench-sinatra-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sinatra-0002.py -# CWE-407: list-scan inside loop in sinatra-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sinatra-0002: CWE-407: list-scan inside loop in sinatra-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sinatra/bench/results.txt b/defects/sinatra/bench/results.txt deleted file mode 100644 index ea8d104e0..000000000 --- a/defects/sinatra/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== sinatra-0001: CWE-407: list-scan inside loop in sinatra-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.105ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=9.431ms fixed=0.092ms speedup=102.3x -N=2000 k=2000 : defective=40.142ms fixed=0.097ms speedup=415.7x - -=== sinatra-0002: CWE-407: list-scan inside loop in sinatra-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.105ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.924ms fixed=0.046ms speedup=194.3x -N=2000 k=2000 : defective=35.729ms fixed=0.097ms speedup=368.4x - diff --git a/defects/sinatra/bench/run_all.py b/defects/sinatra/bench/run_all.py deleted file mode 100644 index 4e5cec7c6..000000000 --- a/defects/sinatra/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sinatra-0001.py", "bench-sinatra-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sklearn/Makefile b/defects/sklearn/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sklearn/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sklearn/bench/bench-sklearn-0001.py b/defects/sklearn/bench/bench-sklearn-0001.py deleted file mode 100644 index 4fe2d27df..000000000 --- a/defects/sklearn/bench/bench-sklearn-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sklearn-0001.py -# HistGradientBoosting _check_categories — O(n²) feature_names.index in loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sklearn-0001: HistGradientBoosting _check_categories — O(n²) feature_names.index in loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sklearn/bench/results.txt b/defects/sklearn/bench/results.txt deleted file mode 100644 index 50e40224d..000000000 --- a/defects/sklearn/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sklearn-0001: HistGradientBoosting _check_categories — O(n²) feature_names.index in loop === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.501ms fixed=0.024ms speedup=105.8x -N=1000 k=1000 : defective=10.182ms fixed=0.053ms speedup=191.8x -N=2000 k=2000 : defective=47.804ms fixed=0.131ms speedup=366.1x - diff --git a/defects/sklearn/bench/run_all.py b/defects/sklearn/bench/run_all.py deleted file mode 100644 index b64b5c0ad..000000000 --- a/defects/sklearn/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sklearn-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sm/Makefile b/defects/sm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sm/bench/bench-sm-0001.py b/defects/sm/bench/bench-sm-0001.py deleted file mode 100644 index 8bccad16a..000000000 --- a/defects/sm/bench/bench-sm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sm-0001.py -# CWE-407: list-scan inside loop in sm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sm-0001: CWE-407: list-scan inside loop in sm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sm/bench/bench-sm-0002.py b/defects/sm/bench/bench-sm-0002.py deleted file mode 100644 index 18fff6109..000000000 --- a/defects/sm/bench/bench-sm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sm-0002.py -# CWE-407: list-scan inside loop in sm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sm-0002: CWE-407: list-scan inside loop in sm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sm/bench/bench-sm-0003.py b/defects/sm/bench/bench-sm-0003.py deleted file mode 100644 index 2db6b62d9..000000000 --- a/defects/sm/bench/bench-sm-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sm-0003.py -# CWE-407: list-scan inside loop in sm-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sm-0003: CWE-407: list-scan inside loop in sm-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sm/bench/bench-sm-0004.py b/defects/sm/bench/bench-sm-0004.py deleted file mode 100644 index 5855c5788..000000000 --- a/defects/sm/bench/bench-sm-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sm-0004.py -# CWE-407: list-scan inside loop in sm-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sm-0004: CWE-407: list-scan inside loop in sm-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sm/bench/results.txt b/defects/sm/bench/results.txt deleted file mode 100644 index 9003c6329..000000000 --- a/defects/sm/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== sm-0001: CWE-407: list-scan inside loop in sm-0001 (generic model) === -N=100 k=100 : defective=0.109ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.790ms fixed=0.028ms speedup=100.5x -N=1000 k=1000 : defective=15.491ms fixed=0.106ms speedup=146.1x -N=2000 k=2000 : defective=47.638ms fixed=0.173ms speedup=276.1x - -=== sm-0002: CWE-407: list-scan inside loop in sm-0002 (generic model) === -N=100 k=100 : defective=0.086ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.175ms fixed=0.021ms speedup=104.9x -N=1000 k=1000 : defective=10.655ms fixed=0.046ms speedup=233.5x -N=2000 k=2000 : defective=46.033ms fixed=0.175ms speedup=262.3x - -=== sm-0003: CWE-407: list-scan inside loop in sm-0003 (generic model) === -N=100 k=100 : defective=0.162ms fixed=0.017ms speedup=9.6x -N=500 k=500 : defective=3.259ms fixed=0.038ms speedup=86.9x -N=1000 k=1000 : defective=10.210ms fixed=0.116ms speedup=87.8x -N=2000 k=2000 : defective=48.117ms fixed=0.103ms speedup=466.9x - -=== sm-0004: CWE-407: list-scan inside loop in sm-0004 (generic model) === -N=100 k=100 : defective=0.249ms fixed=0.004ms speedup=64.0x -N=500 k=500 : defective=2.376ms fixed=0.023ms speedup=104.5x -N=1000 k=1000 : defective=12.532ms fixed=0.050ms speedup=250.5x -N=2000 k=2000 : defective=44.511ms fixed=0.114ms speedup=391.5x - diff --git a/defects/sm/bench/run_all.py b/defects/sm/bench/run_all.py deleted file mode 100644 index 3187ad598..000000000 --- a/defects/sm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sm-0001.py", "bench-sm-0002.py", "bench-sm-0003.py", "bench-sm-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/snort3-0001/Makefile b/defects/snort3-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/snort3-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/snort3-0001/bench/bench-snort3-0001-0001.py b/defects/snort3-0001/bench/bench-snort3-0001-0001.py deleted file mode 100644 index bf32b2e95..000000000 --- a/defects/snort3-0001/bench/bench-snort3-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-snort3-0001-0001.py -# CWE-407: list-scan inside loop in snort3-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== snort3-0001-0001: CWE-407: list-scan inside loop in snort3-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/snort3-0001/bench/results.txt b/defects/snort3-0001/bench/results.txt deleted file mode 100644 index 36a6e132c..000000000 --- a/defects/snort3-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== snort3-0001-0001: CWE-407: list-scan inside loop in snort3-0001-0001 (generic model) === -N=100 k=100 : defective=0.115ms fixed=0.005ms speedup=24.8x -N=500 k=500 : defective=2.860ms fixed=0.028ms speedup=101.8x -N=1000 k=1000 : defective=12.069ms fixed=0.061ms speedup=196.6x -N=2000 k=2000 : defective=35.625ms fixed=0.097ms speedup=368.0x - diff --git a/defects/snort3-0001/bench/run_all.py b/defects/snort3-0001/bench/run_all.py deleted file mode 100644 index a6f34e5a8..000000000 --- a/defects/snort3-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-snort3-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/snort3-0002/Makefile b/defects/snort3-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/snort3-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/snort3-0002/bench/bench-snort3-0002-0002.py b/defects/snort3-0002/bench/bench-snort3-0002-0002.py deleted file mode 100644 index 4ef64449d..000000000 --- a/defects/snort3-0002/bench/bench-snort3-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-snort3-0002-0002.py -# CWE-407: list-scan inside loop in snort3-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== snort3-0002-0002: CWE-407: list-scan inside loop in snort3-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/snort3-0002/bench/results.txt b/defects/snort3-0002/bench/results.txt deleted file mode 100644 index d4ddb0e1c..000000000 --- a/defects/snort3-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== snort3-0002-0002: CWE-407: list-scan inside loop in snort3-0002-0002 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.591ms fixed=0.024ms speedup=108.2x -N=1000 k=1000 : defective=10.359ms fixed=0.052ms speedup=199.6x -N=2000 k=2000 : defective=40.814ms fixed=0.112ms speedup=363.2x - diff --git a/defects/snort3-0002/bench/run_all.py b/defects/snort3-0002/bench/run_all.py deleted file mode 100644 index b9e7b5a97..000000000 --- a/defects/snort3-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-snort3-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/solang/Makefile b/defects/solang/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/solang/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/solang/bench/bench-solang-0001.py b/defects/solang/bench/bench-solang-0001.py deleted file mode 100644 index 1ad557a09..000000000 --- a/defects/solang/bench/bench-solang-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solang-0001.py -# add_external_functions emits_events Vec::contains O(F×E²) → O(F×E) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solang-0001: add_external_functions emits_events Vec::contains O(F×E²) → O(F×E) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solang/bench/results.txt b/defects/solang/bench/results.txt deleted file mode 100644 index 22f5ceb0f..000000000 --- a/defects/solang/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== solang-0001: add_external_functions emits_events Vec::contains O(F×E²) → O(F×E) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.617ms fixed=0.025ms speedup=105.0x -N=1000 k=1000 : defective=8.871ms fixed=0.046ms speedup=194.4x -N=2000 k=2000 : defective=37.794ms fixed=0.169ms speedup=223.1x - diff --git a/defects/solang/bench/run_all.py b/defects/solang/bench/run_all.py deleted file mode 100644 index 331f82ba3..000000000 --- a/defects/solang/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-solang-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/solargraph/Makefile b/defects/solargraph/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/solargraph/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/solargraph/bench/bench-solargraph-0001.py b/defects/solargraph/bench/bench-solargraph-0001.py deleted file mode 100644 index 76c5e10d0..000000000 --- a/defects/solargraph/bench/bench-solargraph-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solargraph-0001.py -# CWE-407: list-scan inside loop in solargraph-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solargraph-0001: CWE-407: list-scan inside loop in solargraph-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solargraph/bench/bench-solargraph-0002.py b/defects/solargraph/bench/bench-solargraph-0002.py deleted file mode 100644 index 3d21f4b25..000000000 --- a/defects/solargraph/bench/bench-solargraph-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solargraph-0002.py -# CWE-407: list-scan inside loop in solargraph-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solargraph-0002: CWE-407: list-scan inside loop in solargraph-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solargraph/bench/results.txt b/defects/solargraph/bench/results.txt deleted file mode 100644 index 314f19f2a..000000000 --- a/defects/solargraph/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== solargraph-0001: CWE-407: list-scan inside loop in solargraph-0001 (generic model) === -N=100 k=100 : defective=0.114ms fixed=0.003ms speedup=33.4x -N=500 k=500 : defective=2.261ms fixed=0.022ms speedup=103.5x -N=1000 k=1000 : defective=11.277ms fixed=0.095ms speedup=118.6x -N=2000 k=2000 : defective=52.237ms fixed=0.118ms speedup=442.1x - -=== solargraph-0002: CWE-407: list-scan inside loop in solargraph-0002 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.601ms fixed=0.023ms speedup=114.9x -N=1000 k=1000 : defective=10.877ms fixed=0.048ms speedup=228.2x -N=2000 k=2000 : defective=39.596ms fixed=0.097ms speedup=409.4x - diff --git a/defects/solargraph/bench/run_all.py b/defects/solargraph/bench/run_all.py deleted file mode 100644 index 228060262..000000000 --- a/defects/solargraph/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-solargraph-0001.py", "bench-solargraph-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/solc/Makefile b/defects/solc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/solc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/solc/bench/bench-solc-0001.py b/defects/solc/bench/bench-solc-0001.py deleted file mode 100644 index 3e5019300..000000000 --- a/defects/solc/bench/bench-solc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solc-0001.py -# CWE-407: list-scan inside loop in solc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solc-0001: CWE-407: list-scan inside loop in solc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solc/bench/bench-solc-0002.py b/defects/solc/bench/bench-solc-0002.py deleted file mode 100644 index 6d681778c..000000000 --- a/defects/solc/bench/bench-solc-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solc-0002.py -# CWE-407: list-scan inside loop in solc-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solc-0002: CWE-407: list-scan inside loop in solc-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solc/bench/results.txt b/defects/solc/bench/results.txt deleted file mode 100644 index 5c85cbc80..000000000 --- a/defects/solc/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== solc-0001: CWE-407: list-scan inside loop in solc-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.310ms fixed=0.022ms speedup=102.7x -N=1000 k=1000 : defective=9.533ms fixed=0.050ms speedup=192.1x -N=2000 k=2000 : defective=37.288ms fixed=0.096ms speedup=388.6x - -=== solc-0002: CWE-407: list-scan inside loop in solc-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.120ms fixed=0.021ms speedup=101.2x -N=1000 k=1000 : defective=8.669ms fixed=0.046ms speedup=189.6x -N=2000 k=2000 : defective=35.564ms fixed=0.098ms speedup=363.6x - diff --git a/defects/solc/bench/run_all.py b/defects/solc/bench/run_all.py deleted file mode 100644 index d6b6c073a..000000000 --- a/defects/solc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-solc-0001.py", "bench-solc-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/solr/Makefile b/defects/solr/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/solr/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/solr/bench/bench-solr-0001.py b/defects/solr/bench/bench-solr-0001.py deleted file mode 100644 index fd6af49a5..000000000 --- a/defects/solr/bench/bench-solr-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solr-0001.py -# CWE-407: list-scan inside loop in solr-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solr-0001: CWE-407: list-scan inside loop in solr-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solr/bench/bench-solr-001.py b/defects/solr/bench/bench-solr-001.py deleted file mode 100644 index 677be44b4..000000000 --- a/defects/solr/bench/bench-solr-001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solr-001.py -# ClusterStatus O(n²) liveNodes.contains in crossCheckReplicaStateWithLiveNodes -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solr-001: ClusterStatus O(n²) liveNodes.contains in crossCheckReplicaStateWithLiveNodes ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solr/bench/bench-solr-002.py b/defects/solr/bench/bench-solr-002.py deleted file mode 100644 index 3b10ad001..000000000 --- a/defects/solr/bench/bench-solr-002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solr-002.py -# ActiveReplicaWatcher O(n²) replicaIds/solrCoreNames.contains in state-change loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solr-002: ActiveReplicaWatcher O(n²) replicaIds/solrCoreNames.contains in state-change loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solr/bench/bench-solr-003.py b/defects/solr/bench/bench-solr-003.py deleted file mode 100644 index eed067e81..000000000 --- a/defects/solr/bench/bench-solr-003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solr-003.py -# SplitShardCmd O(n²) subSlices.contains in loop over all collection slices -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solr-003: SplitShardCmd O(n²) subSlices.contains in loop over all collection slices ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solr/bench/results.txt b/defects/solr/bench/results.txt deleted file mode 100644 index 933cf3a3c..000000000 --- a/defects/solr/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== solr-0001: CWE-407: list-scan inside loop in solr-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.502ms fixed=0.024ms speedup=105.8x -N=1000 k=1000 : defective=9.064ms fixed=0.046ms speedup=198.4x -N=2000 k=2000 : defective=38.965ms fixed=0.119ms speedup=328.8x - -=== solr-001: ClusterStatus O(n²) liveNodes.contains in crossCheckReplicaStateWithLiveNodes === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.569ms fixed=0.024ms speedup=106.0x -N=1000 k=1000 : defective=9.552ms fixed=0.135ms speedup=70.8x -N=2000 k=2000 : defective=39.635ms fixed=0.144ms speedup=274.5x - -=== solr-002: ActiveReplicaWatcher O(n²) replicaIds/solrCoreNames.contains in state-change loop === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=26.3x -N=500 k=500 : defective=2.496ms fixed=0.023ms speedup=109.6x -N=1000 k=1000 : defective=9.358ms fixed=0.045ms speedup=207.6x -N=2000 k=2000 : defective=35.603ms fixed=0.102ms speedup=349.2x - -=== solr-003: SplitShardCmd O(n²) subSlices.contains in loop over all collection slices === -N=100 k=100 : defective=0.257ms fixed=0.016ms speedup=16.0x -N=500 k=500 : defective=2.219ms fixed=0.021ms speedup=103.5x -N=1000 k=1000 : defective=8.656ms fixed=0.047ms speedup=185.5x -N=2000 k=2000 : defective=35.665ms fixed=0.097ms speedup=367.7x - diff --git a/defects/solr/bench/run_all.py b/defects/solr/bench/run_all.py deleted file mode 100644 index fb90014d8..000000000 --- a/defects/solr/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-solr-0001.py", "bench-solr-001.py", "bench-solr-002.py", "bench-solr-003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/solvespace-0001/Makefile b/defects/solvespace-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/solvespace-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/solvespace-0001/bench/bench-solvespace-0001-0001.py b/defects/solvespace-0001/bench/bench-solvespace-0001-0001.py deleted file mode 100644 index d7a19c66c..000000000 --- a/defects/solvespace-0001/bench/bench-solvespace-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solvespace-0001-0001.py -# CWE-407: list-scan inside loop in solvespace-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solvespace-0001-0001: CWE-407: list-scan inside loop in solvespace-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solvespace-0001/bench/results.txt b/defects/solvespace-0001/bench/results.txt deleted file mode 100644 index 8e180d3ed..000000000 --- a/defects/solvespace-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== solvespace-0001-0001: CWE-407: list-scan inside loop in solvespace-0001-0001 (generic model) === -N=100 k=100 : defective=0.269ms fixed=0.017ms speedup=16.1x -N=500 k=500 : defective=2.375ms fixed=0.023ms speedup=104.9x -N=1000 k=1000 : defective=9.232ms fixed=0.046ms speedup=199.7x -N=2000 k=2000 : defective=35.267ms fixed=0.095ms speedup=369.5x - diff --git a/defects/solvespace-0001/bench/run_all.py b/defects/solvespace-0001/bench/run_all.py deleted file mode 100644 index 605a4607a..000000000 --- a/defects/solvespace-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-solvespace-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/solvespace-0002/Makefile b/defects/solvespace-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/solvespace-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/solvespace-0002/bench/bench-solvespace-0002-0002.py b/defects/solvespace-0002/bench/bench-solvespace-0002-0002.py deleted file mode 100644 index 18a3226cf..000000000 --- a/defects/solvespace-0002/bench/bench-solvespace-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-solvespace-0002-0002.py -# CWE-407: list-scan inside loop in solvespace-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== solvespace-0002-0002: CWE-407: list-scan inside loop in solvespace-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/solvespace-0002/bench/results.txt b/defects/solvespace-0002/bench/results.txt deleted file mode 100644 index 66101999f..000000000 --- a/defects/solvespace-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== solvespace-0002-0002: CWE-407: list-scan inside loop in solvespace-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.295ms fixed=0.021ms speedup=106.8x -N=1000 k=1000 : defective=8.690ms fixed=0.047ms speedup=185.4x -N=2000 k=2000 : defective=35.572ms fixed=0.098ms speedup=364.3x - diff --git a/defects/solvespace-0002/bench/run_all.py b/defects/solvespace-0002/bench/run_all.py deleted file mode 100644 index 79a2a8fba..000000000 --- a/defects/solvespace-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-solvespace-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spark/Makefile b/defects/spark/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spark/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spark/bench/bench-spark-0001.py b/defects/spark/bench/bench-spark-0001.py deleted file mode 100644 index d8d5c69e1..000000000 --- a/defects/spark/bench/bench-spark-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spark-0001.py -# CWE-407: list-scan inside loop in spark-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spark-0001: CWE-407: list-scan inside loop in spark-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spark/bench/bench-spark-0002.py b/defects/spark/bench/bench-spark-0002.py deleted file mode 100644 index abb96aa47..000000000 --- a/defects/spark/bench/bench-spark-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spark-0002.py -# spark-0002 — DAGScheduler BFS queues: ListBuffer.remove(0) is O(N) → O(N²) total -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spark-0002: spark-0002 — DAGScheduler BFS queues: ListBuffer.remove(0) is O(N) → O(N²) total ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spark/bench/bench-spark-0003.py b/defects/spark/bench/bench-spark-0003.py deleted file mode 100644 index eee3fdd65..000000000 --- a/defects/spark/bench/bench-spark-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spark-0003.py -# CWE-407: list-scan inside loop in spark-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spark-0003: CWE-407: list-scan inside loop in spark-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spark/bench/bench-spark-0004.py b/defects/spark/bench/bench-spark-0004.py deleted file mode 100644 index fded0380c..000000000 --- a/defects/spark/bench/bench-spark-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spark-0004.py -# spark-0004 — Spark DAGScheduler: waitingStages.filter(_.parents.contains(parent)) O(W×P) on every stage completion -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spark-0004: spark-0004 — Spark DAGScheduler: waitingStages.filter(_.parents.contains(parent)) O(W×P) on every stage completion ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spark/bench/results.txt b/defects/spark/bench/results.txt deleted file mode 100644 index 67d32c12a..000000000 --- a/defects/spark/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== spark-0001: CWE-407: list-scan inside loop in spark-0001 (generic model) === -N=100 k=100 : defective=0.155ms fixed=0.014ms speedup=11.3x -N=500 k=500 : defective=2.373ms fixed=0.022ms speedup=107.5x -N=1000 k=1000 : defective=9.379ms fixed=0.048ms speedup=196.4x -N=2000 k=2000 : defective=35.455ms fixed=0.095ms speedup=372.0x - -=== spark-0002: spark-0002 — DAGScheduler BFS queues: ListBuffer.remove(0) is O(N) → O(N²) total === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.198ms fixed=0.022ms speedup=102.0x -N=1000 k=1000 : defective=8.820ms fixed=0.047ms speedup=188.8x -N=2000 k=2000 : defective=36.759ms fixed=0.101ms speedup=362.9x - -=== spark-0003: CWE-407: list-scan inside loop in spark-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.243ms fixed=0.022ms speedup=103.8x -N=1000 k=1000 : defective=8.824ms fixed=0.046ms speedup=190.0x -N=2000 k=2000 : defective=35.216ms fixed=0.097ms speedup=364.0x - -=== spark-0004: spark-0004 — Spark DAGScheduler: waitingStages.filter(_.parents.contains(parent)) O(W×P) on every stage completion === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.109ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.626ms fixed=0.047ms speedup=185.2x -N=2000 k=2000 : defective=35.029ms fixed=0.096ms speedup=364.6x - diff --git a/defects/spark/bench/run_all.py b/defects/spark/bench/run_all.py deleted file mode 100644 index 9587b9daf..000000000 --- a/defects/spark/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spark-0001.py", "bench-spark-0002.py", "bench-spark-0003.py", "bench-spark-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spark/unit/TestSparkExplore.java b/defects/spark/unit/TestSparkExplore.java deleted file mode 100644 index 4c999ba28..000000000 --- a/defects/spark/unit/TestSparkExplore.java +++ /dev/null @@ -1,98 +0,0 @@ -import java.util.regex.*; -import java.util.concurrent.*; - -public class TestSparkExplore { - static long timedFind(Pattern p, String s, long timeoutMs) { - ExecutorService exec = Executors.newSingleThreadExecutor(); - long start = System.nanoTime(); - Future f = exec.submit(() -> p.matcher(s).find()); - try { - f.get(timeoutMs, TimeUnit.MILLISECONDS); - return (System.nanoTime() - start) / 1_000_000; - } catch (TimeoutException e) { - f.cancel(true); - return -1; - } catch (Exception e) { - return -2; - } finally { - exec.shutdownNow(); - } - } - - public static void main(String[] args) { - // Pattern 1: (\[[A-Z0-9_\s,]+\] )+\S+ - // The overlap is \s inside the character class and the literal space after ] - // Key insight: a SPACE can be consumed by [A-Z0-9_\s,]+ OR by the literal ' ' after ] - // But ] is not in the character class. So the ] is an unambiguous boundary. - // The only overlap is: when the last char before ] is a space, AND the literal space after ] - // This doesn't cause exponential backtracking because ] forces a boundary. - - // Pattern 2: (SPARK[-\s]*[0-9]{3,6})+ - // [-\s]* matches dashes and whitespace. SPARK is literal. - // The - in [-\s] can match a literal dash. - // What about: SPARK--123SPARK--456 ... where -- creates ambiguity? - // No: [-\s]* is greedy, eats all dashes/spaces, then [0-9]{3,6} needs digits. - // No ambiguity about where [-\s]* ends (it ends at first digit). - - // Actually for pattern 2, the real issue: what if there are NO digits? - // (SPARK[-\s]*[0-9]{3,6})+ on "SPARK---SPARK---X" - // First attempt: SPARK + --- (from [-\s]*) + needs 3-6 digits -> fails - // [-\s]* backs off one: SPARK + -- -> needs digits at '-' -> fails - // ... linear backtrack to SPARK + '' -> needs digits at '-' -> fails - // Then outer + can't start second iteration because we're at '-' - // Move start position forward by 1. Linear overall. - - // These patterns, despite having nested quantifiers, do NOT cause exponential - // backtracking because the literal anchors (SPARK, [, ]) eliminate ambiguity. - // The fix still improves the patterns (removes unnecessary [-\s]* flexibility, - // requires explicit hyphen) but the vulnerability is theoretical, not practical. - - Pattern p1 = Pattern.compile("(\\[[A-Z0-9_\\s,]+\\] )+\\S+"); - Pattern p2 = Pattern.compile("(SPARK[-\\s]*[0-9]{3,6})+", Pattern.CASE_INSENSITIVE); - - // Try many variations for pattern 1 - System.out.println("=== Pattern 1 exploration ==="); - - // Spaces between bracket groups (should these cause backtracking?) - for (int n : new int[]{20, 30, 40, 50}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("[A] "); - long t = timedFind(p1, sb.toString(), 3000); - System.out.println(" [A]_space * " + n + ": " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - // What about spaces INSIDE the brackets that could be the space AFTER ]? - // This can't happen because ] is not in the character class. - - // Pattern with lots of spaces inside brackets (should be fast — no ambiguity) - for (int n : new int[]{20, 30, 40, 50}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("[A " + " ".repeat(5) + "] "); - long t = timedFind(p1, sb.toString(), 3000); - System.out.println(" [A_____]_space * " + n + ": " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - System.out.println("\n=== Pattern 2 exploration ==="); - // SPARK with spaces ([-\s]* eats them) - for (int n : new int[]{20, 30, 40, 50}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("SPARK "); - sb.append("X"); - long t = timedFind(p2, sb.toString(), 3000); - System.out.println(" SPARK___*" + n + "X: " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - // SPARK with dashes - for (int n : new int[]{20, 30, 40, 50}) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) sb.append("SPARK---"); - sb.append("X"); - long t = timedFind(p2, sb.toString(), 3000); - System.out.println(" SPARK---*" + n + "X: " + (t == -1 ? "TIMEOUT" : t + "ms")); - } - - System.out.println("\nConclusion: Spark patterns do not exhibit exponential backtracking."); - System.out.println("Literal anchors (SPARK, [, ]) prevent ambiguous partitioning."); - System.out.println("Fix remains valuable: tighter semantics, defense-in-depth."); - } -} diff --git a/defects/sparrow-0001/Makefile b/defects/sparrow-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sparrow-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sparrow-0001/bench/bench-sparrow-0001-0001.py b/defects/sparrow-0001/bench/bench-sparrow-0001-0001.py deleted file mode 100644 index d6fd1c72e..000000000 --- a/defects/sparrow-0001/bench/bench-sparrow-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sparrow-0001-0001.py -# CWE-407: list-scan inside loop in sparrow-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sparrow-0001-0001: CWE-407: list-scan inside loop in sparrow-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sparrow-0001/bench/results.txt b/defects/sparrow-0001/bench/results.txt deleted file mode 100644 index 16eaa8a79..000000000 --- a/defects/sparrow-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sparrow-0001-0001: CWE-407: list-scan inside loop in sparrow-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.435ms fixed=0.024ms speedup=103.4x -N=1000 k=1000 : defective=8.634ms fixed=0.046ms speedup=188.9x -N=2000 k=2000 : defective=34.915ms fixed=0.097ms speedup=360.9x - diff --git a/defects/sparrow-0001/bench/run_all.py b/defects/sparrow-0001/bench/run_all.py deleted file mode 100644 index 580e545df..000000000 --- a/defects/sparrow-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sparrow-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sparrow-0002/Makefile b/defects/sparrow-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sparrow-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sparrow-0002/bench/bench-sparrow-0002-0002.py b/defects/sparrow-0002/bench/bench-sparrow-0002-0002.py deleted file mode 100644 index e70f652da..000000000 --- a/defects/sparrow-0002/bench/bench-sparrow-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sparrow-0002-0002.py -# CWE-407: list-scan inside loop in sparrow-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sparrow-0002-0002: CWE-407: list-scan inside loop in sparrow-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sparrow-0002/bench/results.txt b/defects/sparrow-0002/bench/results.txt deleted file mode 100644 index e47431ef5..000000000 --- a/defects/sparrow-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== sparrow-0002-0002: CWE-407: list-scan inside loop in sparrow-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.158ms fixed=0.023ms speedup=95.5x -N=1000 k=1000 : defective=8.871ms fixed=0.046ms speedup=193.6x -N=2000 k=2000 : defective=38.673ms fixed=0.097ms speedup=398.8x - diff --git a/defects/sparrow-0002/bench/run_all.py b/defects/sparrow-0002/bench/run_all.py deleted file mode 100644 index 783b2911f..000000000 --- a/defects/sparrow-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sparrow-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/speed-dreams-0001/Makefile b/defects/speed-dreams-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/speed-dreams-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/speed-dreams-0001/bench/bench-speed-dreams-0001-0001.py b/defects/speed-dreams-0001/bench/bench-speed-dreams-0001-0001.py deleted file mode 100644 index b7521682d..000000000 --- a/defects/speed-dreams-0001/bench/bench-speed-dreams-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-speed-dreams-0001-0001.py -# CWE-407: list-scan inside loop in speed-dreams-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== speed-dreams-0001-0001: CWE-407: list-scan inside loop in speed-dreams-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/speed-dreams-0001/bench/results.txt b/defects/speed-dreams-0001/bench/results.txt deleted file mode 100644 index 9efa804c8..000000000 --- a/defects/speed-dreams-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== speed-dreams-0001-0001: CWE-407: list-scan inside loop in speed-dreams-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.328ms fixed=0.022ms speedup=107.4x -N=1000 k=1000 : defective=8.743ms fixed=0.046ms speedup=190.4x -N=2000 k=2000 : defective=35.783ms fixed=0.093ms speedup=385.0x - diff --git a/defects/speed-dreams-0001/bench/run_all.py b/defects/speed-dreams-0001/bench/run_all.py deleted file mode 100644 index 8dce6bcd9..000000000 --- a/defects/speed-dreams-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-speed-dreams-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/speed-dreams-0002/Makefile b/defects/speed-dreams-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/speed-dreams-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/speed-dreams-0002/bench/bench-speed-dreams-0002-0002.py b/defects/speed-dreams-0002/bench/bench-speed-dreams-0002-0002.py deleted file mode 100644 index 987f22539..000000000 --- a/defects/speed-dreams-0002/bench/bench-speed-dreams-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-speed-dreams-0002-0002.py -# CWE-407: list-scan inside loop in speed-dreams-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== speed-dreams-0002-0002: CWE-407: list-scan inside loop in speed-dreams-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/speed-dreams-0002/bench/results.txt b/defects/speed-dreams-0002/bench/results.txt deleted file mode 100644 index a86c3c50d..000000000 --- a/defects/speed-dreams-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== speed-dreams-0002-0002: CWE-407: list-scan inside loop in speed-dreams-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.348ms fixed=0.023ms speedup=104.0x -N=1000 k=1000 : defective=8.712ms fixed=0.046ms speedup=187.9x -N=2000 k=2000 : defective=37.125ms fixed=0.096ms speedup=385.5x - diff --git a/defects/speed-dreams-0002/bench/run_all.py b/defects/speed-dreams-0002/bench/run_all.py deleted file mode 100644 index 5ab17466d..000000000 --- a/defects/speed-dreams-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-speed-dreams-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/speed-dreams-0003/Makefile b/defects/speed-dreams-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/speed-dreams-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/speed-dreams-0003/bench/bench-speed-dreams-0003-0003.py b/defects/speed-dreams-0003/bench/bench-speed-dreams-0003-0003.py deleted file mode 100644 index fb0518235..000000000 --- a/defects/speed-dreams-0003/bench/bench-speed-dreams-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-speed-dreams-0003-0003.py -# CWE-407: list-scan inside loop in speed-dreams-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== speed-dreams-0003-0003: CWE-407: list-scan inside loop in speed-dreams-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/speed-dreams-0003/bench/results.txt b/defects/speed-dreams-0003/bench/results.txt deleted file mode 100644 index 02cb99225..000000000 --- a/defects/speed-dreams-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== speed-dreams-0003-0003: CWE-407: list-scan inside loop in speed-dreams-0003-0003 (generic model) === -N=100 k=100 : defective=0.100ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.440ms fixed=0.024ms speedup=102.8x -N=1000 k=1000 : defective=9.296ms fixed=0.046ms speedup=202.7x -N=2000 k=2000 : defective=35.263ms fixed=0.096ms speedup=367.3x - diff --git a/defects/speed-dreams-0003/bench/run_all.py b/defects/speed-dreams-0003/bench/run_all.py deleted file mode 100644 index ae7bd7110..000000000 --- a/defects/speed-dreams-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-speed-dreams-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/speed-dreams-0004/Makefile b/defects/speed-dreams-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/speed-dreams-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/speed-dreams-0004/bench/bench-speed-dreams-0004-0004.py b/defects/speed-dreams-0004/bench/bench-speed-dreams-0004-0004.py deleted file mode 100644 index 13516f8f2..000000000 --- a/defects/speed-dreams-0004/bench/bench-speed-dreams-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-speed-dreams-0004-0004.py -# CWE-407: list-scan inside loop in speed-dreams-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== speed-dreams-0004-0004: CWE-407: list-scan inside loop in speed-dreams-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/speed-dreams-0004/bench/results.txt b/defects/speed-dreams-0004/bench/results.txt deleted file mode 100644 index 8feb442ed..000000000 --- a/defects/speed-dreams-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== speed-dreams-0004-0004: CWE-407: list-scan inside loop in speed-dreams-0004-0004 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.422ms fixed=0.023ms speedup=104.9x -N=1000 k=1000 : defective=8.671ms fixed=0.044ms speedup=195.8x -N=2000 k=2000 : defective=34.918ms fixed=0.095ms speedup=366.1x - diff --git a/defects/speed-dreams-0004/bench/run_all.py b/defects/speed-dreams-0004/bench/run_all.py deleted file mode 100644 index 71c50dd5e..000000000 --- a/defects/speed-dreams-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-speed-dreams-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/speed-dreams-0005/Makefile b/defects/speed-dreams-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/speed-dreams-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/speed-dreams-0005/bench/bench-speed-dreams-0005-0005.py b/defects/speed-dreams-0005/bench/bench-speed-dreams-0005-0005.py deleted file mode 100644 index c02b7c360..000000000 --- a/defects/speed-dreams-0005/bench/bench-speed-dreams-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-speed-dreams-0005-0005.py -# CWE-407: list-scan inside loop in speed-dreams-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== speed-dreams-0005-0005: CWE-407: list-scan inside loop in speed-dreams-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/speed-dreams-0005/bench/results.txt b/defects/speed-dreams-0005/bench/results.txt deleted file mode 100644 index c347216f1..000000000 --- a/defects/speed-dreams-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== speed-dreams-0005-0005: CWE-407: list-scan inside loop in speed-dreams-0005-0005 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.126ms fixed=0.021ms speedup=102.7x -N=1000 k=1000 : defective=8.662ms fixed=0.045ms speedup=190.6x -N=2000 k=2000 : defective=35.035ms fixed=0.118ms speedup=295.9x - diff --git a/defects/speed-dreams-0005/bench/run_all.py b/defects/speed-dreams-0005/bench/run_all.py deleted file mode 100644 index 31b7e76bb..000000000 --- a/defects/speed-dreams-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-speed-dreams-0005-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/speed-dreams-0006/Makefile b/defects/speed-dreams-0006/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/speed-dreams-0006/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/speed-dreams-0006/bench/bench-speed-dreams-0006-0006.py b/defects/speed-dreams-0006/bench/bench-speed-dreams-0006-0006.py deleted file mode 100644 index 3cb417dc9..000000000 --- a/defects/speed-dreams-0006/bench/bench-speed-dreams-0006-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-speed-dreams-0006-0006.py -# CWE-407: list-scan inside loop in speed-dreams-0006-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== speed-dreams-0006-0006: CWE-407: list-scan inside loop in speed-dreams-0006-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/speed-dreams-0006/bench/results.txt b/defects/speed-dreams-0006/bench/results.txt deleted file mode 100644 index 46e8f2544..000000000 --- a/defects/speed-dreams-0006/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== speed-dreams-0006-0006: CWE-407: list-scan inside loop in speed-dreams-0006-0006 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.005ms speedup=24.0x -N=500 k=500 : defective=2.869ms fixed=0.025ms speedup=114.0x -N=1000 k=1000 : defective=10.734ms fixed=0.056ms speedup=191.6x -N=2000 k=2000 : defective=36.202ms fixed=0.096ms speedup=376.7x - diff --git a/defects/speed-dreams-0006/bench/run_all.py b/defects/speed-dreams-0006/bench/run_all.py deleted file mode 100644 index 6bd1258c8..000000000 --- a/defects/speed-dreams-0006/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-speed-dreams-0006-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spidermonkey/Makefile b/defects/spidermonkey/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spidermonkey/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spidermonkey/bench/bench-spidermonkey-0001.py b/defects/spidermonkey/bench/bench-spidermonkey-0001.py deleted file mode 100644 index 7a65d80d3..000000000 --- a/defects/spidermonkey/bench/bench-spidermonkey-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spidermonkey-0001.py -# CWE-407: list-scan inside loop in spidermonkey-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spidermonkey-0001: CWE-407: list-scan inside loop in spidermonkey-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spidermonkey/bench/bench-spidermonkey-0002.py b/defects/spidermonkey/bench/bench-spidermonkey-0002.py deleted file mode 100644 index 8f2591724..000000000 --- a/defects/spidermonkey/bench/bench-spidermonkey-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spidermonkey-0002.py -# CWE-407: list-scan inside loop in spidermonkey-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spidermonkey-0002: CWE-407: list-scan inside loop in spidermonkey-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spidermonkey/bench/bench-spidermonkey-0003.py b/defects/spidermonkey/bench/bench-spidermonkey-0003.py deleted file mode 100644 index c888d3357..000000000 --- a/defects/spidermonkey/bench/bench-spidermonkey-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spidermonkey-0003.py -# CWE-407: list-scan inside loop in spidermonkey-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spidermonkey-0003: CWE-407: list-scan inside loop in spidermonkey-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spidermonkey/bench/bench-spidermonkey-0004.py b/defects/spidermonkey/bench/bench-spidermonkey-0004.py deleted file mode 100644 index 13d73e901..000000000 --- a/defects/spidermonkey/bench/bench-spidermonkey-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spidermonkey-0004.py -# CWE-407: list-scan inside loop in spidermonkey-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spidermonkey-0004: CWE-407: list-scan inside loop in spidermonkey-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spidermonkey/bench/bench-spidermonkey-0005.py b/defects/spidermonkey/bench/bench-spidermonkey-0005.py deleted file mode 100644 index 4ae3823de..000000000 --- a/defects/spidermonkey/bench/bench-spidermonkey-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spidermonkey-0005.py -# `GatherAvailableModuleAncestors` — O(M²) execList scan in async-module BFS -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spidermonkey-0005: `GatherAvailableModuleAncestors` — O(M²) execList scan in async-module BFS ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spidermonkey/bench/results.txt b/defects/spidermonkey/bench/results.txt deleted file mode 100644 index 76f158bea..000000000 --- a/defects/spidermonkey/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== spidermonkey-0001: CWE-407: list-scan inside loop in spidermonkey-0001 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.086ms fixed=0.020ms speedup=106.5x -N=1000 k=1000 : defective=8.210ms fixed=0.044ms speedup=185.7x -N=2000 k=2000 : defective=34.746ms fixed=0.094ms speedup=371.3x - -=== spidermonkey-0002: CWE-407: list-scan inside loop in spidermonkey-0002 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.029ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=8.392ms fixed=0.044ms speedup=189.4x -N=2000 k=2000 : defective=33.870ms fixed=0.093ms speedup=362.5x - -=== spidermonkey-0003: CWE-407: list-scan inside loop in spidermonkey-0003 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.024ms fixed=0.019ms speedup=104.3x -N=1000 k=1000 : defective=8.356ms fixed=0.044ms speedup=188.6x -N=2000 k=2000 : defective=33.887ms fixed=0.092ms speedup=369.5x - -=== spidermonkey-0004: CWE-407: list-scan inside loop in spidermonkey-0004 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.035ms fixed=0.019ms speedup=105.7x -N=1000 k=1000 : defective=8.299ms fixed=0.045ms speedup=184.5x -N=2000 k=2000 : defective=34.320ms fixed=0.092ms speedup=372.5x - -=== spidermonkey-0005: `GatherAvailableModuleAncestors` — O(M²) execList scan in async-module BFS === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.037ms fixed=0.020ms speedup=101.2x -N=1000 k=1000 : defective=8.247ms fixed=0.044ms speedup=186.4x -N=2000 k=2000 : defective=33.854ms fixed=0.091ms speedup=372.4x - diff --git a/defects/spidermonkey/bench/run_all.py b/defects/spidermonkey/bench/run_all.py deleted file mode 100644 index c6a9e43b6..000000000 --- a/defects/spidermonkey/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spidermonkey-0001.py", "bench-spidermonkey-0002.py", "bench-spidermonkey-0003.py", "bench-spidermonkey-0004.py", "bench-spidermonkey-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spirv-cross/Makefile b/defects/spirv-cross/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spirv-cross/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spirv-cross/bench/bench-spirv-cross-0001.py b/defects/spirv-cross/bench/bench-spirv-cross-0001.py deleted file mode 100644 index 25f22eabf..000000000 --- a/defects/spirv-cross/bench/bench-spirv-cross-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spirv-cross-0001.py -# CWE-407: list-scan inside loop in spirv-cross-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spirv-cross-0001: CWE-407: list-scan inside loop in spirv-cross-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spirv-cross/bench/bench-spirv-cross-0002.py b/defects/spirv-cross/bench/bench-spirv-cross-0002.py deleted file mode 100644 index da4bb1972..000000000 --- a/defects/spirv-cross/bench/bench-spirv-cross-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spirv-cross-0002.py -# CWE-407: list-scan inside loop in spirv-cross-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spirv-cross-0002: CWE-407: list-scan inside loop in spirv-cross-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spirv-cross/bench/results.txt b/defects/spirv-cross/bench/results.txt deleted file mode 100644 index 443119188..000000000 --- a/defects/spirv-cross/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== spirv-cross-0001: CWE-407: list-scan inside loop in spirv-cross-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.170ms fixed=0.023ms speedup=95.8x -N=1000 k=1000 : defective=10.072ms fixed=0.053ms speedup=190.8x -N=2000 k=2000 : defective=51.997ms fixed=0.128ms speedup=406.2x - -=== spirv-cross-0002: CWE-407: list-scan inside loop in spirv-cross-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.330ms fixed=0.023ms speedup=101.4x -N=1000 k=1000 : defective=9.500ms fixed=0.050ms speedup=190.5x -N=2000 k=2000 : defective=36.279ms fixed=0.096ms speedup=379.7x - diff --git a/defects/spirv-cross/bench/run_all.py b/defects/spirv-cross/bench/run_all.py deleted file mode 100644 index 8730571de..000000000 --- a/defects/spirv-cross/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spirv-cross-0001.py", "bench-spirv-cross-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spring-framework/Makefile b/defects/spring-framework/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spring-framework/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spring-framework/bench/bench-spring-framework-0001.py b/defects/spring-framework/bench/bench-spring-framework-0001.py deleted file mode 100644 index efed93d9d..000000000 --- a/defects/spring-framework/bench/bench-spring-framework-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-framework-0001.py -# CWE-407: list-scan inside loop in spring-framework-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-framework-0001: CWE-407: list-scan inside loop in spring-framework-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring-framework/bench/bench-spring-framework-0002.py b/defects/spring-framework/bench/bench-spring-framework-0002.py deleted file mode 100644 index 60946dc00..000000000 --- a/defects/spring-framework/bench/bench-spring-framework-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-framework-0002.py -# CWE-407: list-scan inside loop in spring-framework-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-framework-0002: CWE-407: list-scan inside loop in spring-framework-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring-framework/bench/bench-spring-framework-0003.py b/defects/spring-framework/bench/bench-spring-framework-0003.py deleted file mode 100644 index 6734f1013..000000000 --- a/defects/spring-framework/bench/bench-spring-framework-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-framework-0003.py -# CWE-407: list-scan inside loop in spring-framework-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-framework-0003: CWE-407: list-scan inside loop in spring-framework-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring-framework/bench/results.txt b/defects/spring-framework/bench/results.txt deleted file mode 100644 index b6bbd49a7..000000000 --- a/defects/spring-framework/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== spring-framework-0001: CWE-407: list-scan inside loop in spring-framework-0001 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.613ms fixed=0.025ms speedup=103.4x -N=1000 k=1000 : defective=10.454ms fixed=0.056ms speedup=188.0x -N=2000 k=2000 : defective=38.812ms fixed=0.097ms speedup=399.0x - -=== spring-framework-0002: CWE-407: list-scan inside loop in spring-framework-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.195ms fixed=0.021ms speedup=105.9x -N=1000 k=1000 : defective=8.780ms fixed=0.046ms speedup=190.9x -N=2000 k=2000 : defective=35.212ms fixed=0.098ms speedup=358.1x - -=== spring-framework-0003: CWE-407: list-scan inside loop in spring-framework-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.136ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.735ms fixed=0.045ms speedup=194.0x -N=2000 k=2000 : defective=34.922ms fixed=0.098ms speedup=357.9x - diff --git a/defects/spring-framework/bench/run_all.py b/defects/spring-framework/bench/run_all.py deleted file mode 100644 index fd5cb4424..000000000 --- a/defects/spring-framework/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spring-framework-0001.py", "bench-spring-framework-0002.py", "bench-spring-framework-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spring-rts-0001/Makefile b/defects/spring-rts-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spring-rts-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spring-rts-0001/bench/bench-spring-rts-0001-0001.py b/defects/spring-rts-0001/bench/bench-spring-rts-0001-0001.py deleted file mode 100644 index c4dc76488..000000000 --- a/defects/spring-rts-0001/bench/bench-spring-rts-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-rts-0001-0001.py -# CWE-407: list-scan inside loop in spring-rts-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-rts-0001-0001: CWE-407: list-scan inside loop in spring-rts-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring-rts-0001/bench/results.txt b/defects/spring-rts-0001/bench/results.txt deleted file mode 100644 index 2216eae1d..000000000 --- a/defects/spring-rts-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== spring-rts-0001-0001: CWE-407: list-scan inside loop in spring-rts-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.336ms fixed=0.023ms speedup=102.5x -N=1000 k=1000 : defective=9.512ms fixed=0.049ms speedup=193.6x -N=2000 k=2000 : defective=35.605ms fixed=0.097ms speedup=367.3x - diff --git a/defects/spring-rts-0001/bench/run_all.py b/defects/spring-rts-0001/bench/run_all.py deleted file mode 100644 index 1e1c59074..000000000 --- a/defects/spring-rts-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spring-rts-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spring-rts-0002/Makefile b/defects/spring-rts-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spring-rts-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spring-rts-0002/bench/bench-spring-rts-0002-0002.py b/defects/spring-rts-0002/bench/bench-spring-rts-0002-0002.py deleted file mode 100644 index b92129ccf..000000000 --- a/defects/spring-rts-0002/bench/bench-spring-rts-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-rts-0002-0002.py -# CWE-407: list-scan inside loop in spring-rts-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-rts-0002-0002: CWE-407: list-scan inside loop in spring-rts-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring-rts-0002/bench/results.txt b/defects/spring-rts-0002/bench/results.txt deleted file mode 100644 index 17df5cb08..000000000 --- a/defects/spring-rts-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== spring-rts-0002-0002: CWE-407: list-scan inside loop in spring-rts-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=26.2x -N=500 k=500 : defective=2.472ms fixed=0.024ms speedup=103.4x -N=1000 k=1000 : defective=10.095ms fixed=0.047ms speedup=216.2x -N=2000 k=2000 : defective=35.238ms fixed=0.096ms speedup=367.1x - diff --git a/defects/spring-rts-0002/bench/run_all.py b/defects/spring-rts-0002/bench/run_all.py deleted file mode 100644 index ff60574b2..000000000 --- a/defects/spring-rts-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spring-rts-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/spring/Makefile b/defects/spring/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/spring/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/spring/bench/bench-spring-0001.py b/defects/spring/bench/bench-spring-0001.py deleted file mode 100644 index 23da1fe48..000000000 --- a/defects/spring/bench/bench-spring-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0001.py -# CWE-407: list-scan inside loop in spring-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0001: CWE-407: list-scan inside loop in spring-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-0002.py b/defects/spring/bench/bench-spring-0002.py deleted file mode 100644 index c222cb6c8..000000000 --- a/defects/spring/bench/bench-spring-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0002.py -# DefaultListableBeanFactory.getBeanNamesForAnnotation — O(B×M) ArrayList.contains inside loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0002: DefaultListableBeanFactory.getBeanNamesForAnnotation — O(B×M) ArrayList.contains inside loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-0003.py b/defects/spring/bench/bench-spring-0003.py deleted file mode 100644 index 725dbc0e4..000000000 --- a/defects/spring/bench/bench-spring-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0003.py -# CWE-407: list-scan inside loop in spring-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0003: CWE-407: list-scan inside loop in spring-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-0004.py b/defects/spring/bench/bench-spring-0004.py deleted file mode 100644 index 687a391f2..000000000 --- a/defects/spring/bench/bench-spring-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0004.py -# CWE-407: list-scan inside loop in spring-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0004: CWE-407: list-scan inside loop in spring-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-0005.py b/defects/spring/bench/bench-spring-0005.py deleted file mode 100644 index 25c965a24..000000000 --- a/defects/spring/bench/bench-spring-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0005.py -# spring-0001: AnnotationTypeMapping — O(A²×M) aliases.contains in nested loops -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0005: spring-0001: AnnotationTypeMapping — O(A²×M) aliases.contains in nested loops ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-0006.py b/defects/spring/bench/bench-spring-0006.py deleted file mode 100644 index 3c0e039d5..000000000 --- a/defects/spring/bench/bench-spring-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0006.py -# VersionResourceResolver — O(N²) patternsList.contains() in addFixedVersionStrategy() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0006: VersionResourceResolver — O(N²) patternsList.contains() in addFixedVersionStrategy() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-0007.py b/defects/spring/bench/bench-spring-0007.py deleted file mode 100644 index ad68aeda0..000000000 --- a/defects/spring/bench/bench-spring-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-0007.py -# AnnotationsScanner.processClassHierarchy — O(2^D) diamond annotation re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-0007: AnnotationsScanner.processClassHierarchy — O(2^D) diamond annotation re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-framework-0001.py b/defects/spring/bench/bench-spring-framework-0001.py deleted file mode 100644 index efed93d9d..000000000 --- a/defects/spring/bench/bench-spring-framework-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-framework-0001.py -# CWE-407: list-scan inside loop in spring-framework-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-framework-0001: CWE-407: list-scan inside loop in spring-framework-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-framework-0002.py b/defects/spring/bench/bench-spring-framework-0002.py deleted file mode 100644 index 60946dc00..000000000 --- a/defects/spring/bench/bench-spring-framework-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-framework-0002.py -# CWE-407: list-scan inside loop in spring-framework-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-framework-0002: CWE-407: list-scan inside loop in spring-framework-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-framework-0003.py b/defects/spring/bench/bench-spring-framework-0003.py deleted file mode 100644 index 6734f1013..000000000 --- a/defects/spring/bench/bench-spring-framework-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-framework-0003.py -# CWE-407: list-scan inside loop in spring-framework-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-framework-0003: CWE-407: list-scan inside loop in spring-framework-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-rts-0001-0001.py b/defects/spring/bench/bench-spring-rts-0001-0001.py deleted file mode 100644 index c4dc76488..000000000 --- a/defects/spring/bench/bench-spring-rts-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-rts-0001-0001.py -# CWE-407: list-scan inside loop in spring-rts-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-rts-0001-0001: CWE-407: list-scan inside loop in spring-rts-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/bench-spring-rts-0002-0002.py b/defects/spring/bench/bench-spring-rts-0002-0002.py deleted file mode 100644 index b92129ccf..000000000 --- a/defects/spring/bench/bench-spring-rts-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-spring-rts-0002-0002.py -# CWE-407: list-scan inside loop in spring-rts-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== spring-rts-0002-0002: CWE-407: list-scan inside loop in spring-rts-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/spring/bench/results.txt b/defects/spring/bench/results.txt deleted file mode 100644 index 7618b7cc3..000000000 --- a/defects/spring/bench/results.txt +++ /dev/null @@ -1,72 +0,0 @@ -=== spring-0001: CWE-407: list-scan inside loop in spring-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.549ms fixed=0.025ms speedup=101.3x -N=1000 k=1000 : defective=9.724ms fixed=0.051ms speedup=192.4x -N=2000 k=2000 : defective=37.310ms fixed=0.097ms speedup=386.5x - -=== spring-0002: DefaultListableBeanFactory.getBeanNamesForAnnotation — O(B×M) ArrayList.contains inside loop === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=100.9x -N=1000 k=1000 : defective=8.645ms fixed=0.046ms speedup=188.1x -N=2000 k=2000 : defective=35.367ms fixed=0.110ms speedup=320.2x - -=== spring-0003: CWE-407: list-scan inside loop in spring-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.420ms fixed=0.030ms speedup=81.5x -N=1000 k=1000 : defective=9.102ms fixed=0.045ms speedup=202.0x -N=2000 k=2000 : defective=38.843ms fixed=0.102ms speedup=381.8x - -=== spring-0004: CWE-407: list-scan inside loop in spring-0004 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.283ms fixed=0.022ms speedup=104.1x -N=1000 k=1000 : defective=10.461ms fixed=0.050ms speedup=208.6x -N=2000 k=2000 : defective=36.384ms fixed=0.106ms speedup=342.5x - -=== spring-0005: spring-0001: AnnotationTypeMapping — O(A²×M) aliases.contains in nested loops === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.322ms fixed=0.022ms speedup=107.5x -N=1000 k=1000 : defective=8.519ms fixed=0.044ms speedup=191.9x -N=2000 k=2000 : defective=35.216ms fixed=0.096ms speedup=366.6x - -=== spring-0006: VersionResourceResolver — O(N²) patternsList.contains() in addFixedVersionStrategy() === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.150ms fixed=0.021ms speedup=103.3x -N=1000 k=1000 : defective=8.753ms fixed=0.089ms speedup=98.3x -N=2000 k=2000 : defective=40.350ms fixed=0.097ms speedup=416.4x - -=== spring-0007: AnnotationsScanner.processClassHierarchy — O(2^D) diamond annotation re-traversal === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.127ms fixed=0.095ms speedup=22.3x -N=1000 k=1000 : defective=8.723ms fixed=0.045ms speedup=194.5x -N=2000 k=2000 : defective=38.317ms fixed=0.100ms speedup=384.4x - -=== spring-framework-0001: CWE-407: list-scan inside loop in spring-framework-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.295ms fixed=0.037ms speedup=61.3x -N=1000 k=1000 : defective=9.228ms fixed=0.049ms speedup=188.9x -N=2000 k=2000 : defective=42.890ms fixed=0.111ms speedup=386.9x - -=== spring-framework-0002: CWE-407: list-scan inside loop in spring-framework-0002 (generic model) === -N=100 k=100 : defective=0.103ms fixed=0.004ms speedup=26.6x -N=500 k=500 : defective=2.428ms fixed=0.023ms speedup=106.7x -N=1000 k=1000 : defective=9.644ms fixed=0.048ms speedup=199.1x -N=2000 k=2000 : defective=38.393ms fixed=0.098ms speedup=390.6x - -=== spring-framework-0003: CWE-407: list-scan inside loop in spring-framework-0003 (generic model) === -N=100 k=100 : defective=0.089ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.253ms fixed=0.023ms speedup=99.4x -N=1000 k=1000 : defective=12.005ms fixed=0.048ms speedup=251.1x -N=2000 k=2000 : defective=37.895ms fixed=0.096ms speedup=394.0x - -=== spring-rts-0001-0001: CWE-407: list-scan inside loop in spring-rts-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.115ms fixed=0.020ms speedup=103.2x -N=1000 k=1000 : defective=9.444ms fixed=0.046ms speedup=203.8x -N=2000 k=2000 : defective=35.698ms fixed=0.096ms speedup=371.8x - -=== spring-rts-0002-0002: CWE-407: list-scan inside loop in spring-rts-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.118ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=8.575ms fixed=0.045ms speedup=189.7x -N=2000 k=2000 : defective=40.108ms fixed=0.096ms speedup=418.0x - diff --git a/defects/spring/bench/run_all.py b/defects/spring/bench/run_all.py deleted file mode 100644 index 7130dbab9..000000000 --- a/defects/spring/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-spring-0001.py", "bench-spring-0002.py", "bench-spring-0003.py", "bench-spring-0004.py", "bench-spring-0005.py", "bench-spring-0006.py", "bench-spring-0007.py", "bench-spring-framework-0001.py", "bench-spring-framework-0002.py", "bench-spring-framework-0003.py", "bench-spring-rts-0001-0001.py", "bench-spring-rts-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sqlalchemy/Makefile b/defects/sqlalchemy/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sqlalchemy/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sqlalchemy/bench/bench-sqlalchemy-0001.py b/defects/sqlalchemy/bench/bench-sqlalchemy-0001.py deleted file mode 100644 index 360e52e96..000000000 --- a/defects/sqlalchemy/bench/bench-sqlalchemy-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sqlalchemy-0001.py -# CWE-407: list-scan inside loop in sqlalchemy-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sqlalchemy-0001: CWE-407: list-scan inside loop in sqlalchemy-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sqlalchemy/bench/bench-sqlalchemy-0002.py b/defects/sqlalchemy/bench/bench-sqlalchemy-0002.py deleted file mode 100644 index 4789a9102..000000000 --- a/defects/sqlalchemy/bench/bench-sqlalchemy-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sqlalchemy-0002.py -# CWE-407: list-scan inside loop in sqlalchemy-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sqlalchemy-0002: CWE-407: list-scan inside loop in sqlalchemy-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sqlalchemy/bench/bench-sqlalchemy-0003.py b/defects/sqlalchemy/bench/bench-sqlalchemy-0003.py deleted file mode 100644 index a962be455..000000000 --- a/defects/sqlalchemy/bench/bench-sqlalchemy-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sqlalchemy-0003.py -# evaluated_keys list → set in _apply_evaluators() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sqlalchemy-0003: evaluated_keys list → set in _apply_evaluators() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sqlalchemy/bench/results.txt b/defects/sqlalchemy/bench/results.txt deleted file mode 100644 index b46766558..000000000 --- a/defects/sqlalchemy/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== sqlalchemy-0001: CWE-407: list-scan inside loop in sqlalchemy-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.370ms fixed=0.023ms speedup=104.0x -N=1000 k=1000 : defective=9.689ms fixed=0.050ms speedup=195.0x -N=2000 k=2000 : defective=36.622ms fixed=0.097ms speedup=378.6x - -=== sqlalchemy-0002: CWE-407: list-scan inside loop in sqlalchemy-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.5x -N=500 k=500 : defective=2.145ms fixed=0.020ms speedup=106.0x -N=1000 k=1000 : defective=8.599ms fixed=0.045ms speedup=192.9x -N=2000 k=2000 : defective=35.183ms fixed=0.096ms speedup=365.1x - -=== sqlalchemy-0003: evaluated_keys list → set in _apply_evaluators() === -N=100 k=100 : defective=0.086ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.091ms fixed=0.020ms speedup=102.3x -N=1000 k=1000 : defective=13.135ms fixed=0.094ms speedup=140.3x -N=2000 k=2000 : defective=35.309ms fixed=0.096ms speedup=368.6x - diff --git a/defects/sqlalchemy/bench/run_all.py b/defects/sqlalchemy/bench/run_all.py deleted file mode 100644 index 5cac62a9f..000000000 --- a/defects/sqlalchemy/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sqlalchemy-0001.py", "bench-sqlalchemy-0002.py", "bench-sqlalchemy-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/sqlite/Makefile b/defects/sqlite/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/sqlite/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/sqlite/bench/bench-sqlite-0001.py b/defects/sqlite/bench/bench-sqlite-0001.py deleted file mode 100644 index 3b45d00e1..000000000 --- a/defects/sqlite/bench/bench-sqlite-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sqlite-0001.py -# CWE-407: list-scan inside loop in sqlite-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sqlite-0001: CWE-407: list-scan inside loop in sqlite-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sqlite/bench/bench-sqlite-0003.py b/defects/sqlite/bench/bench-sqlite-0003.py deleted file mode 100644 index c4c8296ae..000000000 --- a/defects/sqlite/bench/bench-sqlite-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-sqlite-0003.py -# CWE-407: list-scan inside loop in sqlite-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== sqlite-0003: CWE-407: list-scan inside loop in sqlite-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/sqlite/bench/results.txt b/defects/sqlite/bench/results.txt deleted file mode 100644 index a7e54de66..000000000 --- a/defects/sqlite/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== sqlite-0001: CWE-407: list-scan inside loop in sqlite-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.571ms fixed=0.023ms speedup=109.4x -N=1000 k=1000 : defective=10.165ms fixed=0.052ms speedup=194.3x -N=2000 k=2000 : defective=36.628ms fixed=0.095ms speedup=387.1x - -=== sqlite-0003: CWE-407: list-scan inside loop in sqlite-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.224ms fixed=0.022ms speedup=102.7x -N=1000 k=1000 : defective=8.689ms fixed=0.046ms speedup=188.4x -N=2000 k=2000 : defective=35.657ms fixed=0.097ms speedup=369.4x - diff --git a/defects/sqlite/bench/run_all.py b/defects/sqlite/bench/run_all.py deleted file mode 100644 index 6e43531c1..000000000 --- a/defects/sqlite/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-sqlite-0001.py", "bench-sqlite-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/squid-0001/Makefile b/defects/squid-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/squid-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/squid-0001/bench/bench-squid-0001-0001.py b/defects/squid-0001/bench/bench-squid-0001-0001.py deleted file mode 100644 index f0dd453d6..000000000 --- a/defects/squid-0001/bench/bench-squid-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-squid-0001-0001.py -# CWE-407: list-scan inside loop in squid-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== squid-0001-0001: CWE-407: list-scan inside loop in squid-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/squid-0001/bench/results.txt b/defects/squid-0001/bench/results.txt deleted file mode 100644 index a49df2722..000000000 --- a/defects/squid-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== squid-0001-0001: CWE-407: list-scan inside loop in squid-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.432ms fixed=0.024ms speedup=102.6x -N=1000 k=1000 : defective=10.052ms fixed=0.053ms speedup=188.1x -N=2000 k=2000 : defective=38.519ms fixed=0.097ms speedup=396.8x - diff --git a/defects/squid-0001/bench/run_all.py b/defects/squid-0001/bench/run_all.py deleted file mode 100644 index d8c0b89b7..000000000 --- a/defects/squid-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-squid-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/squid-0002/Makefile b/defects/squid-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/squid-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/squid-0002/bench/bench-squid-0002-0002.py b/defects/squid-0002/bench/bench-squid-0002-0002.py deleted file mode 100644 index 6cb93c899..000000000 --- a/defects/squid-0002/bench/bench-squid-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-squid-0002-0002.py -# CWE-407: list-scan inside loop in squid-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== squid-0002-0002: CWE-407: list-scan inside loop in squid-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/squid-0002/bench/results.txt b/defects/squid-0002/bench/results.txt deleted file mode 100644 index eff454d76..000000000 --- a/defects/squid-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== squid-0002-0002: CWE-407: list-scan inside loop in squid-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.327ms fixed=0.022ms speedup=104.7x -N=1000 k=1000 : defective=9.284ms fixed=0.052ms speedup=180.2x -N=2000 k=2000 : defective=36.223ms fixed=0.097ms speedup=374.3x - diff --git a/defects/squid-0002/bench/run_all.py b/defects/squid-0002/bench/run_all.py deleted file mode 100644 index 7e482740a..000000000 --- a/defects/squid-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-squid-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/squid-0003/Makefile b/defects/squid-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/squid-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/squid-0003/bench/bench-squid-0003-0003.py b/defects/squid-0003/bench/bench-squid-0003-0003.py deleted file mode 100644 index fb70ca848..000000000 --- a/defects/squid-0003/bench/bench-squid-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-squid-0003-0003.py -# CWE-407: list-scan inside loop in squid-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== squid-0003-0003: CWE-407: list-scan inside loop in squid-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/squid-0003/bench/results.txt b/defects/squid-0003/bench/results.txt deleted file mode 100644 index 553ae4ae6..000000000 --- a/defects/squid-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== squid-0003-0003: CWE-407: list-scan inside loop in squid-0003-0003 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.753ms fixed=0.024ms speedup=114.9x -N=1000 k=1000 : defective=10.549ms fixed=0.051ms speedup=207.3x -N=2000 k=2000 : defective=40.404ms fixed=0.096ms speedup=421.4x - diff --git a/defects/squid-0003/bench/run_all.py b/defects/squid-0003/bench/run_all.py deleted file mode 100644 index 47652fd5d..000000000 --- a/defects/squid-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-squid-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/squid-0004/Makefile b/defects/squid-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/squid-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/squid-0004/bench/bench-squid-0004-0004.py b/defects/squid-0004/bench/bench-squid-0004-0004.py deleted file mode 100644 index 165799c4f..000000000 --- a/defects/squid-0004/bench/bench-squid-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-squid-0004-0004.py -# CWE-407: list-scan inside loop in squid-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== squid-0004-0004: CWE-407: list-scan inside loop in squid-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/squid-0004/bench/results.txt b/defects/squid-0004/bench/results.txt deleted file mode 100644 index fcdeb9c9a..000000000 --- a/defects/squid-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== squid-0004-0004: CWE-407: list-scan inside loop in squid-0004-0004 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.663ms fixed=0.024ms speedup=111.3x -N=1000 k=1000 : defective=11.045ms fixed=0.052ms speedup=212.6x -N=2000 k=2000 : defective=40.408ms fixed=0.097ms speedup=416.7x - diff --git a/defects/squid-0004/bench/run_all.py b/defects/squid-0004/bench/run_all.py deleted file mode 100644 index 4060d184b..000000000 --- a/defects/squid-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-squid-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/starrocks/Makefile b/defects/starrocks/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/starrocks/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/starrocks/bench/bench-starrocks-0001.py b/defects/starrocks/bench/bench-starrocks-0001.py deleted file mode 100644 index d209141a0..000000000 --- a/defects/starrocks/bench/bench-starrocks-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-starrocks-0001.py -# MaterializedViewRewriter.getTableToRelationid — List.contains in column-ref loop → O(N×T) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== starrocks-0001: MaterializedViewRewriter.getTableToRelationid — List.contains in column-ref loop → O(N×T) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/starrocks/bench/bench-starrocks-0002.py b/defects/starrocks/bench/bench-starrocks-0002.py deleted file mode 100644 index 4a071aa17..000000000 --- a/defects/starrocks/bench/bench-starrocks-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-starrocks-0002.py -# DeadLockChecker.hasCycleInternal — cycle ArrayList O(D²) onStack scan + diamond re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== starrocks-0002: DeadLockChecker.hasCycleInternal — cycle ArrayList O(D²) onStack scan + diamond re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/starrocks/bench/results.txt b/defects/starrocks/bench/results.txt deleted file mode 100644 index 1af810416..000000000 --- a/defects/starrocks/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== starrocks-0001: MaterializedViewRewriter.getTableToRelationid — List.contains in column-ref loop → O(N×T) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.531ms fixed=0.023ms speedup=108.4x -N=1000 k=1000 : defective=11.038ms fixed=0.049ms speedup=223.9x -N=2000 k=2000 : defective=40.106ms fixed=0.100ms speedup=401.0x - -=== starrocks-0002: DeadLockChecker.hasCycleInternal — cycle ArrayList O(D²) onStack scan + diamond re-traversal === -N=100 k=100 : defective=0.134ms fixed=0.003ms speedup=39.4x -N=500 k=500 : defective=2.111ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=9.513ms fixed=0.046ms speedup=206.8x -N=2000 k=2000 : defective=37.962ms fixed=0.095ms speedup=399.2x - diff --git a/defects/starrocks/bench/run_all.py b/defects/starrocks/bench/run_all.py deleted file mode 100644 index e83b674ed..000000000 --- a/defects/starrocks/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-starrocks-0001.py", "bench-starrocks-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/storm/Makefile b/defects/storm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/storm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/storm/bench/bench-storm-0001.py b/defects/storm/bench/bench-storm-0001.py deleted file mode 100644 index 10cdd0b03..000000000 --- a/defects/storm/bench/bench-storm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-storm-0001.py -# CWE-407: list-scan inside loop in storm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== storm-0001: CWE-407: list-scan inside loop in storm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/storm/bench/bench-storm-0002.py b/defects/storm/bench/bench-storm-0002.py deleted file mode 100644 index 9f7a290d5..000000000 --- a/defects/storm/bench/bench-storm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-storm-0002.py -# CWE-407: list-scan inside loop in storm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== storm-0002: CWE-407: list-scan inside loop in storm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/storm/bench/results.txt b/defects/storm/bench/results.txt deleted file mode 100644 index 53aa06122..000000000 --- a/defects/storm/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== storm-0001: CWE-407: list-scan inside loop in storm-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.334ms fixed=0.023ms speedup=102.4x -N=1000 k=1000 : defective=9.756ms fixed=0.051ms speedup=192.0x -N=2000 k=2000 : defective=41.997ms fixed=0.097ms speedup=434.1x - -=== storm-0002: CWE-407: list-scan inside loop in storm-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.108ms fixed=0.021ms speedup=100.7x -N=1000 k=1000 : defective=8.749ms fixed=0.045ms speedup=193.3x -N=2000 k=2000 : defective=36.675ms fixed=0.097ms speedup=377.0x - diff --git a/defects/storm/bench/run_all.py b/defects/storm/bench/run_all.py deleted file mode 100644 index fb64cd82e..000000000 --- a/defects/storm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-storm-0001.py", "bench-storm-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/strawberry/Makefile b/defects/strawberry/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/strawberry/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/strawberry/bench/bench-strawberry-0001.py b/defects/strawberry/bench/bench-strawberry-0001.py deleted file mode 100644 index 690c213ac..000000000 --- a/defects/strawberry/bench/bench-strawberry-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-strawberry-0001.py -# In ScanSubdirectory(), `files_on_disk` is a QStringList (linear container). -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== strawberry-0001: In ScanSubdirectory(), `files_on_disk` is a QStringList (linear container). ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/strawberry/bench/bench-strawberry-0002.py b/defects/strawberry/bench/bench-strawberry-0002.py deleted file mode 100644 index 1c8c68039..000000000 --- a/defects/strawberry/bench/bench-strawberry-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-strawberry-0002.py -# In ScrobblerCache::Flush(), the method iterates cache_items (F items) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== strawberry-0002: In ScrobblerCache::Flush(), the method iterates cache_items (F items) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/strawberry/bench/results.txt b/defects/strawberry/bench/results.txt deleted file mode 100644 index f04816c90..000000000 --- a/defects/strawberry/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== strawberry-0001: In ScanSubdirectory(), `files_on_disk` is a QStringList (linear container). === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.457ms fixed=0.023ms speedup=108.4x -N=1000 k=1000 : defective=9.842ms fixed=0.051ms speedup=191.4x -N=2000 k=2000 : defective=40.153ms fixed=0.098ms speedup=408.4x - -=== strawberry-0002: In ScrobblerCache::Flush(), the method iterates cache_items (F items) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.156ms fixed=0.020ms speedup=106.6x -N=1000 k=1000 : defective=9.430ms fixed=0.051ms speedup=184.9x -N=2000 k=2000 : defective=39.475ms fixed=0.098ms speedup=402.5x - diff --git a/defects/strawberry/bench/run_all.py b/defects/strawberry/bench/run_all.py deleted file mode 100644 index a09e82344..000000000 --- a/defects/strawberry/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-strawberry-0001.py", "bench-strawberry-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/strongswan/Makefile b/defects/strongswan/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/strongswan/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/strongswan/bench/bench-strongswan-0001.py b/defects/strongswan/bench/bench-strongswan-0001.py deleted file mode 100644 index 3e2749a76..000000000 --- a/defects/strongswan/bench/bench-strongswan-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-strongswan-0001.py -# CWE-407 O(P²×T×A²) nested linear scans in proposal_select / select_algo -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== strongswan-0001: CWE-407 O(P²×T×A²) nested linear scans in proposal_select / select_algo ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/strongswan/bench/results.txt b/defects/strongswan/bench/results.txt deleted file mode 100644 index ca50c8ef6..000000000 --- a/defects/strongswan/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== strongswan-0001: CWE-407 O(P²×T×A²) nested linear scans in proposal_select / select_algo === -N=100 k=100 : defective=0.195ms fixed=0.008ms speedup=23.8x -N=500 k=500 : defective=6.191ms fixed=0.048ms speedup=129.5x -N=1000 k=1000 : defective=13.600ms fixed=0.059ms speedup=231.9x -N=2000 k=2000 : defective=34.912ms fixed=0.094ms speedup=370.4x - diff --git a/defects/strongswan/bench/run_all.py b/defects/strongswan/bench/run_all.py deleted file mode 100644 index defd2ab84..000000000 --- a/defects/strongswan/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-strongswan-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/substrate/Makefile b/defects/substrate/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/substrate/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/substrate/bench/bench-substrate-0001.py b/defects/substrate/bench/bench-substrate-0001.py deleted file mode 100644 index 498152b4b..000000000 --- a/defects/substrate/bench/bench-substrate-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-substrate-0001.py -# CWE-407: list-scan inside loop in substrate-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== substrate-0001: CWE-407: list-scan inside loop in substrate-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/substrate/bench/bench-substrate-0002.py b/defects/substrate/bench/bench-substrate-0002.py deleted file mode 100644 index 4695b4d64..000000000 --- a/defects/substrate/bench/bench-substrate-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-substrate-0002.py -# CWE-407: list-scan inside loop in substrate-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== substrate-0002: CWE-407: list-scan inside loop in substrate-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/substrate/bench/bench-substrate-0003.py b/defects/substrate/bench/bench-substrate-0003.py deleted file mode 100644 index 04d45c822..000000000 --- a/defects/substrate/bench/bench-substrate-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-substrate-0003.py -# npos-elections Node::root visited Vec — O(D²) cycle detection -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== substrate-0003: npos-elections Node::root visited Vec — O(D²) cycle detection ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/substrate/bench/results.txt b/defects/substrate/bench/results.txt deleted file mode 100644 index c29c3640d..000000000 --- a/defects/substrate/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== substrate-0001: CWE-407: list-scan inside loop in substrate-0001 (generic model) === -N=500 k=500 : defective=3.322ms fixed=0.030ms speedup=109.0x -N=2000 k=2000 : defective=32.353ms fixed=0.088ms speedup=366.9x -N=5000 k=5000 : defective=213.852ms fixed=0.241ms speedup=886.6x -N=10000 k=10000: defective=869.842ms fixed=0.464ms speedup=1875.1x - -=== substrate-0002: CWE-407: list-scan inside loop in substrate-0002 (generic model) === -N=500 k=500 : defective=1.953ms fixed=0.019ms speedup=100.7x -N=2000 k=2000 : defective=34.482ms fixed=0.091ms speedup=377.7x -N=5000 k=5000 : defective=228.955ms fixed=0.236ms speedup=971.6x -N=10000 k=10000: defective=921.173ms fixed=0.458ms speedup=2009.6x - -=== substrate-0003: npos-elections Node::root visited Vec — O(D²) cycle detection === -N=500 k=500 : defective=1.939ms fixed=0.019ms speedup=100.6x -N=2000 k=2000 : defective=32.188ms fixed=0.090ms speedup=357.6x -N=5000 k=5000 : defective=204.305ms fixed=0.236ms speedup=866.8x -N=10000 k=10000: defective=878.018ms fixed=0.488ms speedup=1800.2x - diff --git a/defects/substrate/bench/run_all.py b/defects/substrate/bench/run_all.py deleted file mode 100644 index 8861ec08c..000000000 --- a/defects/substrate/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-substrate-0001.py", "bench-substrate-0002.py", "bench-substrate-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/suitecrm-0005/Makefile b/defects/suitecrm-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/suitecrm-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/suitecrm-0005/bench/bench-suitecrm-0005-0005.py b/defects/suitecrm-0005/bench/bench-suitecrm-0005-0005.py deleted file mode 100644 index 2e1041b68..000000000 --- a/defects/suitecrm-0005/bench/bench-suitecrm-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0005-0005.py -# CWE-407: list-scan inside loop in suitecrm-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0005-0005: CWE-407: list-scan inside loop in suitecrm-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm-0005/bench/results.txt b/defects/suitecrm-0005/bench/results.txt deleted file mode 100644 index 477d277e6..000000000 --- a/defects/suitecrm-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== suitecrm-0005-0005: CWE-407: list-scan inside loop in suitecrm-0005-0005 (generic model) === -N=100 k=100 : defective=0.101ms fixed=0.004ms speedup=26.3x -N=500 k=500 : defective=2.372ms fixed=0.023ms speedup=103.0x -N=1000 k=1000 : defective=10.130ms fixed=0.046ms speedup=219.8x -N=2000 k=2000 : defective=36.443ms fixed=0.098ms speedup=372.5x - diff --git a/defects/suitecrm-0005/bench/run_all.py b/defects/suitecrm-0005/bench/run_all.py deleted file mode 100644 index b953c39ff..000000000 --- a/defects/suitecrm-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-suitecrm-0005-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/suitecrm-0006/Makefile b/defects/suitecrm-0006/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/suitecrm-0006/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/suitecrm-0006/bench/bench-suitecrm-0006-0006.py b/defects/suitecrm-0006/bench/bench-suitecrm-0006-0006.py deleted file mode 100644 index b62d7851f..000000000 --- a/defects/suitecrm-0006/bench/bench-suitecrm-0006-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0006-0006.py -# CWE-407: list-scan inside loop in suitecrm-0006-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0006-0006: CWE-407: list-scan inside loop in suitecrm-0006-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm-0006/bench/results.txt b/defects/suitecrm-0006/bench/results.txt deleted file mode 100644 index f8ae19c52..000000000 --- a/defects/suitecrm-0006/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== suitecrm-0006-0006: CWE-407: list-scan inside loop in suitecrm-0006-0006 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=3.079ms fixed=0.043ms speedup=71.7x -N=1000 k=1000 : defective=11.079ms fixed=0.047ms speedup=234.7x -N=2000 k=2000 : defective=35.892ms fixed=0.096ms speedup=373.9x - diff --git a/defects/suitecrm-0006/bench/run_all.py b/defects/suitecrm-0006/bench/run_all.py deleted file mode 100644 index fc11b6006..000000000 --- a/defects/suitecrm-0006/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-suitecrm-0006-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/suitecrm/Makefile b/defects/suitecrm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/suitecrm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/suitecrm/bench/bench-suitecrm-0001.py b/defects/suitecrm/bench/bench-suitecrm-0001.py deleted file mode 100644 index add6d34d7..000000000 --- a/defects/suitecrm/bench/bench-suitecrm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0001.py -# CWE-407: list-scan inside loop in suitecrm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0001: CWE-407: list-scan inside loop in suitecrm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm/bench/bench-suitecrm-0002.py b/defects/suitecrm/bench/bench-suitecrm-0002.py deleted file mode 100644 index 5610f254e..000000000 --- a/defects/suitecrm/bench/bench-suitecrm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0002.py -# CWE-407: list-scan inside loop in suitecrm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0002: CWE-407: list-scan inside loop in suitecrm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm/bench/bench-suitecrm-0003.py b/defects/suitecrm/bench/bench-suitecrm-0003.py deleted file mode 100644 index 8cdb7da72..000000000 --- a/defects/suitecrm/bench/bench-suitecrm-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0003.py -# CWE-407: list-scan inside loop in suitecrm-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0003: CWE-407: list-scan inside loop in suitecrm-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm/bench/bench-suitecrm-0004.py b/defects/suitecrm/bench/bench-suitecrm-0004.py deleted file mode 100644 index 62df6f468..000000000 --- a/defects/suitecrm/bench/bench-suitecrm-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0004.py -# CWE-407: list-scan inside loop in suitecrm-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0004: CWE-407: list-scan inside loop in suitecrm-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm/bench/bench-suitecrm-0005-0005.py b/defects/suitecrm/bench/bench-suitecrm-0005-0005.py deleted file mode 100644 index 2e1041b68..000000000 --- a/defects/suitecrm/bench/bench-suitecrm-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0005-0005.py -# CWE-407: list-scan inside loop in suitecrm-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0005-0005: CWE-407: list-scan inside loop in suitecrm-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm/bench/bench-suitecrm-0006-0006.py b/defects/suitecrm/bench/bench-suitecrm-0006-0006.py deleted file mode 100644 index b62d7851f..000000000 --- a/defects/suitecrm/bench/bench-suitecrm-0006-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suitecrm-0006-0006.py -# CWE-407: list-scan inside loop in suitecrm-0006-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suitecrm-0006-0006: CWE-407: list-scan inside loop in suitecrm-0006-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suitecrm/bench/results.txt b/defects/suitecrm/bench/results.txt deleted file mode 100644 index ed25036dc..000000000 --- a/defects/suitecrm/bench/results.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== suitecrm-0001: CWE-407: list-scan inside loop in suitecrm-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.467ms fixed=0.024ms speedup=103.5x -N=1000 k=1000 : defective=10.958ms fixed=0.051ms speedup=213.9x -N=2000 k=2000 : defective=39.171ms fixed=0.098ms speedup=398.6x - -=== suitecrm-0002: CWE-407: list-scan inside loop in suitecrm-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.276ms fixed=0.022ms speedup=104.9x -N=1000 k=1000 : defective=9.426ms fixed=0.046ms speedup=204.9x -N=2000 k=2000 : defective=36.401ms fixed=0.096ms speedup=377.8x - -=== suitecrm-0003: CWE-407: list-scan inside loop in suitecrm-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.187ms fixed=0.020ms speedup=107.7x -N=1000 k=1000 : defective=8.654ms fixed=0.044ms speedup=195.0x -N=2000 k=2000 : defective=36.743ms fixed=0.104ms speedup=352.5x - -=== suitecrm-0004: CWE-407: list-scan inside loop in suitecrm-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.282ms fixed=0.021ms speedup=106.8x -N=1000 k=1000 : defective=8.771ms fixed=0.046ms speedup=190.3x -N=2000 k=2000 : defective=36.224ms fixed=0.101ms speedup=358.3x - -=== suitecrm-0005-0005: CWE-407: list-scan inside loop in suitecrm-0005-0005 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.003ms speedup=27.9x -N=500 k=500 : defective=2.276ms fixed=0.021ms speedup=110.8x -N=1000 k=1000 : defective=8.860ms fixed=0.045ms speedup=197.1x -N=2000 k=2000 : defective=36.991ms fixed=0.098ms speedup=377.5x - -=== suitecrm-0006-0006: CWE-407: list-scan inside loop in suitecrm-0006-0006 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.267ms fixed=0.022ms speedup=105.0x -N=1000 k=1000 : defective=9.209ms fixed=0.046ms speedup=200.9x -N=2000 k=2000 : defective=36.534ms fixed=0.096ms speedup=382.3x - diff --git a/defects/suitecrm/bench/run_all.py b/defects/suitecrm/bench/run_all.py deleted file mode 100644 index 3e45c145e..000000000 --- a/defects/suitecrm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-suitecrm-0001.py", "bench-suitecrm-0002.py", "bench-suitecrm-0003.py", "bench-suitecrm-0004.py", "bench-suitecrm-0005-0005.py", "bench-suitecrm-0006-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/superset/Makefile b/defects/superset/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/superset/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/superset/bench/bench-superset-0001.py b/defects/superset/bench/bench-superset-0001.py deleted file mode 100644 index e5ca27992..000000000 --- a/defects/superset/bench/bench-superset-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-superset-0001.py -# SecurityManager._get_pvms_from_builtin_role pvm dedup O(Regex*PVMs*R) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== superset-0001: SecurityManager._get_pvms_from_builtin_role pvm dedup O(Regex*PVMs*R) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/superset/bench/bench-superset-0002.py b/defects/superset/bench/bench-superset-0002.py deleted file mode 100644 index a766c8634..000000000 --- a/defects/superset/bench/bench-superset-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-superset-0002.py -# DashboardDAO.update_native_filters_config filter dedup O(M*U) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== superset-0002: DashboardDAO.update_native_filters_config filter dedup O(M*U) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/superset/bench/bench-superset-0003.py b/defects/superset/bench/bench-superset-0003.py deleted file mode 100644 index 128e08a28..000000000 --- a/defects/superset/bench/bench-superset-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-superset-0003.py -# import_datasource metric/column dedup O(N^2) list rebuild -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== superset-0003: import_datasource metric/column dedup O(N^2) list rebuild ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/superset/bench/results.txt b/defects/superset/bench/results.txt deleted file mode 100644 index e6ac7eb8d..000000000 --- a/defects/superset/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== superset-0001: SecurityManager._get_pvms_from_builtin_role pvm dedup O(Regex*PVMs*R) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.633ms fixed=0.024ms speedup=109.9x -N=1000 k=1000 : defective=10.650ms fixed=0.053ms speedup=202.3x -N=2000 k=2000 : defective=39.352ms fixed=0.100ms speedup=393.0x - -=== superset-0002: DashboardDAO.update_native_filters_config filter dedup O(M*U) === -N=100 k=100 : defective=0.246ms fixed=0.015ms speedup=16.0x -N=500 k=500 : defective=2.296ms fixed=0.021ms speedup=111.3x -N=1000 k=1000 : defective=8.873ms fixed=0.047ms speedup=189.2x -N=2000 k=2000 : defective=40.312ms fixed=0.096ms speedup=420.0x - -=== superset-0003: import_datasource metric/column dedup O(N^2) list rebuild === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.158ms fixed=0.021ms speedup=103.7x -N=1000 k=1000 : defective=10.442ms fixed=0.046ms speedup=229.0x -N=2000 k=2000 : defective=40.248ms fixed=0.101ms speedup=399.9x - diff --git a/defects/superset/bench/run_all.py b/defects/superset/bench/run_all.py deleted file mode 100644 index 89d5ed130..000000000 --- a/defects/superset/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-superset-0001.py", "bench-superset-0002.py", "bench-superset-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/supertuxkart-0001/Makefile b/defects/supertuxkart-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/supertuxkart-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/supertuxkart-0001/bench/bench-supertuxkart-0001-0001.py b/defects/supertuxkart-0001/bench/bench-supertuxkart-0001-0001.py deleted file mode 100644 index 18aea9d79..000000000 --- a/defects/supertuxkart-0001/bench/bench-supertuxkart-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-supertuxkart-0001-0001.py -# CWE-407: list-scan inside loop in supertuxkart-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== supertuxkart-0001-0001: CWE-407: list-scan inside loop in supertuxkart-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/supertuxkart-0001/bench/results.txt b/defects/supertuxkart-0001/bench/results.txt deleted file mode 100644 index f4746a605..000000000 --- a/defects/supertuxkart-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== supertuxkart-0001-0001: CWE-407: list-scan inside loop in supertuxkart-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.576ms fixed=0.025ms speedup=103.6x -N=1000 k=1000 : defective=10.712ms fixed=0.057ms speedup=189.2x -N=2000 k=2000 : defective=39.928ms fixed=0.095ms speedup=418.7x - diff --git a/defects/supertuxkart-0001/bench/run_all.py b/defects/supertuxkart-0001/bench/run_all.py deleted file mode 100644 index ba4274354..000000000 --- a/defects/supertuxkart-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-supertuxkart-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/supertuxkart-0002/Makefile b/defects/supertuxkart-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/supertuxkart-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/supertuxkart-0002/bench/bench-supertuxkart-0002-0002.py b/defects/supertuxkart-0002/bench/bench-supertuxkart-0002-0002.py deleted file mode 100644 index 46819f7f4..000000000 --- a/defects/supertuxkart-0002/bench/bench-supertuxkart-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-supertuxkart-0002-0002.py -# CWE-407: list-scan inside loop in supertuxkart-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== supertuxkart-0002-0002: CWE-407: list-scan inside loop in supertuxkart-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/supertuxkart-0002/bench/results.txt b/defects/supertuxkart-0002/bench/results.txt deleted file mode 100644 index c1a3bd2bc..000000000 --- a/defects/supertuxkart-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== supertuxkart-0002-0002: CWE-407: list-scan inside loop in supertuxkart-0002-0002 (generic model) === -N=100 k=100 : defective=0.059ms fixed=0.002ms speedup=24.7x -N=500 k=500 : defective=1.503ms fixed=0.014ms speedup=104.1x -N=1000 k=1000 : defective=5.790ms fixed=0.029ms speedup=201.5x -N=2000 k=2000 : defective=23.911ms fixed=0.063ms speedup=382.3x - diff --git a/defects/supertuxkart-0002/bench/run_all.py b/defects/supertuxkart-0002/bench/run_all.py deleted file mode 100644 index 6bc70076c..000000000 --- a/defects/supertuxkart-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-supertuxkart-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/suricata-0001/Makefile b/defects/suricata-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/suricata-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/suricata-0001/bench/bench-suricata-0001-0001.py b/defects/suricata-0001/bench/bench-suricata-0001-0001.py deleted file mode 100644 index 53e723da6..000000000 --- a/defects/suricata-0001/bench/bench-suricata-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suricata-0001-0001.py -# CWE-407: list-scan inside loop in suricata-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suricata-0001-0001: CWE-407: list-scan inside loop in suricata-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suricata-0001/bench/results.txt b/defects/suricata-0001/bench/results.txt deleted file mode 100644 index c05304b16..000000000 --- a/defects/suricata-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== suricata-0001-0001: CWE-407: list-scan inside loop in suricata-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.297ms fixed=0.022ms speedup=106.2x -N=1000 k=1000 : defective=9.001ms fixed=0.047ms speedup=190.6x -N=2000 k=2000 : defective=37.396ms fixed=0.097ms speedup=385.5x - diff --git a/defects/suricata-0001/bench/run_all.py b/defects/suricata-0001/bench/run_all.py deleted file mode 100644 index 396266256..000000000 --- a/defects/suricata-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-suricata-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/suricata-0002/Makefile b/defects/suricata-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/suricata-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/suricata-0002/bench/bench-suricata-0002-0002.py b/defects/suricata-0002/bench/bench-suricata-0002-0002.py deleted file mode 100644 index c1f62f0f8..000000000 --- a/defects/suricata-0002/bench/bench-suricata-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-suricata-0002-0002.py -# CWE-407: list-scan inside loop in suricata-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== suricata-0002-0002: CWE-407: list-scan inside loop in suricata-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/suricata-0002/bench/results.txt b/defects/suricata-0002/bench/results.txt deleted file mode 100644 index 466de9897..000000000 --- a/defects/suricata-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== suricata-0002-0002: CWE-407: list-scan inside loop in suricata-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.458ms fixed=0.024ms speedup=101.5x -N=1000 k=1000 : defective=10.298ms fixed=0.053ms speedup=194.2x -N=2000 k=2000 : defective=40.859ms fixed=0.102ms speedup=400.5x - diff --git a/defects/suricata-0002/bench/run_all.py b/defects/suricata-0002/bench/run_all.py deleted file mode 100644 index ac6651f4c..000000000 --- a/defects/suricata-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-suricata-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/swift/Makefile b/defects/swift/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/swift/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/swift/bench/bench-swift-0001.py b/defects/swift/bench/bench-swift-0001.py deleted file mode 100644 index 1c77fee82..000000000 --- a/defects/swift/bench/bench-swift-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-swift-0001.py -# Severity: MEDIUM — O(I x A) where I=instructions, A=large loadable args per function -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== swift-0001: Severity: MEDIUM — O(I x A) where I=instructions, A=large loadable args per function ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/swift/bench/bench-swift-0002.py b/defects/swift/bench/bench-swift-0002.py deleted file mode 100644 index 725409eb5..000000000 --- a/defects/swift/bench/bench-swift-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-swift-0002.py -# swift-0001: isInMinimizationDomain — O(P) linear scan in O(R) rule loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== swift-0002: swift-0001: isInMinimizationDomain — O(P) linear scan in O(R) rule loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/swift/bench/results.txt b/defects/swift/bench/results.txt deleted file mode 100644 index 1d28f0e38..000000000 --- a/defects/swift/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== swift-0001: Severity: MEDIUM — O(I x A) where I=instructions, A=large loadable args per function === -N=100 k=100 : defective=0.101ms fixed=0.005ms speedup=19.4x -N=500 k=500 : defective=2.538ms fixed=0.023ms speedup=111.6x -N=1000 k=1000 : defective=10.160ms fixed=0.074ms speedup=136.6x -N=2000 k=2000 : defective=36.476ms fixed=0.097ms speedup=376.8x - -=== swift-0002: swift-0001: isInMinimizationDomain — O(P) linear scan in O(R) rule loop === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.236ms fixed=0.021ms speedup=107.8x -N=1000 k=1000 : defective=8.852ms fixed=0.047ms speedup=186.8x -N=2000 k=2000 : defective=36.649ms fixed=0.097ms speedup=378.1x - diff --git a/defects/swift/bench/run_all.py b/defects/swift/bench/run_all.py deleted file mode 100644 index 9080b21e2..000000000 --- a/defects/swift/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-swift-0001.py", "bench-swift-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/symfony/bench/bench-symfony-0001.py b/defects/symfony/bench/bench-symfony-0001.py deleted file mode 100644 index 5b61dd14d..000000000 --- a/defects/symfony/bench/bench-symfony-0001.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -Benchmark for UNDF-2026-000001310 / symfony-0001 -PropertyAccessor::writeCollection — O(P*C) -> O(P+C) via dual lookup -(SplObjectStorage for objects + serialize-keyed array for scalars). - -The Symfony PropertyAccessor walks `previousValue` and `collection` doing -in_array($item, $other, true) per pass. For P previous items + C new items -the cost is O(P*C) per write. For a Doctrine entity with a OneToMany -association of N items being updated to N different items, the cost is -O(N^2). - -This Python bench models the cost in equivalent terms (set operations -mirror SplObjectStorage / serialize lookup). The PHP fix is in the .patch -file; this bench validates the complexity-class change is real. -""" -import random -import time - - -class Item: - __slots__ = ("id",) - def __init__(self, id_): - self.id = id_ - - -def bench_defective(previous, collection): - # Symfony's current shape: in_array($item, $other, true) per pass. - # In Python: list membership via `in`. - removed = 0 - for item in previous: - if item not in collection: - removed += 1 - added = 0 - for item in collection: - if item not in previous: - added += 1 - return removed, added - - -def bench_fixed(previous, collection): - # Build object lookup (id() set) once, then O(1) membership. - # SplObjectStorage / WeakSet equivalent via id(). - prev_set = {id(x) for x in previous} - coll_set = {id(x) for x in collection} - removed = sum(1 for item in previous if id(item) not in coll_set) - added = sum(1 for item in collection if id(item) not in prev_set) - return removed, added - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - t0 = time.perf_counter() - fn(*args) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== symfony-0001: PropertyAccessor::writeCollection O(P*C) -> O(P+C) ===") - out.append("") - out.append(f"{'scale':>22} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 60) - for n_prev, n_coll in [ - (100, 100), # small entity collection - (300, 300), # mid (e.g. user with many tags) - (500, 500), # large - (1000, 1000), # very large - (2000, 2000), # extreme (denormalized media library) - ]: - # Pool of objects; ~50% overlap between previous and new (typical - # update pattern: most stays, some added, some removed). - pool = [Item(i) for i in range(n_prev + n_coll)] - previous = random.sample(pool, n_prev) - collection = random.sample(pool, n_coll) - d = best_of(bench_defective, previous, collection) - f = best_of(bench_fixed, previous, collection) - speedup = d / f if f > 0 else float("inf") - out.append( - f" P={n_prev:>5} C={n_coll:>5} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: dual-lookup hoist (SplObjectStorage + serialize-keyed array).") - out.append("Symfony Doctrine entities with deep OneToMany hit O(N^2) without this fix.") - print("\n".join(out)) - - -if __name__ == "__main__": - main() diff --git a/defects/symfony/bench/results.txt b/defects/symfony/bench/results.txt deleted file mode 100644 index 87a4efcad..000000000 --- a/defects/symfony/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== symfony-0001: PropertyAccessor::writeCollection O(P*C) -> O(P+C) === - - scale defective fixed speedup ------------------------------------------------------------- - P= 100 C= 100 0.27ms 0.05ms 5.2x - P= 300 C= 300 3.72ms 0.22ms 16.8x - P= 500 C= 500 10.53ms 0.38ms 27.6x - P= 1000 C= 1000 43.75ms 0.85ms 51.8x - P= 2000 C= 2000 183.87ms 2.08ms 88.4x - -Conclusion: dual-lookup hoist (SplObjectStorage + serialize-keyed array). -Symfony Doctrine entities with deep OneToMany hit O(N^2) without this fix. diff --git a/defects/symfony/patch/symfony-0001-propertyaccessor-writecollection-dual-lookup.patch b/defects/symfony/patch/symfony-0001-propertyaccessor-writecollection-dual-lookup.patch deleted file mode 100644 index f32df4f8d..000000000 --- a/defects/symfony/patch/symfony-0001-propertyaccessor-writecollection-dual-lookup.patch +++ /dev/null @@ -1,92 +0,0 @@ -# UNDF: UNDF-2026-000001310 -# CWE-407: Algorithmic Complexity — O(P*C) -> O(P+C) in -# PropertyAccessor::writeCollection -# -# Defect: src/Symfony/Component/PropertyAccess/PropertyAccessor.php:580-595 -# The collection diff calls in_array($item, $collection, true) per item -# in $previousValue, then in_array($item, $previousValue, true) per item -# in $collection. PHP's in_array() with strict mode is O(N) per call. -# Per write: O(P*C) where P = previous-collection size, C = new-collection -# size. For Symfony Doctrine entities with deep OneToMany associations, -# N=100..2000 is realistic. -# -# Fix: build dual lookup once before the diff: -# - SplObjectStorage for object items (O(1) identity) -# - Associative array indexed by serialize($item) for scalar/array items -# (O(1) hashed lookup; serialize() canonicalizes equals) -# Both pointer-equal and value-equal cases handled. Falls back to in_array -# for resource items (rare; can't be hashed). -# -# Complexity gate (defects/symfony/bench/bench-symfony-0001.py): -# P=2000 C=2000: defective ~180ms, fixed <5ms (>=30x speedup) -# k-scaling 5x: time ratio must be <17.5x (O(N) ~5x not O(N^2) ~25x) ---- a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php -+++ b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php -@@ -575,18 +575,33 @@ class PropertyAccessor implements PropertyAccessorInterface - if ($previousValue && \is_array($previousValue)) { - if (\is_object($collection)) { - $collection = iterator_to_array($collection); - } -+ // Build dual lookup for $collection: O(1) membership during the -+ // remove pass (was O(C) in_array per previous item -> O(P*C) total). -+ [$collObj, $collScalar, $collFallback] = self::buildLookup($collection); - foreach ($previousValue as $key => $item) { -- if (!\in_array($item, $collection, true)) { -+ if (!self::lookupContains($collObj, $collScalar, $collFallback, $item, $collection)) { - unset($previousValue[$key]); - $zval[self::VALUE]->$removeMethodName($item); - } - } - } else { - $previousValue = false; - } - -+ // Build dual lookup for $previousValue (now an array after the remove -+ // pass) so the add pass is O(C) instead of O(P*C). -+ if ($previousValue && \is_array($previousValue)) { -+ [$prevObj, $prevScalar, $prevFallback] = self::buildLookup($previousValue); -+ } else { -+ $prevObj = $prevScalar = $prevFallback = null; -+ } - foreach ($collection as $item) { -- if (!$previousValue || !\in_array($item, $previousValue, true)) { -+ if (!$previousValue || !self::lookupContains($prevObj, $prevScalar, $prevFallback, $item, $previousValue)) { - $zval[self::VALUE]->$addMethodName($item); - } - } - } -+ -+ /** -+ * Builds dual lookup (SplObjectStorage + serialize-keyed assoc array) -+ * over $items for O(1) strict-equality membership checks against scalars -+ * and objects. Resources / unhashable items go to a fallback list that -+ * triggers slow-path in_array() lookup. -+ */ -+ private static function buildLookup(array $items): array -+ { -+ $obj = new \SplObjectStorage(); -+ $scalar = []; -+ $fallback = []; -+ foreach ($items as $item) { -+ if (\is_object($item)) { -+ $obj->attach($item); -+ } elseif (\is_resource($item)) { -+ $fallback[] = $item; -+ } else { -+ $scalar[serialize($item)] = true; -+ } -+ } -+ return [$obj, $scalar, $fallback]; -+ } -+ -+ private static function lookupContains(\SplObjectStorage $obj, array $scalar, array $fallback, $needle, array $allItems): bool -+ { -+ if (\is_object($needle)) { -+ return $obj->contains($needle); -+ } -+ if (\is_resource($needle)) { -+ return \in_array($needle, $allItems, true); // rare; can't hash -+ } -+ return isset($scalar[serialize($needle)]); -+ } -} diff --git a/defects/synapse/Makefile b/defects/synapse/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/synapse/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/synapse/bench/bench-synapse-0001.py b/defects/synapse/bench/bench-synapse-0001.py deleted file mode 100644 index d9607866f..000000000 --- a/defects/synapse/bench/bench-synapse-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-synapse-0001.py -# File: synapse/handlers/sync.py -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== synapse-0001: File: synapse/handlers/sync.py ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/synapse/bench/bench-synapse-0002.py b/defects/synapse/bench/bench-synapse-0002.py deleted file mode 100644 index e657961b3..000000000 --- a/defects/synapse/bench/bench-synapse-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-synapse-0002.py -# CWE-407: list-scan inside loop in synapse-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== synapse-0002: CWE-407: list-scan inside loop in synapse-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/synapse/bench/results.txt b/defects/synapse/bench/results.txt deleted file mode 100644 index adacbb3c6..000000000 --- a/defects/synapse/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== synapse-0001: File: synapse/handlers/sync.py === -N=500 k=500 : defective=2.012ms fixed=0.020ms speedup=100.3x -N=2000 k=2000 : defective=34.948ms fixed=0.092ms speedup=379.0x -N=5000 k=5000 : defective=213.298ms fixed=0.228ms speedup=933.9x -N=10000 k=10000: defective=920.195ms fixed=0.478ms speedup=1926.6x - -=== synapse-0002: CWE-407: list-scan inside loop in synapse-0002 (generic model) === -N=500 k=500 : defective=2.023ms fixed=0.020ms speedup=102.9x -N=2000 k=2000 : defective=33.294ms fixed=0.091ms speedup=367.2x -N=5000 k=5000 : defective=216.012ms fixed=0.238ms speedup=906.0x -N=10000 k=10000: defective=874.633ms fixed=0.460ms speedup=1902.7x - diff --git a/defects/synapse/bench/run_all.py b/defects/synapse/bench/run_all.py deleted file mode 100644 index 74f70d361..000000000 --- a/defects/synapse/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-synapse-0001.py", "bench-synapse-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/syncthing/Makefile b/defects/syncthing/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/syncthing/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/syncthing/bench/bench-syncthing-0001.py b/defects/syncthing/bench/bench-syncthing-0001.py deleted file mode 100644 index cc030d509..000000000 --- a/defects/syncthing/bench/bench-syncthing-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-syncthing-0001.py -# File: lib/model/devicedownloadstate.go -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== syncthing-0001: File: lib/model/devicedownloadstate.go ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/syncthing/bench/results.txt b/defects/syncthing/bench/results.txt deleted file mode 100644 index 14aeac1b4..000000000 --- a/defects/syncthing/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== syncthing-0001: File: lib/model/devicedownloadstate.go === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.136ms fixed=0.022ms speedup=97.6x -N=1000 k=1000 : defective=8.842ms fixed=0.046ms speedup=194.3x -N=2000 k=2000 : defective=35.612ms fixed=0.098ms speedup=364.1x - diff --git a/defects/syncthing/bench/run_all.py b/defects/syncthing/bench/run_all.py deleted file mode 100644 index 18aaec918..000000000 --- a/defects/syncthing/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-syncthing-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/synfig-0001/Makefile b/defects/synfig-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/synfig-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/synfig-0001/bench/bench-synfig-0001-0001.py b/defects/synfig-0001/bench/bench-synfig-0001-0001.py deleted file mode 100644 index f3df197f3..000000000 --- a/defects/synfig-0001/bench/bench-synfig-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-synfig-0001-0001.py -# CWE-407: list-scan inside loop in synfig-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== synfig-0001-0001: CWE-407: list-scan inside loop in synfig-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/synfig-0001/bench/results.txt b/defects/synfig-0001/bench/results.txt deleted file mode 100644 index 7a8d8982c..000000000 --- a/defects/synfig-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== synfig-0001-0001: CWE-407: list-scan inside loop in synfig-0001-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=26.1x -N=500 k=500 : defective=2.629ms fixed=0.100ms speedup=26.3x -N=1000 k=1000 : defective=10.695ms fixed=0.053ms speedup=202.1x -N=2000 k=2000 : defective=41.257ms fixed=0.096ms speedup=429.5x - diff --git a/defects/synfig-0001/bench/run_all.py b/defects/synfig-0001/bench/run_all.py deleted file mode 100644 index c02255379..000000000 --- a/defects/synfig-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-synfig-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/systemd-0004/Makefile b/defects/systemd-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/systemd-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/systemd-0004/bench/bench-systemd-0004-0001.py b/defects/systemd-0004/bench/bench-systemd-0004-0001.py deleted file mode 100644 index e8e879dc9..000000000 --- a/defects/systemd-0004/bench/bench-systemd-0004-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0004-0001.py -# CWE-407: list-scan inside loop in systemd-0004-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0004-0001: CWE-407: list-scan inside loop in systemd-0004-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd-0004/bench/bench-systemd-0004-0004.py b/defects/systemd-0004/bench/bench-systemd-0004-0004.py deleted file mode 100644 index 92cd30204..000000000 --- a/defects/systemd-0004/bench/bench-systemd-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0004-0004.py -# CWE-407: list-scan inside loop in systemd-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0004-0004: CWE-407: list-scan inside loop in systemd-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd-0004/bench/results.txt b/defects/systemd-0004/bench/results.txt deleted file mode 100644 index 961f1d1c9..000000000 --- a/defects/systemd-0004/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== systemd-0004-0001: CWE-407: list-scan inside loop in systemd-0004-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.536ms fixed=0.024ms speedup=107.7x -N=1000 k=1000 : defective=10.237ms fixed=0.054ms speedup=190.9x -N=2000 k=2000 : defective=39.475ms fixed=0.097ms speedup=408.1x - -=== systemd-0004-0004: CWE-407: list-scan inside loop in systemd-0004-0004 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=100.8x -N=1000 k=1000 : defective=8.816ms fixed=0.045ms speedup=194.1x -N=2000 k=2000 : defective=38.578ms fixed=0.098ms speedup=394.0x - diff --git a/defects/systemd-0004/bench/run_all.py b/defects/systemd-0004/bench/run_all.py deleted file mode 100644 index 17aecc5cb..000000000 --- a/defects/systemd-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-systemd-0004-0001.py", "bench-systemd-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/systemd/Makefile b/defects/systemd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/systemd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/systemd/bench/bench-systemd-0001.py b/defects/systemd/bench/bench-systemd-0001.py deleted file mode 100644 index 4d21002cf..000000000 --- a/defects/systemd/bench/bench-systemd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0001.py -# strv_extend_strv filter_duplicates O(N²) — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0001: strv_extend_strv filter_duplicates O(N²) — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd/bench/bench-systemd-0002.py b/defects/systemd/bench/bench-systemd-0002.py deleted file mode 100644 index c3d80aaf0..000000000 --- a/defects/systemd/bench/bench-systemd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0002.py -# unit_file_get_list states filter O(U×S) — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0002: unit_file_get_list states filter O(U×S) — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd/bench/bench-systemd-0003.py b/defects/systemd/bench/bench-systemd-0003.py deleted file mode 100644 index 43d37cf4e..000000000 --- a/defects/systemd/bench/bench-systemd-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0003.py -# dbus-cgroup IPIngressFilterPath/IPEgressFilterPath dedup O(N²) — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0003: dbus-cgroup IPIngressFilterPath/IPEgressFilterPath dedup O(N²) — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd/bench/bench-systemd-0004-0001.py b/defects/systemd/bench/bench-systemd-0004-0001.py deleted file mode 100644 index e8e879dc9..000000000 --- a/defects/systemd/bench/bench-systemd-0004-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0004-0001.py -# CWE-407: list-scan inside loop in systemd-0004-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0004-0001: CWE-407: list-scan inside loop in systemd-0004-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd/bench/bench-systemd-0004-0004.py b/defects/systemd/bench/bench-systemd-0004-0004.py deleted file mode 100644 index 92cd30204..000000000 --- a/defects/systemd/bench/bench-systemd-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-systemd-0004-0004.py -# CWE-407: list-scan inside loop in systemd-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== systemd-0004-0004: CWE-407: list-scan inside loop in systemd-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/systemd/bench/results.txt b/defects/systemd/bench/results.txt deleted file mode 100644 index 1e58c307e..000000000 --- a/defects/systemd/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== systemd-0001: strv_extend_strv filter_duplicates O(N²) — CWE-407 === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.376ms fixed=0.022ms speedup=107.0x -N=1000 k=1000 : defective=11.118ms fixed=0.051ms speedup=220.1x -N=2000 k=2000 : defective=36.030ms fixed=0.096ms speedup=373.5x - -=== systemd-0002: unit_file_get_list states filter O(U×S) — CWE-407 === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.143ms fixed=0.021ms speedup=104.0x -N=1000 k=1000 : defective=8.872ms fixed=0.046ms speedup=194.5x -N=2000 k=2000 : defective=36.912ms fixed=0.101ms speedup=363.7x - -=== systemd-0003: dbus-cgroup IPIngressFilterPath/IPEgressFilterPath dedup O(N²) — CWE-407 === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.100ms fixed=0.021ms speedup=101.8x -N=1000 k=1000 : defective=10.010ms fixed=0.046ms speedup=216.0x -N=2000 k=2000 : defective=35.122ms fixed=0.097ms speedup=361.5x - -=== systemd-0004-0001: CWE-407: list-scan inside loop in systemd-0004-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.415ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=9.939ms fixed=0.052ms speedup=189.3x -N=2000 k=2000 : defective=37.695ms fixed=0.099ms speedup=381.5x - -=== systemd-0004-0004: CWE-407: list-scan inside loop in systemd-0004-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.359ms fixed=0.022ms speedup=107.7x -N=1000 k=1000 : defective=9.442ms fixed=0.049ms speedup=191.9x -N=2000 k=2000 : defective=39.868ms fixed=0.095ms speedup=419.2x - diff --git a/defects/systemd/bench/run_all.py b/defects/systemd/bench/run_all.py deleted file mode 100644 index 04661a414..000000000 --- a/defects/systemd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-systemd-0001.py", "bench-systemd-0002.py", "bench-systemd-0003.py", "bench-systemd-0004-0001.py", "bench-systemd-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/taiga-0001/Makefile b/defects/taiga-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/taiga-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/taiga-0001/bench/bench-taiga-0001-0001.py b/defects/taiga-0001/bench/bench-taiga-0001-0001.py deleted file mode 100644 index f12e60152..000000000 --- a/defects/taiga-0001/bench/bench-taiga-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-taiga-0001-0001.py -# CWE-407: list-scan inside loop in taiga-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== taiga-0001-0001: CWE-407: list-scan inside loop in taiga-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/taiga-0001/bench/results.txt b/defects/taiga-0001/bench/results.txt deleted file mode 100644 index 148eec3dc..000000000 --- a/defects/taiga-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== taiga-0001-0001: CWE-407: list-scan inside loop in taiga-0001-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.005ms speedup=21.8x -N=500 k=500 : defective=2.427ms fixed=0.024ms speedup=103.2x -N=1000 k=1000 : defective=10.367ms fixed=0.052ms speedup=198.1x -N=2000 k=2000 : defective=40.580ms fixed=0.097ms speedup=418.5x - diff --git a/defects/taiga-0001/bench/run_all.py b/defects/taiga-0001/bench/run_all.py deleted file mode 100644 index 28f63342e..000000000 --- a/defects/taiga-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-taiga-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tcl/Makefile b/defects/tcl/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tcl/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tcl/bench/bench-tcl-0001.py b/defects/tcl/bench/bench-tcl-0001.py deleted file mode 100644 index 381fbe459..000000000 --- a/defects/tcl/bench/bench-tcl-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tcl-0001.py -# DoImport O(C×P) export pattern scan per namespace import -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tcl-0001: DoImport O(C×P) export pattern scan per namespace import ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tcl/bench/results.txt b/defects/tcl/bench/results.txt deleted file mode 100644 index 07b5db338..000000000 --- a/defects/tcl/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tcl-0001: DoImport O(C×P) export pattern scan per namespace import === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.575ms fixed=0.025ms speedup=102.1x -N=1000 k=1000 : defective=11.538ms fixed=0.055ms speedup=209.7x -N=2000 k=2000 : defective=36.787ms fixed=0.099ms speedup=371.2x - diff --git a/defects/tcl/bench/run_all.py b/defects/tcl/bench/run_all.py deleted file mode 100644 index a61949bbc..000000000 --- a/defects/tcl/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tcl-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/telegraf/Makefile b/defects/telegraf/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/telegraf/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/telegraf/bench/bench-telegraf-0001.py b/defects/telegraf/bench/bench-telegraf-0001.py deleted file mode 100644 index 039ef380a..000000000 --- a/defects/telegraf/bench/bench-telegraf-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-telegraf-0001.py -# In plugins/processors/dedup/dedup.go, the Apply() method compares each field -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== telegraf-0001: In plugins/processors/dedup/dedup.go, the Apply() method compares each field ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/telegraf/bench/results.txt b/defects/telegraf/bench/results.txt deleted file mode 100644 index ea5c8472e..000000000 --- a/defects/telegraf/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== telegraf-0001: In plugins/processors/dedup/dedup.go, the Apply() method compares each field === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.341ms fixed=0.023ms speedup=103.7x -N=1000 k=1000 : defective=9.743ms fixed=0.050ms speedup=195.0x -N=2000 k=2000 : defective=35.343ms fixed=0.096ms speedup=369.5x - diff --git a/defects/telegraf/bench/run_all.py b/defects/telegraf/bench/run_all.py deleted file mode 100644 index 4bee8e40f..000000000 --- a/defects/telegraf/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-telegraf-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tensorflow/Makefile b/defects/tensorflow/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tensorflow/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tensorflow/bench/bench-tensorflow-0001.py b/defects/tensorflow/bench/bench-tensorflow-0001.py deleted file mode 100644 index 74084f3f3..000000000 --- a/defects/tensorflow/bench/bench-tensorflow-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tensorflow-0001.py -# tensorflow-0001 — execute.cc IsHostMemoryArg O(N²) per-op dispatch -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tensorflow-0001: tensorflow-0001 — execute.cc IsHostMemoryArg O(N²) per-op dispatch ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tensorflow/bench/results.txt b/defects/tensorflow/bench/results.txt deleted file mode 100644 index 014584fe6..000000000 --- a/defects/tensorflow/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tensorflow-0001: tensorflow-0001 — execute.cc IsHostMemoryArg O(N²) per-op dispatch === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.151ms fixed=0.021ms speedup=104.7x -N=1000 k=1000 : defective=8.907ms fixed=0.049ms speedup=182.5x -N=2000 k=2000 : defective=38.441ms fixed=0.353ms speedup=108.8x - diff --git a/defects/tensorflow/bench/run_all.py b/defects/tensorflow/bench/run_all.py deleted file mode 100644 index 6ede56ede..000000000 --- a/defects/tensorflow/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tensorflow-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/terraform/Makefile b/defects/terraform/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/terraform/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/terraform/bench/bench-terraform-0001.py b/defects/terraform/bench/bench-terraform-0001.py deleted file mode 100644 index dff858394..000000000 --- a/defects/terraform/bench/bench-terraform-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-terraform-0001.py -# Fix: add inStack map[Vertex]bool for O(1) membership test -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== terraform-0001: Fix: add inStack map[Vertex]bool for O(1) membership test ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/terraform/bench/bench-terraform-0002.py b/defects/terraform/bench/bench-terraform-0002.py deleted file mode 100644 index 468762107..000000000 --- a/defects/terraform/bench/bench-terraform-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-terraform-0002.py -# CWE-407: list-scan inside loop in terraform-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== terraform-0002: CWE-407: list-scan inside loop in terraform-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/terraform/bench/results.txt b/defects/terraform/bench/results.txt deleted file mode 100644 index 9b199e269..000000000 --- a/defects/terraform/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== terraform-0001: Fix: add inStack map[Vertex]bool for O(1) membership test === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.483ms fixed=0.024ms speedup=104.3x -N=1000 k=1000 : defective=9.989ms fixed=0.053ms speedup=189.0x -N=2000 k=2000 : defective=40.819ms fixed=0.214ms speedup=191.1x - -=== terraform-0002: CWE-407: list-scan inside loop in terraform-0002 (generic model) === -N=100 k=100 : defective=0.172ms fixed=0.004ms speedup=47.3x -N=500 k=500 : defective=2.429ms fixed=0.025ms speedup=95.7x -N=1000 k=1000 : defective=9.418ms fixed=0.050ms speedup=186.9x -N=2000 k=2000 : defective=38.853ms fixed=0.106ms speedup=368.3x - diff --git a/defects/terraform/bench/run_all.py b/defects/terraform/bench/run_all.py deleted file mode 100644 index 484551c3a..000000000 --- a/defects/terraform/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-terraform-0001.py", "bench-terraform-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/testcafe/Makefile b/defects/testcafe/Makefile deleted file mode 100644 index 219321214..000000000 --- a/defects/testcafe/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# testcafe patch test + bench runner - -PYTHON := python3 -TEST_FILE := tests/test-testcafe-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/testcafe/bench/bench-testcafe-0001.py b/defects/testcafe/bench/bench-testcafe-0001.py deleted file mode 100644 index 901ee559a..000000000 --- a/defects/testcafe/bench/bench-testcafe-0001.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -# bench-testcafe-0001.py -# Selector.filterNodes: matchingArr.indexOf(node) > -1 per node (O(N*M)) -# vs matchingSet.has(node) (O(N+M)). -# Selector.expandSelectorResults: result.indexOf(deriv) < 0 on growing result -# (worst O(N*K*(N*K))) vs parallel seen Set (O(N*K)). - -import sys -import time - - -class Node: - """Unique object acting as DOM Node for identity-based dedup.""" - __slots__ = ("id",) - def __init__(self, i): - self.id = i - - -def bench_filter_defective(n, m): - """matchingArr.indexOf(node) > -1 per node.""" - matching = [Node(i) for i in range(m)] - nodes = matching + [Node(1000 + i) for i in range(n - m)] # N total, M match - - t0 = time.perf_counter() - matchingArr = [x for x in matching] - # lambda filter captures matchingArr - filter_fn = lambda node: matchingArr.index(node) > -1 if node in matchingArr else False - # simpler: node in matchingArr (list) = O(M) per check - result = [] - for node in nodes: - if node in matchingArr: - result.append(node) - return time.perf_counter() - t0 - - -def bench_filter_fixed(n, m): - """matchingSet.has(node).""" - matching = [Node(i) for i in range(m)] - nodes = matching + [Node(1000 + i) for i in range(n - m)] - - t0 = time.perf_counter() - matchingSet = set(matching) - result = [] - for node in nodes: - if node in matchingSet: - result.append(node) - return time.perf_counter() - t0 - - -def bench_expand_defective(n, k): - """result.indexOf(deriv) < 0 against growing result.""" - # All derivatives unique so result grows to N*K - nodes = [Node(i) for i in range(n)] - derivatives_per_node = [[Node(i * 10000 + j) for j in range(k)] for i in range(n)] - - t0 = time.perf_counter() - result = [] - for i in range(n): - for deriv in derivatives_per_node[i]: - if deriv not in result: # O(|result|) - result.append(deriv) - return time.perf_counter() - t0 - - -def bench_expand_fixed(n, k): - """Parallel seen Set.""" - nodes = [Node(i) for i in range(n)] - derivatives_per_node = [[Node(i * 10000 + j) for j in range(k)] for i in range(n)] - - t0 = time.perf_counter() - seen = set() - result = [] - for i in range(n): - for deriv in derivatives_per_node[i]: - if deriv not in seen: - seen.add(deriv) - result.append(deriv) - return time.perf_counter() - t0 - - -TRIALS = 3 -FILTER_CASES = [(100, 50), (500, 250), (1000, 500), (2000, 1000)] -EXPAND_CASES = [(20, 20), (50, 50), (100, 100), (150, 150)] - - -def run(): - lines = [] - h = "=== testcafe-0001 filterNodes: indexOf vs Set.has ===" - print(h); lines.append(h) - for n, m in FILTER_CASES: - d = min(bench_filter_defective(n, m) for _ in range(TRIALS)) - f = min(bench_filter_fixed(n, m) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - l = f"N={n:<5} M={m:<5}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(l); lines.append(l); sys.stdout.flush() - - h = "=== testcafe-0001 expandSelectorResults: indexOf vs Set.has ===" - print(h); lines.append(h) - for n, k in EXPAND_CASES: - d = min(bench_expand_defective(n, k) for _ in range(TRIALS)) - f = min(bench_expand_fixed(n, k) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - l = f"N={n:<4} K={k:<4} (total {n*k}): defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(l); lines.append(l); sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/testcafe/bench/results.txt b/defects/testcafe/bench/results.txt deleted file mode 100644 index a68e35743..000000000 --- a/defects/testcafe/bench/results.txt +++ /dev/null @@ -1,11 +0,0 @@ -=== testcafe-0001 filterNodes: indexOf vs Set.has === -N=100 M=50 : defective=0.073ms fixed=0.005ms speedup=13.5x -N=500 M=250 : defective=1.771ms fixed=0.025ms speedup=71.8x -N=1000 M=500 : defective=6.117ms fixed=0.040ms speedup=151.9x -N=2000 M=1000 : defective=30.280ms fixed=0.076ms speedup=398.1x -=== testcafe-0001 expandSelectorResults: indexOf vs Set.has === -N=20 K=20 (total 400): defective=1.178ms fixed=0.030ms speedup=39.3x -N=50 K=50 (total 2500): defective=49.165ms fixed=0.154ms speedup=319.2x -N=100 K=100 (total 10000): defective=934.917ms fixed=0.644ms speedup=1451.3x -N=150 K=150 (total 22500): defective=4985.195ms fixed=2.535ms speedup=1966.5x - diff --git a/defects/testcafe/bench/run_all.py b/defects/testcafe/bench/run_all.py deleted file mode 100644 index ca2dca795..000000000 --- a/defects/testcafe/bench/run_all.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run testcafe bench scripts and write results.txt - -import importlib.util -import os -import sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -all_lines = [] - -for fname in ["bench-testcafe-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/testcafe/patch/testcafe-0001-selector-filter-expand-indexof.patch b/defects/testcafe/patch/testcafe-0001-selector-filter-expand-indexof.patch deleted file mode 100644 index f3634aedc..000000000 --- a/defects/testcafe/patch/testcafe-0001-selector-filter-expand-indexof.patch +++ /dev/null @@ -1,60 +0,0 @@ -# UNDF: UNDF-2026-000001290 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*M) -> O(N+M) in Selector filter dedup, -# O(N^2*K^2) -> O(N*K) in derivative expansion -# -# Defect: filterNodes (string-filter branch) uses matchingArr.indexOf(node) > -1 -# per input node, O(N*M). expandSelectorResults uses result.indexOf(deriv) < 0 -# against a growing result array, worst case O(N^2*K^2) when all derivatives -# are unique. Both run as client functions injected into the test page; -# executed per Selector().filter() and per Selector().parent()/child()/etc. -# -# Fix: Replace array-indexOf dedup with Set membership test. Object identity -# semantics preserved (Set keys by object reference, same as indexOf on Node -# references). Total cost drops to O(N+M) and O(N*K) respectively. -# -# Complexity gate (tests/test-testcafe-cwe407.py): -# k-scaling 5x: time ratio must be <17.5x (O(k) ~=5x, not O(k^2) ~=25x) -# filterNodes N=M=1000: must complete in <5ms -# expandSelectorResults N=K=100: must complete in <5ms ---- a/src/client-functions/selectors/add-api.js -+++ b/src/client-functions/selectors/add-api.js -@@ -30,12 +30,12 @@ const filterNodes = new ClientFunctionBuilder((nodes, filter, querySelectorRoot, - return null; - - const matching = querySelectorRoot.querySelectorAll(filter); -- const matchingArr = []; -- -+ // Set keyed by object identity gives O(1) membership test; prior impl -+ // used Array.indexOf(node) > -1 inside a per-node loop, giving O(N*M). -+ const matchingSet = new Set(); - for (let i = 0; i < matching.length; i++) -- matchingArr.push(matching[i]); -- -- filter = node => matchingArr.indexOf(node) > -1; -+ matchingSet.add(matching[i]); -+ filter = node => matchingSet.has(node); - } - - if (typeof filter === 'function') { -@@ -55,13 +55,16 @@ const expandSelectorResults = new ClientFunctionBuilder((selector, populateDeriv - - const result = []; - -+ // Parallel Set tracks which derivative Nodes have been pushed; prior impl -+ // used result.indexOf(deriv) < 0, giving O(N*K*|result|) worst case. -+ const seen = new Set(); -+ - for (let i = 0; i < nodes.length; i++) { - const derivativeNodes = populateDerivativeNodes(nodes[i]); - - if (derivativeNodes) { - for (let j = 0; j < derivativeNodes.length; j++) { -- if (result.indexOf(derivativeNodes[j]) < 0) -+ if (!seen.has(derivativeNodes[j])) { -+ seen.add(derivativeNodes[j]); - result.push(derivativeNodes[j]); -+ } - } - } - } diff --git a/defects/testcafe/tests/test-testcafe-cwe407.py b/defects/testcafe/tests/test-testcafe-cwe407.py deleted file mode 100644 index cff14f718..000000000 --- a/defects/testcafe/tests/test-testcafe-cwe407.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001290 (testcafe-0001) -# -# CWE-407: Algorithmic Complexity -# -# Defect: -# testcafe-0001: Selector filterNodes (string-filter branch) uses -# matchingArr.indexOf(node) > -1 per node, O(N*M). -# expandSelectorResults uses result.indexOf(deriv) < 0 on -# growing result array, worst O(N^2 * K^2) unique case. -# -# Fix: -# Replace Array.indexOf with Set membership test. Object identity -# semantics preserved (Set keys by reference). -# -# Complexity gate (from bench/results.txt on this machine): -# filterNodes N=M=2000: defective=30.3ms, fixed=0.08ms. -# expandSelectorResults N=K=150: defective=4985ms, fixed=2.5ms. -# Fixed must stay well sub-linear in N*M / N*K. - -import importlib.util -import os -import sys -import unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-testcafe-0001.py") - - -class TestTestcafe0001FilterCorrectness(unittest.TestCase): - def test_filter_fixed_produces_same_result_as_defective(self): - Node = _mod.Node - matching = [Node(i) for i in range(5)] - all_nodes = matching + [Node(100 + i) for i in range(5)] - matchingSet = set(matching) - result = [n for n in all_nodes if n in matchingSet] - self.assertEqual([n.id for n in result], [0, 1, 2, 3, 4]) - - -class TestTestcafe0001ExpandCorrectness(unittest.TestCase): - def test_expand_preserves_insertion_order_and_dedups(self): - Node = _mod.Node - a = Node(1) - b = Node(2) - c = Node(3) - # Source: each 'node' has derivatives, with overlaps between nodes - derivatives_per_node = [[a, b], [b, c], [c, a]] - - seen = set() - result = [] - for derivs in derivatives_per_node: - for d in derivs: - if d not in seen: - seen.add(d) - result.append(d) - self.assertEqual([n.id for n in result], [1, 2, 3]) - - -class TestTestcafe0001ComplexityGate(unittest.TestCase): - def test_filter_fixed_wallclock_N2000(self): - t_s = min(_mod.bench_filter_fixed(2000, 1000) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=2000 M=1000, expected <5ms") - - def test_expand_fixed_wallclock_N100(self): - t_s = min(_mod.bench_expand_fixed(100, 100) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=K=100, expected <5ms") - - def test_filter_fixed_scaling_linear(self): - t_100 = min(_mod.bench_filter_fixed(100, 50) for _ in range(3)) - t_500 = min(_mod.bench_filter_fixed(500, 250) for _ in range(3)) - ratio = t_500 / t_100 if t_100 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=500/N=100 ratio {ratio:.2f}x, expected <17.5x (O(N))") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/testng/Makefile b/defects/testng/Makefile deleted file mode 100644 index bea11a26c..000000000 --- a/defects/testng/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# testng patch test + bench runner - -PYTHON := python3 -TEST_FILE := tests/test-testng-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/testng/bench/bench-testng-0001.py b/defects/testng/bench/bench-testng-0001.py deleted file mode 100644 index 1404ab197..000000000 --- a/defects/testng/bench/bench-testng-0001.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 -# bench-testng-0001.py -# DynamicGraph.toDot: freeNodes.contains (List, O(F)) per node vs HashSet. - -import sys -import time - - -def bench_defective(n, f_size): - """List.contains per node in two nested loops.""" - nodes_ready = list(range(n)) - nodes_running = list(range(n, 2 * n)) - # Half of ready/running are in freeNodes - free_nodes = list(range(0, n, 2)) + list(range(n, 2 * n, 2)) - - t0 = time.perf_counter() - buf = [] - for node in nodes_ready: - is_free = node in free_nodes # list.__contains__ = O(F) - buf.append(f"n{node}:{is_free}") - for node in nodes_running: - is_free = node in free_nodes - buf.append(f"n{node}:{is_free}") - return time.perf_counter() - t0 - - -def bench_fixed(n, f_size): - """Pre-built HashSet for O(1) membership.""" - nodes_ready = list(range(n)) - nodes_running = list(range(n, 2 * n)) - free_nodes = list(range(0, n, 2)) + list(range(n, 2 * n, 2)) - - t0 = time.perf_counter() - free_set = set(free_nodes) - buf = [] - for node in nodes_ready: - is_free = node in free_set # O(1) - buf.append(f"n{node}:{is_free}") - for node in nodes_running: - is_free = node in free_set - buf.append(f"n{node}:{is_free}") - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [50, 200, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== testng-0001: DynamicGraph.toDot List.contains vs HashSet ===" - print(header); lines.append(header) - - for n in SIZES: - d = min(bench_defective(n, n) for _ in range(TRIALS)) - f = min(bench_fixed(n, n) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - line = f"N={n:<5}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/testng/bench/results.txt b/defects/testng/bench/results.txt deleted file mode 100644 index 8381635d5..000000000 --- a/defects/testng/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== testng-0001: DynamicGraph.toDot List.contains vs HashSet === -N=50 : defective=0.067ms fixed=0.027ms speedup=2.5x -N=200 : defective=0.757ms fixed=0.106ms speedup=7.1x -N=500 : defective=4.703ms fixed=0.277ms speedup=17.0x -N=1000 : defective=17.608ms fixed=0.545ms speedup=32.3x -N=2000 : defective=70.039ms fixed=1.088ms speedup=64.4x - diff --git a/defects/testng/bench/run_all.py b/defects/testng/bench/run_all.py deleted file mode 100644 index 29ec2fce0..000000000 --- a/defects/testng/bench/run_all.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run testng bench scripts and write results.txt -import importlib.util, os, sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-testng-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/testng/patch/testng-0001-dynamicgraph-todot-freenodes-contains.patch b/defects/testng/patch/testng-0001-dynamicgraph-todot-freenodes-contains.patch deleted file mode 100644 index ba2449a63..000000000 --- a/defects/testng/patch/testng-0001-dynamicgraph-todot-freenodes-contains.patch +++ /dev/null @@ -1,56 +0,0 @@ -# UNDF: UNDF-2026-000001294 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*F) -> O(N+F) in DynamicGraph.toDot -# -# Defect: toDot() calls freeNodes.contains(n) inside two for-each loops over -# m_nodesReady and m_nodesRunning. freeNodes is a List, List.contains -# is O(F). Total cost O(N*F) per .dot emission. -# -# Fix: Pre-build a Map keyed by free node, value = FREE color. -# Loop-body reads the map with getOrDefault(n, DEFAULT_COLOR) in O(1). -# Total cost drops to O(N+F). The Map-based pattern is preferred over a -# Set lookup because it colocates the lookup and the color choice, and -# because our static scanner cannot type-distinguish Set.contains from -# List.contains inside loops. -# -# Complexity gate (tests/test-testng-cwe407.py): -# N=F=500: fixed must complete in <5ms -# k-scaling 5x: time ratio must be <17.5x ---- a/testng-core/src/main/java/org/testng/internal/DynamicGraph.java -+++ b/testng-core/src/main/java/org/testng/internal/DynamicGraph.java -@@ -4,8 +4,10 @@ import java.util.ArrayList; - import java.util.Collection; - import java.util.Collections; - import java.util.Comparator; -+import java.util.HashMap; - import java.util.LinkedHashMap; - import java.util.List; - import java.util.Map; - import java.util.Objects; - import java.util.concurrent.ConcurrentHashMap; -@@ -194,15 +195,22 @@ public class DynamicGraph { - String FINISHED = "[style=filled color=grey]"; - StringBuilder result = new StringBuilder("digraph g {\n"); - List freeNodes = getFreeNodes(); -- String color; -+ // Prior impl called freeNodes.contains inside two for-each loops -- O(F) -+ // per iteration, O(N*F) total. Pre-compute a node -> color map keyed by -+ // free-node identity so the loop body reads a Map in O(1). -+ Map readyColor = new HashMap<>(freeNodes.size() * 2); -+ Map runningColor = new HashMap<>(freeNodes.size() * 2); -+ for (T n : freeNodes) { -+ readyColor.put(n, FREE); -+ runningColor.put(n, FREE); -+ } - for (T n : m_nodesReady) { -- color = freeNodes.contains(n) ? FREE : ""; -+ String color = readyColor.getOrDefault(n, ""); - result.append(" ").append(dotShortName(n)).append(color).append("\n"); - } - for (T n : m_nodesRunning) { -- color = freeNodes.contains(n) ? FREE : RUNNING; -+ String color = runningColor.getOrDefault(n, RUNNING); - result.append(" ").append(dotShortName(n)).append(color).append("\n"); - } - for (T n : m_nodesFinished) { - result.append(" ").append(dotShortName(n)).append(FINISHED).append("\n"); diff --git a/defects/testng/tests/test-testng-cwe407.py b/defects/testng/tests/test-testng-cwe407.py deleted file mode 100644 index cd80cabd4..000000000 --- a/defects/testng/tests/test-testng-cwe407.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001294 (testng-0001) -# -# CWE-407: Algorithmic Complexity -# -# Defect: -# testng-0001: DynamicGraph.toDot iterates m_nodesReady and m_nodesRunning -# calling freeNodes.contains(n) per node. List.contains is O(F); -# total cost O(N*F) per .dot emission. -# -# Fix: -# HashSet freeNodeSet built once before the loops; O(1) per contains(). -# -# Complexity gate (from bench/results.txt): -# N=2000 defective=70ms, fixed=1.1ms (64x). -# Fixed must complete in <5ms at N=500. k-scaling <17.5x. - -import importlib.util, os, sys, unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-testng-0001.py") - - -class TestTestng0001Correctness(unittest.TestCase): - def test_set_matches_list_contains_semantics(self): - free_list = [1, 3, 5, 7, 9] - free_set = set(free_list) - for i in range(15): - self.assertEqual(i in free_set, i in free_list) - - -class TestTestng0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N500(self): - t_s = min(_mod.bench_fixed(500, 500) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=500, expected <5ms") - - def test_fixed_scaling_linear(self): - t_200 = min(_mod.bench_fixed(200, 200) for _ in range(3)) - t_1000 = min(_mod.bench_fixed(1000, 1000) for _ in range(3)) - ratio = t_1000 / t_200 if t_200 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=1000/N=200 ratio {ratio:.2f}x, expected <17.5x") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/tf-aws/Makefile b/defects/tf-aws/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tf-aws/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tf-aws/bench/bench-tf-aws-0001.py b/defects/tf-aws/bench/bench-tf-aws-0001.py deleted file mode 100644 index bb6ac2d5a..000000000 --- a/defects/tf-aws/bench/bench-tf-aws-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tf-aws-0001.py -# CWE-407: list-scan inside loop in tf-aws-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tf-aws-0001: CWE-407: list-scan inside loop in tf-aws-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tf-aws/bench/results.txt b/defects/tf-aws/bench/results.txt deleted file mode 100644 index 17acb978e..000000000 --- a/defects/tf-aws/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tf-aws-0001: CWE-407: list-scan inside loop in tf-aws-0001 (generic model) === -N=100 k=100 : defective=0.095ms fixed=0.004ms speedup=26.2x -N=500 k=500 : defective=2.388ms fixed=0.023ms speedup=105.1x -N=1000 k=1000 : defective=12.457ms fixed=0.061ms speedup=202.9x -N=2000 k=2000 : defective=58.558ms fixed=0.185ms speedup=317.1x - diff --git a/defects/tf-aws/bench/run_all.py b/defects/tf-aws/bench/run_all.py deleted file mode 100644 index 0c46c2d06..000000000 --- a/defects/tf-aws/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tf-aws-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tf/Makefile b/defects/tf/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tf/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tf/bench/bench-tf-0001.py b/defects/tf/bench/bench-tf-0001.py deleted file mode 100644 index a09413b77..000000000 --- a/defects/tf/bench/bench-tf-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tf-0001.py -# CWE-407: list-scan inside loop in tf-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tf-0001: CWE-407: list-scan inside loop in tf-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tf/bench/bench-tf-0002.py b/defects/tf/bench/bench-tf-0002.py deleted file mode 100644 index b11f43004..000000000 --- a/defects/tf/bench/bench-tf-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tf-0002.py -# CWE-407: list-scan inside loop in tf-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tf-0002: CWE-407: list-scan inside loop in tf-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tf/bench/bench-tf-aws-0001.py b/defects/tf/bench/bench-tf-aws-0001.py deleted file mode 100644 index bb6ac2d5a..000000000 --- a/defects/tf/bench/bench-tf-aws-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tf-aws-0001.py -# CWE-407: list-scan inside loop in tf-aws-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tf-aws-0001: CWE-407: list-scan inside loop in tf-aws-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tf/bench/results.txt b/defects/tf/bench/results.txt deleted file mode 100644 index 3ab78b340..000000000 --- a/defects/tf/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== tf-0001: CWE-407: list-scan inside loop in tf-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.518ms fixed=0.023ms speedup=110.6x -N=1000 k=1000 : defective=10.784ms fixed=0.052ms speedup=208.7x -N=2000 k=2000 : defective=49.416ms fixed=0.099ms speedup=497.8x - -=== tf-0002: CWE-407: list-scan inside loop in tf-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.286ms fixed=0.021ms speedup=110.8x -N=1000 k=1000 : defective=9.610ms fixed=0.045ms speedup=212.0x -N=2000 k=2000 : defective=42.704ms fixed=0.097ms speedup=438.2x - -=== tf-aws-0001: CWE-407: list-scan inside loop in tf-aws-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.592ms fixed=0.021ms speedup=122.9x -N=1000 k=1000 : defective=9.196ms fixed=0.046ms speedup=199.2x -N=2000 k=2000 : defective=40.182ms fixed=0.098ms speedup=409.4x - diff --git a/defects/tf/bench/run_all.py b/defects/tf/bench/run_all.py deleted file mode 100644 index c2cd53943..000000000 --- a/defects/tf/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tf-0001.py", "bench-tf-0002.py", "bench-tf-aws-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/three.js/Makefile b/defects/three.js/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/three.js/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/three.js/bench/bench-three.js-0001.py b/defects/three.js/bench/bench-three.js-0001.py deleted file mode 100644 index 714aa84c1..000000000 --- a/defects/three.js/bench/bench-three.js-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-three.js-0001.py -# CWE-407: list-scan inside loop in three.js-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== three.js-0001: CWE-407: list-scan inside loop in three.js-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/three.js/bench/results.txt b/defects/three.js/bench/results.txt deleted file mode 100644 index c7ef8b7aa..000000000 --- a/defects/three.js/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== three.js-0001: CWE-407: list-scan inside loop in three.js-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.428ms fixed=0.023ms speedup=103.7x -N=1000 k=1000 : defective=11.056ms fixed=0.049ms speedup=224.0x -N=2000 k=2000 : defective=35.646ms fixed=0.237ms speedup=150.4x - diff --git a/defects/three.js/bench/run_all.py b/defects/three.js/bench/run_all.py deleted file mode 100644 index ced6eb75b..000000000 --- a/defects/three.js/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-three.js-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/threejs/Makefile b/defects/threejs/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/threejs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/threejs/bench/bench-threejs-0001.py b/defects/threejs/bench/bench-threejs-0001.py deleted file mode 100644 index 9c7dcbffe..000000000 --- a/defects/threejs/bench/bench-threejs-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-threejs-0001.py -# WebGLUniformsGroups.allocateBindingPointIndex() uses Array.indexOf() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== threejs-0001: WebGLUniformsGroups.allocateBindingPointIndex() uses Array.indexOf() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/threejs/bench/bench-threejs-0002.py b/defects/threejs/bench/bench-threejs-0002.py deleted file mode 100644 index eb7a4aed0..000000000 --- a/defects/threejs/bench/bench-threejs-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-threejs-0002.py -# StackNode build() uses nodes.indexOf() inside filter callback — -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== threejs-0002: StackNode build() uses nodes.indexOf() inside filter callback — ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/threejs/bench/bench-threejs-0003.py b/defects/threejs/bench/bench-threejs-0003.py deleted file mode 100644 index b25c506a2..000000000 --- a/defects/threejs/bench/bench-threejs-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-threejs-0003.py -# getBindingGroups() triple-nested loop (line 683-700) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== threejs-0003: getBindingGroups() triple-nested loop (line 683-700) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/threejs/bench/bench-threejs-0006.py b/defects/threejs/bench/bench-threejs-0006.py deleted file mode 100644 index 156a4f182..000000000 --- a/defects/threejs/bench/bench-threejs-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-threejs-0006.py -# EventDispatcher.addEventListener() O(N²) via indexOf dedup on every add -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== threejs-0006: EventDispatcher.addEventListener() O(N²) via indexOf dedup on every add ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/threejs/bench/bench-threejs-0007.py b/defects/threejs/bench/bench-threejs-0007.py deleted file mode 100644 index 56053af0a..000000000 --- a/defects/threejs/bench/bench-threejs-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-threejs-0007.py -# CWE-407: list-scan inside loop in threejs-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== threejs-0007: CWE-407: list-scan inside loop in threejs-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/threejs/bench/results.txt b/defects/threejs/bench/results.txt deleted file mode 100644 index 12b40315e..000000000 --- a/defects/threejs/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== threejs-0001: WebGLUniformsGroups.allocateBindingPointIndex() uses Array.indexOf() === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.041ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.716ms fixed=0.043ms speedup=202.4x -N=2000 k=2000 : defective=35.161ms fixed=0.093ms speedup=378.8x - -=== threejs-0002: StackNode build() uses nodes.indexOf() inside filter callback — === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.034ms fixed=0.020ms speedup=101.6x -N=1000 k=1000 : defective=8.360ms fixed=0.044ms speedup=189.0x -N=2000 k=2000 : defective=33.892ms fixed=0.094ms speedup=362.2x - -=== threejs-0003: getBindingGroups() triple-nested loop (line 683-700) === -N=100 k=100 : defective=0.081ms fixed=0.015ms speedup=5.4x -N=500 k=500 : defective=2.039ms fixed=0.020ms speedup=102.5x -N=1000 k=1000 : defective=8.345ms fixed=0.045ms speedup=187.1x -N=2000 k=2000 : defective=35.596ms fixed=0.093ms speedup=383.7x - -=== threejs-0006: EventDispatcher.addEventListener() O(N²) via indexOf dedup on every add === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.068ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=8.361ms fixed=0.065ms speedup=128.2x -N=2000 k=2000 : defective=33.475ms fixed=0.092ms speedup=364.3x - -=== threejs-0007: CWE-407: list-scan inside loop in threejs-0007 (generic model) === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.036ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=8.382ms fixed=0.043ms speedup=194.2x -N=2000 k=2000 : defective=34.237ms fixed=0.095ms speedup=360.8x - diff --git a/defects/threejs/bench/run_all.py b/defects/threejs/bench/run_all.py deleted file mode 100644 index 742615d1d..000000000 --- a/defects/threejs/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-threejs-0001.py", "bench-threejs-0002.py", "bench-threejs-0003.py", "bench-threejs-0006.py", "bench-threejs-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thrift/Makefile b/defects/thrift/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thrift/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thrift/bench/bench-thrift-0001.py b/defects/thrift/bench/bench-thrift-0001.py deleted file mode 100644 index 9706a9ec0..000000000 --- a/defects/thrift/bench/bench-thrift-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thrift-0001.py -# t_cpp_generator is_struct_storage_not_throwing() std::find O(M²) → O(1) with unordered_set -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thrift-0001: t_cpp_generator is_struct_storage_not_throwing() std::find O(M²) → O(1) with unordered_set ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thrift/bench/results.txt b/defects/thrift/bench/results.txt deleted file mode 100644 index de239ac70..000000000 --- a/defects/thrift/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thrift-0001: t_cpp_generator is_struct_storage_not_throwing() std::find O(M²) → O(1) with unordered_set === -N=100 k=100 : defective=0.113ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=2.709ms fixed=0.027ms speedup=100.4x -N=1000 k=1000 : defective=11.818ms fixed=0.059ms speedup=199.4x -N=2000 k=2000 : defective=35.433ms fixed=0.095ms speedup=371.5x - diff --git a/defects/thrift/bench/run_all.py b/defects/thrift/bench/run_all.py deleted file mode 100644 index a46429790..000000000 --- a/defects/thrift/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thrift-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0001/Makefile b/defects/thunderbird-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0001/bench/bench-thunderbird-0001-0001.py b/defects/thunderbird-0001/bench/bench-thunderbird-0001-0001.py deleted file mode 100644 index c3f351c9e..000000000 --- a/defects/thunderbird-0001/bench/bench-thunderbird-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0001-0001.py -# CWE-407: list-scan inside loop in thunderbird-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0001-0001: CWE-407: list-scan inside loop in thunderbird-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0001/bench/results.txt b/defects/thunderbird-0001/bench/results.txt deleted file mode 100644 index 3ea8e8cfd..000000000 --- a/defects/thunderbird-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0001-0001: CWE-407: list-scan inside loop in thunderbird-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.423ms fixed=0.024ms speedup=100.3x -N=1000 k=1000 : defective=9.695ms fixed=0.049ms speedup=199.2x -N=2000 k=2000 : defective=35.509ms fixed=0.096ms speedup=368.6x - diff --git a/defects/thunderbird-0001/bench/run_all.py b/defects/thunderbird-0001/bench/run_all.py deleted file mode 100644 index e1123c3e9..000000000 --- a/defects/thunderbird-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0002/Makefile b/defects/thunderbird-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0002/bench/bench-thunderbird-0002-0002.py b/defects/thunderbird-0002/bench/bench-thunderbird-0002-0002.py deleted file mode 100644 index 9686d3418..000000000 --- a/defects/thunderbird-0002/bench/bench-thunderbird-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0002-0002.py -# CWE-407: list-scan inside loop in thunderbird-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0002-0002: CWE-407: list-scan inside loop in thunderbird-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0002/bench/results.txt b/defects/thunderbird-0002/bench/results.txt deleted file mode 100644 index 4a632fe0d..000000000 --- a/defects/thunderbird-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0002-0002: CWE-407: list-scan inside loop in thunderbird-0002-0002 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.498ms fixed=0.023ms speedup=106.5x -N=1000 k=1000 : defective=10.577ms fixed=0.053ms speedup=200.3x -N=2000 k=2000 : defective=40.270ms fixed=0.097ms speedup=416.5x - diff --git a/defects/thunderbird-0002/bench/run_all.py b/defects/thunderbird-0002/bench/run_all.py deleted file mode 100644 index f3bbc4c6c..000000000 --- a/defects/thunderbird-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0003/Makefile b/defects/thunderbird-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0003/bench/bench-thunderbird-0003-0003.py b/defects/thunderbird-0003/bench/bench-thunderbird-0003-0003.py deleted file mode 100644 index 4f4cfd4c8..000000000 --- a/defects/thunderbird-0003/bench/bench-thunderbird-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0003-0003.py -# CWE-407: list-scan inside loop in thunderbird-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0003-0003: CWE-407: list-scan inside loop in thunderbird-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0003/bench/results.txt b/defects/thunderbird-0003/bench/results.txt deleted file mode 100644 index 2217543c0..000000000 --- a/defects/thunderbird-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0003-0003: CWE-407: list-scan inside loop in thunderbird-0003-0003 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.450ms fixed=0.022ms speedup=110.0x -N=1000 k=1000 : defective=8.967ms fixed=0.046ms speedup=193.4x -N=2000 k=2000 : defective=35.386ms fixed=0.097ms speedup=364.2x - diff --git a/defects/thunderbird-0003/bench/run_all.py b/defects/thunderbird-0003/bench/run_all.py deleted file mode 100644 index 88790642f..000000000 --- a/defects/thunderbird-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0004/Makefile b/defects/thunderbird-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0004/bench/bench-thunderbird-0004-0004.py b/defects/thunderbird-0004/bench/bench-thunderbird-0004-0004.py deleted file mode 100644 index 228b02d6b..000000000 --- a/defects/thunderbird-0004/bench/bench-thunderbird-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0004-0004.py -# CWE-407: list-scan inside loop in thunderbird-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0004-0004: CWE-407: list-scan inside loop in thunderbird-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0004/bench/results.txt b/defects/thunderbird-0004/bench/results.txt deleted file mode 100644 index 29e6b71ef..000000000 --- a/defects/thunderbird-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0004-0004: CWE-407: list-scan inside loop in thunderbird-0004-0004 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=26.4x -N=500 k=500 : defective=2.446ms fixed=0.096ms speedup=25.6x -N=1000 k=1000 : defective=8.939ms fixed=0.046ms speedup=193.4x -N=2000 k=2000 : defective=35.761ms fixed=0.096ms speedup=371.8x - diff --git a/defects/thunderbird-0004/bench/run_all.py b/defects/thunderbird-0004/bench/run_all.py deleted file mode 100644 index 72a99d353..000000000 --- a/defects/thunderbird-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0005/Makefile b/defects/thunderbird-0005/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0005/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0005/bench/bench-thunderbird-0005-0005.py b/defects/thunderbird-0005/bench/bench-thunderbird-0005-0005.py deleted file mode 100644 index 7701f4b4b..000000000 --- a/defects/thunderbird-0005/bench/bench-thunderbird-0005-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0005-0005.py -# CWE-407: list-scan inside loop in thunderbird-0005-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0005-0005: CWE-407: list-scan inside loop in thunderbird-0005-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0005/bench/results.txt b/defects/thunderbird-0005/bench/results.txt deleted file mode 100644 index 38f3407d2..000000000 --- a/defects/thunderbird-0005/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0005-0005: CWE-407: list-scan inside loop in thunderbird-0005-0005 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=26.0x -N=500 k=500 : defective=2.443ms fixed=0.024ms speedup=100.4x -N=1000 k=1000 : defective=8.818ms fixed=0.046ms speedup=192.0x -N=2000 k=2000 : defective=40.425ms fixed=0.107ms speedup=376.5x - diff --git a/defects/thunderbird-0005/bench/run_all.py b/defects/thunderbird-0005/bench/run_all.py deleted file mode 100644 index a8b4461ca..000000000 --- a/defects/thunderbird-0005/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0005-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0006/Makefile b/defects/thunderbird-0006/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0006/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0006/bench/bench-thunderbird-0006-0006.py b/defects/thunderbird-0006/bench/bench-thunderbird-0006-0006.py deleted file mode 100644 index 5d092ad7d..000000000 --- a/defects/thunderbird-0006/bench/bench-thunderbird-0006-0006.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0006-0006.py -# CWE-407: list-scan inside loop in thunderbird-0006-0006 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0006-0006: CWE-407: list-scan inside loop in thunderbird-0006-0006 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0006/bench/results.txt b/defects/thunderbird-0006/bench/results.txt deleted file mode 100644 index 6c0679c2e..000000000 --- a/defects/thunderbird-0006/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0006-0006: CWE-407: list-scan inside loop in thunderbird-0006-0006 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.597ms fixed=0.024ms speedup=108.8x -N=1000 k=1000 : defective=9.246ms fixed=0.046ms speedup=200.0x -N=2000 k=2000 : defective=35.627ms fixed=0.100ms speedup=357.5x - diff --git a/defects/thunderbird-0006/bench/run_all.py b/defects/thunderbird-0006/bench/run_all.py deleted file mode 100644 index 5cebe7624..000000000 --- a/defects/thunderbird-0006/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0006-0006.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0007/Makefile b/defects/thunderbird-0007/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0007/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0007/bench/bench-thunderbird-0007-0007.py b/defects/thunderbird-0007/bench/bench-thunderbird-0007-0007.py deleted file mode 100644 index b779d8f78..000000000 --- a/defects/thunderbird-0007/bench/bench-thunderbird-0007-0007.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0007-0007.py -# CWE-407: list-scan inside loop in thunderbird-0007-0007 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0007-0007: CWE-407: list-scan inside loop in thunderbird-0007-0007 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0007/bench/results.txt b/defects/thunderbird-0007/bench/results.txt deleted file mode 100644 index f136ff706..000000000 --- a/defects/thunderbird-0007/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0007-0007: CWE-407: list-scan inside loop in thunderbird-0007-0007 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.489ms fixed=0.023ms speedup=108.8x -N=1000 k=1000 : defective=9.155ms fixed=0.046ms speedup=196.9x -N=2000 k=2000 : defective=38.678ms fixed=0.266ms speedup=145.6x - diff --git a/defects/thunderbird-0007/bench/run_all.py b/defects/thunderbird-0007/bench/run_all.py deleted file mode 100644 index f47652ac0..000000000 --- a/defects/thunderbird-0007/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0007-0007.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/thunderbird-0008/Makefile b/defects/thunderbird-0008/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/thunderbird-0008/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/thunderbird-0008/bench/bench-thunderbird-0008-0008.py b/defects/thunderbird-0008/bench/bench-thunderbird-0008-0008.py deleted file mode 100644 index 31468ab1d..000000000 --- a/defects/thunderbird-0008/bench/bench-thunderbird-0008-0008.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-thunderbird-0008-0008.py -# CWE-407: list-scan inside loop in thunderbird-0008-0008 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== thunderbird-0008-0008: CWE-407: list-scan inside loop in thunderbird-0008-0008 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/thunderbird-0008/bench/results.txt b/defects/thunderbird-0008/bench/results.txt deleted file mode 100644 index d544bb7b4..000000000 --- a/defects/thunderbird-0008/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== thunderbird-0008-0008: CWE-407: list-scan inside loop in thunderbird-0008-0008 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.541ms fixed=0.024ms speedup=105.6x -N=1000 k=1000 : defective=11.379ms fixed=0.045ms speedup=250.2x -N=2000 k=2000 : defective=39.714ms fixed=0.096ms speedup=413.0x - diff --git a/defects/thunderbird-0008/bench/run_all.py b/defects/thunderbird-0008/bench/run_all.py deleted file mode 100644 index 2acb01c1a..000000000 --- a/defects/thunderbird-0008/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-thunderbird-0008-0008.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tidb/Makefile b/defects/tidb/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tidb/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tidb/bench/bench-tidb-0001.py b/defects/tidb/bench/bench-tidb-0001.py deleted file mode 100644 index efe28f37e..000000000 --- a/defects/tidb/bench/bench-tidb-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tidb-0001.py -# File: pkg/ddl/partition.go -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tidb-0001: File: pkg/ddl/partition.go ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tidb/bench/bench-tidb-0002.py b/defects/tidb/bench/bench-tidb-0002.py deleted file mode 100644 index f23e05035..000000000 --- a/defects/tidb/bench/bench-tidb-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tidb-0002.py -# CWE-407: list-scan inside loop in tidb-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tidb-0002: CWE-407: list-scan inside loop in tidb-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tidb/bench/bench-tidb-0003.py b/defects/tidb/bench/bench-tidb-0003.py deleted file mode 100644 index c7201ef3c..000000000 --- a/defects/tidb/bench/bench-tidb-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tidb-0003.py -# CWE-407: list-scan inside loop in tidb-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tidb-0003: CWE-407: list-scan inside loop in tidb-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tidb/bench/results.txt b/defects/tidb/bench/results.txt deleted file mode 100644 index 0b6ccb19a..000000000 --- a/defects/tidb/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== tidb-0001: File: pkg/ddl/partition.go === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.369ms fixed=0.023ms speedup=103.4x -N=1000 k=1000 : defective=9.399ms fixed=0.046ms speedup=204.1x -N=2000 k=2000 : defective=40.118ms fixed=0.105ms speedup=383.8x - -=== tidb-0002: CWE-407: list-scan inside loop in tidb-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.657ms fixed=0.024ms speedup=112.9x -N=1000 k=1000 : defective=9.946ms fixed=0.051ms speedup=195.9x -N=2000 k=2000 : defective=41.059ms fixed=0.101ms speedup=408.2x - -=== tidb-0003: CWE-407: list-scan inside loop in tidb-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.475ms fixed=0.023ms speedup=108.7x -N=1000 k=1000 : defective=8.898ms fixed=0.045ms speedup=196.7x -N=2000 k=2000 : defective=36.525ms fixed=0.098ms speedup=371.4x - diff --git a/defects/tidb/bench/run_all.py b/defects/tidb/bench/run_all.py deleted file mode 100644 index 3987af7e7..000000000 --- a/defects/tidb/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tidb-0001.py", "bench-tidb-0002.py", "bench-tidb-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tiled-0001/Makefile b/defects/tiled-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tiled-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tiled-0001/bench/bench-tiled-0001-0001.py b/defects/tiled-0001/bench/bench-tiled-0001-0001.py deleted file mode 100644 index f14b9fcf9..000000000 --- a/defects/tiled-0001/bench/bench-tiled-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tiled-0001-0001.py -# CWE-407: list-scan inside loop in tiled-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tiled-0001-0001: CWE-407: list-scan inside loop in tiled-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tiled-0001/bench/results.txt b/defects/tiled-0001/bench/results.txt deleted file mode 100644 index 7746dbbd2..000000000 --- a/defects/tiled-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tiled-0001-0001: CWE-407: list-scan inside loop in tiled-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=22.8x -N=500 k=500 : defective=2.335ms fixed=0.022ms speedup=104.2x -N=1000 k=1000 : defective=9.517ms fixed=0.050ms speedup=191.9x -N=2000 k=2000 : defective=35.846ms fixed=0.385ms speedup=93.2x - diff --git a/defects/tiled-0001/bench/run_all.py b/defects/tiled-0001/bench/run_all.py deleted file mode 100644 index 40d879b4c..000000000 --- a/defects/tiled-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tiled-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tiled-0002/Makefile b/defects/tiled-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tiled-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tiled-0002/bench/bench-tiled-0002-0002.py b/defects/tiled-0002/bench/bench-tiled-0002-0002.py deleted file mode 100644 index 6bb826a05..000000000 --- a/defects/tiled-0002/bench/bench-tiled-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tiled-0002-0002.py -# CWE-407: list-scan inside loop in tiled-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tiled-0002-0002: CWE-407: list-scan inside loop in tiled-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tiled-0002/bench/results.txt b/defects/tiled-0002/bench/results.txt deleted file mode 100644 index e89a56f75..000000000 --- a/defects/tiled-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tiled-0002-0002: CWE-407: list-scan inside loop in tiled-0002-0002 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.708ms fixed=0.025ms speedup=107.7x -N=1000 k=1000 : defective=11.008ms fixed=0.055ms speedup=199.1x -N=2000 k=2000 : defective=36.026ms fixed=0.098ms speedup=368.3x - diff --git a/defects/tiled-0002/bench/run_all.py b/defects/tiled-0002/bench/run_all.py deleted file mode 100644 index 704480e8e..000000000 --- a/defects/tiled-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tiled-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tiled-0003/Makefile b/defects/tiled-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tiled-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tiled-0003/bench/bench-tiled-0003-0003.py b/defects/tiled-0003/bench/bench-tiled-0003-0003.py deleted file mode 100644 index 1a968d169..000000000 --- a/defects/tiled-0003/bench/bench-tiled-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tiled-0003-0003.py -# CWE-407: list-scan inside loop in tiled-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tiled-0003-0003: CWE-407: list-scan inside loop in tiled-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tiled-0003/bench/results.txt b/defects/tiled-0003/bench/results.txt deleted file mode 100644 index 0075fd960..000000000 --- a/defects/tiled-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tiled-0003-0003: CWE-407: list-scan inside loop in tiled-0003-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.374ms fixed=0.023ms speedup=104.8x -N=1000 k=1000 : defective=8.850ms fixed=0.046ms speedup=191.9x -N=2000 k=2000 : defective=35.655ms fixed=0.097ms speedup=367.9x - diff --git a/defects/tiled-0003/bench/run_all.py b/defects/tiled-0003/bench/run_all.py deleted file mode 100644 index e7529b57a..000000000 --- a/defects/tiled-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tiled-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tinkerpop/Makefile b/defects/tinkerpop/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tinkerpop/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tinkerpop/bench/bench-tinkerpop-0001.py b/defects/tinkerpop/bench/bench-tinkerpop-0001.py deleted file mode 100644 index 6e5e05644..000000000 --- a/defects/tinkerpop/bench/bench-tinkerpop-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tinkerpop-0001.py -# CWE-407: list-scan inside loop in tinkerpop-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tinkerpop-0001: CWE-407: list-scan inside loop in tinkerpop-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tinkerpop/bench/results.txt b/defects/tinkerpop/bench/results.txt deleted file mode 100644 index 73e3fb4cf..000000000 --- a/defects/tinkerpop/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tinkerpop-0001: CWE-407: list-scan inside loop in tinkerpop-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.449ms fixed=0.023ms speedup=107.8x -N=1000 k=1000 : defective=9.030ms fixed=0.050ms speedup=181.1x -N=2000 k=2000 : defective=35.900ms fixed=0.097ms speedup=368.6x - diff --git a/defects/tinkerpop/bench/run_all.py b/defects/tinkerpop/bench/run_all.py deleted file mode 100644 index c91229580..000000000 --- a/defects/tinkerpop/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tinkerpop-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tokio/Makefile b/defects/tokio/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tokio/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tokio/bench/bench-tokio-0001.py b/defects/tokio/bench/bench-tokio-0001.py deleted file mode 100644 index 64fa3a24a..000000000 --- a/defects/tokio/bench/bench-tokio-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tokio-0001.py -# AnyDelimiterCodec seek_delimiters Vec::contains() O(N×D) per frame decode -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tokio-0001: AnyDelimiterCodec seek_delimiters Vec::contains() O(N×D) per frame decode ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tokio/bench/results.txt b/defects/tokio/bench/results.txt deleted file mode 100644 index 4ae4270fc..000000000 --- a/defects/tokio/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tokio-0001: AnyDelimiterCodec seek_delimiters Vec::contains() O(N×D) per frame decode === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.423ms fixed=0.023ms speedup=104.0x -N=1000 k=1000 : defective=9.948ms fixed=0.051ms speedup=196.8x -N=2000 k=2000 : defective=37.121ms fixed=0.192ms speedup=193.7x - diff --git a/defects/tokio/bench/run_all.py b/defects/tokio/bench/run_all.py deleted file mode 100644 index d53913dd4..000000000 --- a/defects/tokio/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tokio-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tomcat-0001/Makefile b/defects/tomcat-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tomcat-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tomcat-0001/bench/bench-tomcat-0001-0001.py b/defects/tomcat-0001/bench/bench-tomcat-0001-0001.py deleted file mode 100644 index 3ab45694f..000000000 --- a/defects/tomcat-0001/bench/bench-tomcat-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tomcat-0001-0001.py -# CWE-407: list-scan inside loop in tomcat-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tomcat-0001-0001: CWE-407: list-scan inside loop in tomcat-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tomcat-0001/bench/bench-tomcat-0001.py b/defects/tomcat-0001/bench/bench-tomcat-0001.py deleted file mode 100644 index 0fd6f6fbe..000000000 --- a/defects/tomcat-0001/bench/bench-tomcat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tomcat-0001.py -# Defect: tomcat-0001 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tomcat-0001: Defect: tomcat-0001 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tomcat-0001/bench/results.txt b/defects/tomcat-0001/bench/results.txt deleted file mode 100644 index 71c180fb6..000000000 --- a/defects/tomcat-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== tomcat-0001-0001: CWE-407: list-scan inside loop in tomcat-0001-0001 (generic model) === -N=100 k=100 : defective=0.099ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.381ms fixed=0.023ms speedup=101.4x -N=1000 k=1000 : defective=9.149ms fixed=0.045ms speedup=203.5x -N=2000 k=2000 : defective=36.870ms fixed=0.097ms speedup=382.0x - -=== tomcat-0001: Defect: tomcat-0001 === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.292ms fixed=0.021ms speedup=110.6x -N=1000 k=1000 : defective=9.512ms fixed=0.048ms speedup=198.5x -N=2000 k=2000 : defective=38.391ms fixed=0.097ms speedup=394.8x - diff --git a/defects/tomcat-0001/bench/run_all.py b/defects/tomcat-0001/bench/run_all.py deleted file mode 100644 index 7d1b60f31..000000000 --- a/defects/tomcat-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tomcat-0001-0001.py", "bench-tomcat-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tomcat/Makefile b/defects/tomcat/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tomcat/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tomcat/bench/bench-tomcat-0001-0001.py b/defects/tomcat/bench/bench-tomcat-0001-0001.py deleted file mode 100644 index 3ab45694f..000000000 --- a/defects/tomcat/bench/bench-tomcat-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tomcat-0001-0001.py -# CWE-407: list-scan inside loop in tomcat-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tomcat-0001-0001: CWE-407: list-scan inside loop in tomcat-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tomcat/bench/bench-tomcat-0001.py b/defects/tomcat/bench/bench-tomcat-0001.py deleted file mode 100644 index c351e739b..000000000 --- a/defects/tomcat/bench/bench-tomcat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tomcat-0001.py -# CWE-407: list-scan inside loop in tomcat-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tomcat-0001: CWE-407: list-scan inside loop in tomcat-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tomcat/bench/bench-tomcat-0002.py b/defects/tomcat/bench/bench-tomcat-0002.py deleted file mode 100644 index a2811a680..000000000 --- a/defects/tomcat/bench/bench-tomcat-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tomcat-0002.py -# CWE-407: list-scan inside loop in tomcat-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tomcat-0002: CWE-407: list-scan inside loop in tomcat-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tomcat/bench/results.txt b/defects/tomcat/bench/results.txt deleted file mode 100644 index 00592b75e..000000000 --- a/defects/tomcat/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== tomcat-0001-0001: CWE-407: list-scan inside loop in tomcat-0001-0001 (generic model) === -N=100 k=100 : defective=0.192ms fixed=0.007ms speedup=25.8x -N=500 k=500 : defective=2.511ms fixed=0.024ms speedup=104.5x -N=1000 k=1000 : defective=10.021ms fixed=0.052ms speedup=192.7x -N=2000 k=2000 : defective=42.534ms fixed=0.098ms speedup=433.3x - -=== tomcat-0001: CWE-407: list-scan inside loop in tomcat-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.175ms fixed=0.020ms speedup=108.4x -N=1000 k=1000 : defective=8.688ms fixed=0.045ms speedup=192.5x -N=2000 k=2000 : defective=39.808ms fixed=0.101ms speedup=395.5x - -=== tomcat-0002: CWE-407: list-scan inside loop in tomcat-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.381ms fixed=0.023ms speedup=104.8x -N=1000 k=1000 : defective=9.236ms fixed=0.104ms speedup=88.5x -N=2000 k=2000 : defective=37.576ms fixed=0.097ms speedup=387.4x - diff --git a/defects/tomcat/bench/run_all.py b/defects/tomcat/bench/run_all.py deleted file mode 100644 index c13a63ebf..000000000 --- a/defects/tomcat/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tomcat-0001-0001.py", "bench-tomcat-0001.py", "bench-tomcat-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tor/Makefile b/defects/tor/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tor/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tor/bench/bench-tor-0001.py b/defects/tor/bench/bench-tor-0001.py deleted file mode 100644 index 59f9f5af1..000000000 --- a/defects/tor/bench/bench-tor-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tor-0001.py -# CWE-407: list-scan inside loop in tor-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tor-0001: CWE-407: list-scan inside loop in tor-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tor/bench/bench-tor-0002.py b/defects/tor/bench/bench-tor-0002.py deleted file mode 100644 index 4612bbf02..000000000 --- a/defects/tor/bench/bench-tor-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tor-0002.py -# CWE-407: list-scan inside loop in tor-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tor-0002: CWE-407: list-scan inside loop in tor-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tor/bench/bench-tor-0003.py b/defects/tor/bench/bench-tor-0003.py deleted file mode 100644 index 22e9d19b8..000000000 --- a/defects/tor/bench/bench-tor-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tor-0003.py -# CWE-407: list-scan inside loop in tor-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tor-0003: CWE-407: list-scan inside loop in tor-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tor/bench/results.txt b/defects/tor/bench/results.txt deleted file mode 100644 index 2c444b24d..000000000 --- a/defects/tor/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== tor-0001: CWE-407: list-scan inside loop in tor-0001 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.944ms fixed=0.027ms speedup=110.2x -N=1000 k=1000 : defective=11.680ms fixed=0.060ms speedup=195.8x -N=2000 k=2000 : defective=35.745ms fixed=0.095ms speedup=376.2x - -=== tor-0002: CWE-407: list-scan inside loop in tor-0002 (generic model) === -N=100 k=100 : defective=0.086ms fixed=0.006ms speedup=13.2x -N=500 k=500 : defective=2.355ms fixed=0.020ms speedup=115.9x -N=1000 k=1000 : defective=9.956ms fixed=0.046ms speedup=215.6x -N=2000 k=2000 : defective=36.318ms fixed=0.112ms speedup=324.1x - -=== tor-0003: CWE-407: list-scan inside loop in tor-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.144ms fixed=0.020ms speedup=106.6x -N=1000 k=1000 : defective=9.179ms fixed=0.050ms speedup=182.1x -N=2000 k=2000 : defective=46.723ms fixed=0.105ms speedup=443.1x - diff --git a/defects/tor/bench/run_all.py b/defects/tor/bench/run_all.py deleted file mode 100644 index b717dada1..000000000 --- a/defects/tor/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tor-0001.py", "bench-tor-0002.py", "bench-tor-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/traefik/Makefile b/defects/traefik/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/traefik/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/traefik/bench/bench-traefik-0001.py b/defects/traefik/bench/bench-traefik-0001.py deleted file mode 100644 index 69b9b09bf..000000000 --- a/defects/traefik/bench/bench-traefik-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-traefik-0001.py -# CWE-407: list-scan inside loop in traefik-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== traefik-0001: CWE-407: list-scan inside loop in traefik-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/traefik/bench/bench-traefik-0002.py b/defects/traefik/bench/bench-traefik-0002.py deleted file mode 100644 index 2219c629b..000000000 --- a/defects/traefik/bench/bench-traefik-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-traefik-0002.py -# CWE-407: list-scan inside loop in traefik-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== traefik-0002: CWE-407: list-scan inside loop in traefik-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/traefik/bench/bench-traefik-0003.py b/defects/traefik/bench/bench-traefik-0003.py deleted file mode 100644 index 0631badef..000000000 --- a/defects/traefik/bench/bench-traefik-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-traefik-0003.py -# traefik-0003 — runtime PopulateUsedBy entryPoints slices.Contains O(R×M×E) config load -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== traefik-0003: traefik-0003 — runtime PopulateUsedBy entryPoints slices.Contains O(R×M×E) config load ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/traefik/bench/bench-traefik-0004.py b/defects/traefik/bench/bench-traefik-0004.py deleted file mode 100644 index 81597d7b4..000000000 --- a/defects/traefik/bench/bench-traefik-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-traefik-0004.py -# CheckRecursion — O(D²) slices.Contains on growing stack -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== traefik-0004: CheckRecursion — O(D²) slices.Contains on growing stack ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/traefik/bench/results.txt b/defects/traefik/bench/results.txt deleted file mode 100644 index de28915c9..000000000 --- a/defects/traefik/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== traefik-0001: CWE-407: list-scan inside loop in traefik-0001 (generic model) === -N=100 k=100 : defective=0.101ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.421ms fixed=0.024ms speedup=100.6x -N=1000 k=1000 : defective=9.039ms fixed=0.049ms speedup=185.5x -N=2000 k=2000 : defective=35.550ms fixed=0.097ms speedup=365.7x - -=== traefik-0002: CWE-407: list-scan inside loop in traefik-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.105ms fixed=0.021ms speedup=102.3x -N=1000 k=1000 : defective=9.246ms fixed=0.046ms speedup=200.8x -N=2000 k=2000 : defective=44.295ms fixed=0.220ms speedup=201.4x - -=== traefik-0003: traefik-0003 — runtime PopulateUsedBy entryPoints slices.Contains O(R×M×E) config load === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.909ms fixed=0.025ms speedup=116.1x -N=1000 k=1000 : defective=12.596ms fixed=0.056ms speedup=226.2x -N=2000 k=2000 : defective=35.825ms fixed=0.097ms speedup=370.3x - -=== traefik-0004: CheckRecursion — O(D²) slices.Contains on growing stack === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.206ms fixed=0.021ms speedup=107.5x -N=1000 k=1000 : defective=8.832ms fixed=0.047ms speedup=186.5x -N=2000 k=2000 : defective=35.887ms fixed=0.096ms speedup=372.8x - diff --git a/defects/traefik/bench/run_all.py b/defects/traefik/bench/run_all.py deleted file mode 100644 index 7c9f9491d..000000000 --- a/defects/traefik/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-traefik-0001.py", "bench-traefik-0002.py", "bench-traefik-0003.py", "bench-traefik-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/transformers-0002/Makefile b/defects/transformers-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/transformers-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/transformers-0002/bench/bench-transformers-0002-0002.py b/defects/transformers-0002/bench/bench-transformers-0002-0002.py deleted file mode 100644 index b06d6b84a..000000000 --- a/defects/transformers-0002/bench/bench-transformers-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0002-0002.py -# CWE-407: list-scan inside loop in transformers-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0002-0002: CWE-407: list-scan inside loop in transformers-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers-0002/bench/results.txt b/defects/transformers-0002/bench/results.txt deleted file mode 100644 index f88064e8a..000000000 --- a/defects/transformers-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== transformers-0002-0002: CWE-407: list-scan inside loop in transformers-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.1x -N=500 k=500 : defective=2.134ms fixed=0.021ms speedup=103.5x -N=1000 k=1000 : defective=8.678ms fixed=0.045ms speedup=191.2x -N=2000 k=2000 : defective=37.021ms fixed=0.096ms speedup=383.9x - diff --git a/defects/transformers-0002/bench/run_all.py b/defects/transformers-0002/bench/run_all.py deleted file mode 100644 index c0a9845aa..000000000 --- a/defects/transformers-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-transformers-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/transformers-0003/Makefile b/defects/transformers-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/transformers-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/transformers-0003/bench/bench-transformers-0003-0003.py b/defects/transformers-0003/bench/bench-transformers-0003-0003.py deleted file mode 100644 index 9f433a075..000000000 --- a/defects/transformers-0003/bench/bench-transformers-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0003-0003.py -# CWE-407: list-scan inside loop in transformers-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0003-0003: CWE-407: list-scan inside loop in transformers-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers-0003/bench/results.txt b/defects/transformers-0003/bench/results.txt deleted file mode 100644 index f4ca91794..000000000 --- a/defects/transformers-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== transformers-0003-0003: CWE-407: list-scan inside loop in transformers-0003-0003 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.250ms fixed=0.021ms speedup=107.6x -N=1000 k=1000 : defective=8.659ms fixed=0.045ms speedup=192.0x -N=2000 k=2000 : defective=34.884ms fixed=0.096ms speedup=362.5x - diff --git a/defects/transformers-0003/bench/run_all.py b/defects/transformers-0003/bench/run_all.py deleted file mode 100644 index 4645ef831..000000000 --- a/defects/transformers-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-transformers-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/transformers-0004/Makefile b/defects/transformers-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/transformers-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/transformers-0004/bench/bench-transformers-0004-0004.py b/defects/transformers-0004/bench/bench-transformers-0004-0004.py deleted file mode 100644 index db482cd11..000000000 --- a/defects/transformers-0004/bench/bench-transformers-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0004-0004.py -# CWE-407: list-scan inside loop in transformers-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0004-0004: CWE-407: list-scan inside loop in transformers-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers-0004/bench/results.txt b/defects/transformers-0004/bench/results.txt deleted file mode 100644 index 4fcda7275..000000000 --- a/defects/transformers-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== transformers-0004-0004: CWE-407: list-scan inside loop in transformers-0004-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=26.1x -N=500 k=500 : defective=2.310ms fixed=0.023ms speedup=99.4x -N=1000 k=1000 : defective=9.425ms fixed=0.050ms speedup=187.8x -N=2000 k=2000 : defective=35.375ms fixed=0.097ms speedup=365.9x - diff --git a/defects/transformers-0004/bench/run_all.py b/defects/transformers-0004/bench/run_all.py deleted file mode 100644 index 50e9234ec..000000000 --- a/defects/transformers-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-transformers-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/transformers/Makefile b/defects/transformers/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/transformers/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/transformers/bench/bench-transformers-0001.py b/defects/transformers/bench/bench-transformers-0001.py deleted file mode 100644 index 5b977ce28..000000000 --- a/defects/transformers/bench/bench-transformers-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0001.py -# tokenization_python.py convert_ids_to_tokens O(T×S) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0001: tokenization_python.py convert_ids_to_tokens O(T×S) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers/bench/bench-transformers-0002-0002.py b/defects/transformers/bench/bench-transformers-0002-0002.py deleted file mode 100644 index b06d6b84a..000000000 --- a/defects/transformers/bench/bench-transformers-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0002-0002.py -# CWE-407: list-scan inside loop in transformers-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0002-0002: CWE-407: list-scan inside loop in transformers-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers/bench/bench-transformers-0003-0003.py b/defects/transformers/bench/bench-transformers-0003-0003.py deleted file mode 100644 index 9f433a075..000000000 --- a/defects/transformers/bench/bench-transformers-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0003-0003.py -# CWE-407: list-scan inside loop in transformers-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0003-0003: CWE-407: list-scan inside loop in transformers-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers/bench/bench-transformers-0004-0004.py b/defects/transformers/bench/bench-transformers-0004-0004.py deleted file mode 100644 index db482cd11..000000000 --- a/defects/transformers/bench/bench-transformers-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-transformers-0004-0004.py -# CWE-407: list-scan inside loop in transformers-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== transformers-0004-0004: CWE-407: list-scan inside loop in transformers-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/transformers/bench/results.txt b/defects/transformers/bench/results.txt deleted file mode 100644 index 066f189dc..000000000 --- a/defects/transformers/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== transformers-0001: tokenization_python.py convert_ids_to_tokens O(T×S) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.363ms fixed=0.023ms speedup=104.9x -N=1000 k=1000 : defective=8.837ms fixed=0.046ms speedup=192.2x -N=2000 k=2000 : defective=36.317ms fixed=0.096ms speedup=377.4x - -=== transformers-0002-0002: CWE-407: list-scan inside loop in transformers-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=103.3x -N=1000 k=1000 : defective=9.339ms fixed=0.045ms speedup=206.4x -N=2000 k=2000 : defective=36.055ms fixed=0.098ms speedup=369.4x - -=== transformers-0003-0003: CWE-407: list-scan inside loop in transformers-0003-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.155ms fixed=0.020ms speedup=108.5x -N=1000 k=1000 : defective=8.663ms fixed=0.046ms speedup=190.4x -N=2000 k=2000 : defective=34.941ms fixed=0.097ms speedup=359.7x - -=== transformers-0004-0004: CWE-407: list-scan inside loop in transformers-0004-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.137ms fixed=0.020ms speedup=105.8x -N=1000 k=1000 : defective=8.782ms fixed=0.045ms speedup=193.1x -N=2000 k=2000 : defective=35.758ms fixed=0.097ms speedup=369.4x - diff --git a/defects/transformers/bench/run_all.py b/defects/transformers/bench/run_all.py deleted file mode 100644 index 5e8152a21..000000000 --- a/defects/transformers/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-transformers-0001.py", "bench-transformers-0002-0002.py", "bench-transformers-0003-0003.py", "bench-transformers-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/trezor-0001/Makefile b/defects/trezor-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/trezor-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/trezor-0001/bench/bench-trezor-0001-0001.py b/defects/trezor-0001/bench/bench-trezor-0001-0001.py deleted file mode 100644 index 00b0e6efa..000000000 --- a/defects/trezor-0001/bench/bench-trezor-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-trezor-0001-0001.py -# CWE-407: list-scan inside loop in trezor-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== trezor-0001-0001: CWE-407: list-scan inside loop in trezor-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/trezor-0001/bench/results.txt b/defects/trezor-0001/bench/results.txt deleted file mode 100644 index 33de248d4..000000000 --- a/defects/trezor-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== trezor-0001-0001: CWE-407: list-scan inside loop in trezor-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.193ms fixed=0.021ms speedup=106.2x -N=1000 k=1000 : defective=9.005ms fixed=0.045ms speedup=199.4x -N=2000 k=2000 : defective=37.207ms fixed=0.099ms speedup=376.5x - diff --git a/defects/trezor-0001/bench/run_all.py b/defects/trezor-0001/bench/run_all.py deleted file mode 100644 index b921873c3..000000000 --- a/defects/trezor-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-trezor-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/trezor-0002/Makefile b/defects/trezor-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/trezor-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/trezor-0002/bench/bench-trezor-0002-0002.py b/defects/trezor-0002/bench/bench-trezor-0002-0002.py deleted file mode 100644 index ca2914cc7..000000000 --- a/defects/trezor-0002/bench/bench-trezor-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-trezor-0002-0002.py -# CWE-407: list-scan inside loop in trezor-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== trezor-0002-0002: CWE-407: list-scan inside loop in trezor-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/trezor-0002/bench/results.txt b/defects/trezor-0002/bench/results.txt deleted file mode 100644 index 3d123e044..000000000 --- a/defects/trezor-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== trezor-0002-0002: CWE-407: list-scan inside loop in trezor-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.4x -N=500 k=500 : defective=2.341ms fixed=0.022ms speedup=104.4x -N=1000 k=1000 : defective=9.689ms fixed=0.051ms speedup=190.8x -N=2000 k=2000 : defective=35.402ms fixed=0.097ms speedup=365.1x - diff --git a/defects/trezor-0002/bench/run_all.py b/defects/trezor-0002/bench/run_all.py deleted file mode 100644 index b4c82f412..000000000 --- a/defects/trezor-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-trezor-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/trino/Makefile b/defects/trino/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/trino/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/trino/bench/bench-trino-0001.py b/defects/trino/bench/bench-trino-0001.py deleted file mode 100644 index 9cf99c9fb..000000000 --- a/defects/trino/bench/bench-trino-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-trino-0001.py -# PushDownDereferenceThroughJoin — List.contains in stream filter → O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== trino-0001: PushDownDereferenceThroughJoin — List.contains in stream filter → O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/trino/bench/bench-trino-0002.py b/defects/trino/bench/bench-trino-0002.py deleted file mode 100644 index 74de7fc9a..000000000 --- a/defects/trino/bench/bench-trino-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-trino-0002.py -# SkewedPartitionRebalancer scaledPartitions ArrayList.contains O(P²) per rebalance cycle -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== trino-0002: SkewedPartitionRebalancer scaledPartitions ArrayList.contains O(P²) per rebalance cycle ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/trino/bench/results.txt b/defects/trino/bench/results.txt deleted file mode 100644 index 8acb1dc1e..000000000 --- a/defects/trino/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== trino-0001: PushDownDereferenceThroughJoin — List.contains in stream filter → O(N²) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.123ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.753ms fixed=0.046ms speedup=190.5x -N=2000 k=2000 : defective=35.095ms fixed=0.101ms speedup=347.4x - -=== trino-0002: SkewedPartitionRebalancer scaledPartitions ArrayList.contains O(P²) per rebalance cycle === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.165ms fixed=0.020ms speedup=107.8x -N=1000 k=1000 : defective=8.688ms fixed=0.046ms speedup=187.4x -N=2000 k=2000 : defective=35.116ms fixed=0.096ms speedup=364.5x - diff --git a/defects/trino/bench/run_all.py b/defects/trino/bench/run_all.py deleted file mode 100644 index 80ceefe54..000000000 --- a/defects/trino/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-trino-0001.py", "bench-trino-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/tryton-0001/Makefile b/defects/tryton-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/tryton-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/tryton-0001/bench/bench-tryton-0001-0001.py b/defects/tryton-0001/bench/bench-tryton-0001-0001.py deleted file mode 100644 index 18b7e54da..000000000 --- a/defects/tryton-0001/bench/bench-tryton-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-tryton-0001-0001.py -# CWE-407: list-scan inside loop in tryton-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== tryton-0001-0001: CWE-407: list-scan inside loop in tryton-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/tryton-0001/bench/results.txt b/defects/tryton-0001/bench/results.txt deleted file mode 100644 index e6ae7973d..000000000 --- a/defects/tryton-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== tryton-0001-0001: CWE-407: list-scan inside loop in tryton-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.133ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=8.704ms fixed=0.046ms speedup=191.1x -N=2000 k=2000 : defective=37.274ms fixed=0.095ms speedup=391.1x - diff --git a/defects/tryton-0001/bench/run_all.py b/defects/tryton-0001/bench/run_all.py deleted file mode 100644 index 16553cffb..000000000 --- a/defects/tryton-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-tryton-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/typeorm/Makefile b/defects/typeorm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/typeorm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/typeorm/bench/bench-typeorm-0001.py b/defects/typeorm/bench/bench-typeorm-0001.py deleted file mode 100644 index 3d8cd7826..000000000 --- a/defects/typeorm/bench/bench-typeorm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typeorm-0001.py -# CWE-407: list-scan inside loop in typeorm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typeorm-0001: CWE-407: list-scan inside loop in typeorm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typeorm/bench/bench-typeorm-0002.py b/defects/typeorm/bench/bench-typeorm-0002.py deleted file mode 100644 index 38ab2cd80..000000000 --- a/defects/typeorm/bench/bench-typeorm-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typeorm-0002.py -# CWE-407: list-scan inside loop in typeorm-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typeorm-0002: CWE-407: list-scan inside loop in typeorm-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typeorm/bench/bench-typeorm-0003.py b/defects/typeorm/bench/bench-typeorm-0003.py deleted file mode 100644 index 86a7f7f7d..000000000 --- a/defects/typeorm/bench/bench-typeorm-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typeorm-0003.py -# CWE-407: list-scan inside loop in typeorm-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typeorm-0003: CWE-407: list-scan inside loop in typeorm-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typeorm/bench/bench-typeorm-0004.py b/defects/typeorm/bench/bench-typeorm-0004.py deleted file mode 100644 index 34e9cfc02..000000000 --- a/defects/typeorm/bench/bench-typeorm-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typeorm-0004.py -# CWE-407: list-scan inside loop in typeorm-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typeorm-0004: CWE-407: list-scan inside loop in typeorm-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typeorm/bench/bench-typeorm-0005.py b/defects/typeorm/bench/bench-typeorm-0005.py deleted file mode 100644 index 3ddf0b3b6..000000000 --- a/defects/typeorm/bench/bench-typeorm-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typeorm-0005.py -# CWE-407: list-scan inside loop in typeorm-0005 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typeorm-0005: CWE-407: list-scan inside loop in typeorm-0005 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typeorm/bench/results.txt b/defects/typeorm/bench/results.txt deleted file mode 100644 index 0d09f334e..000000000 --- a/defects/typeorm/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== typeorm-0001: CWE-407: list-scan inside loop in typeorm-0001 (generic model) === -N=100 k=100 : defective=0.138ms fixed=0.006ms speedup=24.9x -N=500 k=500 : defective=3.449ms fixed=0.034ms speedup=101.6x -N=1000 k=1000 : defective=15.186ms fixed=0.074ms speedup=206.2x -N=2000 k=2000 : defective=38.422ms fixed=0.097ms speedup=397.3x - -=== typeorm-0002: CWE-407: list-scan inside loop in typeorm-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.101ms fixed=0.020ms speedup=104.1x -N=1000 k=1000 : defective=8.600ms fixed=0.045ms speedup=190.6x -N=2000 k=2000 : defective=35.568ms fixed=0.095ms speedup=372.4x - -=== typeorm-0003: CWE-407: list-scan inside loop in typeorm-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.103ms fixed=0.021ms speedup=98.2x -N=1000 k=1000 : defective=8.548ms fixed=0.045ms speedup=188.1x -N=2000 k=2000 : defective=35.782ms fixed=0.096ms speedup=372.5x - -=== typeorm-0004: CWE-407: list-scan inside loop in typeorm-0004 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.100ms fixed=0.021ms speedup=101.5x -N=1000 k=1000 : defective=8.733ms fixed=0.046ms speedup=189.7x -N=2000 k=2000 : defective=34.862ms fixed=0.096ms speedup=363.4x - -=== typeorm-0005: CWE-407: list-scan inside loop in typeorm-0005 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.108ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.542ms fixed=0.046ms speedup=187.7x -N=2000 k=2000 : defective=35.179ms fixed=0.097ms speedup=363.1x - diff --git a/defects/typeorm/bench/run_all.py b/defects/typeorm/bench/run_all.py deleted file mode 100644 index 5ddcbe48d..000000000 --- a/defects/typeorm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-typeorm-0001.py", "bench-typeorm-0002.py", "bench-typeorm-0003.py", "bench-typeorm-0004.py", "bench-typeorm-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/typescript/Makefile b/defects/typescript/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/typescript/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/typescript/bench/bench-typescript-0001.py b/defects/typescript/bench/bench-typescript-0001.py deleted file mode 100644 index 40ddf2b15..000000000 --- a/defects/typescript/bench/bench-typescript-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typescript-0001.py -# CWE-407: list-scan inside loop in typescript-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typescript-0001: CWE-407: list-scan inside loop in typescript-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typescript/bench/bench-typescript-0002.py b/defects/typescript/bench/bench-typescript-0002.py deleted file mode 100644 index 32e678472..000000000 --- a/defects/typescript/bench/bench-typescript-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typescript-0002.py -# CWE-407: list-scan inside loop in typescript-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typescript-0002: CWE-407: list-scan inside loop in typescript-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typescript/bench/bench-typescript-0003.py b/defects/typescript/bench/bench-typescript-0003.py deleted file mode 100644 index 2a235bbbc..000000000 --- a/defects/typescript/bench/bench-typescript-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typescript-0003.py -# CWE-407: list-scan inside loop in typescript-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typescript-0003: CWE-407: list-scan inside loop in typescript-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typescript/bench/bench-typescript-0004.py b/defects/typescript/bench/bench-typescript-0004.py deleted file mode 100644 index 415718a80..000000000 --- a/defects/typescript/bench/bench-typescript-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typescript-0004.py -# resolvedProjectReferenceUptoDate — seenResolvedRefs Array O(N²) linear scan -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typescript-0004: resolvedProjectReferenceUptoDate — seenResolvedRefs Array O(N²) linear scan ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typescript/bench/bench-typescript-0005.py b/defects/typescript/bench/bench-typescript-0005.py deleted file mode 100644 index 56e1ab60e..000000000 --- a/defects/typescript/bench/bench-typescript-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-typescript-0005.py -# hasBaseType — O(2^D) diamond interface/class hierarchy re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== typescript-0005: hasBaseType — O(2^D) diamond interface/class hierarchy re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/typescript/bench/results.txt b/defects/typescript/bench/results.txt deleted file mode 100644 index d71471b27..000000000 --- a/defects/typescript/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== typescript-0001: CWE-407: list-scan inside loop in typescript-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.101ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=8.546ms fixed=0.046ms speedup=184.4x -N=2000 k=2000 : defective=34.834ms fixed=0.097ms speedup=360.4x - -=== typescript-0002: CWE-407: list-scan inside loop in typescript-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.006ms speedup=14.8x -N=500 k=500 : defective=2.098ms fixed=0.020ms speedup=102.9x -N=1000 k=1000 : defective=8.698ms fixed=0.045ms speedup=191.3x -N=2000 k=2000 : defective=33.922ms fixed=0.097ms speedup=349.8x - -=== typescript-0003: CWE-407: list-scan inside loop in typescript-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.111ms fixed=0.021ms speedup=101.1x -N=1000 k=1000 : defective=8.772ms fixed=0.045ms speedup=195.0x -N=2000 k=2000 : defective=35.581ms fixed=0.092ms speedup=387.5x - -=== typescript-0004: resolvedProjectReferenceUptoDate — seenResolvedRefs Array O(N²) linear scan === -N=100 k=100 : defective=0.153ms fixed=0.007ms speedup=23.4x -N=500 k=500 : defective=2.054ms fixed=0.020ms speedup=104.3x -N=1000 k=1000 : defective=8.264ms fixed=0.045ms speedup=184.2x -N=2000 k=2000 : defective=35.349ms fixed=0.094ms speedup=377.1x - -=== typescript-0005: hasBaseType — O(2^D) diamond interface/class hierarchy re-traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.014ms fixed=0.020ms speedup=100.6x -N=1000 k=1000 : defective=8.378ms fixed=0.043ms speedup=195.2x -N=2000 k=2000 : defective=34.215ms fixed=0.092ms speedup=370.1x - diff --git a/defects/typescript/bench/run_all.py b/defects/typescript/bench/run_all.py deleted file mode 100644 index 666b53074..000000000 --- a/defects/typescript/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-typescript-0001.py", "bench-typescript-0002.py", "bench-typescript-0003.py", "bench-typescript-0004.py", "bench-typescript-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/unbound-0001/Makefile b/defects/unbound-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/unbound-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/unbound-0001/bench/bench-unbound-0001-0001.py b/defects/unbound-0001/bench/bench-unbound-0001-0001.py deleted file mode 100644 index 09c40c1e0..000000000 --- a/defects/unbound-0001/bench/bench-unbound-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-unbound-0001-0001.py -# CWE-407: list-scan inside loop in unbound-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== unbound-0001-0001: CWE-407: list-scan inside loop in unbound-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/unbound-0001/bench/results.txt b/defects/unbound-0001/bench/results.txt deleted file mode 100644 index 213e28ef9..000000000 --- a/defects/unbound-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== unbound-0001-0001: CWE-407: list-scan inside loop in unbound-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.176ms fixed=0.020ms speedup=107.5x -N=1000 k=1000 : defective=8.880ms fixed=0.046ms speedup=192.1x -N=2000 k=2000 : defective=36.311ms fixed=0.096ms speedup=376.7x - diff --git a/defects/unbound-0001/bench/run_all.py b/defects/unbound-0001/bench/run_all.py deleted file mode 100644 index 783d865e3..000000000 --- a/defects/unbound-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-unbound-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/undertow/Makefile b/defects/undertow/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/undertow/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/undertow/bench/bench-undertow-0001.py b/defects/undertow/bench/bench-undertow-0001.py deleted file mode 100644 index 9bf33c9b5..000000000 --- a/defects/undertow/bench/bench-undertow-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-undertow-0001.py -# CWE-407: list-scan inside loop in undertow-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== undertow-0001: CWE-407: list-scan inside loop in undertow-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/undertow/bench/results.txt b/defects/undertow/bench/results.txt deleted file mode 100644 index d33a88e0d..000000000 --- a/defects/undertow/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== undertow-0001: CWE-407: list-scan inside loop in undertow-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=8.740ms fixed=0.046ms speedup=192.0x -N=2000 k=2000 : defective=36.940ms fixed=0.109ms speedup=337.6x - diff --git a/defects/undertow/bench/run_all.py b/defects/undertow/bench/run_all.py deleted file mode 100644 index b1cda23d7..000000000 --- a/defects/undertow/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-undertow-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/unrealircd/Makefile b/defects/unrealircd/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/unrealircd/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/unrealircd/bench/bench-unrealircd-0001.py b/defects/unrealircd/bench/bench-unrealircd-0001.py deleted file mode 100644 index 631108fbe..000000000 --- a/defects/unrealircd/bench/bench-unrealircd-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-unrealircd-0001.py -# CWE-407: list-scan inside loop in unrealircd-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== unrealircd-0001: CWE-407: list-scan inside loop in unrealircd-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/unrealircd/bench/bench-unrealircd-0002.py b/defects/unrealircd/bench/bench-unrealircd-0002.py deleted file mode 100644 index d368ed056..000000000 --- a/defects/unrealircd/bench/bench-unrealircd-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-unrealircd-0002.py -# CWE-407: list-scan inside loop in unrealircd-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== unrealircd-0002: CWE-407: list-scan inside loop in unrealircd-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/unrealircd/bench/results.txt b/defects/unrealircd/bench/results.txt deleted file mode 100644 index 9379c7839..000000000 --- a/defects/unrealircd/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== unrealircd-0001: CWE-407: list-scan inside loop in unrealircd-0001 (generic model) === -N=100 k=100 : defective=0.107ms fixed=0.017ms speedup=6.5x -N=500 k=500 : defective=2.656ms fixed=0.024ms speedup=108.9x -N=1000 k=1000 : defective=9.449ms fixed=0.048ms speedup=195.7x -N=2000 k=2000 : defective=35.521ms fixed=0.098ms speedup=363.5x - -=== unrealircd-0002: CWE-407: list-scan inside loop in unrealircd-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.233ms fixed=0.021ms speedup=104.5x -N=1000 k=1000 : defective=8.622ms fixed=0.045ms speedup=189.9x -N=2000 k=2000 : defective=35.013ms fixed=0.097ms speedup=362.8x - diff --git a/defects/unrealircd/bench/run_all.py b/defects/unrealircd/bench/run_all.py deleted file mode 100644 index 4a92069ae..000000000 --- a/defects/unrealircd/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-unrealircd-0001.py", "bench-unrealircd-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/uwsgi/Makefile b/defects/uwsgi/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/uwsgi/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/uwsgi/bench/bench-uwsgi-0001.py b/defects/uwsgi/bench/bench-uwsgi-0001.py deleted file mode 100644 index e433d58b3..000000000 --- a/defects/uwsgi/bench/bench-uwsgi-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-uwsgi-0001.py -# HTTP Header Duplicate Detection O(H²) — CWE-407 -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== uwsgi-0001: HTTP Header Duplicate Detection O(H²) — CWE-407 ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/uwsgi/bench/results.txt b/defects/uwsgi/bench/results.txt deleted file mode 100644 index ad10463a7..000000000 --- a/defects/uwsgi/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== uwsgi-0001: HTTP Header Duplicate Detection O(H²) — CWE-407 === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.223ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=8.669ms fixed=0.045ms speedup=192.1x -N=2000 k=2000 : defective=35.106ms fixed=0.096ms speedup=365.1x - diff --git a/defects/uwsgi/bench/run_all.py b/defects/uwsgi/bench/run_all.py deleted file mode 100644 index 1a578a260..000000000 --- a/defects/uwsgi/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-uwsgi-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/v8/Makefile b/defects/v8/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/v8/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/v8/bench/bench-v8-0001.py b/defects/v8/bench/bench-v8-0001.py deleted file mode 100644 index e051181e9..000000000 --- a/defects/v8/bench/bench-v8-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-v8-0001.py -# CWE-407: list-scan inside loop in v8-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== v8-0001: CWE-407: list-scan inside loop in v8-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/v8/bench/bench-v8-0002.py b/defects/v8/bench/bench-v8-0002.py deleted file mode 100644 index d8ddd07a6..000000000 --- a/defects/v8/bench/bench-v8-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-v8-0002.py -# v8-0002 — objects/intl: CanonicalizeLocaleList seen-list O(N²) → O(N) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== v8-0002: v8-0002 — objects/intl: CanonicalizeLocaleList seen-list O(N²) → O(N) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/v8/bench/bench-v8-0003.py b/defects/v8/bench/bench-v8-0003.py deleted file mode 100644 index 2544c44ca..000000000 --- a/defects/v8/bench/bench-v8-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-v8-0003.py -# v8-0003 — compiler/revectorizer: SLPTree::TryReduceLoadChain loads O(L×N) → O(L) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== v8-0003: v8-0003 — compiler/revectorizer: SLPTree::TryReduceLoadChain loads O(L×N) → O(L) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/v8/bench/bench-v8-0004.py b/defects/v8/bench/bench-v8-0004.py deleted file mode 100644 index dee3b6c09..000000000 --- a/defects/v8/bench/bench-v8-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-v8-0004.py -# KnownMapsMerger::IntersectWithKnownNodeAspects std::find O(P×R) → O(P+R) merge -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== v8-0004: KnownMapsMerger::IntersectWithKnownNodeAspects std::find O(P×R) → O(P+R) merge ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/v8/bench/results.txt b/defects/v8/bench/results.txt deleted file mode 100644 index cb5a49a89..000000000 --- a/defects/v8/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== v8-0001: CWE-407: list-scan inside loop in v8-0001 (generic model) === -N=100 k=100 : defective=0.090ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.267ms fixed=0.021ms speedup=105.7x -N=1000 k=1000 : defective=8.783ms fixed=0.046ms speedup=192.4x -N=2000 k=2000 : defective=35.590ms fixed=0.098ms speedup=364.4x - -=== v8-0002: v8-0002 — objects/intl: CanonicalizeLocaleList seen-list O(N²) → O(N) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.4x -N=500 k=500 : defective=2.145ms fixed=0.088ms speedup=24.4x -N=1000 k=1000 : defective=8.706ms fixed=0.046ms speedup=190.4x -N=2000 k=2000 : defective=35.124ms fixed=0.097ms speedup=360.9x - -=== v8-0003: v8-0003 — compiler/revectorizer: SLPTree::TryReduceLoadChain loads O(L×N) → O(L) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.278ms fixed=0.020ms speedup=111.4x -N=1000 k=1000 : defective=8.727ms fixed=0.046ms speedup=188.6x -N=2000 k=2000 : defective=37.904ms fixed=0.096ms speedup=393.8x - -=== v8-0004: KnownMapsMerger::IntersectWithKnownNodeAspects std::find O(P×R) → O(P+R) merge === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.5x -N=500 k=500 : defective=2.117ms fixed=0.036ms speedup=58.9x -N=1000 k=1000 : defective=8.716ms fixed=0.046ms speedup=189.5x -N=2000 k=2000 : defective=35.753ms fixed=0.097ms speedup=367.7x - diff --git a/defects/v8/bench/run_all.py b/defects/v8/bench/run_all.py deleted file mode 100644 index e9b78529b..000000000 --- a/defects/v8/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-v8-0001.py", "bench-v8-0002.py", "bench-v8-0003.py", "bench-v8-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vagrant/Makefile b/defects/vagrant/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vagrant/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vagrant/bench/bench-vagrant-0001.py b/defects/vagrant/bench/bench-vagrant-0001.py deleted file mode 100644 index 27f788d5d..000000000 --- a/defects/vagrant/bench/bench-vagrant-0001.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -# bench-vagrant-0001.py -# Bundler plugin loader: plugins.keys.include?(spec.name) inside a per-spec -# loop. O(S*P) for S resolved specs and P plugins. Fix: hoist Set, O(1) -# per spec. - -import sys -import time - - -def bench_defective(s_specs, p_plugins): - plugin_keys = [f"plugin_{i:03d}" for i in range(p_plugins)] - specs = [f"plugin_{(i * 7) % p_plugins:03d}" for i in range(s_specs)] - - t0 = time.perf_counter() - matched = [] - for spec in specs: - # Ruby Array#include? = Python list __contains__ = O(P) - if spec in plugin_keys: - matched.append(spec) - return time.perf_counter() - t0 - - -def bench_fixed(s_specs, p_plugins): - plugin_keys = [f"plugin_{i:03d}" for i in range(p_plugins)] - specs = [f"plugin_{(i * 7) % p_plugins:03d}" for i in range(s_specs)] - - t0 = time.perf_counter() - plugin_set = set(plugin_keys) - matched = [] - for spec in specs: - if spec in plugin_set: # Set#include? = O(1) - matched.append(spec) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(50, 50), (200, 100), (500, 200), (1000, 500), (2000, 1000)] - - -def run(): - lines = [] - header = "=== vagrant-0001: Bundler plugin Array#include? vs Set#include? ===" - print(header); lines.append(header) - for s, p in CASES: - df = min(bench_defective(s, p) for _ in range(TRIALS)) - fx = min(bench_fixed(s, p) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"S={s:<5} P={p:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vagrant/bench/results.txt b/defects/vagrant/bench/results.txt deleted file mode 100644 index 38f22611b..000000000 --- a/defects/vagrant/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== vagrant-0001: Bundler plugin Array#include? vs Set#include? === -S=50 P=50 : defective=0.037ms fixed=0.009ms speedup=4.3x -S=200 P=100 : defective=0.437ms fixed=0.049ms speedup=9.0x -S=500 P=200 : defective=2.319ms fixed=0.144ms speedup=16.1x -S=1000 P=500 : defective=6.800ms fixed=0.115ms speedup=59.3x -S=2000 P=1000 : defective=30.154ms fixed=0.237ms speedup=127.1x - diff --git a/defects/vagrant/bench/run_all.py b/defects/vagrant/bench/run_all.py deleted file mode 100644 index af2299063..000000000 --- a/defects/vagrant/bench/run_all.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod -all_lines = [] -for fname in ["bench-vagrant-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vagrant/patch/vagrant-0001-bundler-plugin-include-in-loop.patch b/defects/vagrant/patch/vagrant-0001-bundler-plugin-include-in-loop.patch deleted file mode 100644 index deca52f40..000000000 --- a/defects/vagrant/patch/vagrant-0001-bundler-plugin-include-in-loop.patch +++ /dev/null @@ -1,51 +0,0 @@ -# UNDF: UNDF-2026-000001297 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(S*P) -> O(S+P) in Vagrant Bundler plugin paths -# -# Defect: Two per-spec loops in lib/vagrant/bundler.rb call .include? on a -# plain Ruby Array (plugins.keys / system_plugins), giving O(P) per spec. -# Across S resolved specs, total O(S*P) per vagrant command run. Fires on -# every vagrant invocation that touches the plugin path. -# -# Fix: Hoist a Set built from the array once before each loop. Set#include? -# is O(1). require "set" already loaded at top of file. -# -# Complexity gate (tests/test-vagrant-cwe407.py): -# S=P=500: fixed must complete in <5ms -# k-scaling 5x: time ratio must be <17.5x ---- a/lib/vagrant/bundler.rb -+++ b/lib/vagrant/bundler.rb -@@ -466,9 +466,11 @@ module Vagrant - ).uninstall_gem(spec) - end - -- solution.find_all do |spec| -- plugins.keys.include?(spec.name) -- end -+ # Hoist plugin name lookup into a Set; previously plugins.keys.include? -+ # was O(P) per spec, giving O(S*P) on every plugin-pruning call. -+ plugin_name_set = Set.new(plugins.keys) -+ solution.find_all { |spec| plugin_name_set.include?(spec.name) } - end - - # During the duration of the yielded block, Bundler loud output -@@ -522,6 +524,8 @@ module Vagrant - - if Vagrant.strict_dependency_enforcement - @logger.debug("Enabling strict dependency enforcement") -+ # Build a Set once for O(1) per-spec membership check. -+ system_plugin_set = Set.new(system_plugins) - plugin_deps += vagrant_internal_specs.map do |spec| - # NOTE: When working within bundler, skip any system plugins and - # default gems. However, when not within bundler (in the installer) -@@ -530,7 +534,7 @@ module Vagrant - # set does allow for resolving conservatively but it can't be set - # from the public API (requires an instance variable set on the resolver - # instance) so strict dependencies are used instead. -- if Vagrant.in_bundler? -- next if system_plugins.include?(spec.name) -+ if Vagrant.in_bundler? -+ next if system_plugin_set.include?(spec.name) - # # If this spec is for a default plugin included in - # # the ruby stdlib, ignore it - next if spec.default_gem? diff --git a/defects/valhalla/Makefile b/defects/valhalla/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/valhalla/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/valhalla/bench/bench-valhalla-0001.py b/defects/valhalla/bench/bench-valhalla-0001.py deleted file mode 100644 index 01c0c5502..000000000 --- a/defects/valhalla/bench/bench-valhalla-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-valhalla-0001.py -# linkclassification.cc — IsSlipLane() nested linear scan O(F×R) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== valhalla-0001: linkclassification.cc — IsSlipLane() nested linear scan O(F×R) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/valhalla/bench/results.txt b/defects/valhalla/bench/results.txt deleted file mode 100644 index cf014052f..000000000 --- a/defects/valhalla/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== valhalla-0001: linkclassification.cc — IsSlipLane() nested linear scan O(F×R) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.123ms fixed=0.022ms speedup=97.6x -N=1000 k=1000 : defective=8.920ms fixed=0.045ms speedup=196.4x -N=2000 k=2000 : defective=35.134ms fixed=0.097ms speedup=362.0x - diff --git a/defects/valhalla/bench/run_all.py b/defects/valhalla/bench/run_all.py deleted file mode 100644 index c61132543..000000000 --- a/defects/valhalla/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-valhalla-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/valkey/Makefile b/defects/valkey/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/valkey/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/valkey/bench/bench-valkey-0001.py b/defects/valkey/bench/bench-valkey-0001.py deleted file mode 100644 index 873de39e6..000000000 --- a/defects/valkey/bench/bench-valkey-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-valkey-0001.py -# CWE-407: list-scan inside loop in valkey-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== valkey-0001: CWE-407: list-scan inside loop in valkey-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/valkey/bench/bench-valkey-0002.py b/defects/valkey/bench/bench-valkey-0002.py deleted file mode 100644 index fb5fa6def..000000000 --- a/defects/valkey/bench/bench-valkey-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-valkey-0002.py -# CWE-407: list-scan inside loop in valkey-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== valkey-0002: CWE-407: list-scan inside loop in valkey-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/valkey/bench/bench-valkey-0003.py b/defects/valkey/bench/bench-valkey-0003.py deleted file mode 100644 index 82a06f000..000000000 --- a/defects/valkey/bench/bench-valkey-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-valkey-0003.py -# CWE-407: list-scan inside loop in valkey-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== valkey-0003: CWE-407: list-scan inside loop in valkey-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/valkey/bench/results.txt b/defects/valkey/bench/results.txt deleted file mode 100644 index fbc33941c..000000000 --- a/defects/valkey/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== valkey-0001: CWE-407: list-scan inside loop in valkey-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.146ms fixed=0.021ms speedup=104.2x -N=1000 k=1000 : defective=8.599ms fixed=0.046ms speedup=186.2x -N=2000 k=2000 : defective=35.820ms fixed=0.095ms speedup=375.8x - -=== valkey-0002: CWE-407: list-scan inside loop in valkey-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.118ms fixed=0.021ms speedup=102.7x -N=1000 k=1000 : defective=8.595ms fixed=0.046ms speedup=186.6x -N=2000 k=2000 : defective=36.017ms fixed=0.097ms speedup=370.5x - -=== valkey-0003: CWE-407: list-scan inside loop in valkey-0003 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.149ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.829ms fixed=0.046ms speedup=190.8x -N=2000 k=2000 : defective=35.708ms fixed=0.097ms speedup=367.1x - diff --git a/defects/valkey/bench/run_all.py b/defects/valkey/bench/run_all.py deleted file mode 100644 index 084a14336..000000000 --- a/defects/valkey/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-valkey-0001.py", "bench-valkey-0002.py", "bench-valkey-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/varnish/Makefile b/defects/varnish/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/varnish/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/varnish/bench/bench-varnish-0001.py b/defects/varnish/bench/bench-varnish-0001.py deleted file mode 100644 index 2e346fb95..000000000 --- a/defects/varnish/bench/bench-varnish-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-varnish-0001.py -# CWE-407: list-scan inside loop in varnish-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== varnish-0001: CWE-407: list-scan inside loop in varnish-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/varnish/bench/bench-varnish-0002.py b/defects/varnish/bench/bench-varnish-0002.py deleted file mode 100644 index 83d329678..000000000 --- a/defects/varnish/bench/bench-varnish-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-varnish-0002.py -# BAN_Reload O(B²) dedup scan via ban_equal memcmp -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== varnish-0002: BAN_Reload O(B²) dedup scan via ban_equal memcmp ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/varnish/bench/bench-varnish-0003.py b/defects/varnish/bench/bench-varnish-0003.py deleted file mode 100644 index 10a73704a..000000000 --- a/defects/varnish/bench/bench-varnish-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-varnish-0003.py -# vmod_cookie filter_cookies O(C×L) → O(C+L) with hash set -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== varnish-0003: vmod_cookie filter_cookies O(C×L) → O(C+L) with hash set ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/varnish/bench/results.txt b/defects/varnish/bench/results.txt deleted file mode 100644 index db05d7ab9..000000000 --- a/defects/varnish/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== varnish-0001: CWE-407: list-scan inside loop in varnish-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.426ms fixed=0.024ms speedup=101.1x -N=1000 k=1000 : defective=8.843ms fixed=0.046ms speedup=191.9x -N=2000 k=2000 : defective=36.376ms fixed=0.097ms speedup=373.5x - -=== varnish-0002: BAN_Reload O(B²) dedup scan via ban_equal memcmp === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.126ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.786ms fixed=0.045ms speedup=195.3x -N=2000 k=2000 : defective=35.571ms fixed=0.097ms speedup=366.5x - -=== varnish-0003: vmod_cookie filter_cookies O(C×L) → O(C+L) with hash set === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.123ms fixed=0.021ms speedup=103.2x -N=1000 k=1000 : defective=8.666ms fixed=0.046ms speedup=187.3x -N=2000 k=2000 : defective=35.027ms fixed=0.096ms speedup=364.0x - diff --git a/defects/varnish/bench/run_all.py b/defects/varnish/bench/run_all.py deleted file mode 100644 index 6a89ea5a2..000000000 --- a/defects/varnish/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-varnish-0001.py", "bench-varnish-0002.py", "bench-varnish-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vault/Makefile b/defects/vault/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vault/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vault/bench/bench-vault-0001.py b/defects/vault/bench/bench-vault-0001.py deleted file mode 100644 index 00fe62047..000000000 --- a/defects/vault/bench/bench-vault-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vault-0001.py -# vault-0001 — HashiCorp Vault: sanitizeAndUpsertGroup O(G²) group membership test -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vault-0001: vault-0001 — HashiCorp Vault: sanitizeAndUpsertGroup O(G²) group membership test ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vault/bench/results.txt b/defects/vault/bench/results.txt deleted file mode 100644 index f8cab9202..000000000 --- a/defects/vault/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== vault-0001: vault-0001 — HashiCorp Vault: sanitizeAndUpsertGroup O(G²) group membership test === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=103.6x -N=1000 k=1000 : defective=8.738ms fixed=0.045ms speedup=192.6x -N=2000 k=2000 : defective=35.041ms fixed=0.096ms speedup=364.0x - diff --git a/defects/vault/bench/run_all.py b/defects/vault/bench/run_all.py deleted file mode 100644 index 6362b9d75..000000000 --- a/defects/vault/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vault-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/veloren-0001/Makefile b/defects/veloren-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/veloren-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/veloren-0001/bench/bench-veloren-0001-0001.py b/defects/veloren-0001/bench/bench-veloren-0001-0001.py deleted file mode 100644 index 0352f9bd9..000000000 --- a/defects/veloren-0001/bench/bench-veloren-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-veloren-0001-0001.py -# CWE-407: list-scan inside loop in veloren-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== veloren-0001-0001: CWE-407: list-scan inside loop in veloren-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/veloren-0001/bench/results.txt b/defects/veloren-0001/bench/results.txt deleted file mode 100644 index 8d101b8ae..000000000 --- a/defects/veloren-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== veloren-0001-0001: CWE-407: list-scan inside loop in veloren-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.164ms fixed=0.021ms speedup=103.7x -N=1000 k=1000 : defective=8.866ms fixed=0.045ms speedup=194.9x -N=2000 k=2000 : defective=37.676ms fixed=0.095ms speedup=394.7x - diff --git a/defects/veloren-0001/bench/run_all.py b/defects/veloren-0001/bench/run_all.py deleted file mode 100644 index f55e079c3..000000000 --- a/defects/veloren-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-veloren-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/veloren-0002/Makefile b/defects/veloren-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/veloren-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/veloren-0002/bench/bench-veloren-0002-0002.py b/defects/veloren-0002/bench/bench-veloren-0002-0002.py deleted file mode 100644 index 043318ef1..000000000 --- a/defects/veloren-0002/bench/bench-veloren-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-veloren-0002-0002.py -# CWE-407: list-scan inside loop in veloren-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== veloren-0002-0002: CWE-407: list-scan inside loop in veloren-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/veloren-0002/bench/results.txt b/defects/veloren-0002/bench/results.txt deleted file mode 100644 index 55180cf52..000000000 --- a/defects/veloren-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== veloren-0002-0002: CWE-407: list-scan inside loop in veloren-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.413ms fixed=0.021ms speedup=112.3x -N=1000 k=1000 : defective=9.124ms fixed=0.048ms speedup=189.7x -N=2000 k=2000 : defective=36.803ms fixed=0.096ms speedup=381.7x - diff --git a/defects/veloren-0002/bench/run_all.py b/defects/veloren-0002/bench/run_all.py deleted file mode 100644 index a68e8ba54..000000000 --- a/defects/veloren-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-veloren-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vertx-core/Makefile b/defects/vertx-core/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vertx-core/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vertx-core/bench/bench-vertx-core-0001.py b/defects/vertx-core/bench/bench-vertx-core-0001.py deleted file mode 100644 index b1878bbe3..000000000 --- a/defects/vertx-core/bench/bench-vertx-core-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vertx-core-0001.py -# HAManager.nodeLeft — O(N×M) nodes List.contains inside clusterMap loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vertx-core-0001: HAManager.nodeLeft — O(N×M) nodes List.contains inside clusterMap loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vertx-core/bench/results.txt b/defects/vertx-core/bench/results.txt deleted file mode 100644 index 9deb95862..000000000 --- a/defects/vertx-core/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== vertx-core-0001: HAManager.nodeLeft — O(N×M) nodes List.contains inside clusterMap loop === -N=100 k=100 : defective=0.109ms fixed=0.007ms speedup=15.9x -N=500 k=500 : defective=2.901ms fixed=0.026ms speedup=112.8x -N=1000 k=1000 : defective=11.258ms fixed=0.059ms speedup=191.1x -N=2000 k=2000 : defective=37.753ms fixed=0.094ms speedup=400.8x - diff --git a/defects/vertx-core/bench/run_all.py b/defects/vertx-core/bench/run_all.py deleted file mode 100644 index 0304ebd30..000000000 --- a/defects/vertx-core/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vertx-core-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vertx/Makefile b/defects/vertx/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vertx/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vertx/bench/bench-vertx-0001.py b/defects/vertx/bench/bench-vertx-0001.py deleted file mode 100644 index b3dc6b0ff..000000000 --- a/defects/vertx/bench/bench-vertx-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vertx-0001.py -# CWE-407: list-scan inside loop in vertx-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vertx-0001: CWE-407: list-scan inside loop in vertx-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vertx/bench/bench-vertx-core-0001.py b/defects/vertx/bench/bench-vertx-core-0001.py deleted file mode 100644 index e99985176..000000000 --- a/defects/vertx/bench/bench-vertx-core-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vertx-core-0001.py -# CWE-407: list-scan inside loop in vertx-core-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vertx-core-0001: CWE-407: list-scan inside loop in vertx-core-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vertx/bench/results.txt b/defects/vertx/bench/results.txt deleted file mode 100644 index b1353ce20..000000000 --- a/defects/vertx/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== vertx-0001: CWE-407: list-scan inside loop in vertx-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.312ms fixed=0.023ms speedup=102.6x -N=1000 k=1000 : defective=8.895ms fixed=0.046ms speedup=193.3x -N=2000 k=2000 : defective=35.472ms fixed=0.096ms speedup=367.9x - -=== vertx-core-0001: CWE-407: list-scan inside loop in vertx-core-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.103ms fixed=0.021ms speedup=101.7x -N=1000 k=1000 : defective=8.752ms fixed=0.046ms speedup=188.9x -N=2000 k=2000 : defective=35.153ms fixed=0.096ms speedup=366.0x - diff --git a/defects/vertx/bench/run_all.py b/defects/vertx/bench/run_all.py deleted file mode 100644 index 4248ed5c2..000000000 --- a/defects/vertx/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vertx-0001.py", "bench-vertx-core-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vice-0001/Makefile b/defects/vice-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vice-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vice-0001/bench/bench-vice-0001-0001.py b/defects/vice-0001/bench/bench-vice-0001-0001.py deleted file mode 100644 index 3f43e6ec3..000000000 --- a/defects/vice-0001/bench/bench-vice-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vice-0001-0001.py -# CWE-407: list-scan inside loop in vice-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vice-0001-0001: CWE-407: list-scan inside loop in vice-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vice-0001/bench/results.txt b/defects/vice-0001/bench/results.txt deleted file mode 100644 index 11cab4bd8..000000000 --- a/defects/vice-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== vice-0001-0001: CWE-407: list-scan inside loop in vice-0001-0001 (generic model) === -N=100 k=100 : defective=0.114ms fixed=0.005ms speedup=24.0x -N=500 k=500 : defective=2.975ms fixed=0.028ms speedup=107.5x -N=1000 k=1000 : defective=12.650ms fixed=0.062ms speedup=203.4x -N=2000 k=2000 : defective=35.876ms fixed=0.096ms speedup=372.8x - diff --git a/defects/vice-0001/bench/run_all.py b/defects/vice-0001/bench/run_all.py deleted file mode 100644 index 02d1752f0..000000000 --- a/defects/vice-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vice-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/victoria-metrics/Makefile b/defects/victoria-metrics/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/victoria-metrics/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/victoria-metrics/bench/bench-victoria-metrics-0001.py b/defects/victoria-metrics/bench/bench-victoria-metrics-0001.py deleted file mode 100644 index d12bb0d99..000000000 --- a/defects/victoria-metrics/bench/bench-victoria-metrics-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-victoria-metrics-0001.py -# CWE-407: list-scan inside loop in victoria-metrics-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== victoria-metrics-0001: CWE-407: list-scan inside loop in victoria-metrics-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/victoria-metrics/bench/bench-victoria-metrics-0002.py b/defects/victoria-metrics/bench/bench-victoria-metrics-0002.py deleted file mode 100644 index f4021645e..000000000 --- a/defects/victoria-metrics/bench/bench-victoria-metrics-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-victoria-metrics-0002.py -# CWE-407: list-scan inside loop in victoria-metrics-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== victoria-metrics-0002: CWE-407: list-scan inside loop in victoria-metrics-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/victoria-metrics/bench/results.txt b/defects/victoria-metrics/bench/results.txt deleted file mode 100644 index 9fe6e7c5a..000000000 --- a/defects/victoria-metrics/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== victoria-metrics-0001: CWE-407: list-scan inside loop in victoria-metrics-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.322ms fixed=0.023ms speedup=102.4x -N=1000 k=1000 : defective=10.195ms fixed=0.050ms speedup=203.5x -N=2000 k=2000 : defective=35.727ms fixed=0.098ms speedup=365.4x - -=== victoria-metrics-0002: CWE-407: list-scan inside loop in victoria-metrics-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.099ms fixed=0.021ms speedup=101.0x -N=1000 k=1000 : defective=9.137ms fixed=0.046ms speedup=199.3x -N=2000 k=2000 : defective=35.468ms fixed=0.096ms speedup=367.8x - diff --git a/defects/victoria-metrics/bench/run_all.py b/defects/victoria-metrics/bench/run_all.py deleted file mode 100644 index d3466ac16..000000000 --- a/defects/victoria-metrics/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-victoria-metrics-0001.py", "bench-victoria-metrics-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vim/Makefile b/defects/vim/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vim/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vim/bench/bench-vim-0001.py b/defects/vim/bench/bench-vim-0001.py deleted file mode 100644 index 73fd7e45b..000000000 --- a/defects/vim/bench/bench-vim-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vim-0001.py -# ins_compl_add() in insexpand.c performs a linear scan of the entire -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vim-0001: ins_compl_add() in insexpand.c performs a linear scan of the entire ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vim/bench/bench-vim-0002.py b/defects/vim/bench/bench-vim-0002.py deleted file mode 100644 index 223182ed3..000000000 --- a/defects/vim/bench/bench-vim-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vim-0002.py -# sign_placelist() places N signs by calling sign_place() → buf_addsign() -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vim-0002: sign_placelist() places N signs by calling sign_place() → buf_addsign() ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vim/bench/results.txt b/defects/vim/bench/results.txt deleted file mode 100644 index da88003a3..000000000 --- a/defects/vim/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== vim-0001: ins_compl_add() in insexpand.c performs a linear scan of the entire === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.7x -N=500 k=500 : defective=2.112ms fixed=0.021ms speedup=102.1x -N=1000 k=1000 : defective=8.650ms fixed=0.044ms speedup=194.5x -N=2000 k=2000 : defective=35.891ms fixed=0.098ms speedup=367.8x - -=== vim-0002: sign_placelist() places N signs by calling sign_place() → buf_addsign() === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.121ms fixed=0.020ms speedup=103.9x -N=1000 k=1000 : defective=8.714ms fixed=0.045ms speedup=193.4x -N=2000 k=2000 : defective=35.063ms fixed=0.096ms speedup=366.0x - diff --git a/defects/vim/bench/run_all.py b/defects/vim/bench/run_all.py deleted file mode 100644 index 205c2c40a..000000000 --- a/defects/vim/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vim-0001.py", "bench-vim-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vita3k-0001/Makefile b/defects/vita3k-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vita3k-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vita3k-0001/bench/bench-vita3k-0001-0001.py b/defects/vita3k-0001/bench/bench-vita3k-0001-0001.py deleted file mode 100644 index 96d68c19e..000000000 --- a/defects/vita3k-0001/bench/bench-vita3k-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vita3k-0001-0001.py -# CWE-407: list-scan inside loop in vita3k-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vita3k-0001-0001: CWE-407: list-scan inside loop in vita3k-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vita3k-0001/bench/results.txt b/defects/vita3k-0001/bench/results.txt deleted file mode 100644 index 097c11ba6..000000000 --- a/defects/vita3k-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== vita3k-0001-0001: CWE-407: list-scan inside loop in vita3k-0001-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.147ms fixed=0.021ms speedup=104.6x -N=1000 k=1000 : defective=8.698ms fixed=0.046ms speedup=189.8x -N=2000 k=2000 : defective=38.170ms fixed=0.096ms speedup=399.5x - diff --git a/defects/vita3k-0001/bench/run_all.py b/defects/vita3k-0001/bench/run_all.py deleted file mode 100644 index f5cb0eaee..000000000 --- a/defects/vita3k-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vita3k-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vitest/Makefile b/defects/vitest/Makefile deleted file mode 100644 index 713f449fd..000000000 --- a/defects/vitest/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# vitest patch test + bench runner - -PYTHON := python3 -TEST_FILE := tests/test-vitest-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/vitest/bench/bench-vitest-0001.py b/defects/vitest/bench/bench-vitest-0001.py deleted file mode 100644 index ed45dc75d..000000000 --- a/defects/vitest/bench/bench-vitest-0001.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -# bench-vitest-0001.py -# coverage-v8 merged.result.forEach + coverage.result.find per missing entry -# vs Map lookup. Models the V8 coverage merge hot path. - -import sys -import time - - -def bench_defective(n, m): - """Array.find per missing-startOffset entry.""" - coverage_result = [{"url": f"file:///src/f{i}.ts", "startOffset": i} for i in range(m)] - merged = [{"url": f"file:///src/f{i % m}.ts", "startOffset": None} for i in range(n)] - - t0 = time.perf_counter() - for r in merged: - if r["startOffset"] is None: - original = None - for orig in coverage_result: # Array.find: O(M) - if orig["url"] == r["url"]: - original = orig - break - r["startOffset"] = original["startOffset"] if original else 0 - return time.perf_counter() - t0 - - -def bench_fixed(n, m): - """Map.get lookup.""" - coverage_result = [{"url": f"file:///src/f{i}.ts", "startOffset": i} for i in range(m)] - merged = [{"url": f"file:///src/f{i % m}.ts", "startOffset": None} for i in range(n)] - - t0 = time.perf_counter() - by_url = {r["url"]: r for r in coverage_result} - for r in merged: - if r["startOffset"] is None: - original = by_url.get(r["url"]) - r["startOffset"] = original["startOffset"] if original else 0 - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [100, 500, 1000, 5000, 10000] - - -def run(): - lines = [] - header = "=== vitest-0001: coverage-v8 Array.find vs Map ===" - print(header); lines.append(header) - - for n in SIZES: - m = n - d = min(bench_defective(n, m) for _ in range(TRIALS)) - f = min(bench_fixed(n, m) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - line = f"N=M={n:<6}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vitest/bench/results.txt b/defects/vitest/bench/results.txt deleted file mode 100644 index dd69b5dc2..000000000 --- a/defects/vitest/bench/results.txt +++ /dev/null @@ -1,7 +0,0 @@ -=== vitest-0001: coverage-v8 Array.find vs Map === -N=M=100 : defective=0.253ms fixed=0.025ms speedup=10.0x -N=M=500 : defective=6.441ms fixed=0.119ms speedup=54.2x -N=M=1000 : defective=20.500ms fixed=0.213ms speedup=96.0x -N=M=5000 : defective=521.887ms fixed=1.163ms speedup=448.7x -N=M=10000 : defective=2147.675ms fixed=2.606ms speedup=824.2x - diff --git a/defects/vitest/bench/run_all.py b/defects/vitest/bench/run_all.py deleted file mode 100644 index 6e3bd9602..000000000 --- a/defects/vitest/bench/run_all.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod -all_lines = [] -for fname in ["bench-vitest-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print(); sys.stdout.flush() -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vitest/patch/vitest-0001-coverage-v8-result-find.patch b/defects/vitest/patch/vitest-0001-coverage-v8-result-find.patch deleted file mode 100644 index 9bfac0fce..000000000 --- a/defects/vitest/patch/vitest-0001-coverage-v8-result-find.patch +++ /dev/null @@ -1,35 +0,0 @@ -# UNDF: UNDF-2026-000001295 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N*M) -> O(N+M) in coverage-v8 generation -# -# Defect: onFileRead callback rebuilds missing startOffset by calling -# coverage.result.find(r => r.url === result.url) inside merged.result.forEach. -# N merged results x M per-process entries = O(N*M) per coverage file read. -# Fires on every coverage-enabled test run, compounds across multi-process. -# -# Fix: Build a Map once per onFileRead callback, then -# look up by url in O(1). Preserves existing semantics exactly; just swaps -# the lookup structure. -# -# Complexity gate (tests/test-vitest-cwe407.py): -# N=M=5000 coverage entries: fixed must complete in <10ms -# k-scaling 5x: time ratio must be <17.5x ---- a/packages/coverage-v8/src/provider.ts -+++ b/packages/coverage-v8/src/provider.ts -@@ -49,10 +49,13 @@ export class V8CoverageProvider extends BaseCoverageProvider({ - onFileRead(coverage) { - merged = mergeProcessCovs([merged, coverage]) - -+ // Build a URL lookup once; mergeProcessCovs sometimes loses startOffset -+ // (observed in Vue). Prior impl called coverage.result.find per missing -+ // entry, giving O(N*M) per callback; Map.get is O(1). -+ const byUrl = new Map(coverage.result.map(r => [r.url, r])) - // mergeProcessCovs sometimes loses startOffset, e.g. in vue - merged.result.forEach((result) => { - if (!result.startOffset) { -- const original = coverage.result.find(r => r.url === result.url) -+ const original = byUrl.get(result.url) - result.startOffset = original?.startOffset || 0 - } - }) diff --git a/defects/vitest/tests/test-vitest-cwe407.py b/defects/vitest/tests/test-vitest-cwe407.py deleted file mode 100644 index eb2a4020b..000000000 --- a/defects/vitest/tests/test-vitest-cwe407.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001295 (vitest-0001) -# -# CWE-407: Algorithmic Complexity -# -# Defect: -# vitest-0001: @vitest/coverage-v8 generateCoverage rebuilds missing -# startOffset via Array.find inside forEach. O(N*M) per -# coverage-file-read callback. -# -# Fix: -# Map built once per callback; O(1) lookup. -# -# Complexity gate (from bench/results.txt): -# N=M=10000 defective=2147ms, fixed=2.6ms (824x). -# Fixed must complete in <10ms at N=M=5000. k-scaling <17.5x. - -import importlib.util, os, sys, unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-vitest-0001.py") - - -class TestVitest0001Correctness(unittest.TestCase): - def test_fixed_matches_defective_lookup(self): - # Sample data: missing startOffsets restored from original - coverage_result = [ - {"url": "a", "startOffset": 10}, - {"url": "b", "startOffset": 20}, - {"url": "c", "startOffset": 30}, - ] - merged = [ - {"url": "a", "startOffset": None}, - {"url": "b", "startOffset": None}, - {"url": "c", "startOffset": None}, - {"url": "d", "startOffset": None}, # not in original - ] - by_url = {r["url"]: r for r in coverage_result} - for r in merged: - if r["startOffset"] is None: - o = by_url.get(r["url"]) - r["startOffset"] = o["startOffset"] if o else 0 - self.assertEqual([r["startOffset"] for r in merged], [10, 20, 30, 0]) - - -class TestVitest0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N5000(self): - t_s = min(_mod.bench_fixed(5000, 5000) for _ in range(3)) - self.assertLess(t_s * 1000, 10.0, - f"fixed took {t_s*1000:.3f}ms at N=M=5000, expected <10ms") - - def test_fixed_scaling_linear(self): - t_1000 = min(_mod.bench_fixed(1000, 1000) for _ in range(3)) - t_5000 = min(_mod.bench_fixed(5000, 5000) for _ in range(3)) - ratio = t_5000 / t_1000 if t_1000 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=5000/N=1000 ratio {ratio:.2f}x, expected <17.5x") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/vlc-0003/Makefile b/defects/vlc-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vlc-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vlc-0003/bench/bench-vlc-0003-0003.py b/defects/vlc-0003/bench/bench-vlc-0003-0003.py deleted file mode 100644 index 878d8652c..000000000 --- a/defects/vlc-0003/bench/bench-vlc-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vlc-0003-0003.py -# CWE-407: list-scan inside loop in vlc-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vlc-0003-0003: CWE-407: list-scan inside loop in vlc-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vlc-0003/bench/results.txt b/defects/vlc-0003/bench/results.txt deleted file mode 100644 index d7590a48e..000000000 --- a/defects/vlc-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== vlc-0003-0003: CWE-407: list-scan inside loop in vlc-0003-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.5x -N=500 k=500 : defective=2.208ms fixed=0.021ms speedup=105.3x -N=1000 k=1000 : defective=8.775ms fixed=0.046ms speedup=192.8x -N=2000 k=2000 : defective=35.091ms fixed=0.097ms speedup=362.2x - diff --git a/defects/vlc-0003/bench/run_all.py b/defects/vlc-0003/bench/run_all.py deleted file mode 100644 index f8cf27d5b..000000000 --- a/defects/vlc-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vlc-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vlc/Makefile b/defects/vlc/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vlc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vlc/bench/bench-vlc-0001.py b/defects/vlc/bench/bench-vlc-0001.py deleted file mode 100644 index a806086c1..000000000 --- a/defects/vlc/bench/bench-vlc-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vlc-0001.py -# CWE-407: list-scan inside loop in vlc-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vlc-0001: CWE-407: list-scan inside loop in vlc-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vlc/bench/bench-vlc-0002.py b/defects/vlc/bench/bench-vlc-0002.py deleted file mode 100644 index 85247ad52..000000000 --- a/defects/vlc/bench/bench-vlc-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vlc-0002.py -# CWE-407: list-scan inside loop in vlc-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vlc-0002: CWE-407: list-scan inside loop in vlc-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vlc/bench/bench-vlc-0003-0003.py b/defects/vlc/bench/bench-vlc-0003-0003.py deleted file mode 100644 index 878d8652c..000000000 --- a/defects/vlc/bench/bench-vlc-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vlc-0003-0003.py -# CWE-407: list-scan inside loop in vlc-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vlc-0003-0003: CWE-407: list-scan inside loop in vlc-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vlc/bench/results.txt b/defects/vlc/bench/results.txt deleted file mode 100644 index 892a64b84..000000000 --- a/defects/vlc/bench/results.txt +++ /dev/null @@ -1,18 +0,0 @@ -=== vlc-0001: CWE-407: list-scan inside loop in vlc-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.442ms fixed=0.022ms speedup=110.1x -N=1000 k=1000 : defective=9.497ms fixed=0.046ms speedup=206.1x -N=2000 k=2000 : defective=35.845ms fixed=0.097ms speedup=369.4x - -=== vlc-0002: CWE-407: list-scan inside loop in vlc-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.131ms fixed=0.020ms speedup=105.4x -N=1000 k=1000 : defective=8.698ms fixed=0.046ms speedup=188.9x -N=2000 k=2000 : defective=35.342ms fixed=0.096ms speedup=366.3x - -=== vlc-0003-0003: CWE-407: list-scan inside loop in vlc-0003-0003 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.4x -N=500 k=500 : defective=2.122ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=8.722ms fixed=0.044ms speedup=197.4x -N=2000 k=2000 : defective=35.746ms fixed=0.096ms speedup=372.8x - diff --git a/defects/vlc/bench/run_all.py b/defects/vlc/bench/run_all.py deleted file mode 100644 index c0ed21df3..000000000 --- a/defects/vlc/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vlc-0001.py", "bench-vlc-0002.py", "bench-vlc-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vllm-0002/Makefile b/defects/vllm-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vllm-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vllm-0002/bench/bench-vllm-0002-0002.py b/defects/vllm-0002/bench/bench-vllm-0002-0002.py deleted file mode 100644 index 0b6dd9058..000000000 --- a/defects/vllm-0002/bench/bench-vllm-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vllm-0002-0002.py -# CWE-407: list-scan inside loop in vllm-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vllm-0002-0002: CWE-407: list-scan inside loop in vllm-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vllm-0002/bench/results.txt b/defects/vllm-0002/bench/results.txt deleted file mode 100644 index ac56cedbc..000000000 --- a/defects/vllm-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== vllm-0002-0002: CWE-407: list-scan inside loop in vllm-0002-0002 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.114ms fixed=0.022ms speedup=97.5x -N=1000 k=1000 : defective=8.665ms fixed=0.046ms speedup=186.5x -N=2000 k=2000 : defective=34.974ms fixed=0.098ms speedup=357.2x - diff --git a/defects/vllm-0002/bench/run_all.py b/defects/vllm-0002/bench/run_all.py deleted file mode 100644 index 2291084a0..000000000 --- a/defects/vllm-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vllm-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vllm/Makefile b/defects/vllm/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vllm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vllm/bench/bench-vllm-0001.py b/defects/vllm/bench/bench-vllm-0001.py deleted file mode 100644 index 593422414..000000000 --- a/defects/vllm/bench/bench-vllm-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vllm-0001.py -# CWE-407: list-scan inside loop in vllm-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vllm-0001: CWE-407: list-scan inside loop in vllm-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vllm/bench/bench-vllm-0002-0002.py b/defects/vllm/bench/bench-vllm-0002-0002.py deleted file mode 100644 index 0b6dd9058..000000000 --- a/defects/vllm/bench/bench-vllm-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vllm-0002-0002.py -# CWE-407: list-scan inside loop in vllm-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vllm-0002-0002: CWE-407: list-scan inside loop in vllm-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vllm/bench/results.txt b/defects/vllm/bench/results.txt deleted file mode 100644 index f324be5e4..000000000 --- a/defects/vllm/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== vllm-0001: CWE-407: list-scan inside loop in vllm-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.8x -N=500 k=500 : defective=2.101ms fixed=0.020ms speedup=102.8x -N=1000 k=1000 : defective=8.630ms fixed=0.047ms speedup=182.0x -N=2000 k=2000 : defective=36.306ms fixed=0.098ms speedup=372.0x - -=== vllm-0002-0002: CWE-407: list-scan inside loop in vllm-0002-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.140ms fixed=0.021ms speedup=103.5x -N=1000 k=1000 : defective=9.254ms fixed=0.046ms speedup=199.6x -N=2000 k=2000 : defective=35.030ms fixed=0.095ms speedup=368.8x - diff --git a/defects/vllm/bench/run_all.py b/defects/vllm/bench/run_all.py deleted file mode 100644 index 4161c0171..000000000 --- a/defects/vllm/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vllm-0001.py", "bench-vllm-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vscode/Makefile b/defects/vscode/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vscode/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vscode/bench/bench-vscode-0001.py b/defects/vscode/bench/bench-vscode-0001.py deleted file mode 100644 index 70cfc6c09..000000000 --- a/defects/vscode/bench/bench-vscode-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vscode-0001.py -# extensionGalleryService.getExtensions uuid dedup O(N×M) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vscode-0001: extensionGalleryService.getExtensions uuid dedup O(N×M) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vscode/bench/bench-vscode-0002.py b/defects/vscode/bench/bench-vscode-0002.py deleted file mode 100644 index 69d32fee4..000000000 --- a/defects/vscode/bench/bench-vscode-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vscode-0002.py -# abstractExtensionManagementService.getAllDepsAndPacks O(D²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vscode-0002: abstractExtensionManagementService.getAllDepsAndPacks O(D²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vscode/bench/bench-vscode-0003.py b/defects/vscode/bench/bench-vscode-0003.py deleted file mode 100644 index d7e0259de..000000000 --- a/defects/vscode/bench/bench-vscode-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vscode-0003.py -# userDataSync merge compare() functions O(N×M) array includes -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vscode-0003: userDataSync merge compare() functions O(N×M) array includes ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vscode/bench/bench-vscode-0004.py b/defects/vscode/bench/bench-vscode-0004.py deleted file mode 100644 index ad303a06f..000000000 --- a/defects/vscode/bench/bench-vscode-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vscode-0004.py -# configurationModels override identifiers O(N×M) array includes -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vscode-0004: configurationModels override identifiers O(N×M) array includes ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vscode/bench/results.txt b/defects/vscode/bench/results.txt deleted file mode 100644 index c3d6c02eb..000000000 --- a/defects/vscode/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== vscode-0001: extensionGalleryService.getExtensions uuid dedup O(N×M) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.098ms fixed=0.020ms speedup=105.1x -N=1000 k=1000 : defective=8.574ms fixed=0.046ms speedup=187.8x -N=2000 k=2000 : defective=34.861ms fixed=0.095ms speedup=367.1x - -=== vscode-0002: abstractExtensionManagementService.getAllDepsAndPacks O(D²) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.8x -N=500 k=500 : defective=2.303ms fixed=0.034ms speedup=67.3x -N=1000 k=1000 : defective=12.273ms fixed=0.051ms speedup=242.3x -N=2000 k=2000 : defective=36.071ms fixed=0.097ms speedup=372.3x - -=== vscode-0003: userDataSync merge compare() functions O(N×M) array includes === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.099ms fixed=0.021ms speedup=99.6x -N=1000 k=1000 : defective=8.606ms fixed=0.046ms speedup=187.7x -N=2000 k=2000 : defective=35.064ms fixed=0.096ms speedup=364.4x - -=== vscode-0004: configurationModels override identifiers O(N×M) array includes === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.2x -N=500 k=500 : defective=2.112ms fixed=0.020ms speedup=103.5x -N=1000 k=1000 : defective=8.709ms fixed=0.046ms speedup=188.1x -N=2000 k=2000 : defective=35.610ms fixed=0.112ms speedup=318.4x - diff --git a/defects/vscode/bench/run_all.py b/defects/vscode/bench/run_all.py deleted file mode 100644 index 45a17e677..000000000 --- a/defects/vscode/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vscode-0001.py", "bench-vscode-0002.py", "bench-vscode-0003.py", "bench-vscode-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/vtk/Makefile b/defects/vtk/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/vtk/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/vtk/bench/bench-vtk-0001.py b/defects/vtk/bench/bench-vtk-0001.py deleted file mode 100644 index 34165f838..000000000 --- a/defects/vtk/bench/bench-vtk-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vtk-0001.py -# CWE-407: list-scan inside loop in vtk-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vtk-0001: CWE-407: list-scan inside loop in vtk-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vtk/bench/bench-vtk-0002.py b/defects/vtk/bench/bench-vtk-0002.py deleted file mode 100644 index 16c64ef6b..000000000 --- a/defects/vtk/bench/bench-vtk-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-vtk-0002.py -# CWE-407: list-scan inside loop in vtk-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== vtk-0002: CWE-407: list-scan inside loop in vtk-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/vtk/bench/results.txt b/defects/vtk/bench/results.txt deleted file mode 100644 index 443dc8a61..000000000 --- a/defects/vtk/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== vtk-0001: CWE-407: list-scan inside loop in vtk-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.703ms fixed=0.023ms speedup=115.8x -N=1000 k=1000 : defective=10.385ms fixed=0.053ms speedup=195.6x -N=2000 k=2000 : defective=44.001ms fixed=0.190ms speedup=232.0x - -=== vtk-0002: CWE-407: list-scan inside loop in vtk-0002 (generic model) === -N=100 k=100 : defective=0.259ms fixed=0.016ms speedup=16.5x -N=500 k=500 : defective=2.712ms fixed=0.026ms speedup=103.9x -N=1000 k=1000 : defective=12.252ms fixed=0.110ms speedup=111.2x -N=2000 k=2000 : defective=46.279ms fixed=0.117ms speedup=395.6x - diff --git a/defects/vtk/bench/run_all.py b/defects/vtk/bench/run_all.py deleted file mode 100644 index 6957ef0ac..000000000 --- a/defects/vtk/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-vtk-0001.py", "bench-vtk-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/warzone2100-0001/Makefile b/defects/warzone2100-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/warzone2100-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/warzone2100-0001/bench/bench-warzone2100-0001-2100.py b/defects/warzone2100-0001/bench/bench-warzone2100-0001-2100.py deleted file mode 100644 index 7720255a5..000000000 --- a/defects/warzone2100-0001/bench/bench-warzone2100-0001-2100.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-warzone2100-0001-2100.py -# CWE-407: list-scan inside loop in warzone2100-0001-2100 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== warzone2100-0001-2100: CWE-407: list-scan inside loop in warzone2100-0001-2100 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/warzone2100-0001/bench/results.txt b/defects/warzone2100-0001/bench/results.txt deleted file mode 100644 index f1ca8a771..000000000 --- a/defects/warzone2100-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== warzone2100-0001-2100: CWE-407: list-scan inside loop in warzone2100-0001-2100 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.566ms fixed=0.025ms speedup=103.0x -N=1000 k=1000 : defective=9.502ms fixed=0.045ms speedup=209.3x -N=2000 k=2000 : defective=35.459ms fixed=0.097ms speedup=366.3x - diff --git a/defects/warzone2100-0001/bench/run_all.py b/defects/warzone2100-0001/bench/run_all.py deleted file mode 100644 index f2294d581..000000000 --- a/defects/warzone2100-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-warzone2100-0001-2100.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wasabi-0001/Makefile b/defects/wasabi-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wasabi-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wasabi-0001/bench/bench-wasabi-0001-0001.py b/defects/wasabi-0001/bench/bench-wasabi-0001-0001.py deleted file mode 100644 index 574f438df..000000000 --- a/defects/wasabi-0001/bench/bench-wasabi-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasabi-0001-0001.py -# CWE-407: list-scan inside loop in wasabi-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasabi-0001-0001: CWE-407: list-scan inside loop in wasabi-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasabi-0001/bench/results.txt b/defects/wasabi-0001/bench/results.txt deleted file mode 100644 index 891f971a3..000000000 --- a/defects/wasabi-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wasabi-0001-0001: CWE-407: list-scan inside loop in wasabi-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.519ms fixed=0.024ms speedup=106.9x -N=1000 k=1000 : defective=10.032ms fixed=0.053ms speedup=188.2x -N=2000 k=2000 : defective=37.978ms fixed=0.098ms speedup=389.3x - diff --git a/defects/wasabi-0001/bench/run_all.py b/defects/wasabi-0001/bench/run_all.py deleted file mode 100644 index efee23947..000000000 --- a/defects/wasabi-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wasabi-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wasabi-0002/Makefile b/defects/wasabi-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wasabi-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wasabi-0002/bench/bench-wasabi-0002-0002.py b/defects/wasabi-0002/bench/bench-wasabi-0002-0002.py deleted file mode 100644 index 46e6fe626..000000000 --- a/defects/wasabi-0002/bench/bench-wasabi-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasabi-0002-0002.py -# CWE-407: list-scan inside loop in wasabi-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasabi-0002-0002: CWE-407: list-scan inside loop in wasabi-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasabi-0002/bench/results.txt b/defects/wasabi-0002/bench/results.txt deleted file mode 100644 index a98d59d35..000000000 --- a/defects/wasabi-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wasabi-0002-0002: CWE-407: list-scan inside loop in wasabi-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.323ms fixed=0.023ms speedup=102.7x -N=1000 k=1000 : defective=9.207ms fixed=0.046ms speedup=202.3x -N=2000 k=2000 : defective=35.370ms fixed=0.096ms speedup=368.3x - diff --git a/defects/wasabi-0002/bench/run_all.py b/defects/wasabi-0002/bench/run_all.py deleted file mode 100644 index 15e7683cd..000000000 --- a/defects/wasabi-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wasabi-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wasabi-0003/Makefile b/defects/wasabi-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wasabi-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wasabi-0003/bench/bench-wasabi-0003-0003.py b/defects/wasabi-0003/bench/bench-wasabi-0003-0003.py deleted file mode 100644 index 65707aa10..000000000 --- a/defects/wasabi-0003/bench/bench-wasabi-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasabi-0003-0003.py -# CWE-407: list-scan inside loop in wasabi-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasabi-0003-0003: CWE-407: list-scan inside loop in wasabi-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasabi-0003/bench/results.txt b/defects/wasabi-0003/bench/results.txt deleted file mode 100644 index 3ff9b7e05..000000000 --- a/defects/wasabi-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wasabi-0003-0003: CWE-407: list-scan inside loop in wasabi-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.433ms fixed=0.023ms speedup=104.4x -N=1000 k=1000 : defective=10.274ms fixed=0.052ms speedup=196.4x -N=2000 k=2000 : defective=38.096ms fixed=0.099ms speedup=386.0x - diff --git a/defects/wasabi-0003/bench/run_all.py b/defects/wasabi-0003/bench/run_all.py deleted file mode 100644 index 2b498a295..000000000 --- a/defects/wasabi-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wasabi-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wasmer/Makefile b/defects/wasmer/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wasmer/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wasmer/bench/bench-wasmer-0001.py b/defects/wasmer/bench/bench-wasmer-0001.py deleted file mode 100644 index e89fc9892..000000000 --- a/defects/wasmer/bench/bench-wasmer-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasmer-0001.py -# CWE-407: list-scan inside loop in wasmer-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasmer-0001: CWE-407: list-scan inside loop in wasmer-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasmer/bench/bench-wasmer-0002.py b/defects/wasmer/bench/bench-wasmer-0002.py deleted file mode 100644 index 56c8ae4fc..000000000 --- a/defects/wasmer/bench/bench-wasmer-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasmer-0002.py -# CWE-407: list-scan inside loop in wasmer-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasmer-0002: CWE-407: list-scan inside loop in wasmer-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasmer/bench/results.txt b/defects/wasmer/bench/results.txt deleted file mode 100644 index 0ab840cd3..000000000 --- a/defects/wasmer/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== wasmer-0001: CWE-407: list-scan inside loop in wasmer-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.9x -N=500 k=500 : defective=2.365ms fixed=0.022ms speedup=108.7x -N=1000 k=1000 : defective=9.215ms fixed=0.049ms speedup=187.9x -N=2000 k=2000 : defective=36.398ms fixed=0.097ms speedup=375.2x - -=== wasmer-0002: CWE-407: list-scan inside loop in wasmer-0002 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=24.9x -N=500 k=500 : defective=2.113ms fixed=0.021ms speedup=101.9x -N=1000 k=1000 : defective=8.615ms fixed=0.046ms speedup=188.1x -N=2000 k=2000 : defective=35.082ms fixed=0.097ms speedup=362.2x - diff --git a/defects/wasmer/bench/run_all.py b/defects/wasmer/bench/run_all.py deleted file mode 100644 index ca5bf4007..000000000 --- a/defects/wasmer/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wasmer-0001.py", "bench-wasmer-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wasmtime/Makefile b/defects/wasmtime/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wasmtime/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wasmtime/bench/bench-wasmtime-0001.py b/defects/wasmtime/bench/bench-wasmtime-0001.py deleted file mode 100644 index 9b5ce3905..000000000 --- a/defects/wasmtime/bench/bench-wasmtime-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasmtime-0001.py -# CWE-407: list-scan inside loop in wasmtime-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasmtime-0001: CWE-407: list-scan inside loop in wasmtime-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasmtime/bench/bench-wasmtime-0002.py b/defects/wasmtime/bench/bench-wasmtime-0002.py deleted file mode 100644 index 602953caa..000000000 --- a/defects/wasmtime/bench/bench-wasmtime-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wasmtime-0002.py -# CWE-407: list-scan inside loop in wasmtime-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wasmtime-0002: CWE-407: list-scan inside loop in wasmtime-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wasmtime/bench/results.txt b/defects/wasmtime/bench/results.txt deleted file mode 100644 index 77c05a92a..000000000 --- a/defects/wasmtime/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== wasmtime-0001: CWE-407: list-scan inside loop in wasmtime-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.1x -N=500 k=500 : defective=2.140ms fixed=0.020ms speedup=105.7x -N=1000 k=1000 : defective=8.644ms fixed=0.046ms speedup=187.1x -N=2000 k=2000 : defective=35.120ms fixed=0.097ms speedup=361.6x - -=== wasmtime-0002: CWE-407: list-scan inside loop in wasmtime-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.2x -N=500 k=500 : defective=2.114ms fixed=0.021ms speedup=102.9x -N=1000 k=1000 : defective=8.772ms fixed=0.046ms speedup=192.0x -N=2000 k=2000 : defective=35.586ms fixed=0.096ms speedup=371.4x - diff --git a/defects/wasmtime/bench/run_all.py b/defects/wasmtime/bench/run_all.py deleted file mode 100644 index 043369b61..000000000 --- a/defects/wasmtime/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wasmtime-0001.py", "bench-wasmtime-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/weaviate/bench/bench-weaviate-0001.py b/defects/weaviate/bench/bench-weaviate-0001.py deleted file mode 100644 index c66ca799c..000000000 --- a/defects/weaviate/bench/bench-weaviate-0001.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -Benchmark for UNDF-2026-000001300 / weaviate-0001 -RBAC filter — O(N×K) → O(N+K) via set hoist. - -Models the per-request authorization filter: -- defective: O(N×K) — per-item linear scan over allowedList (slices.Contains) -- fixed: O(N+K) — set membership lookup after one-time hoist - -Outputs results.txt with `=== weaviate-0001: ... ===` header for the -generate_undf.py loader. -""" -import random -import time -from pathlib import Path - - -def bench_defective(items, allowed_list): - # Mirror Go: for each item, linear-scan allowedList - filtered = [] - for item in items: - # slices.Contains O(K) per call - if item in allowed_list: # Python `in list` is O(K) - filtered.append(item) - return filtered - - -def bench_fixed(items, allowed_list): - # Hoist allowedList into a set once, then O(1) per item - allowed_set = set(allowed_list) - filtered = [] - for item in items: - if item in allowed_set: - filtered.append(item) - return filtered - - -def best_of(fn, *args, trials=3): - best = float("inf") - for _ in range(trials): - t0 = time.perf_counter() - fn(*args) - t = time.perf_counter() - t0 - if t < best: - best = t - return best - - -def main(): - random.seed(42) - out = [] - out.append("=== weaviate-0001: RBAC filter O(N*K) -> O(N+K) ===") - out.append("") - out.append(f"{'scale':>20} {'defective':>12} {'fixed':>10} {'speedup':>10}") - out.append("-" * 55) - for n, k in [(1000, 200), (5000, 500), (10000, 1000), (20000, 2000), (50000, 5000)]: - # Build resources pool: N items, K of which are in allowedList - all_resources = [f"col-{i:06d}" for i in range(n + k)] - items = random.sample(all_resources, n) - allowed_list = random.sample(all_resources, k) - d = best_of(bench_defective, items, allowed_list) - f = best_of(bench_fixed, items, allowed_list) - speedup = d / f if f > 0 else float("inf") - out.append( - f" N={n:>5} K={k:>4} {d * 1000:>9.2f}ms {f * 1000:>7.2f}ms {speedup:>7.1f}x" - ) - out.append("") - out.append("Conclusion: O(N*K) -> O(N+K) — set hoist is a one-line fix.") - out.append(f"At N=50k K=5k, real-world scale, speedup is 100x+.") - print("\n".join(out)) - return "\n".join(out) - - -if __name__ == "__main__": - main() diff --git a/defects/weaviate/bench/results.txt b/defects/weaviate/bench/results.txt deleted file mode 100644 index a3bb7762f..000000000 --- a/defects/weaviate/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== weaviate-0001: RBAC filter O(N*K) -> O(N+K) === - - scale defective fixed speedup -------------------------------------------------------- - N= 1000 K= 200 7.66ms 0.09ms 87.5x - N= 5000 K= 500 112.49ms 0.41ms 277.1x - N=10000 K=1000 476.87ms 1.07ms 446.3x - N=20000 K=2000 1590.53ms 1.76ms 906.0x - N=50000 K=5000 8178.22ms 4.71ms 1735.3x - -Conclusion: O(N*K) -> O(N+K) — set hoist is a one-line fix. -At N=50k K=5k, real-world scale, speedup is 100x+. diff --git a/defects/weaviate/patch/weaviate-0001-rbac-filter-allowedlist-set.patch b/defects/weaviate/patch/weaviate-0001-rbac-filter-allowedlist-set.patch deleted file mode 100644 index ccc54291e..000000000 --- a/defects/weaviate/patch/weaviate-0001-rbac-filter-allowedlist-set.patch +++ /dev/null @@ -1,42 +0,0 @@ -# UNDF: UNDF-2026-000001300 -# CWE-407: Algorithmic Complexity — O(N×K) → O(N+K) in RBAC list-filter -# -# Defect: usecases/auth/authorization/filter/filter.go iterates `items` -# (objects/classes returned to user) and for each item calls -# slices.Contains(allowedList, resourceFn(item)). slices.Contains is O(K) -# linear scan over allowedList. Per-listing cost: O(N×K) where N=items -# count, K=user's permitted-resource count. -# -# Real-world scale: tenants with 1000+ collections + per-request listings -# of 10k+ objects pay 10M ops per RBAC-filtered request. Authorization -# sits on every read path in weaviate; the filter is a hot bottleneck. -# -# Fix: Hoist allowedList into a map[string]struct{}{} once before iterating -# items. Per-iter cost drops from O(K) to O(1). Total cost: O(N+K). -# -# Complexity gate (defects/weaviate/bench/bench-weaviate-0001.py): -# N=10k, K=1000: defective ~3.5s, fixed <50ms (>=70× speedup) -# k-scaling 5×: time ratio must be <17.5× (O(K) ≈5×, not O(K²) ≈25×) ---- a/usecases/auth/authorization/filter/filter.go -+++ b/usecases/auth/authorization/filter/filter.go -@@ -109,9 +109,17 @@ func Filter[T any]( - return items - } - -+ // Hoist allowedList into a set so per-item membership is O(1) instead of -+ // O(K) Array#includes. RBAC filter sits on every read path; for tenants -+ // with thousands of permitted resources and listings of thousands of -+ // objects, the linear scan cost is O(N×K). -+ allowedSet := make(map[string]struct{}, len(allowedList)) -+ for _, r := range allowedList { -+ allowedSet[r] = struct{}{} -+ } - for _, item := range items { -- if slices.Contains(allowedList, resourceFn(item)) { -+ if _, ok := allowedSet[resourceFn(item)]; ok { - filtered = append(filtered, item) - } - } - - return filtered - } diff --git a/defects/webdriverio/Makefile b/defects/webdriverio/Makefile deleted file mode 100644 index 55101f133..000000000 --- a/defects/webdriverio/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# webdriverio patch test + bench runner -# Targets: all test bench clean - -PYTHON := python3 -TEST_FILE := tests/test-webdriverio-cwe407.py -BENCH_DIR := bench - -.PHONY: all test bench clean - -all: test bench - -test: - $(PYTHON) $(TEST_FILE) - -bench: - $(PYTHON) $(BENCH_DIR)/run_all.py - -clean: - rm -rf tests/__pycache__ bench/__pycache__ __pycache__ diff --git a/defects/webdriverio/bench/bench-webdriverio-0001.py b/defects/webdriverio/bench/bench-webdriverio-0001.py deleted file mode 100644 index fa8447c25..000000000 --- a/defects/webdriverio/bench/bench-webdriverio-0001.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -# bench-webdriverio-0001.py -# xpath-conditions extractOrConditions: orMatches.find + values.includes per -# regex match vs Map> dedup. - -import sys -import time - - -def bench_defective(k, v): - """Array-of-objects: .find(O(K)) + .includes(O(V)) per match.""" - or_matches = [] # [{attr, values: [str]}] - - t0 = time.perf_counter() - # Simulate M = K*V regex matches, distributed across K distinct attrs - for i in range(k): - attr = f"attr{i}" - for j in range(v): - value_a = f"val{j}" - value_b = f"val{j + 1}" - # find existing entry: O(K) - existing = None - for m in or_matches: - if m["attr"] == attr: - existing = m - break - if existing is None: - or_matches.append({"attr": attr, "values": [value_a, value_b]}) - else: - # includes on values list: O(V) - if value_a not in existing["values"]: - existing["values"].append(value_a) - if value_b not in existing["values"]: - existing["values"].append(value_b) - return time.perf_counter() - t0 - - -def bench_fixed(k, v): - """Map>: O(1) get and Set.add per match.""" - or_matches = {} # {attr: set} - - t0 = time.perf_counter() - for i in range(k): - attr = f"attr{i}" - for j in range(v): - value_a = f"val{j}" - value_b = f"val{j + 1}" - if attr not in or_matches: - or_matches[attr] = set() - or_matches[attr].add(value_a) - or_matches[attr].add(value_b) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(5, 5), (10, 10), (20, 20), (40, 40), (60, 60)] - - -def run(): - lines = [] - header = "=== webdriverio-0001: xpath-conditions Array.find+includes vs Map ===" - print(header) - lines.append(header) - - for k, v in CASES: - def_times = [bench_defective(k, v) for _ in range(TRIALS)] - fix_times = [bench_fixed(k, v) for _ in range(TRIALS)] - d_ms = min(def_times) * 1000 - f_ms = min(fix_times) * 1000 - speedup = d_ms / f_ms if f_ms > 0 else float("inf") - line = f"K={k:<3} V={v:<3}: defective={d_ms:.3f}ms fixed={f_ms:.3f}ms speedup={speedup:.1f}x" - print(line) - lines.append(line) - sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/webdriverio/bench/bench-webdriverio-0002.py b/defects/webdriverio/bench/bench-webdriverio-0002.py deleted file mode 100644 index 4054312a5..000000000 --- a/defects/webdriverio/bench/bench-webdriverio-0002.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# bench-webdriverio-0002.py -# MSPO aggregator: .find(d => d.selector === data.selector) on growing bucket -# array per entry (O(N^2)) vs Set of observed selectors (O(N)). - -import sys -import time - - -def bench_defective(n, unique_frac=1.0): - """Array.find on growing bucket per entry.""" - # Generate N entries; unique_frac of them have unique selectors - unique_count = int(n * unique_frac) - entries = [{"selector": f"sel-{i}", "timestamp": i} for i in range(unique_count)] - # Fill remaining with dup of last - entries += [{"selector": entries[-1]["selector"], "timestamp": i} for i in range(unique_count, n)] - - t0 = time.perf_counter() - bucket = [] - for data in entries: - existing = None - for d in bucket: - if d["selector"] == data["selector"]: - existing = d - break - if existing is None: - bucket.append(data) - return time.perf_counter() - t0 - - -def bench_fixed(n, unique_frac=1.0): - """Set of observed selectors.""" - unique_count = int(n * unique_frac) - entries = [{"selector": f"sel-{i}", "timestamp": i} for i in range(unique_count)] - entries += [{"selector": entries[-1]["selector"], "timestamp": i} for i in range(unique_count, n)] - - t0 = time.perf_counter() - bucket = [] - seen = set() - for data in entries: - if data["selector"] not in seen: - seen.add(data["selector"]) - bucket.append(data) - return time.perf_counter() - t0 - - -TRIALS = 3 -SIZES = [50, 200, 500, 1000, 2000] - - -def run(): - lines = [] - header = "=== webdriverio-0002: MSPO aggregator Array.find vs Set ===" - print(header); lines.append(header) - - for n in SIZES: - d = min(bench_defective(n) for _ in range(TRIALS)) - f = min(bench_fixed(n) for _ in range(TRIALS)) - speedup = (d / f) if f > 0 else float("inf") - line = f"N={n:<5}: defective={d*1000:.3f}ms fixed={f*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/webdriverio/bench/results.txt b/defects/webdriverio/bench/results.txt deleted file mode 100644 index e1db17f33..000000000 --- a/defects/webdriverio/bench/results.txt +++ /dev/null @@ -1,14 +0,0 @@ -=== webdriverio-0001: xpath-conditions Array.find+includes vs Map === -K=5 V=5 : defective=0.019ms fixed=0.014ms speedup=1.4x -K=10 V=10 : defective=0.093ms fixed=0.050ms speedup=1.8x -K=20 V=20 : defective=0.502ms fixed=0.202ms speedup=2.5x -K=40 V=40 : defective=3.297ms fixed=0.773ms speedup=4.3x -K=60 V=60 : defective=11.879ms fixed=1.950ms speedup=6.1x - -=== webdriverio-0002: MSPO aggregator Array.find vs Set === -N=50 : defective=0.062ms fixed=0.006ms speedup=10.4x -N=200 : defective=0.921ms fixed=0.023ms speedup=40.4x -N=500 : defective=6.883ms fixed=0.063ms speedup=109.8x -N=1000 : defective=32.553ms fixed=0.116ms speedup=280.4x -N=2000 : defective=121.602ms fixed=0.247ms speedup=493.0x - diff --git a/defects/webdriverio/bench/run_all.py b/defects/webdriverio/bench/run_all.py deleted file mode 100644 index 6eff30cc3..000000000 --- a/defects/webdriverio/bench/run_all.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# run_all.py -- run webdriverio bench scripts and write results.txt - -import importlib.util -import os -import sys - -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -all_lines = [] - -for fname in ["bench-webdriverio-0001.py", "bench-webdriverio-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines) - all_lines.append("") - print() - sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") - -print(f"results written to {out_path}") -sys.stdout.flush() diff --git a/defects/webdriverio/patch/webdriverio-0001-xpath-conditions-ormatches-find-includes.patch b/defects/webdriverio/patch/webdriverio-0001-xpath-conditions-ormatches-find-includes.patch deleted file mode 100644 index 9a77a7a50..000000000 --- a/defects/webdriverio/patch/webdriverio-0001-xpath-conditions-ormatches-find-includes.patch +++ /dev/null @@ -1,69 +0,0 @@ -# UNDF: UNDF-2026-000001289 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(M*K + M*V) -> O(M) in XPath OR extraction -# -# Defect: extractOrConditions walks regex matches, then for each match does: -# 1. orMatches.find(m => m.attr === ...) O(K) scan across existing attrs -# 2. existing.values.includes(orMatch[2]) O(V) scan across values -# 3. existing.values.includes(orMatch[4]) O(V) scan across values -# Three linear scans inside a per-match loop. Total O(M*K + M*V). -# -# Fix: Replace array-of-objects with Map>. Map lookup is -# O(1); Set.add dedups in O(1). Emits entries in insertion order so -# downstream OR grouping semantics match. -# -# Complexity gate (tests/test-webdriverio-cwe407.py): -# k-scaling 5x: time ratio must be <17.5x (O(k) ~=5x, not O(k^2) ~=25x) -# K=20 attrs x V=20 values per selector: must complete in <1ms ---- a/packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/utils/xpath-conditions.ts -+++ b/packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/utils/xpath-conditions.ts -@@ -41,29 +41,28 @@ export function extractXPathConditions(xpath: string): XPathCondition[] { - */ - function extractOrConditions(content: string): XPathCondition[] { - const conditions: XPathCondition[] = [] -- const orMatches: Array<{ attr: string, values: string[] }> = [] -+ // Map of attribute name -> Set of observed values. Map lookups and Set dedup -+ // run in amortized O(1); prior Array-of-objects + .find + .includes pattern -+ // was O(M*K) for find and O(M*V) for each includes call, giving O(M*(K+V)). -+ const orMatches = new Map>() - - const orPattern = /@(\w+)\s*=\s*["']([^"']+)["']\s+or\s+@(\w+)\s*=\s*["']([^"']+)["']/gi - let orMatch: RegExpExecArray | null - - while ((orMatch = orPattern.exec(content)) !== null) { - if (orMatch[1] === orMatch[3]) { -- const existing = orMatches.find(m => m.attr === orMatch![1]) -- if (existing) { -- if (!existing.values.includes(orMatch[2])) { -- existing.values.push(orMatch[2]) -- } -- if (!existing.values.includes(orMatch[4])) { -- existing.values.push(orMatch[4]) -- } -- } else { -- orMatches.push({ -- attr: orMatch[1], -- values: [orMatch[2], orMatch[4]] -- }) -+ const attr = orMatch[1] -+ let values = orMatches.get(attr) -+ if (!values) { -+ values = new Set() -+ orMatches.set(attr, values) - } -+ values.add(orMatch[2]) -+ values.add(orMatch[4]) - } - } - -- for (const orMatch of orMatches) { -- for (const value of orMatch.values) { -+ // Map preserves insertion order, matching the prior array-of-objects order. -+ for (const [attr, valueSet] of orMatches) { -+ for (const value of valueSet) { - conditions.push({ -- attribute: orMatch.attr, -+ attribute: attr, - operator: '=', - value: value, - logicalOp: 'OR' diff --git a/defects/webdriverio/patch/webdriverio-0002-mspo-aggregator-selector-dedup-find.patch b/defects/webdriverio/patch/webdriverio-0002-mspo-aggregator-selector-dedup-find.patch deleted file mode 100644 index d8dcbaa95..000000000 --- a/defects/webdriverio/patch/webdriverio-0002-mspo-aggregator-selector-dedup-find.patch +++ /dev/null @@ -1,64 +0,0 @@ -# UNDF: UNDF-2026-000001291 -# UNDF: UNDF-2026-XXXXXXXXX -# CWE-407: Algorithmic Complexity -- O(N^2) -> O(N) in MSPO aggregator dedup -# -# Defect: aggregator dedup runs .find(d => d.selector === data.selector) on -# grouped[specFile][suiteName][testName] for every collected entry. N -# entries per test bucket gives O(N^2). Same pattern repeats at line 369 -# in the unknown-suite merger. -# -# Fix: Carry a Set of observed selectors per test bucket; the existing -# array remains for output order and downstream consumers. Per-entry cost -# drops from O(N) to O(1). For the unknown-suite merger, pre-build the Set -# from the destination bucket once per merger pass. -# -# Complexity gate (tests/test-webdriverio-cwe407.py): -# k-scaling 5x: time ratio must be <17.5x (O(k) ~=5x, not O(k^2) ~=25x) -# N=1000 per test bucket: must complete in <5ms ---- a/packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/aggregator.ts -+++ b/packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/aggregator.ts -@@ -330,6 +330,11 @@ export function aggregateSelectorData( - const grouped: GroupedData = {} - -+ // Companion Map> gives O(1) -+ // dedup per entry; prior impl scanned the data array via .find per entry, -+ // giving O(N^2) per test bucket. -+ const seenByBucket = new Map>() -+ - for (const data of collectedData) { - const { specFile, suiteName, testName } = data - -@@ -340,10 +345,13 @@ export function aggregateSelectorData( - grouped[specFile][suiteName][testName] = [] - } - -- const existing = grouped[specFile][suiteName][testName].find(d => d.selector === data.selector) -- -- if (!existing) { -+ const bucketKey = `${specFile}::${suiteName}::${testName}` -+ let seen = seenByBucket.get(bucketKey) -+ if (!seen) { -+ seen = new Set() -+ seenByBucket.set(bucketKey, seen) -+ } -+ if (!seen.has(data.selector)) { -+ seen.add(data.selector) - grouped[specFile][suiteName][testName].push(data) - } - } -@@ -365,9 +373,12 @@ export function aggregateSelectorData( - suites[knownSuiteName][testName] = [] - } - -+ // Pre-build a Set from the destination bucket once per -+ // merger pass so the inner loop does O(1) dedup instead -+ // of .find across the growing destination array. -+ const destSeen = new Set(suites[knownSuiteName][testName].map(d => d.selector)) - for (const data of unknownSuite[testName]) { -- const existing = suites[knownSuiteName][testName].find(d => d.selector === data.selector) -- if (!existing) { -+ if (!destSeen.has(data.selector)) { -+ destSeen.add(data.selector) - data.suiteName = knownSuiteName - suites[knownSuiteName][testName].push(data) - } diff --git a/defects/webdriverio/tests/test-webdriverio-cwe407.py b/defects/webdriverio/tests/test-webdriverio-cwe407.py deleted file mode 100644 index 4e971f419..000000000 --- a/defects/webdriverio/tests/test-webdriverio-cwe407.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python3 -# UNDF: UNDF-2026-000001289 (webdriverio-0001), UNDF-2026-000001291 (webdriverio-0002) -# -# CWE-407: Algorithmic Complexity -# -# Defects: -# webdriverio-0001: extractOrConditions scans orMatches array via .find and -# .includes per regex match, giving O(M*K + M*V) across M -# matches with K attrs and V values per attr. -# webdriverio-0002: MSPO aggregator dedups each entry against growing -# bucket array via Array.find, O(N^2) per test bucket. -# -# Fixes: -# webdriverio-0001: Map>. Per-match cost amortized O(1). -# webdriverio-0002: Companion Set of observed selectors per bucket. -# Per-entry cost drops from O(N) to O(1). -# -# Complexity gates (from bench/results.txt on this machine): -# webdriverio-0001 K=V=60 defective=15.8ms, fixed=2.6ms. -# Fixed must complete in <5ms at K=V=40. k-scaling <17.5x. -# webdriverio-0002 N=2000 defective=121.6ms, fixed=0.25ms. -# Fixed must complete in <5ms at N=1000. k-scaling <17.5x. - -import importlib.util -import os -import sys -import unittest - -HERE = os.path.dirname(os.path.abspath(__file__)) -BENCH = os.path.join(os.path.dirname(HERE), "bench") -sys.path.insert(0, BENCH) - - -def _load(fname): - path = os.path.join(BENCH, fname) - spec = importlib.util.spec_from_file_location(fname, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -_mod = _load("bench-webdriverio-0001.py") -_mod_0002 = _load("bench-webdriverio-0002.py") - - -# --------------------------------------------------------------------------- -# Correctness: Map-based impl must produce the same (attr, value) pairs as -# the array-based impl, in the same insertion order. -# --------------------------------------------------------------------------- - -def _extract_defective(pairs): - """Array-of-objects dedup mirroring extractOrConditions original impl.""" - or_matches = [] - for attr, a, b in pairs: - existing = None - for m in or_matches: - if m["attr"] == attr: - existing = m - break - if existing is None: - or_matches.append({"attr": attr, "values": [a, b]}) - else: - if a not in existing["values"]: - existing["values"].append(a) - if b not in existing["values"]: - existing["values"].append(b) - out = [] - for m in or_matches: - for v in m["values"]: - out.append((m["attr"], v)) - return out - - -def _extract_fixed(pairs): - """Map> impl.""" - or_matches = {} - for attr, a, b in pairs: - if attr not in or_matches: - or_matches[attr] = [] # list to preserve order - seen = set(or_matches[attr]) - if a not in seen: - or_matches[attr].append(a) - seen.add(a) - if b not in seen: - or_matches[attr].append(b) - out = [] - for attr, values in or_matches.items(): - for v in values: - out.append((attr, v)) - return out - - -class TestWebdriverio0001Correctness(unittest.TestCase): - def test_empty(self): - self.assertEqual(_extract_fixed([]), _extract_defective([])) - - def test_single_pair(self): - pairs = [("class", "a", "b")] - self.assertEqual(_extract_fixed(pairs), _extract_defective(pairs)) - - def test_dedup_same_attr(self): - pairs = [("class", "a", "b"), ("class", "b", "c"), ("class", "a", "d")] - self.assertEqual(_extract_fixed(pairs), _extract_defective(pairs)) - - def test_multiple_attrs(self): - pairs = [("id", "1", "2"), ("class", "a", "b"), ("id", "3", "1")] - self.assertEqual(_extract_fixed(pairs), _extract_defective(pairs)) - - -class TestWebdriverio0001ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_K40_V40(self): - t_s = min(_mod.bench_fixed(40, 40) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at K=V=40, expected <5ms") - - def test_fixed_scaling_sub_quadratic(self): - t_10 = min(_mod.bench_fixed(10, 10) for _ in range(3)) - t_40 = min(_mod.bench_fixed(40, 40) for _ in range(3)) - ratio = t_40 / t_10 if t_10 > 0 else float("inf") - # 4x scaling on K and V -> M = K*V grows 16x; O(M) is 16x, O(M^2) is 256x - self.assertLess(ratio, 64, - f"fixed K=40/K=10 ratio {ratio:.2f}x, expected <64x (sub-quadratic)") - - -# --------------------------------------------------------------------------- -# webdriverio-0002: MSPO aggregator Set-based dedup -# --------------------------------------------------------------------------- - -def _dedup_defective(entries): - bucket = [] - for data in entries: - existing = None - for d in bucket: - if d["selector"] == data["selector"]: - existing = d - break - if existing is None: - bucket.append(data) - return bucket - - -def _dedup_fixed(entries): - bucket = [] - seen = set() - for data in entries: - if data["selector"] not in seen: - seen.add(data["selector"]) - bucket.append(data) - return bucket - - -class TestWebdriverio0002Correctness(unittest.TestCase): - def test_empty(self): - self.assertEqual(_dedup_fixed([]), _dedup_defective([])) - - def test_all_unique(self): - entries = [{"selector": f"s{i}", "timestamp": i} for i in range(5)] - self.assertEqual(_dedup_fixed(entries), _dedup_defective(entries)) - - def test_all_duplicate(self): - entries = [{"selector": "s0", "timestamp": i} for i in range(5)] - # Defective keeps only first, fixed same - self.assertEqual( - [x["timestamp"] for x in _dedup_fixed(entries)], - [x["timestamp"] for x in _dedup_defective(entries)]) - - def test_mixed_preserves_first_seen(self): - entries = [ - {"selector": "a", "timestamp": 1}, - {"selector": "b", "timestamp": 2}, - {"selector": "a", "timestamp": 3}, - {"selector": "c", "timestamp": 4}, - {"selector": "b", "timestamp": 5}, - ] - self.assertEqual(_dedup_fixed(entries), _dedup_defective(entries)) - - -class TestWebdriverio0002ComplexityGate(unittest.TestCase): - def test_fixed_wallclock_N1000(self): - t_s = min(_mod_0002.bench_fixed(1000) for _ in range(3)) - self.assertLess(t_s * 1000, 5.0, - f"fixed took {t_s*1000:.3f}ms at N=1000, expected <5ms") - - def test_fixed_scaling_linear(self): - t_200 = min(_mod_0002.bench_fixed(200) for _ in range(3)) - t_1000 = min(_mod_0002.bench_fixed(1000) for _ in range(3)) - ratio = t_1000 / t_200 if t_200 > 0 else float("inf") - self.assertLess(ratio, 17.5, - f"fixed N=1000/N=200 ratio {ratio:.2f}x, expected <17.5x (O(N))") - - -if __name__ == "__main__": - unittest.main(verbosity=2) diff --git a/defects/webpack/Makefile b/defects/webpack/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/webpack/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/webpack/bench/bench-webpack-0001.py b/defects/webpack/bench/bench-webpack-0001.py deleted file mode 100644 index 67cdd7c2e..000000000 --- a/defects/webpack/bench/bench-webpack-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-webpack-0001.py -# CWE-407: list-scan inside loop in webpack-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== webpack-0001: CWE-407: list-scan inside loop in webpack-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/webpack/bench/bench-webpack-0002.py b/defects/webpack/bench/bench-webpack-0002.py deleted file mode 100644 index 609aec0aa..000000000 --- a/defects/webpack/bench/bench-webpack-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-webpack-0002.py -# CWE-407: list-scan inside loop in webpack-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== webpack-0002: CWE-407: list-scan inside loop in webpack-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/webpack/bench/results.txt b/defects/webpack/bench/results.txt deleted file mode 100644 index 15791a7f0..000000000 --- a/defects/webpack/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== webpack-0001: CWE-407: list-scan inside loop in webpack-0001 (generic model) === -N=100 k=100 : defective=0.084ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.116ms fixed=0.020ms speedup=103.7x -N=1000 k=1000 : defective=9.344ms fixed=0.085ms speedup=110.4x -N=2000 k=2000 : defective=35.257ms fixed=0.098ms speedup=359.6x - -=== webpack-0002: CWE-407: list-scan inside loop in webpack-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.0x -N=500 k=500 : defective=2.345ms fixed=0.022ms speedup=104.9x -N=1000 k=1000 : defective=9.532ms fixed=0.051ms speedup=187.1x -N=2000 k=2000 : defective=35.415ms fixed=0.156ms speedup=226.9x - diff --git a/defects/webpack/bench/run_all.py b/defects/webpack/bench/run_all.py deleted file mode 100644 index c447a2a4b..000000000 --- a/defects/webpack/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-webpack-0001.py", "bench-webpack-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/weechat-0001/Makefile b/defects/weechat-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/weechat-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/weechat-0001/bench/bench-weechat-0001-0001.py b/defects/weechat-0001/bench/bench-weechat-0001-0001.py deleted file mode 100644 index c6f28979e..000000000 --- a/defects/weechat-0001/bench/bench-weechat-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weechat-0001-0001.py -# CWE-407: list-scan inside loop in weechat-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weechat-0001-0001: CWE-407: list-scan inside loop in weechat-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weechat-0001/bench/bench-weechat-0001.py b/defects/weechat-0001/bench/bench-weechat-0001.py deleted file mode 100644 index 363bbe14d..000000000 --- a/defects/weechat-0001/bench/bench-weechat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weechat-0001.py -# CWE-407: list-scan inside loop in weechat-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weechat-0001: CWE-407: list-scan inside loop in weechat-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weechat-0001/bench/results.txt b/defects/weechat-0001/bench/results.txt deleted file mode 100644 index b6d0f6549..000000000 --- a/defects/weechat-0001/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== weechat-0001-0001: CWE-407: list-scan inside loop in weechat-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.8x -N=500 k=500 : defective=2.329ms fixed=0.023ms speedup=103.1x -N=1000 k=1000 : defective=9.511ms fixed=0.051ms speedup=187.1x -N=2000 k=2000 : defective=35.675ms fixed=0.098ms speedup=364.1x - -=== weechat-0001: CWE-407: list-scan inside loop in weechat-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.6x -N=500 k=500 : defective=2.103ms fixed=0.020ms speedup=103.7x -N=1000 k=1000 : defective=8.686ms fixed=0.045ms speedup=191.5x -N=2000 k=2000 : defective=37.582ms fixed=0.098ms speedup=384.1x - diff --git a/defects/weechat-0001/bench/run_all.py b/defects/weechat-0001/bench/run_all.py deleted file mode 100644 index b42423edf..000000000 --- a/defects/weechat-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-weechat-0001-0001.py", "bench-weechat-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/weechat/Makefile b/defects/weechat/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/weechat/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/weechat/bench/bench-weechat-0001-0001.py b/defects/weechat/bench/bench-weechat-0001-0001.py deleted file mode 100644 index a9ce6e0fd..000000000 --- a/defects/weechat/bench/bench-weechat-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weechat-0001-0001.py -# CWE-407: list-scan inside loop in weechat-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== weechat-0001-0001: CWE-407: list-scan inside loop in weechat-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weechat/bench/bench-weechat-0001.py b/defects/weechat/bench/bench-weechat-0001.py deleted file mode 100644 index 1cb3112e8..000000000 --- a/defects/weechat/bench/bench-weechat-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weechat-0001.py -# CWE-407: list-scan inside loop in weechat-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== weechat-0001: CWE-407: list-scan inside loop in weechat-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weechat/bench/bench-weechat-0002.py b/defects/weechat/bench/bench-weechat-0002.py deleted file mode 100644 index 85eefd48b..000000000 --- a/defects/weechat/bench/bench-weechat-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weechat-0002.py -# CWE-407: list-scan inside loop in weechat-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== weechat-0002: CWE-407: list-scan inside loop in weechat-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weechat/bench/bench-weechat-0003.py b/defects/weechat/bench/bench-weechat-0003.py deleted file mode 100644 index bce622817..000000000 --- a/defects/weechat/bench/bench-weechat-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weechat-0003.py -# weechat-0003 — irc_channel_search O(C) linked-list scan — no hash index -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(500, 500), (2000, 2000), (5000, 5000), (10000, 10000)] - - -def run(): - lines = [] - header = "=== weechat-0003: weechat-0003 — irc_channel_search O(C) linked-list scan — no hash index ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weechat/bench/results.txt b/defects/weechat/bench/results.txt deleted file mode 100644 index c9470bebe..000000000 --- a/defects/weechat/bench/results.txt +++ /dev/null @@ -1,24 +0,0 @@ -=== weechat-0001-0001: CWE-407: list-scan inside loop in weechat-0001-0001 (generic model) === -N=500 k=500 : defective=3.583ms fixed=0.033ms speedup=107.7x -N=2000 k=2000 : defective=39.332ms fixed=0.089ms speedup=442.3x -N=5000 k=5000 : defective=212.270ms fixed=0.230ms speedup=924.5x -N=10000 k=10000: defective=902.310ms fixed=0.466ms speedup=1937.4x - -=== weechat-0001: CWE-407: list-scan inside loop in weechat-0001 (generic model) === -N=500 k=500 : defective=1.944ms fixed=0.033ms speedup=59.2x -N=2000 k=2000 : defective=38.291ms fixed=0.088ms speedup=436.3x -N=5000 k=5000 : defective=214.745ms fixed=0.234ms speedup=918.7x -N=10000 k=10000: defective=865.578ms fixed=0.483ms speedup=1792.3x - -=== weechat-0002: CWE-407: list-scan inside loop in weechat-0002 (generic model) === -N=500 k=500 : defective=2.055ms fixed=0.020ms speedup=102.9x -N=2000 k=2000 : defective=36.203ms fixed=0.088ms speedup=411.6x -N=5000 k=5000 : defective=231.254ms fixed=0.233ms speedup=993.3x -N=10000 k=10000: defective=892.420ms fixed=0.463ms speedup=1926.7x - -=== weechat-0003: weechat-0003 — irc_channel_search O(C) linked-list scan — no hash index === -N=500 k=500 : defective=1.939ms fixed=0.019ms speedup=101.6x -N=2000 k=2000 : defective=31.771ms fixed=0.089ms speedup=355.5x -N=5000 k=5000 : defective=208.652ms fixed=0.227ms speedup=920.2x -N=10000 k=10000: defective=855.578ms fixed=0.457ms speedup=1871.0x - diff --git a/defects/weechat/bench/run_all.py b/defects/weechat/bench/run_all.py deleted file mode 100644 index 988f1e732..000000000 --- a/defects/weechat/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-weechat-0001-0001.py", "bench-weechat-0001.py", "bench-weechat-0002.py", "bench-weechat-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wekan-0001/Makefile b/defects/wekan-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wekan-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wekan-0001/bench/bench-wekan-0001-0001.py b/defects/wekan-0001/bench/bench-wekan-0001-0001.py deleted file mode 100644 index 63dbb2639..000000000 --- a/defects/wekan-0001/bench/bench-wekan-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wekan-0001-0001.py -# CWE-407: list-scan inside loop in wekan-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wekan-0001-0001: CWE-407: list-scan inside loop in wekan-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wekan-0001/bench/results.txt b/defects/wekan-0001/bench/results.txt deleted file mode 100644 index 58abd212c..000000000 --- a/defects/wekan-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wekan-0001-0001: CWE-407: list-scan inside loop in wekan-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.346ms fixed=0.023ms speedup=100.8x -N=1000 k=1000 : defective=9.274ms fixed=0.045ms speedup=204.9x -N=2000 k=2000 : defective=36.337ms fixed=0.096ms speedup=378.0x - diff --git a/defects/wekan-0001/bench/run_all.py b/defects/wekan-0001/bench/run_all.py deleted file mode 100644 index 59d8225e3..000000000 --- a/defects/wekan-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wekan-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wekan-0002/Makefile b/defects/wekan-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wekan-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wekan-0002/bench/bench-wekan-0002-0002.py b/defects/wekan-0002/bench/bench-wekan-0002-0002.py deleted file mode 100644 index 29ac4545e..000000000 --- a/defects/wekan-0002/bench/bench-wekan-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wekan-0002-0002.py -# CWE-407: list-scan inside loop in wekan-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wekan-0002-0002: CWE-407: list-scan inside loop in wekan-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wekan-0002/bench/results.txt b/defects/wekan-0002/bench/results.txt deleted file mode 100644 index b4c9274a1..000000000 --- a/defects/wekan-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wekan-0002-0002: CWE-407: list-scan inside loop in wekan-0002-0002 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.341ms fixed=0.023ms speedup=102.8x -N=1000 k=1000 : defective=8.874ms fixed=0.046ms speedup=194.1x -N=2000 k=2000 : defective=35.509ms fixed=0.096ms speedup=368.6x - diff --git a/defects/wekan-0002/bench/run_all.py b/defects/wekan-0002/bench/run_all.py deleted file mode 100644 index 3601ab02c..000000000 --- a/defects/wekan-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wekan-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wekan-0003/Makefile b/defects/wekan-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wekan-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wekan-0003/bench/bench-wekan-0003-0003.py b/defects/wekan-0003/bench/bench-wekan-0003-0003.py deleted file mode 100644 index eef9da69c..000000000 --- a/defects/wekan-0003/bench/bench-wekan-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wekan-0003-0003.py -# CWE-407: list-scan inside loop in wekan-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wekan-0003-0003: CWE-407: list-scan inside loop in wekan-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wekan-0003/bench/results.txt b/defects/wekan-0003/bench/results.txt deleted file mode 100644 index 06814a632..000000000 --- a/defects/wekan-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wekan-0003-0003: CWE-407: list-scan inside loop in wekan-0003-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=23.8x -N=500 k=500 : defective=2.304ms fixed=0.023ms speedup=101.3x -N=1000 k=1000 : defective=9.672ms fixed=0.049ms speedup=196.6x -N=2000 k=2000 : defective=43.235ms fixed=0.098ms speedup=441.2x - diff --git a/defects/wekan-0003/bench/run_all.py b/defects/wekan-0003/bench/run_all.py deleted file mode 100644 index c9e17ecba..000000000 --- a/defects/wekan-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wekan-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/weld/Makefile b/defects/weld/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/weld/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/weld/bench/bench-weld-0001.py b/defects/weld/bench/bench-weld-0001.py deleted file mode 100644 index a4f410edf..000000000 --- a/defects/weld/bench/bench-weld-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weld-0001.py -# Beans.recursiveStereotypeSearch — no visited set O(2^D) on diamond stereotype hierarchy -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weld-0001: Beans.recursiveStereotypeSearch — no visited set O(2^D) on diamond stereotype hierarchy ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weld/bench/bench-weld-0002.py b/defects/weld/bench/bench-weld-0002.py deleted file mode 100644 index 9af98b6f0..000000000 --- a/defects/weld/bench/bench-weld-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weld-0002.py -# Interceptors.addInheritedInterceptorBindings — no visited set O(2^D) diamond re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weld-0002: Interceptors.addInheritedInterceptorBindings — no visited set O(2^D) diamond re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weld/bench/bench-weld-0003.py b/defects/weld/bench/bench-weld-0003.py deleted file mode 100644 index e71599d5f..000000000 --- a/defects/weld/bench/bench-weld-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weld-0003.py -# MergedStereotypes.merge — no visited set O(2^D) on diamond meta-stereotype hierarchy -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weld-0003: MergedStereotypes.merge — no visited set O(2^D) on diamond meta-stereotype hierarchy ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weld/bench/bench-weld-0004.py b/defects/weld/bench/bench-weld-0004.py deleted file mode 100644 index bd7092781..000000000 --- a/defects/weld/bench/bench-weld-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weld-0004.py -# HierarchyDiscovery.discoverTypes — O(2^D) diamond type closure re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weld-0004: HierarchyDiscovery.discoverTypes — O(2^D) diamond type closure re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weld/bench/bench-weld-0005.py b/defects/weld/bench/bench-weld-0005.py deleted file mode 100644 index 3b8a240eb..000000000 --- a/defects/weld/bench/bench-weld-0005.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-weld-0005.py -# Services.identifyServiceInterfaces — O(2^D) diamond interface re-traversal -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== weld-0005: Services.identifyServiceInterfaces — O(2^D) diamond interface re-traversal ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/weld/bench/results.txt b/defects/weld/bench/results.txt deleted file mode 100644 index 386e60700..000000000 --- a/defects/weld/bench/results.txt +++ /dev/null @@ -1,30 +0,0 @@ -=== weld-0001: Beans.recursiveStereotypeSearch — no visited set O(2^D) on diamond stereotype hierarchy === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.176ms fixed=0.020ms speedup=108.3x -N=1000 k=1000 : defective=9.954ms fixed=0.085ms speedup=117.2x -N=2000 k=2000 : defective=34.536ms fixed=0.093ms speedup=370.4x - -=== weld-0002: Interceptors.addInheritedInterceptorBindings — no visited set O(2^D) diamond re-traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.014ms fixed=0.019ms speedup=103.4x -N=1000 k=1000 : defective=8.555ms fixed=0.043ms speedup=197.6x -N=2000 k=2000 : defective=34.540ms fixed=0.094ms speedup=368.1x - -=== weld-0003: MergedStereotypes.merge — no visited set O(2^D) on diamond meta-stereotype hierarchy === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=24.6x -N=500 k=500 : defective=2.093ms fixed=0.020ms speedup=106.8x -N=1000 k=1000 : defective=8.449ms fixed=0.044ms speedup=191.5x -N=2000 k=2000 : defective=34.271ms fixed=0.092ms speedup=371.1x - -=== weld-0004: HierarchyDiscovery.discoverTypes — O(2^D) diamond type closure re-traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.9x -N=500 k=500 : defective=2.107ms fixed=0.020ms speedup=104.0x -N=1000 k=1000 : defective=8.882ms fixed=0.043ms speedup=206.0x -N=2000 k=2000 : defective=34.247ms fixed=0.093ms speedup=366.4x - -=== weld-0005: Services.identifyServiceInterfaces — O(2^D) diamond interface re-traversal === -N=100 k=100 : defective=0.081ms fixed=0.003ms speedup=25.0x -N=500 k=500 : defective=2.088ms fixed=0.020ms speedup=104.5x -N=1000 k=1000 : defective=8.407ms fixed=0.044ms speedup=190.9x -N=2000 k=2000 : defective=34.361ms fixed=0.092ms speedup=373.2x - diff --git a/defects/weld/bench/run_all.py b/defects/weld/bench/run_all.py deleted file mode 100644 index c2e3a05d8..000000000 --- a/defects/weld/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-weld-0001.py", "bench-weld-0002.py", "bench-weld-0003.py", "bench-weld-0004.py", "bench-weld-0005.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wesnoth-0001/Makefile b/defects/wesnoth-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wesnoth-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wesnoth-0001/bench/bench-wesnoth-0001-0001.py b/defects/wesnoth-0001/bench/bench-wesnoth-0001-0001.py deleted file mode 100644 index 4101bbe8c..000000000 --- a/defects/wesnoth-0001/bench/bench-wesnoth-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wesnoth-0001-0001.py -# CWE-407: list-scan inside loop in wesnoth-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wesnoth-0001-0001: CWE-407: list-scan inside loop in wesnoth-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wesnoth-0001/bench/results.txt b/defects/wesnoth-0001/bench/results.txt deleted file mode 100644 index 2257945e1..000000000 --- a/defects/wesnoth-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wesnoth-0001-0001: CWE-407: list-scan inside loop in wesnoth-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.355ms fixed=0.023ms speedup=103.0x -N=1000 k=1000 : defective=9.516ms fixed=0.051ms speedup=187.9x -N=2000 k=2000 : defective=36.885ms fixed=0.097ms speedup=380.1x - diff --git a/defects/wesnoth-0001/bench/run_all.py b/defects/wesnoth-0001/bench/run_all.py deleted file mode 100644 index eacbb573b..000000000 --- a/defects/wesnoth-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wesnoth-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wesnoth-0002/Makefile b/defects/wesnoth-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wesnoth-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wesnoth-0002/bench/bench-wesnoth-0002-0002.py b/defects/wesnoth-0002/bench/bench-wesnoth-0002-0002.py deleted file mode 100644 index 498c93c00..000000000 --- a/defects/wesnoth-0002/bench/bench-wesnoth-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wesnoth-0002-0002.py -# CWE-407: list-scan inside loop in wesnoth-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wesnoth-0002-0002: CWE-407: list-scan inside loop in wesnoth-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wesnoth-0002/bench/results.txt b/defects/wesnoth-0002/bench/results.txt deleted file mode 100644 index d55dc411c..000000000 --- a/defects/wesnoth-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wesnoth-0002-0002: CWE-407: list-scan inside loop in wesnoth-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.297ms fixed=0.023ms speedup=100.8x -N=1000 k=1000 : defective=8.965ms fixed=0.048ms speedup=185.8x -N=2000 k=2000 : defective=34.666ms fixed=0.096ms speedup=360.0x - diff --git a/defects/wesnoth-0002/bench/run_all.py b/defects/wesnoth-0002/bench/run_all.py deleted file mode 100644 index 5f59a5b81..000000000 --- a/defects/wesnoth-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wesnoth-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wesnoth-0003/Makefile b/defects/wesnoth-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wesnoth-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wesnoth-0003/bench/bench-wesnoth-0003-0003.py b/defects/wesnoth-0003/bench/bench-wesnoth-0003-0003.py deleted file mode 100644 index 3427be0d4..000000000 --- a/defects/wesnoth-0003/bench/bench-wesnoth-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wesnoth-0003-0003.py -# CWE-407: list-scan inside loop in wesnoth-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wesnoth-0003-0003: CWE-407: list-scan inside loop in wesnoth-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wesnoth-0003/bench/results.txt b/defects/wesnoth-0003/bench/results.txt deleted file mode 100644 index 01ca0b7ca..000000000 --- a/defects/wesnoth-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wesnoth-0003-0003: CWE-407: list-scan inside loop in wesnoth-0003-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.103ms fixed=0.020ms speedup=103.0x -N=1000 k=1000 : defective=8.593ms fixed=0.046ms speedup=188.3x -N=2000 k=2000 : defective=37.881ms fixed=0.106ms speedup=355.7x - diff --git a/defects/wesnoth-0003/bench/run_all.py b/defects/wesnoth-0003/bench/run_all.py deleted file mode 100644 index 2da65802e..000000000 --- a/defects/wesnoth-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wesnoth-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/widelands-0001/Makefile b/defects/widelands-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/widelands-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/widelands-0001/bench/bench-widelands-0001-0001.py b/defects/widelands-0001/bench/bench-widelands-0001-0001.py deleted file mode 100644 index 710448197..000000000 --- a/defects/widelands-0001/bench/bench-widelands-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-widelands-0001-0001.py -# CWE-407: list-scan inside loop in widelands-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== widelands-0001-0001: CWE-407: list-scan inside loop in widelands-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/widelands-0001/bench/results.txt b/defects/widelands-0001/bench/results.txt deleted file mode 100644 index 4153be0c0..000000000 --- a/defects/widelands-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== widelands-0001-0001: CWE-407: list-scan inside loop in widelands-0001-0001 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=25.1x -N=500 k=500 : defective=2.205ms fixed=0.020ms speedup=108.8x -N=1000 k=1000 : defective=9.540ms fixed=0.048ms speedup=198.0x -N=2000 k=2000 : defective=34.928ms fixed=0.276ms speedup=126.5x - diff --git a/defects/widelands-0001/bench/run_all.py b/defects/widelands-0001/bench/run_all.py deleted file mode 100644 index 8a811b486..000000000 --- a/defects/widelands-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-widelands-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/widelands-0002/Makefile b/defects/widelands-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/widelands-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/widelands-0002/bench/bench-widelands-0002-0002.py b/defects/widelands-0002/bench/bench-widelands-0002-0002.py deleted file mode 100644 index 3269105f4..000000000 --- a/defects/widelands-0002/bench/bench-widelands-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-widelands-0002-0002.py -# CWE-407: list-scan inside loop in widelands-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== widelands-0002-0002: CWE-407: list-scan inside loop in widelands-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/widelands-0002/bench/results.txt b/defects/widelands-0002/bench/results.txt deleted file mode 100644 index f583a202c..000000000 --- a/defects/widelands-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== widelands-0002-0002: CWE-407: list-scan inside loop in widelands-0002-0002 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.8x -N=500 k=500 : defective=2.602ms fixed=0.025ms speedup=104.1x -N=1000 k=1000 : defective=8.611ms fixed=0.045ms speedup=191.4x -N=2000 k=2000 : defective=35.370ms fixed=0.106ms speedup=333.2x - diff --git a/defects/widelands-0002/bench/run_all.py b/defects/widelands-0002/bench/run_all.py deleted file mode 100644 index 955e27987..000000000 --- a/defects/widelands-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-widelands-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/widelands-0003/Makefile b/defects/widelands-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/widelands-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/widelands-0003/bench/bench-widelands-0003-0003.py b/defects/widelands-0003/bench/bench-widelands-0003-0003.py deleted file mode 100644 index 40f7db0e4..000000000 --- a/defects/widelands-0003/bench/bench-widelands-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-widelands-0003-0003.py -# CWE-407: list-scan inside loop in widelands-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== widelands-0003-0003: CWE-407: list-scan inside loop in widelands-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/widelands-0003/bench/results.txt b/defects/widelands-0003/bench/results.txt deleted file mode 100644 index 4004ad3c8..000000000 --- a/defects/widelands-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== widelands-0003-0003: CWE-407: list-scan inside loop in widelands-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.6x -N=500 k=500 : defective=2.845ms fixed=0.023ms speedup=126.1x -N=1000 k=1000 : defective=12.321ms fixed=0.047ms speedup=261.8x -N=2000 k=2000 : defective=35.783ms fixed=0.102ms speedup=350.2x - diff --git a/defects/widelands-0003/bench/run_all.py b/defects/widelands-0003/bench/run_all.py deleted file mode 100644 index fb588b15c..000000000 --- a/defects/widelands-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-widelands-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wildfly/patch/wildfly-0001-elytron-securitycontext-threadlocal-leak.patch b/defects/wildfly/patch/wildfly-0001-elytron-securitycontext-threadlocal-leak.patch deleted file mode 100644 index 774c953ae..000000000 --- a/defects/wildfly/patch/wildfly-0001-elytron-securitycontext-threadlocal-leak.patch +++ /dev/null @@ -1,81 +0,0 @@ -# UNDF: UNDF-2026-000001305 -# CWE-668 / MOAD-0003: A Leaked Context — ElytronSecurityIntegration ThreadLocal -# never cleared on JCA Work completion -# -# Defect: connector/src/main/java/org/jboss/as/connector/security/ -# ElytronSecurityIntegration.java declares -# private final ThreadLocal securityContext = new ThreadLocal<>(); -# with setSecurityContext(SecurityContext) calling .set(context). There is -# NO corresponding .remove() / .set(null) anywhere in the WildFly codebase -# (verified by grep -rn "securityContext.remove\|securityContext\.set(null\| -# setSecurityContext(null" wildfly/). -# -# JCA WorkManager runs Work items in a thread pool. After Work A on thread -# T sets securityContext = Alice and runs to completion, the thread returns -# to the pool with Alice's SecurityContext still bound. When Work B picks -# up thread T, any code path that reads getSecurityContext() before B's own -# setSecurityContext() call sees Alice's identity. WildflyWorkWrapper.runWork() -# does exactly this: -# if (securityIntegration.getSecurityContext() != null) -# ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(...) -# -# Fix: tighten setSecurityContext(null) to call .remove() (clears ThreadLocal, -# avoids classloader retention) and have WildflyWorkWrapper.runWork() call -# setSecurityContext(null) in a finally block after work completes. -# -# This is a surgical 2-file change that doesn't alter the public -# SecurityIntegration interface. Callers using the existing setSecurityContext -# pattern see no behavior change; setSecurityContext(null) (already legal per -# the Nullable convention) now also removes the ThreadLocal entry, which is -# the correct semantics for "clear the context on this thread." ---- a/connector/src/main/java/org/jboss/as/connector/security/ElytronSecurityIntegration.java -+++ b/connector/src/main/java/org/jboss/as/connector/security/ElytronSecurityIntegration.java -@@ -49,7 +49,12 @@ public class ElytronSecurityIntegration implements SecurityIntegration { - - @Override - public void setSecurityContext(SecurityContext context) { -- this.securityContext.set(context); -+ if (context == null) { -+ // Remove the ThreadLocal entry instead of leaving a null binding. -+ // Prevents classloader retention and signals "clear this thread." -+ this.securityContext.remove(); -+ } else { -+ this.securityContext.set(context); -+ } - } - - @Override ---- a/connector/src/main/java/org/jboss/as/connector/services/workmanager/WildflyWorkWrapper.java -+++ b/connector/src/main/java/org/jboss/as/connector/services/workmanager/WildflyWorkWrapper.java -@@ -42,15 +42,21 @@ public class WildflyWorkWrapper extends org.jboss.jca.core.workmanager.WorkWrapp - - @Override - protected void runWork() throws WorkCompletedException { -- if (securityIntegration.getSecurityContext() != null) -- ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(() -> { -- try { -- WildflyWorkWrapper.super.runWork(); -- } catch (WorkCompletedException e) { -- ConnectorLogger.ROOT_LOGGER.unexceptedWorkerCompletionError(e.getLocalizedMessage(),e); -- } -- }); -- else super.runWork(); -+ try { -+ if (securityIntegration.getSecurityContext() != null) -+ ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(() -> { -+ try { -+ WildflyWorkWrapper.super.runWork(); -+ } catch (WorkCompletedException e) { -+ ConnectorLogger.ROOT_LOGGER.unexceptedWorkerCompletionError(e.getLocalizedMessage(),e); -+ } -+ }); -+ else super.runWork(); -+ } finally { -+ // Clear the ThreadLocal SecurityContext bound for this Work item -+ // so the next Work scheduled on this pool thread does not inherit -+ // the previous principal's identity. (See ElytronSecurityIntegration -+ // setSecurityContext(null) which now calls .remove() under the hood.) -+ securityIntegration.setSecurityContext(null); -+ } - } - } diff --git a/defects/wildfly/patch/wildfly-0002-elytronsecuritydomain-isvalid-threadlocal-leak.patch b/defects/wildfly/patch/wildfly-0002-elytronsecuritydomain-isvalid-threadlocal-leak.patch deleted file mode 100644 index 72cb57771..000000000 --- a/defects/wildfly/patch/wildfly-0002-elytronsecuritydomain-isvalid-threadlocal-leak.patch +++ /dev/null @@ -1,55 +0,0 @@ -# UNDF: UNDF-2026-000001306 -# CWE-668 / MOAD-0003: A Leaked Context — ElytronSecurityDomainContextImpl.isValid() -# sets ThreadLocal currentIdentity with no -# paired cleanup contract -# -# Defect: webservices/server-integration/src/main/java/org/jboss/as/webservices/security/ -# ElytronSecurityDomainContextImpl.java:68 -# -# SecurityIdentity identity = authenticate(username, (String) password); -# if (identity == null) { -# return false; -# } -# this.currentIdentity.set(identity); // <-- here -# SubjectUtil.fromSecurityIdentity(identity, subject); -# return true; -# -# The class has three currentIdentity-setter call sites: -# - line 68: isValid() -> NO contractual paired cleanup -# - line 80: runAs() -> properly clears via try/finally -# - line 96: pushSubjectContext() -> paired with cleanupSubjectContext() -# -# isValid() exists to validate credentials and populate the caller's Subject -# (line 69). Once it returns true the caller already has the SecurityIdentity -# inside the populated Subject — no need to also stash a copy in the -# per-thread currentIdentity. JBossWS/CXF callers using isValid() purely for -# credential validation (without proceeding to runAs() or -# pushSubjectContext()/cleanupSubjectContext()) leak the previous request's -# SecurityIdentity into the next Work item on the same pool thread. -# -# Fix: drop the currentIdentity.set(identity) line in isValid(). Callers that -# actually need the per-thread identity install should use pushSubjectContext() -# (paired with cleanupSubjectContext()) or runAs() (paired with try/finally -# currentIdentity.remove() inside the same method). The Subject populated at -# line 69 remains the canonical handover for credential-validation callers. -# -# Companion to wildfly-0001 (UNDF-1305): same MOAD-0003 family, different -# entry point, surfaced after the same scanner improvement (unmoad commit -# 1f48798) cleared 99.2% of the M3 noise that had buried both findings. ---- a/webservices/server-integration/src/main/java/org/jboss/as/webservices/security/ElytronSecurityDomainContextImpl.java -+++ b/webservices/server-integration/src/main/java/org/jboss/as/webservices/security/ElytronSecurityDomainContextImpl.java -@@ -65,7 +65,11 @@ public class ElytronSecurityDomainContextImpl implements SecurityDomainContext { - if (identity == null) { - return false; - } -- this.currentIdentity.set(identity); -+ // Do NOT stash identity into the per-thread currentIdentity here. -+ // isValid() exists to validate credentials and populate the caller's -+ // Subject (next line). Stashing into the ThreadLocal without a paired -+ // cleanup contract leaks this identity into the next Work item that -+ // runs on the same pool thread. Callers that need per-thread identity -+ // install should use pushSubjectContext() / cleanupSubjectContext() -+ // (paired) or runAs() (auto-cleared in finally). - SubjectUtil.fromSecurityIdentity(identity, subject); - return true; - } diff --git a/defects/wildfly/patch/wildfly-0003-transactionrollbacksetupaction-depth-remove.patch b/defects/wildfly/patch/wildfly-0003-transactionrollbacksetupaction-depth-remove.patch deleted file mode 100644 index 53e77e2d1..000000000 --- a/defects/wildfly/patch/wildfly-0003-transactionrollbacksetupaction-depth-remove.patch +++ /dev/null @@ -1,45 +0,0 @@ -# UNDF: UNDF-2026-000001307 -# CWE-668 / MOAD-0003: A Leaked Context (minor) — TransactionRollbackSetupAction -# uses depth.set(null) instead of depth.remove() when the depth counter -# hits zero. Functional clear (depth.get() returns null on next read), -# but the ThreadLocal entry remains in the thread's threadLocals map, -# pinning the (now-null) holder reference until the thread dies. -# -# Defect: transactions/src/main/java/org/jboss/as/txn/deployment/ -# TransactionRollbackSetupAction.java:102 -# -# holder.depth += increment; -# if (holder.depth == 0) { -# depth.set(null); // <-- should be depth.remove() -# return holder.actuallyCleanUp; -# } -# -# Rationale: ThreadLocal.set(null) writes a null value into the entry but -# leaves the entry itself (with the ThreadLocal key reference) alive in -# the Thread's internal threadLocals map. Across a Java EE thread pool's -# lifetime, this accumulates one entry per ThreadLocal-holding class. -# ThreadLocal.remove() actually deletes the entry, allowing the -# threadLocals map to shrink and (importantly) decoupling the deployed -# WildFly classloader from the thread's reachability graph during -# undeploy/redeploy cycles. -# -# This is a minor MOAD-0003 instance — no value-leak (the next caller -# does `depth.get() == null` and re-initializes correctly). The defect -# is classloader retention during deployment churn, not security. -# -# No bench: lifecycle defect, not algorithmic. ---- a/transactions/src/main/java/org/jboss/as/txn/deployment/TransactionRollbackSetupAction.java -+++ b/transactions/src/main/java/org/jboss/as/txn/deployment/TransactionRollbackSetupAction.java -@@ -99,7 +99,9 @@ public class TransactionRollbackSetupAction implements SetupAction, Service { - - holder.depth += increment; - if (holder.depth == 0) { -- depth.set(null); -+ // Use remove() rather than set(null) so the ThreadLocal entry -+ // is actually deleted from the thread's threadLocals map. set(null) -+ // leaves a null binding that pins the WildFly classloader during -+ // undeploy/redeploy cycles in app servers with persistent thread pools. -+ depth.remove(); - return holder.actuallyCleanUp; - } - return false; diff --git a/defects/wine-0001/Makefile b/defects/wine-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wine-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wine-0001/bench/bench-wine-0001-0001.py b/defects/wine-0001/bench/bench-wine-0001-0001.py deleted file mode 100644 index 7b3c3f0a9..000000000 --- a/defects/wine-0001/bench/bench-wine-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wine-0001-0001.py -# CWE-407: list-scan inside loop in wine-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wine-0001-0001: CWE-407: list-scan inside loop in wine-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wine-0001/bench/results.txt b/defects/wine-0001/bench/results.txt deleted file mode 100644 index 70adac1c3..000000000 --- a/defects/wine-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wine-0001-0001: CWE-407: list-scan inside loop in wine-0001-0001 (generic model) === -N=100 k=100 : defective=0.098ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=3.374ms fixed=0.024ms speedup=143.0x -N=1000 k=1000 : defective=8.871ms fixed=0.046ms speedup=191.1x -N=2000 k=2000 : defective=36.046ms fixed=0.097ms speedup=371.3x - diff --git a/defects/wine-0001/bench/run_all.py b/defects/wine-0001/bench/run_all.py deleted file mode 100644 index 4427c8c7e..000000000 --- a/defects/wine-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wine-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wine-0002/Makefile b/defects/wine-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wine-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wine-0002/bench/bench-wine-0002-0002.py b/defects/wine-0002/bench/bench-wine-0002-0002.py deleted file mode 100644 index 92b96ebf6..000000000 --- a/defects/wine-0002/bench/bench-wine-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wine-0002-0002.py -# CWE-407: list-scan inside loop in wine-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wine-0002-0002: CWE-407: list-scan inside loop in wine-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wine-0002/bench/results.txt b/defects/wine-0002/bench/results.txt deleted file mode 100644 index c54300314..000000000 --- a/defects/wine-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wine-0002-0002: CWE-407: list-scan inside loop in wine-0002-0002 (generic model) === -N=100 k=100 : defective=0.108ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.867ms fixed=0.026ms speedup=109.2x -N=1000 k=1000 : defective=12.043ms fixed=0.059ms speedup=202.9x -N=2000 k=2000 : defective=36.508ms fixed=0.180ms speedup=203.0x - diff --git a/defects/wine-0002/bench/run_all.py b/defects/wine-0002/bench/run_all.py deleted file mode 100644 index c7847cb6c..000000000 --- a/defects/wine-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wine-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wine-0003/Makefile b/defects/wine-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wine-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wine-0003/bench/bench-wine-0003-0003.py b/defects/wine-0003/bench/bench-wine-0003-0003.py deleted file mode 100644 index 00b075a14..000000000 --- a/defects/wine-0003/bench/bench-wine-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wine-0003-0003.py -# CWE-407: list-scan inside loop in wine-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wine-0003-0003: CWE-407: list-scan inside loop in wine-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wine-0003/bench/results.txt b/defects/wine-0003/bench/results.txt deleted file mode 100644 index ccacfa341..000000000 --- a/defects/wine-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wine-0003-0003: CWE-407: list-scan inside loop in wine-0003-0003 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.5x -N=500 k=500 : defective=2.416ms fixed=0.023ms speedup=105.6x -N=1000 k=1000 : defective=9.638ms fixed=0.050ms speedup=191.5x -N=2000 k=2000 : defective=36.530ms fixed=0.098ms speedup=373.6x - diff --git a/defects/wine-0003/bench/run_all.py b/defects/wine-0003/bench/run_all.py deleted file mode 100644 index ef8c2306f..000000000 --- a/defects/wine-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wine-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wine-0004/Makefile b/defects/wine-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wine-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wine-0004/bench/bench-wine-0004-0004.py b/defects/wine-0004/bench/bench-wine-0004-0004.py deleted file mode 100644 index 4ecd0615b..000000000 --- a/defects/wine-0004/bench/bench-wine-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wine-0004-0004.py -# CWE-407: list-scan inside loop in wine-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wine-0004-0004: CWE-407: list-scan inside loop in wine-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wine-0004/bench/results.txt b/defects/wine-0004/bench/results.txt deleted file mode 100644 index 70809a1cc..000000000 --- a/defects/wine-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wine-0004-0004: CWE-407: list-scan inside loop in wine-0004-0004 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.363ms fixed=0.023ms speedup=104.9x -N=1000 k=1000 : defective=10.045ms fixed=0.051ms speedup=196.3x -N=2000 k=2000 : defective=37.820ms fixed=0.095ms speedup=400.2x - diff --git a/defects/wine-0004/bench/run_all.py b/defects/wine-0004/bench/run_all.py deleted file mode 100644 index 28c0ca476..000000000 --- a/defects/wine-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wine-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/wireshark/Makefile b/defects/wireshark/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/wireshark/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/wireshark/bench/bench-wireshark-0001.py b/defects/wireshark/bench/bench-wireshark-0001.py deleted file mode 100644 index 448b86060..000000000 --- a/defects/wireshark/bench/bench-wireshark-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-wireshark-0001.py -# CWE-407: list-scan inside loop in wireshark-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== wireshark-0001: CWE-407: list-scan inside loop in wireshark-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/wireshark/bench/results.txt b/defects/wireshark/bench/results.txt deleted file mode 100644 index 6b5b795c8..000000000 --- a/defects/wireshark/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== wireshark-0001: CWE-407: list-scan inside loop in wireshark-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.7x -N=500 k=500 : defective=2.449ms fixed=0.024ms speedup=102.8x -N=1000 k=1000 : defective=10.133ms fixed=0.053ms speedup=191.3x -N=2000 k=2000 : defective=38.469ms fixed=0.113ms speedup=340.9x - diff --git a/defects/wireshark/bench/run_all.py b/defects/wireshark/bench/run_all.py deleted file mode 100644 index 00a25b2de..000000000 --- a/defects/wireshark/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-wireshark-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/woodpecker-0001/Makefile b/defects/woodpecker-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/woodpecker-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/woodpecker-0001/bench/bench-woodpecker-0001-0001.py b/defects/woodpecker-0001/bench/bench-woodpecker-0001-0001.py deleted file mode 100644 index 8e4324205..000000000 --- a/defects/woodpecker-0001/bench/bench-woodpecker-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-woodpecker-0001-0001.py -# CWE-407: list-scan inside loop in woodpecker-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== woodpecker-0001-0001: CWE-407: list-scan inside loop in woodpecker-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/woodpecker-0001/bench/results.txt b/defects/woodpecker-0001/bench/results.txt deleted file mode 100644 index 9d9eb5a93..000000000 --- a/defects/woodpecker-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== woodpecker-0001-0001: CWE-407: list-scan inside loop in woodpecker-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.2x -N=500 k=500 : defective=2.364ms fixed=0.023ms speedup=103.4x -N=1000 k=1000 : defective=8.990ms fixed=0.045ms speedup=200.1x -N=2000 k=2000 : defective=35.994ms fixed=0.095ms speedup=378.0x - diff --git a/defects/woodpecker-0001/bench/run_all.py b/defects/woodpecker-0001/bench/run_all.py deleted file mode 100644 index 347ac3680..000000000 --- a/defects/woodpecker-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-woodpecker-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/woodpecker-0002/Makefile b/defects/woodpecker-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/woodpecker-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/woodpecker-0002/bench/bench-woodpecker-0002-0001.py b/defects/woodpecker-0002/bench/bench-woodpecker-0002-0001.py deleted file mode 100644 index 45c032b52..000000000 --- a/defects/woodpecker-0002/bench/bench-woodpecker-0002-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-woodpecker-0002-0001.py -# CWE-407: list-scan inside loop in woodpecker-0002-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== woodpecker-0002-0001: CWE-407: list-scan inside loop in woodpecker-0002-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/woodpecker-0002/bench/results.txt b/defects/woodpecker-0002/bench/results.txt deleted file mode 100644 index 82558a191..000000000 --- a/defects/woodpecker-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== woodpecker-0002-0001: CWE-407: list-scan inside loop in woodpecker-0002-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=24.6x -N=500 k=500 : defective=2.543ms fixed=0.025ms speedup=101.9x -N=1000 k=1000 : defective=10.404ms fixed=0.055ms speedup=187.6x -N=2000 k=2000 : defective=38.262ms fixed=0.097ms speedup=394.0x - diff --git a/defects/woodpecker-0002/bench/run_all.py b/defects/woodpecker-0002/bench/run_all.py deleted file mode 100644 index cebf9e7b5..000000000 --- a/defects/woodpecker-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-woodpecker-0002-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xash3d-0001/Makefile b/defects/xash3d-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xash3d-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xash3d-0001/bench/bench-xash3d-0001-0001.py b/defects/xash3d-0001/bench/bench-xash3d-0001-0001.py deleted file mode 100644 index e3a3d5135..000000000 --- a/defects/xash3d-0001/bench/bench-xash3d-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xash3d-0001-0001.py -# CWE-407: list-scan inside loop in xash3d-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xash3d-0001-0001: CWE-407: list-scan inside loop in xash3d-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xash3d-0001/bench/results.txt b/defects/xash3d-0001/bench/results.txt deleted file mode 100644 index 1115ce277..000000000 --- a/defects/xash3d-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xash3d-0001-0001: CWE-407: list-scan inside loop in xash3d-0001-0001 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.004ms speedup=24.1x -N=500 k=500 : defective=2.146ms fixed=0.021ms speedup=103.4x -N=1000 k=1000 : defective=9.556ms fixed=0.046ms speedup=207.1x -N=2000 k=2000 : defective=37.428ms fixed=0.098ms speedup=381.2x - diff --git a/defects/xash3d-0001/bench/run_all.py b/defects/xash3d-0001/bench/run_all.py deleted file mode 100644 index 1d374ae43..000000000 --- a/defects/xash3d-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xash3d-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xash3d-0002/Makefile b/defects/xash3d-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xash3d-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xash3d-0002/bench/bench-xash3d-0002-0002.py b/defects/xash3d-0002/bench/bench-xash3d-0002-0002.py deleted file mode 100644 index 17a451656..000000000 --- a/defects/xash3d-0002/bench/bench-xash3d-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xash3d-0002-0002.py -# CWE-407: list-scan inside loop in xash3d-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xash3d-0002-0002: CWE-407: list-scan inside loop in xash3d-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xash3d-0002/bench/results.txt b/defects/xash3d-0002/bench/results.txt deleted file mode 100644 index cbe993366..000000000 --- a/defects/xash3d-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xash3d-0002-0002: CWE-407: list-scan inside loop in xash3d-0002-0002 (generic model) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.3x -N=500 k=500 : defective=2.181ms fixed=0.021ms speedup=105.3x -N=1000 k=1000 : defective=8.727ms fixed=0.046ms speedup=189.9x -N=2000 k=2000 : defective=39.546ms fixed=0.096ms speedup=411.8x - diff --git a/defects/xash3d-0002/bench/run_all.py b/defects/xash3d-0002/bench/run_all.py deleted file mode 100644 index 054e0845d..000000000 --- a/defects/xash3d-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xash3d-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xash3d-0003/Makefile b/defects/xash3d-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xash3d-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xash3d-0003/bench/bench-xash3d-0003-0003.py b/defects/xash3d-0003/bench/bench-xash3d-0003-0003.py deleted file mode 100644 index 6bca80297..000000000 --- a/defects/xash3d-0003/bench/bench-xash3d-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xash3d-0003-0003.py -# CWE-407: list-scan inside loop in xash3d-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xash3d-0003-0003: CWE-407: list-scan inside loop in xash3d-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xash3d-0003/bench/results.txt b/defects/xash3d-0003/bench/results.txt deleted file mode 100644 index 84b6a462a..000000000 --- a/defects/xash3d-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xash3d-0003-0003: CWE-407: list-scan inside loop in xash3d-0003-0003 (generic model) === -N=100 k=100 : defective=0.088ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.222ms fixed=0.022ms speedup=102.4x -N=1000 k=1000 : defective=8.978ms fixed=0.047ms speedup=191.7x -N=2000 k=2000 : defective=36.225ms fixed=0.143ms speedup=253.5x - diff --git a/defects/xash3d-0003/bench/run_all.py b/defects/xash3d-0003/bench/run_all.py deleted file mode 100644 index bc531d06c..000000000 --- a/defects/xash3d-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xash3d-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xen/Makefile b/defects/xen/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xen/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xen/bench/bench-xen-0001.py b/defects/xen/bench/bench-xen-0001.py deleted file mode 100644 index fa2afed66..000000000 --- a/defects/xen/bench/bench-xen-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xen-0001.py -# credit2 balance_load() VCPU swap-search O(V²) per scheduler tick -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xen-0001: credit2 balance_load() VCPU swap-search O(V²) per scheduler tick ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xen/bench/results.txt b/defects/xen/bench/results.txt deleted file mode 100644 index a96dba95c..000000000 --- a/defects/xen/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xen-0001: credit2 balance_load() VCPU swap-search O(V²) per scheduler tick === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=26.0x -N=500 k=500 : defective=2.282ms fixed=0.035ms speedup=65.3x -N=1000 k=1000 : defective=9.311ms fixed=0.045ms speedup=206.8x -N=2000 k=2000 : defective=36.622ms fixed=0.096ms speedup=382.4x - diff --git a/defects/xen/bench/run_all.py b/defects/xen/bench/run_all.py deleted file mode 100644 index cece74e50..000000000 --- a/defects/xen/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xen-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xenia-0001/Makefile b/defects/xenia-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xenia-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xenia-0001/bench/bench-xenia-0001-0001.py b/defects/xenia-0001/bench/bench-xenia-0001-0001.py deleted file mode 100644 index b3acc5f44..000000000 --- a/defects/xenia-0001/bench/bench-xenia-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xenia-0001-0001.py -# CWE-407: list-scan inside loop in xenia-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xenia-0001-0001: CWE-407: list-scan inside loop in xenia-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xenia-0001/bench/results.txt b/defects/xenia-0001/bench/results.txt deleted file mode 100644 index d8a6f25e9..000000000 --- a/defects/xenia-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xenia-0001-0001: CWE-407: list-scan inside loop in xenia-0001-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.3x -N=500 k=500 : defective=2.358ms fixed=0.023ms speedup=104.2x -N=1000 k=1000 : defective=8.664ms fixed=0.046ms speedup=187.8x -N=2000 k=2000 : defective=35.202ms fixed=0.097ms speedup=362.7x - diff --git a/defects/xenia-0001/bench/run_all.py b/defects/xenia-0001/bench/run_all.py deleted file mode 100644 index efe780d9d..000000000 --- a/defects/xenia-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xenia-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xonotic-0001/Makefile b/defects/xonotic-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xonotic-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xonotic-0001/bench/bench-xonotic-0001-0001.py b/defects/xonotic-0001/bench/bench-xonotic-0001-0001.py deleted file mode 100644 index 55f2fefd9..000000000 --- a/defects/xonotic-0001/bench/bench-xonotic-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xonotic-0001-0001.py -# CWE-407: list-scan inside loop in xonotic-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xonotic-0001-0001: CWE-407: list-scan inside loop in xonotic-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xonotic-0001/bench/results.txt b/defects/xonotic-0001/bench/results.txt deleted file mode 100644 index 6996e8415..000000000 --- a/defects/xonotic-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xonotic-0001-0001: CWE-407: list-scan inside loop in xonotic-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=23.9x -N=500 k=500 : defective=2.359ms fixed=0.022ms speedup=105.8x -N=1000 k=1000 : defective=8.685ms fixed=0.045ms speedup=194.2x -N=2000 k=2000 : defective=35.820ms fixed=0.097ms speedup=367.7x - diff --git a/defects/xonotic-0001/bench/run_all.py b/defects/xonotic-0001/bench/run_all.py deleted file mode 100644 index 60d883f7c..000000000 --- a/defects/xonotic-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xonotic-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xonotic-0002/Makefile b/defects/xonotic-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xonotic-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xonotic-0002/bench/bench-xonotic-0002-0002.py b/defects/xonotic-0002/bench/bench-xonotic-0002-0002.py deleted file mode 100644 index 8e7244603..000000000 --- a/defects/xonotic-0002/bench/bench-xonotic-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xonotic-0002-0002.py -# CWE-407: list-scan inside loop in xonotic-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xonotic-0002-0002: CWE-407: list-scan inside loop in xonotic-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xonotic-0002/bench/results.txt b/defects/xonotic-0002/bench/results.txt deleted file mode 100644 index 34b056ced..000000000 --- a/defects/xonotic-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xonotic-0002-0002: CWE-407: list-scan inside loop in xonotic-0002-0002 (generic model) === -N=100 k=100 : defective=0.191ms fixed=0.008ms speedup=24.4x -N=500 k=500 : defective=2.511ms fixed=0.024ms speedup=102.6x -N=1000 k=1000 : defective=10.665ms fixed=0.053ms speedup=200.9x -N=2000 k=2000 : defective=37.129ms fixed=0.105ms speedup=353.9x - diff --git a/defects/xonotic-0002/bench/run_all.py b/defects/xonotic-0002/bench/run_all.py deleted file mode 100644 index fc3d7cadd..000000000 --- a/defects/xonotic-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xonotic-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xonotic-0003/Makefile b/defects/xonotic-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xonotic-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xonotic-0003/bench/bench-xonotic-0003-0003.py b/defects/xonotic-0003/bench/bench-xonotic-0003-0003.py deleted file mode 100644 index 7b0b03a4f..000000000 --- a/defects/xonotic-0003/bench/bench-xonotic-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xonotic-0003-0003.py -# CWE-407: list-scan inside loop in xonotic-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xonotic-0003-0003: CWE-407: list-scan inside loop in xonotic-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xonotic-0003/bench/results.txt b/defects/xonotic-0003/bench/results.txt deleted file mode 100644 index ef7941943..000000000 --- a/defects/xonotic-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xonotic-0003-0003: CWE-407: list-scan inside loop in xonotic-0003-0003 (generic model) === -N=100 k=100 : defective=0.100ms fixed=0.004ms speedup=24.3x -N=500 k=500 : defective=2.627ms fixed=0.025ms speedup=104.7x -N=1000 k=1000 : defective=10.669ms fixed=0.055ms speedup=192.8x -N=2000 k=2000 : defective=37.599ms fixed=0.102ms speedup=369.4x - diff --git a/defects/xonotic-0003/bench/run_all.py b/defects/xonotic-0003/bench/run_all.py deleted file mode 100644 index 95acd626a..000000000 --- a/defects/xonotic-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xonotic-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xonotic-0004/Makefile b/defects/xonotic-0004/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xonotic-0004/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xonotic-0004/bench/bench-xonotic-0004-0004.py b/defects/xonotic-0004/bench/bench-xonotic-0004-0004.py deleted file mode 100644 index fc9cd1626..000000000 --- a/defects/xonotic-0004/bench/bench-xonotic-0004-0004.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xonotic-0004-0004.py -# CWE-407: list-scan inside loop in xonotic-0004-0004 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xonotic-0004-0004: CWE-407: list-scan inside loop in xonotic-0004-0004 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xonotic-0004/bench/results.txt b/defects/xonotic-0004/bench/results.txt deleted file mode 100644 index feca30099..000000000 --- a/defects/xonotic-0004/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xonotic-0004-0004: CWE-407: list-scan inside loop in xonotic-0004-0004 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.358ms fixed=0.022ms speedup=106.7x -N=1000 k=1000 : defective=9.552ms fixed=0.050ms speedup=192.9x -N=2000 k=2000 : defective=37.531ms fixed=0.097ms speedup=386.4x - diff --git a/defects/xonotic-0004/bench/run_all.py b/defects/xonotic-0004/bench/run_all.py deleted file mode 100644 index 0db4f1875..000000000 --- a/defects/xonotic-0004/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xonotic-0004-0004.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/xtuple-0001/Makefile b/defects/xtuple-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/xtuple-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/xtuple-0001/bench/bench-xtuple-0001-0001.py b/defects/xtuple-0001/bench/bench-xtuple-0001-0001.py deleted file mode 100644 index 09ec76a76..000000000 --- a/defects/xtuple-0001/bench/bench-xtuple-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-xtuple-0001-0001.py -# CWE-407: list-scan inside loop in xtuple-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== xtuple-0001-0001: CWE-407: list-scan inside loop in xtuple-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/xtuple-0001/bench/results.txt b/defects/xtuple-0001/bench/results.txt deleted file mode 100644 index 39a43712e..000000000 --- a/defects/xtuple-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== xtuple-0001-0001: CWE-407: list-scan inside loop in xtuple-0001-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=2.452ms fixed=0.023ms speedup=104.5x -N=1000 k=1000 : defective=11.185ms fixed=0.054ms speedup=207.5x -N=2000 k=2000 : defective=43.010ms fixed=0.101ms speedup=427.5x - diff --git a/defects/xtuple-0001/bench/run_all.py b/defects/xtuple-0001/bench/run_all.py deleted file mode 100644 index 7cb773077..000000000 --- a/defects/xtuple-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-xtuple-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/yabause-0001/Makefile b/defects/yabause-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/yabause-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/yabause-0001/bench/bench-yabause-0001-0001.py b/defects/yabause-0001/bench/bench-yabause-0001-0001.py deleted file mode 100644 index 6d465fce0..000000000 --- a/defects/yabause-0001/bench/bench-yabause-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-yabause-0001-0001.py -# CWE-407: list-scan inside loop in yabause-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== yabause-0001-0001: CWE-407: list-scan inside loop in yabause-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/yabause-0001/bench/results.txt b/defects/yabause-0001/bench/results.txt deleted file mode 100644 index e5e0427b6..000000000 --- a/defects/yabause-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== yabause-0001-0001: CWE-407: list-scan inside loop in yabause-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.009ms speedup=11.5x -N=500 k=500 : defective=2.440ms fixed=0.024ms speedup=103.1x -N=1000 k=1000 : defective=11.046ms fixed=0.053ms speedup=210.0x -N=2000 k=2000 : defective=47.616ms fixed=0.099ms speedup=479.2x - diff --git a/defects/yabause-0001/bench/run_all.py b/defects/yabause-0001/bench/run_all.py deleted file mode 100644 index 0b3276dc1..000000000 --- a/defects/yabause-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-yabause-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/yugabyte/Makefile b/defects/yugabyte/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/yugabyte/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/yugabyte/bench/bench-yugabyte-0001.py b/defects/yugabyte/bench/bench-yugabyte-0001.py deleted file mode 100644 index b299f19e9..000000000 --- a/defects/yugabyte/bench/bench-yugabyte-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-yugabyte-0001.py -# yugabyte-0001 — GetXReplStreamsForTable: std::find on table_id list inside per-table loop -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== yugabyte-0001: yugabyte-0001 — GetXReplStreamsForTable: std::find on table_id list inside per-table loop ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/yugabyte/bench/results.txt b/defects/yugabyte/bench/results.txt deleted file mode 100644 index 4f02a133c..000000000 --- a/defects/yugabyte/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== yugabyte-0001: yugabyte-0001 — GetXReplStreamsForTable: std::find on table_id list inside per-table loop === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.2x -N=500 k=500 : defective=2.384ms fixed=0.023ms speedup=105.9x -N=1000 k=1000 : defective=9.532ms fixed=0.106ms speedup=89.6x -N=2000 k=2000 : defective=45.816ms fixed=0.105ms speedup=437.0x - diff --git a/defects/yugabyte/bench/run_all.py b/defects/yugabyte/bench/run_all.py deleted file mode 100644 index be7ad5d18..000000000 --- a/defects/yugabyte/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-yugabyte-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zabbix-0001/Makefile b/defects/zabbix-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zabbix-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zabbix-0001/bench/bench-zabbix-0001-0001.py b/defects/zabbix-0001/bench/bench-zabbix-0001-0001.py deleted file mode 100644 index 1a6837f3e..000000000 --- a/defects/zabbix-0001/bench/bench-zabbix-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zabbix-0001-0001.py -# CWE-407: list-scan inside loop in zabbix-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zabbix-0001-0001: CWE-407: list-scan inside loop in zabbix-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zabbix-0001/bench/results.txt b/defects/zabbix-0001/bench/results.txt deleted file mode 100644 index 0d27ba016..000000000 --- a/defects/zabbix-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zabbix-0001-0001: CWE-407: list-scan inside loop in zabbix-0001-0001 (generic model) === -N=100 k=100 : defective=0.122ms fixed=0.004ms speedup=31.2x -N=500 k=500 : defective=2.560ms fixed=0.024ms speedup=106.5x -N=1000 k=1000 : defective=10.188ms fixed=0.107ms speedup=94.9x -N=2000 k=2000 : defective=45.021ms fixed=0.096ms speedup=466.8x - diff --git a/defects/zabbix-0001/bench/run_all.py b/defects/zabbix-0001/bench/run_all.py deleted file mode 100644 index b9e3ffdb0..000000000 --- a/defects/zabbix-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zabbix-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zabbix-0002/Makefile b/defects/zabbix-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zabbix-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zabbix-0002/bench/bench-zabbix-0002-0002.py b/defects/zabbix-0002/bench/bench-zabbix-0002-0002.py deleted file mode 100644 index 6528e6f69..000000000 --- a/defects/zabbix-0002/bench/bench-zabbix-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zabbix-0002-0002.py -# CWE-407: list-scan inside loop in zabbix-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zabbix-0002-0002: CWE-407: list-scan inside loop in zabbix-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zabbix-0002/bench/results.txt b/defects/zabbix-0002/bench/results.txt deleted file mode 100644 index f2dfce720..000000000 --- a/defects/zabbix-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zabbix-0002-0002: CWE-407: list-scan inside loop in zabbix-0002-0002 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.403ms fixed=0.046ms speedup=52.0x -N=1000 k=1000 : defective=11.797ms fixed=0.046ms speedup=258.3x -N=2000 k=2000 : defective=43.505ms fixed=0.098ms speedup=443.9x - diff --git a/defects/zabbix-0002/bench/run_all.py b/defects/zabbix-0002/bench/run_all.py deleted file mode 100644 index b0155b60e..000000000 --- a/defects/zabbix-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zabbix-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zathura-0001/Makefile b/defects/zathura-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zathura-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zathura-0001/bench/bench-zathura-0001-0001.py b/defects/zathura-0001/bench/bench-zathura-0001-0001.py deleted file mode 100644 index 38981e468..000000000 --- a/defects/zathura-0001/bench/bench-zathura-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zathura-0001-0001.py -# CWE-407: list-scan inside loop in zathura-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zathura-0001-0001: CWE-407: list-scan inside loop in zathura-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zathura-0001/bench/results.txt b/defects/zathura-0001/bench/results.txt deleted file mode 100644 index 516d419cc..000000000 --- a/defects/zathura-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zathura-0001-0001: CWE-407: list-scan inside loop in zathura-0001-0001 (generic model) === -N=100 k=100 : defective=0.182ms fixed=0.008ms speedup=24.2x -N=500 k=500 : defective=3.191ms fixed=0.024ms speedup=132.0x -N=1000 k=1000 : defective=9.198ms fixed=0.049ms speedup=187.6x -N=2000 k=2000 : defective=51.788ms fixed=0.100ms speedup=520.3x - diff --git a/defects/zathura-0001/bench/run_all.py b/defects/zathura-0001/bench/run_all.py deleted file mode 100644 index 568b8c50b..000000000 --- a/defects/zathura-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zathura-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zebra-0001/Makefile b/defects/zebra-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zebra-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zebra-0001/bench/bench-zebra-0001-0001.py b/defects/zebra-0001/bench/bench-zebra-0001-0001.py deleted file mode 100644 index 51181c73c..000000000 --- a/defects/zebra-0001/bench/bench-zebra-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zebra-0001-0001.py -# CWE-407: list-scan inside loop in zebra-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zebra-0001-0001: CWE-407: list-scan inside loop in zebra-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zebra-0001/bench/results.txt b/defects/zebra-0001/bench/results.txt deleted file mode 100644 index d86f24190..000000000 --- a/defects/zebra-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zebra-0001-0001: CWE-407: list-scan inside loop in zebra-0001-0001 (generic model) === -N=100 k=100 : defective=0.093ms fixed=0.004ms speedup=25.9x -N=500 k=500 : defective=2.424ms fixed=0.044ms speedup=55.7x -N=1000 k=1000 : defective=8.742ms fixed=0.047ms speedup=187.5x -N=2000 k=2000 : defective=64.935ms fixed=0.143ms speedup=453.9x - diff --git a/defects/zebra-0001/bench/run_all.py b/defects/zebra-0001/bench/run_all.py deleted file mode 100644 index 0ffcf848e..000000000 --- a/defects/zebra-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zebra-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zed/Makefile b/defects/zed/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zed/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zed/bench/bench-zed-0001.py b/defects/zed/bench/bench-zed-0001.py deleted file mode 100644 index bc1ecd691..000000000 --- a/defects/zed/bench/bench-zed-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zed-0001.py -# lsp_store LSP edit dedup Vec::contains O(E²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zed-0001: lsp_store LSP edit dedup Vec::contains O(E²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zed/bench/bench-zed-0002.py b/defects/zed/bench/bench-zed-0002.py deleted file mode 100644 index 86d75ff7c..000000000 --- a/defects/zed/bench/bench-zed-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zed-0002.py -# extension_builder manifest entry dedup Vec::contains O(N²) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zed-0002: extension_builder manifest entry dedup Vec::contains O(N²) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zed/bench/results.txt b/defects/zed/bench/results.txt deleted file mode 100644 index e630785e8..000000000 --- a/defects/zed/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== zed-0001: lsp_store LSP edit dedup Vec::contains O(E²) === -N=100 k=100 : defective=0.239ms fixed=0.007ms speedup=36.1x -N=500 k=500 : defective=3.095ms fixed=0.022ms speedup=142.4x -N=1000 k=1000 : defective=15.365ms fixed=0.096ms speedup=160.2x -N=2000 k=2000 : defective=56.229ms fixed=0.206ms speedup=272.4x - -=== zed-0002: extension_builder manifest entry dedup Vec::contains O(N²) === -N=100 k=100 : defective=0.085ms fixed=0.003ms speedup=25.7x -N=500 k=500 : defective=2.950ms fixed=0.021ms speedup=138.0x -N=1000 k=1000 : defective=14.564ms fixed=0.095ms speedup=153.0x -N=2000 k=2000 : defective=66.573ms fixed=0.196ms speedup=339.0x - diff --git a/defects/zed/bench/run_all.py b/defects/zed/bench/run_all.py deleted file mode 100644 index 5911548aa..000000000 --- a/defects/zed/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zed-0001.py", "bench-zed-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zeek/Makefile b/defects/zeek/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zeek/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zeek/bench/bench-zeek-0001.py b/defects/zeek/bench/bench-zeek-0001.py deleted file mode 100644 index 9e2ba8922..000000000 --- a/defects/zeek/bench/bench-zeek-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zeek-0001.py -# CWE-407: list-scan inside loop in zeek-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zeek-0001: CWE-407: list-scan inside loop in zeek-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zeek/bench/bench-zeek-0002.py b/defects/zeek/bench/bench-zeek-0002.py deleted file mode 100644 index fc4db055f..000000000 --- a/defects/zeek/bench/bench-zeek-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zeek-0002.py -# zeek-0002 — Attributes::AddAttr O(A²) during script compilation -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zeek-0002: zeek-0002 — Attributes::AddAttr O(A²) during script compilation ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zeek/bench/results.txt b/defects/zeek/bench/results.txt deleted file mode 100644 index ca2147a38..000000000 --- a/defects/zeek/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== zeek-0001: CWE-407: list-scan inside loop in zeek-0001 (generic model) === -N=100 k=100 : defective=0.092ms fixed=0.004ms speedup=25.0x -N=500 k=500 : defective=4.327ms fixed=0.045ms speedup=96.1x -N=1000 k=1000 : defective=17.245ms fixed=0.151ms speedup=114.1x -N=2000 k=2000 : defective=70.095ms fixed=0.160ms speedup=439.1x - -=== zeek-0002: zeek-0002 — Attributes::AddAttr O(A²) during script compilation === -N=100 k=100 : defective=0.177ms fixed=0.003ms speedup=50.8x -N=500 k=500 : defective=3.026ms fixed=0.020ms speedup=148.6x -N=1000 k=1000 : defective=16.036ms fixed=0.060ms speedup=266.6x -N=2000 k=2000 : defective=73.327ms fixed=0.106ms speedup=691.7x - diff --git a/defects/zeek/bench/run_all.py b/defects/zeek/bench/run_all.py deleted file mode 100644 index ac53ec32c..000000000 --- a/defects/zeek/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zeek-0001.py", "bench-zeek-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zephyr-0001/Makefile b/defects/zephyr-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zephyr-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zephyr-0001/bench/bench-zephyr-0001-0001.py b/defects/zephyr-0001/bench/bench-zephyr-0001-0001.py deleted file mode 100644 index dba12c735..000000000 --- a/defects/zephyr-0001/bench/bench-zephyr-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zephyr-0001-0001.py -# CWE-407: list-scan inside loop in zephyr-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zephyr-0001-0001: CWE-407: list-scan inside loop in zephyr-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zephyr-0001/bench/results.txt b/defects/zephyr-0001/bench/results.txt deleted file mode 100644 index 4996f1f59..000000000 --- a/defects/zephyr-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zephyr-0001-0001: CWE-407: list-scan inside loop in zephyr-0001-0001 (generic model) === -N=100 k=100 : defective=0.230ms fixed=0.014ms speedup=16.0x -N=500 k=500 : defective=3.544ms fixed=0.023ms speedup=152.8x -N=1000 k=1000 : defective=16.903ms fixed=0.110ms speedup=153.0x -N=2000 k=2000 : defective=57.113ms fixed=0.226ms speedup=253.3x - diff --git a/defects/zephyr-0001/bench/run_all.py b/defects/zephyr-0001/bench/run_all.py deleted file mode 100644 index e1413a851..000000000 --- a/defects/zephyr-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zephyr-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zephyr-0002/Makefile b/defects/zephyr-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zephyr-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zephyr-0002/bench/bench-zephyr-0002-0002.py b/defects/zephyr-0002/bench/bench-zephyr-0002-0002.py deleted file mode 100644 index 92b883c94..000000000 --- a/defects/zephyr-0002/bench/bench-zephyr-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zephyr-0002-0002.py -# CWE-407: list-scan inside loop in zephyr-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zephyr-0002-0002: CWE-407: list-scan inside loop in zephyr-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zephyr-0002/bench/results.txt b/defects/zephyr-0002/bench/results.txt deleted file mode 100644 index 259672548..000000000 --- a/defects/zephyr-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zephyr-0002-0002: CWE-407: list-scan inside loop in zephyr-0002-0002 (generic model) === -N=100 k=100 : defective=0.224ms fixed=0.015ms speedup=14.5x -N=500 k=500 : defective=2.465ms fixed=0.022ms speedup=110.4x -N=1000 k=1000 : defective=11.225ms fixed=0.049ms speedup=227.2x -N=2000 k=2000 : defective=45.579ms fixed=0.119ms speedup=382.6x - diff --git a/defects/zephyr-0002/bench/run_all.py b/defects/zephyr-0002/bench/run_all.py deleted file mode 100644 index 6806b02f3..000000000 --- a/defects/zephyr-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zephyr-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zesarux-0001/Makefile b/defects/zesarux-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zesarux-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zesarux-0001/bench/bench-zesarux-0001-0001.py b/defects/zesarux-0001/bench/bench-zesarux-0001-0001.py deleted file mode 100644 index f45ad87f5..000000000 --- a/defects/zesarux-0001/bench/bench-zesarux-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zesarux-0001-0001.py -# CWE-407: list-scan inside loop in zesarux-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zesarux-0001-0001: CWE-407: list-scan inside loop in zesarux-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zesarux-0001/bench/results.txt b/defects/zesarux-0001/bench/results.txt deleted file mode 100644 index 6ce8ef9cc..000000000 --- a/defects/zesarux-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zesarux-0001-0001: CWE-407: list-scan inside loop in zesarux-0001-0001 (generic model) === -N=100 k=100 : defective=0.199ms fixed=0.007ms speedup=29.4x -N=500 k=500 : defective=2.811ms fixed=0.024ms speedup=117.7x -N=1000 k=1000 : defective=11.018ms fixed=0.053ms speedup=207.4x -N=2000 k=2000 : defective=48.493ms fixed=0.101ms speedup=478.0x - diff --git a/defects/zesarux-0001/bench/run_all.py b/defects/zesarux-0001/bench/run_all.py deleted file mode 100644 index 659f2b3f0..000000000 --- a/defects/zesarux-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zesarux-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zookeeper/Makefile b/defects/zookeeper/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zookeeper/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zookeeper/bench/bench-zookeeper-0001.py b/defects/zookeeper/bench/bench-zookeeper-0001.py deleted file mode 100644 index ede8c845b..000000000 --- a/defects/zookeeper/bench/bench-zookeeper-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zookeeper-0001.py -# CWE-407: list-scan inside loop in zookeeper-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zookeeper-0001: CWE-407: list-scan inside loop in zookeeper-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zookeeper/bench/bench-zookeeper-0002.py b/defects/zookeeper/bench/bench-zookeeper-0002.py deleted file mode 100644 index 152e19195..000000000 --- a/defects/zookeeper/bench/bench-zookeeper-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zookeeper-0002.py -# CWE-407: list-scan inside loop in zookeeper-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zookeeper-0002: CWE-407: list-scan inside loop in zookeeper-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zookeeper/bench/results.txt b/defects/zookeeper/bench/results.txt deleted file mode 100644 index 0923842ee..000000000 --- a/defects/zookeeper/bench/results.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== zookeeper-0001: CWE-407: list-scan inside loop in zookeeper-0001 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.004ms speedup=24.7x -N=500 k=500 : defective=2.456ms fixed=0.023ms speedup=105.7x -N=1000 k=1000 : defective=11.720ms fixed=0.054ms speedup=218.9x -N=2000 k=2000 : defective=39.434ms fixed=0.098ms speedup=401.9x - -=== zookeeper-0002: CWE-407: list-scan inside loop in zookeeper-0002 (generic model) === -N=100 k=100 : defective=0.247ms fixed=0.015ms speedup=16.2x -N=500 k=500 : defective=2.146ms fixed=0.021ms speedup=102.9x -N=1000 k=1000 : defective=10.134ms fixed=0.052ms speedup=195.5x -N=2000 k=2000 : defective=38.463ms fixed=0.159ms speedup=242.5x - diff --git a/defects/zookeeper/bench/run_all.py b/defects/zookeeper/bench/run_all.py deleted file mode 100644 index 4d1bbf98e..000000000 --- a/defects/zookeeper/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zookeeper-0001.py", "bench-zookeeper-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zulip-0001/Makefile b/defects/zulip-0001/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zulip-0001/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zulip-0001/bench/bench-zulip-0001-0001.py b/defects/zulip-0001/bench/bench-zulip-0001-0001.py deleted file mode 100644 index 401a519bb..000000000 --- a/defects/zulip-0001/bench/bench-zulip-0001-0001.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zulip-0001-0001.py -# CWE-407: list-scan inside loop in zulip-0001-0001 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zulip-0001-0001: CWE-407: list-scan inside loop in zulip-0001-0001 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zulip-0001/bench/results.txt b/defects/zulip-0001/bench/results.txt deleted file mode 100644 index f57a05e1e..000000000 --- a/defects/zulip-0001/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zulip-0001-0001: CWE-407: list-scan inside loop in zulip-0001-0001 (generic model) === -N=100 k=100 : defective=0.102ms fixed=0.004ms speedup=25.4x -N=500 k=500 : defective=2.629ms fixed=0.049ms speedup=53.8x -N=1000 k=1000 : defective=15.424ms fixed=0.069ms speedup=222.6x -N=2000 k=2000 : defective=46.302ms fixed=0.120ms speedup=386.2x - diff --git a/defects/zulip-0001/bench/run_all.py b/defects/zulip-0001/bench/run_all.py deleted file mode 100644 index ec82c8024..000000000 --- a/defects/zulip-0001/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zulip-0001-0001.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zulip-0002/Makefile b/defects/zulip-0002/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zulip-0002/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zulip-0002/bench/bench-zulip-0002-0002.py b/defects/zulip-0002/bench/bench-zulip-0002-0002.py deleted file mode 100644 index ce8be9972..000000000 --- a/defects/zulip-0002/bench/bench-zulip-0002-0002.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zulip-0002-0002.py -# CWE-407: list-scan inside loop in zulip-0002-0002 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zulip-0002-0002: CWE-407: list-scan inside loop in zulip-0002-0002 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zulip-0002/bench/results.txt b/defects/zulip-0002/bench/results.txt deleted file mode 100644 index 22b41ee87..000000000 --- a/defects/zulip-0002/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zulip-0002-0002: CWE-407: list-scan inside loop in zulip-0002-0002 (generic model) === -N=100 k=100 : defective=0.109ms fixed=0.004ms speedup=26.2x -N=500 k=500 : defective=3.331ms fixed=0.066ms speedup=50.8x -N=1000 k=1000 : defective=15.554ms fixed=0.059ms speedup=265.6x -N=2000 k=2000 : defective=52.025ms fixed=0.098ms speedup=531.1x - diff --git a/defects/zulip-0002/bench/run_all.py b/defects/zulip-0002/bench/run_all.py deleted file mode 100644 index 964533007..000000000 --- a/defects/zulip-0002/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zulip-0002-0002.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/defects/zulip-0003/Makefile b/defects/zulip-0003/Makefile deleted file mode 100644 index 125b5b8f6..000000000 --- a/defects/zulip-0003/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -.PHONY: all bench clean -all: bench -bench: - python3 bench/run_all.py -clean: - rm -rf bench/__pycache__ __pycache__ diff --git a/defects/zulip-0003/bench/bench-zulip-0003-0003.py b/defects/zulip-0003/bench/bench-zulip-0003-0003.py deleted file mode 100644 index acae62e93..000000000 --- a/defects/zulip-0003/bench/bench-zulip-0003-0003.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -# bench-zulip-0003-0003.py -# CWE-407: list-scan inside loop in zulip-0003-0003 (generic model) -# Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. - -import sys -import time - - -def bench_defective(n, k): - pool = list(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool: # O(k) - seen.append(x) - return time.perf_counter() - t0 - - -def bench_fixed(n, k): - pool_set = set(range(k)) - items = list(range(n)) - t0 = time.perf_counter() - seen = [] - for x in items: - if x not in pool_set: # O(1) - seen.append(x) - return time.perf_counter() - t0 - - -TRIALS = 3 -CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] - - -def run(): - lines = [] - header = "=== zulip-0003-0003: CWE-407: list-scan inside loop in zulip-0003-0003 (generic model) ===" - print(header); lines.append(header) - for n, k in CASES: - df = min(bench_defective(n, k) for _ in range(TRIALS)) - fx = min(bench_fixed(n, k) for _ in range(TRIALS)) - speedup = (df / fx) if fx > 0 else float("inf") - line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" - print(line); lines.append(line); sys.stdout.flush() - return lines - - -if __name__ == "__main__": - run() diff --git a/defects/zulip-0003/bench/results.txt b/defects/zulip-0003/bench/results.txt deleted file mode 100644 index 349aca27c..000000000 --- a/defects/zulip-0003/bench/results.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== zulip-0003-0003: CWE-407: list-scan inside loop in zulip-0003-0003 (generic model) === -N=100 k=100 : defective=0.097ms fixed=0.005ms speedup=20.6x -N=500 k=500 : defective=3.778ms fixed=0.023ms speedup=162.8x -N=1000 k=1000 : defective=12.238ms fixed=0.052ms speedup=233.1x -N=2000 k=2000 : defective=45.910ms fixed=0.099ms speedup=463.8x - diff --git a/defects/zulip-0003/bench/run_all.py b/defects/zulip-0003/bench/run_all.py deleted file mode 100644 index d08982e0b..000000000 --- a/defects/zulip-0003/bench/run_all.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -import importlib.util, os, sys -BENCH_DIR = os.path.dirname(os.path.abspath(__file__)) - -def load_module(filename): - path = os.path.join(BENCH_DIR, filename) - spec = importlib.util.spec_from_file_location("mod", path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - -all_lines = [] -for fname in ["bench-zulip-0003-0003.py"]: - mod = load_module(fname) - lines = mod.run() - all_lines.extend(lines); all_lines.append("") - print(); sys.stdout.flush() - -out_path = os.path.join(BENCH_DIR, "results.txt") -with open(out_path, "w") as f: - f.write("\n".join(all_lines) + "\n") -print(f"results written to {out_path}"); sys.stdout.flush() diff --git a/docs/tickets/check-0001-suite-tcase_by_name-linear-strcmp.md b/docs/tickets/check-0001-suite-tcase_by_name-linear-strcmp.md deleted file mode 100644 index b7c2d7166..000000000 --- a/docs/tickets/check-0001-suite-tcase_by_name-linear-strcmp.md +++ /dev/null @@ -1,67 +0,0 @@ -# check-0001: Suite test-case lookup — O(N) strcmp linear scan per call - -**Target:** libcheck/check -**Severity:** LOW-MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `src/check.c:76-94, 186-229` -**Language:** C -**Status:** open - -## Description - -`libcheck` looks up test cases by name via a linear scan of a `List`, calling `strcmp` per entry. The same pattern lives in two places: `suite_tcase` (helper for tcase-by-name lookup) and the suite-runner filter (lines 186-229) that applies `sname`/`tcname` filters to decide whether to execute a given suite/tcase. On large test suites (hundreds of suites × hundreds of tcases each), per-call cost is O(N) per lookup, O(N²) if the runner iterates all tcases checking name membership. - -## Root Cause - -```c -// src/check.c:76-94 -int suite_tcase(Suite *s, const char *tcname) -{ - List *l; - - if(s == NULL) return 0; - - l = s->tclst; - for(check_list_front(l); !check_list_at_end(l); check_list_advance(l)) - { - TCase *tc = (TCase *)check_list_val(l); - if(strcmp(tcname, tc->name) == 0) - return 1; - } - return 0; -} - -// src/check_run.c:186-229 — runner filter -// For each suite (sname filter) and each tcase (tcname filter), strcmp is -// invoked per list entry per call. -``` - -## Fix - -Maintain a parallel `hashtable` (or sorted array with binary search) keyed by name alongside the List, updated whenever `tcase_add`/`suite_add_tcase` is called. Lookup drops to O(1) amortized. The List is preserved for ordered iteration (test-run order matters). - -```c -// Add to Suite: -struct hashtable *tcname_index; // maps char* name -> TCase* - -// In tcase_add, on insert: -hashtable_insert(s->tcname_index, tc->name, tc); - -// Rewrite suite_tcase: -int suite_tcase(Suite *s, const char *tcname) { - if (s == NULL || s->tcname_index == NULL) return 0; - return hashtable_search(s->tcname_index, tcname) != NULL; -} -``` - -Total cost drops from O(N) per lookup to O(1) amortized. For the runner filter, the net speedup across a test-run is O(N²) → O(N). - -## Severity Note - -Impact scales with test suite size. Typical unit-test codebases have <50 tcases per suite, where the effect is milliseconds at most. Larger suites (integration/e2e harnesses with hundreds of tcases and filter patterns) see measurable slowdown. LOW-MEDIUM priority; cleanup rather than hotspot. - -## Complexity Gate - -- N=500 tcases per suite, 500 lookups: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/gatsby-0001-indexing-nodetypenames-includes-set.md b/docs/tickets/gatsby-0001-indexing-nodetypenames-includes-set.md deleted file mode 100644 index 9496357bb..000000000 --- a/docs/tickets/gatsby-0001-indexing-nodetypenames-includes-set.md +++ /dev/null @@ -1,80 +0,0 @@ -# gatsby-0001: in-memory indexing — O(N×T) nodeTypeNames.includes per node walk - -**Target:** gatsbyjs/gatsby -**Severity:** MEDIUM-HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `packages/gatsby/src/datastore/in-memory/indexing.ts:326, 378, 504` -**Language:** TypeScript -**Status:** open - -## Description - -Three filter-cache builders in Gatsby's in-memory datastore walk the full node store and check each node's type against a list of declared `nodeTypeNames` via `Array#includes`. The Gatsby authors annotate two of the three call sites with the comment `// This loop is expensive at scale (!)` and `// Expensive at scale` — they know the pattern is hot but the lookup is still a linear scan. - -For N nodes (a typical content-heavy Gatsby site has 50K-500K nodes — every Markdown file, image, frontmatter object, GraphQL-introspected source becomes a node) and T type-names per query (typically 5-30 declared types per filter), per-cache-build cost is O(N×T). - -## Root Cause - -```typescript -// indexing.ts:323-336 — ensureIndexByElemMatch -} else { - // Here we must first filter for the node type - // This loop is expensive at scale (!) - getDataStore() - .iterateNodes() - .forEach(node => { - if (!nodeTypeNames.includes(node.internal.type)) { // O(T) per node - return - } - addNodeToFilterCache({ node, chain: filterPath, ... }) - }) -} - -// indexing.ts:372-384 — ensureEmptyFilterCache (same pattern) -} else { - // Here we must first filter for the node type - // This loop is expensive at scale (!) - getDataStore().iterateNodes().forEach(node => { - if (nodeTypeNames.includes(node.internal.type)) { ... } - }) -} - -// indexing.ts:499-516 — ensureIndexByElemMatchValue (same pattern) -} else { - // Expensive at scale - getDataStore().iterateNodes().forEach(node => { - if (!nodeTypeNames.includes(node.internal.type)) { return } - addNodeToBucketWithElemMatch({ ... }) - }) -} -``` - -`Array#includes` is O(T) per call. Across N node iterations: O(N×T) per cache build. Filter caches are built per query, every page render in develop mode triggers more. - -## Fix - -Convert `nodeTypeNames` to a `Set` at the top of each function. Per-iter cost drops to O(1). - -```typescript -// In each function, before the forEach loop: -const nodeTypeNameSet = new Set(nodeTypeNames); - -getDataStore().iterateNodes().forEach(node => { - if (!nodeTypeNameSet.has(node.internal.type)) { // O(1) - return; - } - ... -}); -``` - -Total cost drops from O(N×T) to O(N+T) per cache build. The Set-build cost (O(T)) is amortized over the N-node walk. - -## Severity Note - -Hot path on every Gatsby site build. Every developer running `gatsby develop` or `gatsby build` pays this on every query that filters by type. Large sites (Smashing Magazine-scale content sites with 100K+ pages) hit O(N×T) on every cache rebuild. The Gatsby authors flagged this in source comments — the data shape is acknowledged as a problem; the fix is a one-line hoist. - -## Complexity Gate - -- N=100,000 nodes × T=20 types: fixed must complete in <50ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/ghidra-0001-recoveredclasshelper-list-to-set.md b/docs/tickets/ghidra-0001-recoveredclasshelper-list-to-set.md deleted file mode 100644 index fe83c2dc5..000000000 --- a/docs/tickets/ghidra-0001-recoveredclasshelper-list-to-set.md +++ /dev/null @@ -1,75 +0,0 @@ -# ghidra-0001: RecoveredClassHelper — O(F×R²) List.contains + ArrayList copy on every add - -**Target:** NationalSecurityAgency/ghidra -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java:218-237, 256-275` -**Language:** Java -**Status:** open - -## Description - -`RecoveredClassHelper` builds two maps during ghidra's C++ class recovery analysis: -- `functionToVftableRefsMap: Map>` -- `functionToClassesMap: Map>` - -Each insert path checks for membership via `List.contains` (O(R) linear scan), then copies the existing `ArrayList` into a new `ArrayList` (O(R) defensive copy), then `Map.replace`s the entry. Per-function cost: **O(R²)** for R items added. Per-binary cost: **O(F × R²)** where F = function count, R = references-per-function. - -Real-world scale: large reverse-engineered C++ binaries (malware analysis, OS kernels, AAA games) routinely have 1000+ classes and 10k+ vftable references. Class recovery analysis scripts run into seconds-to-minutes per binary today. - -## Root Cause - -```java -// RecoveredClassHelper.java:218 — addVftableReferencesToFunctionMapping -for (Address vtableReference : keySet) { - if (functionToVftableRefsMap.containsKey(function)) { - List
referenceList = functionToVftableRefsMap.get(function); - if (!referenceList.contains(vtableReference)) { // O(R) per call - List
newList = new ArrayList<>(referenceList); // O(R) copy per add - newList.add(vtableReference); - functionToVftableRefsMap.replace(function, referenceList, newList); - } - } else { - List
newList = new ArrayList<>(); - newList.add(vtableReference); - functionToVftableRefsMap.put(function, newList); - } -} - -// RecoveredClassHelper.java:256 — addFunctionsToClassMapping (same pattern) -``` - -Each add does both a linear scan and a list copy. Across F functions × R references each: **O(F × R²)**. - -## Fix - -Replace `Map>` with `Map>`. `LinkedHashSet` preserves insertion order (so callers iterating in the order references were discovered see the same order) AND gives O(1) `add` + `contains`. The defensive ArrayList copy on every add disappears entirely. - -```java -private final Map> functionToVftableRefSetMap = new HashMap<>(); -private final Map> functionToClassesSetMap = new HashMap<>(); - -// Insert path becomes: -functionToVftableRefSetMap - .computeIfAbsent(function, k -> new LinkedHashSet<>()) - .add(vtableReference); -``` - -Public API readers wrap the set as `List` for downstream-script compatibility: - -```java -public List
getVftableReferences(Function function) { - LinkedHashSet
set = functionToVftableRefSetMap.get(function); - return set == null ? null : new ArrayList<>(set); -} -``` - -## Severity Note - -Hot path on every C++ class recovery script invocation. Bench (defects/ghidra/bench/) shows 6.5× speedup at F=100 R=50, scaling to 27× at F=2000 R=500. Reverse engineering analysts running ghidra on large binaries see this latency as part of "RecoverClassesFromRTTIScript" wall-clock time. - -## Complexity Gate - -- F=2000 functions × R=500 refs: fixed must complete in <250ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/ghidra-0002-getvttaddresses-set-hoist.md b/docs/tickets/ghidra-0002-getvttaddresses-set-hoist.md deleted file mode 100644 index 278bb59f0..000000000 --- a/docs/tickets/ghidra-0002-getvttaddresses-set-hoist.md +++ /dev/null @@ -1,96 +0,0 @@ -# ghidra-0002: RTTIGccClassRecoverer.getVttAddresses — O(A²·V + A·V) coupled defects - -**Target:** NationalSecurityAgency/ghidra -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java:880-925, 944-960, 988-1005` -**Language:** Java -**Status:** open - -## Description - -Three coupled patterns in ghidra's gcc-compiled C++ class recovery: - -1. **`isPossibleVttStart(address, vtables, knownVtts)` rebuilds `vtableAndVftableAddrs` on every invocation** — calls `getListOfVtableAndVftableTops(vtables)` from scratch each time, walking all vtables to extract their addresses. O(V) wasted work per call. - -2. **`getVttAddresses` calls `isPossibleVttStart` once per address-to-check inside an outer `while (keepChecking)` retry loop** — multiplies the rebuild cost across iterations. - -3. **`addPointerToList` uses `List.contains` on `List
` for membership** — O(V) and O(T) per check during the per-VTT pointer walk. - -Total per analysis: O(outer_iters × A × V) just for the rebuilds, plus O(A × V) for the linear-scan contains. A gcc-compiled C++ binary with 1000 classes (2000 vtable+vftable addresses) and 500 candidate addresses produces ~30M ops per RecoverClassesFromRTTIScript invocation. - -## Root Cause - -```java -// getVttAddresses(): outer loop with per-call rebuild -while (keepChecking) { - for (Address possibleVttStart : addressesToCheck) { - if (isPossibleVttStart(possibleVttStart, vtables, vttStarts)) { // rebuilds list - vttStarts.add(possibleVttStart); - } - } - ... -} - -// isPossibleVttStart(): O(V) rebuild every call -private boolean isPossibleVttStart(Address address, List vtables, List
knownVtts) { - List
vtableAndVftableAddrs = getListOfVtableAndVftableTops(vtables); // <- O(V) every call - ... - if (referencedAddress != null && (vtableAndVftableAddrs.contains(referencedAddress) || - knownVtts.contains(referencedAddress))) { // O(V)+O(T) per check - return true; - } -} - -// addPointerToList(): rebuilt-each-time + List.contains -List
vtableAndVftableAddrs = getListOfVtableAndVftableTops(vtables); // built once but List -List
vttStarts = getVttAddresses(vtts); -for (Vtt vtt : vtts) { - while (referencedAddress != null && - (vtableAndVftableAddrs.contains(referencedAddress) || // O(V) per check - vttStarts.contains(referencedAddress))) { // O(T) per check - ... - } -} -``` - -## Fix - -1. Build `Set
vtableAndVftableSet` once in `getVttAddresses` (and again in `addPointerToList`) before any inner loop. -2. Change `isPossibleVttStart` to accept the prebuilt sets as parameters (no per-call rebuild). -3. Maintain `Set
vttStartSet` alongside the existing `List` so `vttStarts.add(addr)` updates both for downstream `isPossibleVttStart` calls. - -```java -Set
vtableAndVftableSet = - new HashSet<>(getListOfVtableAndVftableTops(vtables)); -Set
vttStartSet = new HashSet<>(); -while (keepChecking) { - for (Address possibleVttStart : addressesToCheck) { - if (isPossibleVttStart(possibleVttStart, vtableAndVftableSet, vttStartSet)) { - vttStarts.add(possibleVttStart); - vttStartSet.add(possibleVttStart); - } - } - ... -} - -private boolean isPossibleVttStart(Address address, Set
vtableAndVftableSet, - Set
knownVttSet) throws CancelledException { - if (isSelfReferencing(address)) return true; - Address referencedAddress = getReferencedAddress(address); - return referencedAddress != null && (vtableAndVftableSet.contains(referencedAddress) || - knownVttSet.contains(referencedAddress)); -} -``` - -## Severity Note - -Hot path on every gcc-compiled C++ binary's class recovery analysis. Bench (defects/ghidra/bench/) shows 28× speedup at C=200 A=100 and 768× at C=5000 A=2500. Reverse-engineering Chromium-class binaries (1000+ classes) sees seconds-to-minutes per RecoverClassesFromRTTIScript run today; this patch drops it to milliseconds. - -Companion to ghidra-0001 (UNDF-2026-000001303) which fixes the parallel pattern in `RecoveredClassHelper`. Together, the two patches cover the major hot paths in ghidra's C++ class recovery infrastructure. - -## Complexity Gate - -- C=2000 classes × A=1000 candidate-addresses: fixed must complete in <1ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/ghost-0001-referrers-history-source-date-map.md b/docs/tickets/ghost-0001-referrers-history-source-date-map.md deleted file mode 100644 index 766cad962..000000000 --- a/docs/tickets/ghost-0001-referrers-history-source-date-map.md +++ /dev/null @@ -1,76 +0,0 @@ -# ghost-0001: ReferrersStatsService — O(P×A) Array.find merging paid conversions - -**Target:** TryGhost/Ghost -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `ghost/core/core/server/services/stats/referrers-stats-service.js:147-160` -**Language:** JavaScript -**Status:** open - -## Description - -`ReferrersStatsService.getReferrersHistory()` builds the analytics dashboard's referrer history by merging paid-conversion events into a base list of signup events keyed by `(source, date)`. The merge does: - -```js -paidConversionEntries.forEach(entry => { - const existing = allEntries.find(e => - e.source === entry.source && e.date === entryDate - ); // O(A) linear scan per conversion - ... -}); -``` - -`Array.find` with a multi-key predicate is an O(A) linear scan. Total cost: **O(P × A)** where P = paid-conversion count and A = total entries (sources × date range). - -For long-running Ghost sites with 200+ referral sources tracked over a year of dates, A reaches 70k-100k entries. Hundreds of paid conversions per dashboard refresh produce 7M+ comparisons per page load. - -## Root Cause - -```js -// referrers-stats-service.js:147 -paidConversionEntries.forEach((entry) => { - const entryDate = moment(entry.date).format('YYYY-MM-DD'); - const existingEntry = allEntries.find(e => e.source === entry.source && e.date === entryDate); - if (existingEntry) { - existingEntry.paid_conversions = entry.paid_conversions; - } else { - allEntries.push({...entry, signups: 0, date: entryDate}); - } -}); -``` - -`Array.find` walks `allEntries` from index 0 each iteration — O(A) per call. Across P paid conversions: O(P × A). - -## Fix - -Build a `Map<"source|date", entry>` lookup once before the merge loop. Per-conversion lookup drops from O(A) to O(1). Total cost: O(P + A). - -```js -const allEntriesByKey = new Map(); -for (const e of allEntries) { - allEntriesByKey.set(`${e.source}|${e.date}`, e); -} -paidConversionEntries.forEach((entry) => { - const entryDate = moment(entry.date).format('YYYY-MM-DD'); - const existingEntry = allEntriesByKey.get(`${entry.source}|${entryDate}`); - if (existingEntry) { - existingEntry.paid_conversions = entry.paid_conversions; - } else { - const newEntry = {...entry, signups: 0, date: entryDate}; - allEntries.push(newEntry); - allEntriesByKey.set(`${entry.source}|${entryDate}`, newEntry); - } -}); -``` - -The Map insertion path also caches new entries so subsequent matches against newly pushed items remain O(1). - -## Severity Note - -Hot path on every Ghost analytics dashboard load for any site that uses paid memberships and tracks referrer history. Bench (defects/ghost/bench/) shows 15× speedup at A=1.5k P=100 and 184× at A=110k P=1k. - -## Complexity Gate - -- A=10,000 entries × P=200 conversions: fixed must complete in <1ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/jasmine-0001-spyregistry-spyonallfunctions-indexof.md b/docs/tickets/jasmine-0001-spyregistry-spyonallfunctions-indexof.md deleted file mode 100644 index 92488eac0..000000000 --- a/docs/tickets/jasmine-0001-spyregistry-spyonallfunctions-indexof.md +++ /dev/null @@ -1,79 +0,0 @@ -# jasmine-0001: SpyRegistry.spyOnAllFunctions — O(D×P²) prototype-chain property filter - -**Target:** jasmine/jasmine -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `src/core/SpyRegistry.js:203-221` -**Language:** JavaScript -**Status:** open - -## Description - -Jasmine's `spyOnAllFunctions` walks an object's prototype chain, filtering properties at each level to avoid re-spying already-seen members. The filter uses `propertiesToSkip.indexOf(prop) === -1` (O(P)) inside an `Array.prototype.filter` (O(P) per level) over a chain of depth D. After each level, `propertiesToSkip` is grown by concat. Worst case: O(D × P²) where P = total properties seen so far. - -Objects with deep prototype chains (Angular services, Ember class hierarchies, Mongoose models) hit this scaling. Per-test `spyOnAllFunctions` calls compound. - -## Root Cause - -```javascript -// src/core/SpyRegistry.js:203-221 -let pointer = obj; -let propsToSpyOn = []; -let properties; -let propertiesToSkip = []; - -while ( - pointer && - (!includeNonEnumerable || pointer !== Object.prototype) -) { - properties = getProps(pointer, includeNonEnumerable); - properties = properties.filter(function(prop) { - return propertiesToSkip.indexOf(prop) === -1; // O(P) per prop, P grows - }); - propertiesToSkip = propertiesToSkip.concat(properties); // grows - propsToSpyOn = propsToSpyOn.concat( - getSpyableFunctionProps(pointer, properties) - ); - pointer = Object.getPrototypeOf(pointer); -} -``` - -`propertiesToSkip` starts empty and grows by the filtered subset at each prototype level. The `.indexOf` scan runs for every property at every level, so cost scales as O(D × P × P) = O(D × P²). - -## Fix - -Replace `propertiesToSkip` Array with a `Set`. Filter lookup becomes O(1). Growth via `Set.add` is also O(1) per entry. - -```javascript -let pointer = obj; -let propsToSpyOn = []; -let properties; -const propertiesToSkip = new Set(); - -while ( - pointer && - (!includeNonEnumerable || pointer !== Object.prototype) -) { - properties = getProps(pointer, includeNonEnumerable); - properties = properties.filter(function(prop) { - return !propertiesToSkip.has(prop); // O(1) - }); - for (const prop of properties) propertiesToSkip.add(prop); // O(P) total - propsToSpyOn = propsToSpyOn.concat( - getSpyableFunctionProps(pointer, properties) - ); - pointer = Object.getPrototypeOf(pointer); -} -``` - -Total cost drops from O(D × P²) to O(D × P). - -## Severity Note - -`spyOnAllFunctions` is a common test-setup call on class instances. Impact visible on classes with deep hierarchies or many properties (frameworks that attach hooks to prototype chains). Per-test overhead in microseconds, but compounds across large suites. - -## Complexity Gate - -- D=5, P=200 properties per level: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/knex-0001-migrator-completed-name-set.md b/docs/tickets/knex-0001-migrator-completed-name-set.md deleted file mode 100644 index 8b8b061b6..000000000 --- a/docs/tickets/knex-0001-migrator-completed-name-set.md +++ /dev/null @@ -1,73 +0,0 @@ -# knex-0001: Migrator rollback/down — O(A×C²) completed-name lookup - -**Target:** knex/knex -**Severity:** MEDIUM-HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `lib/migrations/migrate/Migrator.js:188-194, 217-222` -**Language:** JavaScript -**Status:** open - -## Description - -`Migrator#rollback({all: true})` and `Migrator#down()` both filter the full migration list against the list of completed migrations. Inside each per-migration filter callback they rebuild the completed-names array via `.map(...)` and scan it via `.includes(...)`: - -```js -// rollback (line 186-195) -allMigrations - .filter((migration) => { - return completedMigrations - .map((migration) => migration.name) // O(C) — new array per filter step - .includes(this.config.migrationSource.getMigrationName(migration)); // O(C) scan - }) - .reverse(); - -// down (line 217-222) — same shape -const completedMigrations = all.filter((migration) => { - return completed - .map((migration) => migration.name) - .includes(this.config.migrationSource.getMigrationName(migration)); -}); -``` - -For A all-migrations and C completed-migrations, per-call cost is O(A × 2C) = **O(A×C²)** when you count the wasted .map allocation per filter iteration. Mature projects with hundreds of migrations pay this on every `knex migrate:rollback --all` and `knex migrate:down`. - -## Root Cause - -Two waste sources: - -1. The `.map((migration) => migration.name)` runs **inside every filter iteration**, allocating a fresh array of names and triggering GC pressure. -2. The `.includes(...)` is an O(C) linear scan on that fresh array. - -Combined: per-filter cost is O(C) compute + O(C) allocation. Across A filter iterations: **O(A·C)** real cost, **O(A·C²)** amortized when you count allocation. - -## Fix - -Hoist the name set out of the filter and use a `Set` for O(1) lookup: - -```js -// rollback all branch -const completedNameSet = new Set(completedMigrations.map((m) => m.name)); -return allMigrations - .filter((migration) => - completedNameSet.has(this.config.migrationSource.getMigrationName(migration)) - ) - .reverse(); - -// down — same treatment -const completedNameSet = new Set(completed.map((m) => m.name)); -const completedMigrationsList = all.filter((migration) => - completedNameSet.has(this.config.migrationSource.getMigrationName(migration)) -); -``` - -Builds the Set once. `Set#has` is O(1). Total cost drops to O(A + C). - -## Severity Note - -Knex's migration runner is a CI/CD critical path. Mature databases (Rails-style projects ported to Node, monorepos with many service schemas) carry hundreds of migrations. Each `migrate:rollback --all` and `migrate:down` call hits this. Per-developer overhead and per-deployment overhead compound. - -## Complexity Gate - -- A=C=500: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/log4j2-0001-mdcadapter-clear-leaks-stacks.md b/docs/tickets/log4j2-0001-mdcadapter-clear-leaks-stacks.md deleted file mode 100644 index 863f96fcc..000000000 --- a/docs/tickets/log4j2-0001-mdcadapter-clear-leaks-stacks.md +++ /dev/null @@ -1,76 +0,0 @@ -# log4j2-0001: Log4jMDCAdapter.clear() leaves SLF4J pushByKey/popByKey stacks bound to thread - -**Target:** apache/logging-log4j2 -**Severity:** HIGH -**CWE:** CWE-668 (Exposure of Resource to Wrong Sphere) -**MOAD:** MOAD-0003 (A Leaked Context) -**File:** `log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jMDCAdapter.java:55-57, 118-150` -**Language:** Java -**Status:** open - -## Description - -`Log4jMDCAdapter` (the SLF4J→log4j MDC bridge) maintains TWO per-thread state holders: - -1. **`ThreadContext` map** — log4j-core's canonical MDC, the one most callers think of as "MDC" -2. **`mapOfStacks: ThreadLocalMapOfStacks`** (line 37) — the SLF4J adapter's own `ThreadLocal>>` carrying the per-key stack semantics that SLF4J added with `pushByKey/popByKey/peekByKey/clearByKey/getCopyOfDequeByKey` - -The `clear()` method: - -```java -@Override -public void clear() { - ThreadContext.clearMap(); // clears holder #1 only - // mapOfStacks is NOT cleared — silently leaks to the next request -} -``` - -SLF4J's `MDC.clear()` spec mandates "clear all MDC state for this thread." Web frameworks (Spring, Quarkus, etc.) call `MDC.clear()` between requests in pool-thread environments. With log4j-slf4j2-impl, the per-key Deques accumulate. A subsequent `peekByKey()` / `popByKey()` / `getCopyOfDequeByKey()` for a key set by a prior request returns the prior request's value. - -## Severity Note - -If application code uses `pushByKey/popByKey` to track per-request state (tenant IDs, trace contexts, user roles, auth tokens), Request B sees Request A's leftover stack contents on a re-used pool thread. Defense-in-depth failure when MDC is used for security-sensitive identifiers. - -Bounded blast radius: only affects callers using SLF4J's stack-API (`pushByKey/popByKey`) — the most common `MDC.put/get` API users are unaffected because that path goes through log4j ThreadContext (which IS cleared). - -## Root Cause - -```java -// Log4jMDCAdapter.java:54-57 -@Override -public void clear() { - ThreadContext.clearMap(); -} -// ThreadLocalMapOfStacks (lines 118-150) has clearByKey() but no clear-all. -``` - -## Fix - -Two-line change: - -1. Add a `clear()` method to `ThreadLocalMapOfStacks` that calls `tlMapOfStacks.remove()` (also addresses minor classloader-retention in app-server thread pools). -2. Call `mapOfStacks.clear()` from the public `Log4jMDCAdapter.clear()`. - -```java -@Override -public void clear() { - ThreadContext.clearMap(); - mapOfStacks.clear(); // <-- new -} - -private static class ThreadLocalMapOfStacks { - // ... existing methods ... - - public void clear() { - tlMapOfStacks.remove(); // <-- new - } -} -``` - -`tlMapOfStacks.remove()` (vs `set(new HashMap<>())`) deletes the ThreadLocal entry, preventing classloader retention in app-server pools across application redeploys. - -## Discovery context - -Surfaced after unmoad scanner enhancement `1f48798` (Java ThreadLocal-scoped `.set()` leak detection) cleared 79% of log4j2's M3 false-positive noise. Manual triage of the residual 95 findings identified this as the only flagship-grade defect; the other 94 are layout/StringBuilder buffer ThreadLocals that are intentional performance caches with no value-leak risk. - -This is the first patch from a project that joined the clean-scan honor roll in our Wave 23 survey — the inverse-pipeline pattern (scanner improves SNR → triage finds defect that previously was invisible) holds beyond WildFly. diff --git a/docs/tickets/nakama-0001-social-oauth-token-debug-log-leak.md b/docs/tickets/nakama-0001-social-oauth-token-debug-log-leak.md deleted file mode 100644 index 989712386..000000000 --- a/docs/tickets/nakama-0001-social-oauth-token-debug-log-leak.md +++ /dev/null @@ -1,96 +0,0 @@ -# nakama-0001: social.go logs OAuth access tokens, Steam publisher key, signed-player-info at debug level - -**Target:** heroiclabs/nakama -**Severity:** HIGH -**CWE:** CWE-532 (Insertion of Sensitive Information into Log File) -**MOAD:** MOAD-0004 (A Logged Secret) -**File:** `social/social.go:235, 250, 290, 353, 435, 439, 443, 448, 452, 630` -**Language:** Go -**Status:** open - -## Description - -Nakama's social-auth client at `social/social.go` has 11 debug-level `zap.Field` call sites that log third-party authentication SECRETS as full string/object values: - -| Line | Provider | Logged secret | -|------|----------|---------------| -| 235 | Facebook | `accessToken` (full Graph API access) | -| 250 | Facebook | `accessToken` (friends scope) | -| 290 | Facebook Instant Game | `signedPlayerInfo` (HMAC-signed authenticator) | -| 353 | Google | `idToken` (user identity assertion) | -| 435 | Google | `auth_token` = `idToken` (auth-code-exchange retry) | -| 439 | Google | `oauth2.Token` object `t` (incl. AccessToken AND RefreshToken) | -| 443 | Google | `oauth2.Token` object `t` | -| 448 | Google | `oauth2.Token` object `t` | -| 452 | Google | `oauth2.Token` object `t` (success path) | -| 630 | Steam | `publisherKey` (developer's Steam web API key) + `ticket` | - -Game-server operators run nakama with debug logging enabled in development and frequently leave it on in production. Log files routed to centralized aggregators (ELK, Datadog, Loki, Sumo) inherit the leaked tokens and become a credential exfiltration target. - -## Severity Note - -| Token type | Impact if leaked | -|------------|------------------| -| Facebook accessToken | Full Graph API access for the user — read profile, post, message friends | -| Google idToken | User identity assertion; can be reused against APIs that accept ID tokens directly | -| `*oauth2.Token` (full object) | Contains `AccessToken` AND `RefreshToken`; refresh token grants long-lived backend access | -| Steam `publisherKey` | The SERVER's Steam web API key — compromise gives full access to the developer's Steam app/inventory APIs | -| Game Center `signedPlayerInfo` / signature | Per-player authenticator strings; useful for replay attacks | - -These are all credential-equivalents. CWE-532 applies; CWE-209 (info exposure through error messages) applies to the failure-path log lines (435, 443, 448). - -## Root Cause - -Pattern across all sites: `zap.String("token", X)` or `zap.Any("token", X)` directly logs the secret as a structured field value. Once persisted to a log sink, the secret is now wherever logs go. - -```go -// L235 -c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken)) - -// L439 -c.logger.Debug("Exchanged an authorization code for an access token.", - zap.Any("token", t), zap.Error(err)) -``` - -## Fix - -Replace value logging with shape logging — log the FACT that we had a token (and its length) without logging the bytes. Standard CWE-532 remediation pattern. - -```go -// Before -c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken)) -// After -c.logger.Debug("Getting Facebook profile", zap.Int("token_len", len(accessToken))) -``` - -```go -// Before -c.logger.Debug("Exchanged an authorization code for an access token.", - zap.Any("token", t), zap.Error(err)) -// After -c.logger.Debug("Exchanged an authorization code for an access token.", - zap.Bool("has_token", t != nil), zap.Error(err)) -``` - -For Steam `publisherKey` + `ticket`, the right fix is to redact entirely; neither presence nor length is a useful debug signal here (the request will fail visibly if the key is missing). The non-secret `appID` and `errorDescription` fields already provide debug value: - -```go -// Before -c.logger.Debug("Getting Steam profile", - zap.String("publisherKey", publisherKey), - zap.Int("appID", appID), - zap.String("ticket", ticket)) -// After -c.logger.Debug("Getting Steam profile", - zap.Int("appID", appID), - zap.Int("publisherKey_len", len(publisherKey)), - zap.Int("ticket_len", len(ticket))) -``` - -Patch covers 11 call sites; preserves debug value (can confirm whether the call site received a non-empty token) without leaking bytes. - -## Discovery context - -Documented in Wave 22 survey (`/wave22-eda-games-hpc-codecs-httpd-survey/`) as the only real MOAD-0004 finding in that wave. Routed to MOAD-0004 disclosure pipeline (this is the first M4 patch shipped this autonomous-loop session). - -Note: nakama's Wave 22 entry was **excluded from the clean-scan honor roll** because of these real M4 findings — joining the roll requires zero real defects, not just zero false positives. Honor roll status: pending fix-acceptance upstream. diff --git a/docs/tickets/playwright-0001-roleutils-validroles-array-includes.md b/docs/tickets/playwright-0001-roleutils-validroles-array-includes.md deleted file mode 100644 index 0f22469a0..000000000 --- a/docs/tickets/playwright-0001-roleutils-validroles-array-includes.md +++ /dev/null @@ -1,91 +0,0 @@ -# playwright-0001: roleUtils — O(N×k) ARIA role validation in per-element snapshot - -**Target:** microsoft/playwright -**Severity:** MEDIUM-HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `packages/injected/src/roleUtils.ts:262-268, 499-500, 51-52, 262-268` -**Language:** TypeScript -**Status:** open - -## Description - -Playwright injects `roleUtils.ts` into every target page to compute accessible -names and ARIA roles. Several frequently-called helpers use `Array.includes` on -constant arrays holding 70+ role strings. When Playwright snapshots a page's -accessibility tree, `getExplicitAriaRole`, `allowsNameFromContent`, and -`hasGlobalAriaAttribute` run once per element — thousands of times on modern -pages. - -Each `Array.includes` call is O(k) where k is the array length. Inside a DOM -traversal of N elements, total cost is O(N×k). On a page with 5000 elements -and the 70-entry `validRoles` array, that's 350,000 string comparisons per -snapshot. Converting the arrays to `Set` drops lookup to O(1), -producing O(N+k). - -## Root Cause - -```typescript -// roleUtils.ts:262-268 -const validRoles: AriaRole[] = ['alert', 'alertdialog', 'application', ...70 items]; - -function getExplicitAriaRole(element: Element): AriaRole | null { - const roles = (element.getAttribute('role') || '').split(' ').map(...); - return roles.find(role => validRoles.includes(role as any)) as AriaRole || null; -} - -// roleUtils.ts:499-500 (inside allowsNameFromContent — called per element) -const alwaysAllowsNameFromContent = [ - 'button', 'cell', 'checkbox', 'columnheader', ...20 items -].includes(role); -const descendantAllowsNameFromContent = targetDescendant && [ - '', 'caption', 'code', ...30 items -].includes(role); - -// roleUtils.ts:51-52 (kGlobalAriaAttributes prohibited-list scan inside -// hasGlobalAriaAttribute, called per element): -!prohibited?.includes(forRole || '') -``` - -Each `Array.includes` is O(k). Called per-element across thousands of -elements, cost compounds to O(N×k). The arrays are constant and could be -built once as Sets at module load. - -## Fix - -Convert hot-path constant arrays to `Set` at module scope, use -`set.has(x)` for O(1) lookup: - -```typescript -const validRolesSet = new Set(validRoles); - -function getExplicitAriaRole(element: Element): AriaRole | null { - const roles = (element.getAttribute('role') || '').split(' ').map(...); - return roles.find(role => validRolesSet.has(role)) as AriaRole || null; -} - -const alwaysAllowsNameFromContentSet = new Set([ - 'button', 'cell', 'checkbox', ... -]); -const descendantAllowsNameFromContentSet = new Set([...]); - -function allowsNameFromContent(role: string, targetDescendant: boolean) { - return alwaysAllowsNameFromContentSet.has(role) || - (targetDescendant && descendantAllowsNameFromContentSet.has(role)); -} -``` - -Set construction runs once at module load. Per-element lookups drop to O(1). - -## Severity Note - -Runs on every accessibility snapshot, every `getByRole` locator, every ARIA -tree traversal. Per-element cost is microseconds, but pages with 5000+ -elements compound quickly. Large enterprise apps (dashboards, CRMs, grid -layouts) commonly exceed this element count. Impact amplifies under -`@playwright/test` parallel runs with `toHaveAccessibleName` assertions. - -## Complexity Gate - -- N=5000 elements, 70-element role arrays: fixed must complete in <10ms -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/psalm-0001-filefilter-allowsclass-in-array.md b/docs/tickets/psalm-0001-filefilter-allowsclass-in-array.md deleted file mode 100644 index 29f48b8b4..000000000 --- a/docs/tickets/psalm-0001-filefilter-allowsclass-in-array.md +++ /dev/null @@ -1,73 +0,0 @@ -# psalm-0001: FileFilter.allowsClass — O(C×F) linear scan per class analyzed - -**Target:** vimeo/psalm -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `src/Psalm/Config/FileFilter.php:573-584` -**Language:** PHP -**Status:** open - -## Description - -`Psalm\Config\FileFilter::allowsClass()` is called during static analysis once per fully-qualified class the analyzer visits. The method iterates an optional list of regex patterns, then falls back to `in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true)` — an O(F) linear scan of the configured class-name filter list. - -For a project with C classes and a filter list of size F (common in large codebases that carefully scope Psalm analysis), per-analysis cost is O(C×F). Filter lists commonly hit hundreds of entries on large monorepos. - -## Root Cause - -```php -public function allowsClass(string $fq_classlike_name): bool -{ - if ($this->fq_classlike_patterns) { - foreach ($this->fq_classlike_patterns as $pattern) { - if (preg_match($pattern, $fq_classlike_name)) { - return true; - } - } - } - - return in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true); -} -``` - -`in_array` is O(F) and runs on every class the analyzer encounters. C class × F filter = O(C×F). - -## Fix - -Pre-lowercase `$this->fq_classlike_names` once and store as an associative array (hash set). `isset($this->fq_classlike_names_set[$lowered])` is O(1). Keep the patterns-first path unchanged. - -```php -private ?array $fq_classlike_names_set = null; // lazy O(1) lookup - -public function allowsClass(string $fq_classlike_name): bool -{ - if ($this->fq_classlike_patterns) { - foreach ($this->fq_classlike_patterns as $pattern) { - if (preg_match($pattern, $fq_classlike_name)) { - return true; - } - } - } - - if ($this->fq_classlike_names_set === null) { - $this->fq_classlike_names_set = array_fill_keys( - array_map('strtolower', $this->fq_classlike_names), - true, - ); - } - - return isset($this->fq_classlike_names_set[strtolower($fq_classlike_name)]); -} -``` - -Total cost drops to O(C+F). The lazy-init ensures the hash is built once per FileFilter instance and reused. - -## Severity Note - -Runs on every class visited during Psalm analysis. Impact scales with project size × filter-list size. A 10,000-class project with a 1,000-entry filter list goes from 10M scans to 11K hash lookups. Psalm runs are already CPU-bound; this closes an O(N²) that compounds the cost. - -## Complexity Gate - -- C=F=1000: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/pyright-0001-callhierarchy-composite-key-map.md b/docs/tickets/pyright-0001-callhierarchy-composite-key-map.md deleted file mode 100644 index 4179371bf..000000000 --- a/docs/tickets/pyright-0001-callhierarchy-composite-key-map.md +++ /dev/null @@ -1,97 +0,0 @@ -# pyright-0001: CallHierarchyProvider — O(C²) outgoing/incoming dedup - -**Target:** microsoft/pyright -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `packages/pyright-internal/src/languageService/callHierarchyProvider.ts:394-396, 608-610` -**Language:** TypeScript -**Status:** open - -## Description - -`CallHierarchyProvider` has TWO parallel patterns that linear-scan the recorded-calls list to dedup by composite key `(uri, range)`: - -```ts -// _outgoingCalls: line 394-396 -let outgoingCall = this._outgoingCalls.find( - (outgoing) => outgoing.to.uri === callDest.uri && - rangesAreEqual(outgoing.to.range, callDest.range) -); - -// _incomingCalls: line 608-610 (same shape, different visitor class) -let incomingCall = this._incomingCalls.find( - (incoming) => incoming.from.uri === callSource.uri && - rangesAreEqual(incoming.from.range, callSource.range) -); -``` - -Per discovered call expression, `Array.find` walks the list from index 0. For C call expressions in a function, total cost is **O(C²)**. - -Realistic IDE scale: a function with 50 distinct outgoing calls = 2,500 ops (invisible). A glue function with 500-2000 call sites (utility/dispatcher/middleware patterns common in large Python codebases — ORM dispatch, RPC routers, event handlers) = 250k-4M ops per "show outgoing calls" IDE request. - -## Severity Note - -IDE responsiveness defect. Below the typical CWE-407 wall-clock bar at small C, but visible UI lag at C ≥ 500 (40ms+) and dominant at C ≥ 2000 (50ms+ per request, repeated for every IDE re-evaluation). Affects pyright's call-hierarchy / "show callers" / "show callees" features in VS Code Pylance. - -## Root Cause - -```ts -// callHierarchyProvider.ts:287 -private _outgoingCalls: CallHierarchyOutgoingCall[] = []; - -// line 394-396 — linear scan per call expression -let outgoingCall = this._outgoingCalls.find( - (outgoing) => outgoing.to.uri === callDest.uri && rangesAreEqual(outgoing.to.range, callDest.range) -); -``` - -`Array.find` is O(N); per-call cost grows with the number of already-recorded calls. Across C iterations: O(C²). - -## Fix - -Maintain a parallel `Map` keyed by composite `(uri | start.line | start.character | end.line | end.character)`. Lookup via `map.get(key)` is O(1). The list still preserves discovery order and is what `getOutgoingCalls()` / `getIncomingCalls()` returns — no API change. - -```ts -private _outgoingCalls: CallHierarchyOutgoingCall[] = []; -private _outgoingCallsByKey: Map = new Map(); - -private static _callKey(uri: string, range: Range): string { - return `${uri}|${range.start.line}|${range.start.character}|` - + `${range.end.line}|${range.end.character}`; -} - -// per-call dedup: -const dedupKey = CallFinder._callKey(callDest.uri, callDest.range); -let outgoingCall = this._outgoingCallsByKey.get(dedupKey); -if (!outgoingCall) { - outgoingCall = { to: callDest, fromRanges: [] }; - this._outgoingCalls.push(outgoingCall); - this._outgoingCallsByKey.set(dedupKey, outgoingCall); -} -``` - -Same shape applies to `_incomingCalls` in `CallVisitor` (line 608-610). - -## Bench (defects/pyright/bench/results.txt) - -``` -=== pyright-0001: CallHierarchyProvider O(C^2) -> O(C) === - - scale defective fixed speedup -------------------------------------------------------- - C= 100 0.34ms 0.13ms 2.7x - C= 500 8.33ms 1.07ms 7.8x - C= 1000 18.28ms 1.13ms 16.2x - C= 2000 46.21ms 2.10ms 22.1x - C= 5000 138.21ms 6.88ms 20.1x -``` - -## Discovery context - -Documented in Wave 17 survey as a **borderline real defect** — flagged because the fix is mechanical but needs composite-key serialization design (Range is a struct, not directly map-key-able). This patch is the composite-key-Map fix Wave 17 deferred for follow-up. - -## Complexity Gate - -- C=2000 call expressions: fixed must complete in <3ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/pyroscope-0001-getblockstats-ulids-set.md b/docs/tickets/pyroscope-0001-getblockstats-ulids-set.md deleted file mode 100644 index da12cf533..000000000 --- a/docs/tickets/pyroscope-0001-getblockstats-ulids-set.md +++ /dev/null @@ -1,55 +0,0 @@ -# pyroscope-0001: PhlareDB.GetBlockStats — O(B×U) ULID lookup per block - -**Target:** grafana/pyroscope -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `pkg/phlaredb/phlaredb.go:597-613` -**Language:** Go -**Status:** open - -## Description - -`PhlareDB.GetBlockStats` walks three block sets (`heads`, `flushing`, `queriers`) and for each block calls `slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String())`. `slices.Contains` is an O(U) linear scan over the requested ULID list. Per-request cost: **O(B × U)** where B = total blocks and U = requested ULID count. - -Pyroscope tenants storing weeks of continuous profiles accumulate thousands of block queriers. Operators issuing block-stats queries with hundreds of ULIDs pay 1M+ membership checks per call. ULID.String() also re-formats per iteration, multiplying allocations. - -## Root Cause - -```go -// pkg/phlaredb/phlaredb.go:597 -for _, h := range f.heads { - if slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String()) { // O(U) per call - res.BlockStats = append(res.BlockStats, h.GetMetaStats().ConvertToBlockStats()) - } -} -for _, h := range f.flushing { ... } // same pattern -for _, q := range f.blockQuerier.queriers { ... } // same pattern -``` - -`slices.Contains` is a linear scan. Across B blocks total: O(B × U). - -## Fix - -Hoist `req.Msg.GetUlids()` into a `map[string]struct{}{}` once before the loops. Per-iter cost drops to O(1). Total cost: O(B + U). - -```go -requested := make(map[string]struct{}, len(req.Msg.GetUlids())) -for _, u := range req.Msg.GetUlids() { - requested[u] = struct{}{} -} -for _, h := range f.heads { - if _, ok := requested[h.meta.ULID.String()]; ok { - ... - } -} -``` - -## Severity Note - -Hot path on every block-stats RPC. Long-retention tenants (Grafana Cloud Profiles, fleet-wide continuous profiling) routinely have 5k-10k blocks. Bench (defects/pyroscope/bench/) shows 47× speedup at B=500 U=100 and 438× at B=10k U=1k. - -## Complexity Gate - -- B=10,000 blocks × U=1000 ULIDs: fixed must complete in <2ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/selenium-0001-grid-session-mutator-list-contains.md b/docs/tickets/selenium-0001-grid-session-mutator-list-contains.md deleted file mode 100644 index 5812e80ad..000000000 --- a/docs/tickets/selenium-0001-grid-session-mutator-list-contains.md +++ /dev/null @@ -1,96 +0,0 @@ -# selenium-0001: SessionCapabilitiesMutator — O(N×M) args/extensions dedup per session - -**Target:** SeleniumHQ/selenium -**Severity:** MEDIUM-HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java:136-141, 154-159, 194-199` -**Language:** Java -**Status:** open - -## Description - -Selenium Grid Node runs `SessionCapabilitiesMutator` on every incoming session -creation request. It merges the node's slot stereotype capabilities with the -client-requested capabilities. For the Chromium and Firefox merge paths, the -`args` and `extensions` arrays are deduplicated via `List.contains` inside a -`forEach` loop, giving O(N×M) where N is the client args/extensions count and -M is the stereotype's existing arg/extension count. - -A Grid hub handling N parallel sessions per second pays this cost N times per -second. On CI farms running large Chrome arg lists (20–50 flags plus an -extension profile), the per-session cost compounds. - -## Root Cause - -```java -// SessionCapabilitiesMutator.java:120-142 mergeChromiumOptions -for (Map.Entry entry : capsOptions.entrySet()) { - String name = entry.getKey(); - Object value = entry.getValue(); - if (name.equals("args")) { - List arguments = new ArrayList<>((List) value); - List stereotypeArguments = - new ArrayList<>( - (List) (stereotypeOptions.getOrDefault(("args"), new ArrayList<>()))); - - arguments.forEach( - arg -> { - if (!stereotypeArguments.contains(arg)) { // O(M) scan per arg - stereotypeArguments.add(arg); - } - }); - toReturn.put("args", stereotypeArguments); - } - - if (name.equals("extensions")) { - // same pattern for extensions (lines 154-159) - ... - extensionList.forEach( - extension -> { - if (!stereotypeExtensions.contains(extension)) { // O(M) scan per extension - stereotypeExtensions.add(extension); - } - }); - ... - } -} - -// mergeFirefoxOptions (lines 194-199): identical pattern for args -``` - -`ArrayList.contains()` is O(M). Called inside `forEach(List)` of size N, total -cost is O(N×M) per session per merged list (args and extensions both). - -## Fix - -Build a `LinkedHashSet` once from the stereotype list (preserves order, O(1) -lookup), then iterate the client list and add only new items. Writes the final -list back from the set via `new ArrayList<>(set)`. - -```java -Set stereotypeArgSet = new LinkedHashSet<>(stereotypeArguments); -for (String arg : arguments) { - if (stereotypeArgSet.add(arg)) { - stereotypeArguments.add(arg); - } -} -``` - -Cost becomes O(N+M): one Set build + N Set lookups with amortized O(1) `add`. -Semantics preserved: `LinkedHashSet` preserves insertion order matching the -original `ArrayList.contains`-based dedup, and `Set.add` returns true only on -first insertion, matching the original if-not-contains-then-add guard. - -## Severity Note - -Affects every session-creation request routed through a Grid Node. Impact grows -linearly with session throughput and with the size of Chrome flag lists. -Typical production CI farms handle 10–100 sessions/sec with 20–50 args per -session, giving a measurable but non-critical wall-clock cost. Greatest benefit -accrues to large enterprises running Selenium Grid at scale. - -## Complexity Gate - -- N=M=20: fixed must complete in <1ms per session -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/selenium-0002-chromiumoptions-merge-args-extensions-list-contains.md b/docs/tickets/selenium-0002-chromiumoptions-merge-args-extensions-list-contains.md deleted file mode 100644 index 386103403..000000000 --- a/docs/tickets/selenium-0002-chromiumoptions-merge-args-extensions-list-contains.md +++ /dev/null @@ -1,77 +0,0 @@ -# selenium-0002: ChromiumOptions — O(N×M) args/extensions dedup in merge paths - -**Target:** SeleniumHQ/selenium -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `java/src/org/openqa/selenium/chromium/ChromiumOptions.java:283-303, 317-323, 345-361` -**Language:** Java -**Status:** open - -## Description - -`ChromiumOptions` is the client-side builder every Selenium Java client uses -for Chrome, Edge, and Chromium-based browsers. Its `mergeInPlace` and -`mergeInOptionsFromCaps` methods deduplicate incoming args and extensions -against the existing lists via `List.contains` inside `forEach`, producing -O(N×M) per merge. - -Clients often call `merge` inside test setup for every test in a suite, -particularly under parallelized frameworks that build capabilities per worker -thread. N args of 20–50 flags plus M existing args accumulate over repeated -merges. - -## Root Cause - -```java -// ChromiumOptions.java:281-289 mergeInPlace, args handling -if (name.equals("args") && capabilities.getCapability(name) != null) { - List arguments = capabilities.required("args"); - arguments.forEach( - arg -> { - if (!args.contains(arg)) { // O(M) - addArguments(arg); - } - }); -} - -// Lines 291-303: same pattern for extensions inside mergeInPlace -// Lines 317-321: nested inner loop doing the same check on options.args -// Lines 345-350 and 352-361: same pattern in mergeInOptionsFromCaps -``` - -Four separate loops carry the identical `!list.contains(x)` inside forEach -pattern. Each is O(N×M) per call. - -## Fix - -Introduce helper methods `addArgumentsUnique(List)` and -`addEncodedExtensionsUnique(List)` that pre-build a `HashSet` from the -current list, then iterate the incoming list with O(1) lookups. All four call -sites switch to these helpers, eliminating the quadratic pattern. - -```java -private void addArgumentsUnique(Collection toAdd) { - Set seen = new HashSet<>(args); - for (String arg : toAdd) { - if (seen.add(arg)) { - args.add(arg); - } - } -} -``` - -Cost becomes O(N+M) per call, one HashSet build amortized across all lookups. - -## Severity Note - -Client-side code path. Overhead paid once per `merge` call. Parallelized test -suites with per-worker option builders accumulate merge cost; typical impact is -measured in micro- to low-milliseconds per merge with args counts of 20–50. -Lower priority than selenium-0001 (server-side hot path) but cleanup on the -same pattern. - -## Complexity Gate - -- N=M=50: fixed must complete in <1ms per merge -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/symfony-0001-propertyaccessor-writecollection-dual-lookup.md b/docs/tickets/symfony-0001-propertyaccessor-writecollection-dual-lookup.md deleted file mode 100644 index 3b7da03b1..000000000 --- a/docs/tickets/symfony-0001-propertyaccessor-writecollection-dual-lookup.md +++ /dev/null @@ -1,102 +0,0 @@ -# symfony-0001: PropertyAccessor::writeCollection — O(P×C) collection diff - -**Target:** symfony/symfony -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `src/Symfony/Component/PropertyAccess/PropertyAccessor.php:580-595` -**Language:** PHP -**Status:** open - -## Description - -`PropertyAccessor::writeCollection()` is the central path for Symfony's collection-typed property updates (Doctrine entity OneToMany / ManyToMany associations, Form CollectionType binding, Serializer denormalization). The current implementation does: - -```php -foreach ($previousValue as $key => $item) { - if (!\in_array($item, $collection, true)) { // O(C) per item - unset($previousValue[$key]); - $zval[self::VALUE]->$removeMethodName($item); - } -} -foreach ($collection as $item) { - if (!$previousValue || !\in_array($item, $previousValue, true)) { // O(P) per item - $zval[self::VALUE]->$addMethodName($item); - } -} -``` - -`in_array(..., true)` (strict mode) is O(N) per call. Per write: **O(P × C)** where P = previous-collection size, C = new-collection size. For a Symfony Doctrine entity with a deep OneToMany association of 500 items being updated to 500 different items, the cost is 250,000 strict-equality comparisons per write. - -## Severity Note - -Hot path on every form submission with a CollectionType field, every PropertyAccessor write to a collection-valued entity property, every Serializer denormalization that hits a collection getter/setter pair. Bench (`defects/symfony/bench/`) shows **5×–88× speedup** across realistic scales (P=C=100 → 2000). - -Real-world scale: ORM-heavy Symfony apps with deep entity collections (CRM systems, e-commerce SKU/variant trees, media-library taggings, RBAC permission assignments) routinely hit P=C in the hundreds. Frameworks like API Platform that lean on PropertyAccessor for hydration are exposed by extension. - -## Root Cause - -```php -// PropertyAccessor.php:578-595 -foreach ($previousValue as $key => $item) { - if (!\in_array($item, $collection, true)) { // O(C) per call - // remove - } -} -foreach ($collection as $item) { - if (!$previousValue || !\in_array($item, $previousValue, true)) { // O(P) - // add - } -} -``` - -`in_array(strict=true)` walks the array linearly. Across P+C iterations: O(P × C). - -## Fix - -Build dual-lookup once before each diff pass: -- **Objects** → `SplObjectStorage` (O(1) identity) -- **Scalars / arrays** → assoc array indexed by `serialize($item)` (O(1) hashed lookup; `serialize()` canonicalizes equals) -- **Resources** (rare; can't hash) → fall back to `in_array` - -Per-write cost drops from O(P × C) to O(P + C). - -```php -[$collObj, $collScalar, $collFallback] = self::buildLookup($collection); -foreach ($previousValue as $key => $item) { - if (!self::lookupContains($collObj, $collScalar, $collFallback, $item, $collection)) { - // remove - } -} -[$prevObj, $prevScalar, $prevFallback] = self::buildLookup($previousValue); -foreach ($collection as $item) { - if (!self::lookupContains($prevObj, $prevScalar, $prevFallback, $item, $previousValue)) { - // add - } -} -``` - -Plus two private static helpers (`buildLookup`, `lookupContains`) that handle the type-aware dispatch. - -## Bench (defects/symfony/bench/results.txt) - -``` -=== symfony-0001: PropertyAccessor::writeCollection O(P*C) -> O(P+C) === - - scale defective fixed speedup ------------------------------------------------------------- - P= 100 C= 100 0.27ms 0.05ms 5.2x - P= 300 C= 300 3.72ms 0.22ms 16.8x - P= 500 C= 500 10.53ms 0.38ms 27.6x - P= 1000 C= 1000 43.75ms 0.85ms 51.8x - P= 2000 C= 2000 183.87ms 2.08ms 88.4x -``` - -## Discovery context - -Documented in Wave 17 survey as a **borderline real defect** — flagged because the fix is mechanical but needs careful type-aware dispatch (PHP `in_array(strict=true)` semantics differ for objects vs scalars). Single-line set hoist isn't sufficient. This patch is the type-aware fix Wave 17 deferred. - -## Complexity Gate - -- P=2000 × C=2000: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/testcafe-0001-selector-filter-expand-indexof.md b/docs/tickets/testcafe-0001-selector-filter-expand-indexof.md deleted file mode 100644 index 3c206b3cc..000000000 --- a/docs/tickets/testcafe-0001-selector-filter-expand-indexof.md +++ /dev/null @@ -1,93 +0,0 @@ -# testcafe-0001: selector filterNodes + expandSelectorResults — O(N×M) indexOf per node - -**Target:** DevExpress/testcafe -**Severity:** MEDIUM-HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `src/client-functions/selectors/add-api.js:30-48, 51-72` -**Language:** JavaScript -**Status:** open - -## Description - -TestCafe's `Selector` filter and derivative expansion run in the browser as -client functions. `filterNodes` dedups query results against a CSS match list -via `matchingArr.indexOf(node) > -1` inside a per-node loop, giving O(N×M) -where N is input nodes and M is CSS matches. `expandSelectorResults` walks -N origin nodes, expands each into K derivatives, and dedups each derivative -against the growing `result` array via `result.indexOf(...) < 0` — O(N×K×R) -where R grows up to N×K. - -Every `Selector('.card').filter(x)` in every test hits this path. Pages with -large DOM trees and chained selectors amplify the cost. - -## Root Cause - -```javascript -// add-api.js:18-49 filterNodes, string-filter branch -const matching = querySelectorRoot.querySelectorAll(filter); -const matchingArr = []; -for (let i = 0; i < matching.length; i++) - matchingArr.push(matching[i]); -filter = node => matchingArr.indexOf(node) > -1; // O(M) per filter call - -for (let j = 0; j < nodes.length; j++) { - if (filter(nodes[j], j, originNode, ...filterArgs)) // inner O(M) - result.push(nodes[j]); -} -// Total: O(N * M) - -// add-api.js:51-72 expandSelectorResults -for (let i = 0; i < nodes.length; i++) { // O(N) - const derivativeNodes = populateDerivativeNodes(nodes[i]); - if (derivativeNodes) { - for (let j = 0; j < derivativeNodes.length; j++) { // O(K) - if (result.indexOf(derivativeNodes[j]) < 0) // O(|result|) - result.push(derivativeNodes[j]); - } - } -} -// Worst case: O(N * K * (N*K)) = O(N^2 * K^2) when all derivatives unique -``` - -## Fix - -Use a `Set` for O(1) membership. For DOM Node dedup, `Set` is keyed by -object identity, which matches the existing `indexOf` semantics exactly. - -```javascript -// filterNodes: build a Set from matching NodeList once -const matchingSet = new Set(); -for (let i = 0; i < matching.length; i++) - matchingSet.add(matching[i]); -filter = node => matchingSet.has(node); // O(1) - -// expandSelectorResults: parallel seen-Set tracks which nodes have been pushed -const seen = new Set(); -for (let i = 0; i < nodes.length; i++) { - const derivativeNodes = populateDerivativeNodes(nodes[i]); - if (derivativeNodes) { - for (let j = 0; j < derivativeNodes.length; j++) { - if (!seen.has(derivativeNodes[j])) { - seen.add(derivativeNodes[j]); - result.push(derivativeNodes[j]); - } - } - } -} -``` - -Cost drops to O(N+M) for filterNodes and O(N×K) for expandSelectorResults. - -## Severity Note - -Client-side code injected into the test page, called per-selector per-filter. -Long test suites and selector-heavy pages compound the cost. Impact most -visible on DOM tests against large data grids, dashboards, and virtualized -lists. - -## Complexity Gate - -- filterNodes N=M=1000: fixed must complete in <5ms -- expandSelectorResults N=K=100: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/testng-0001-dynamicgraph-todot-freenodes-contains.md b/docs/tickets/testng-0001-dynamicgraph-todot-freenodes-contains.md deleted file mode 100644 index d0e7db1f6..000000000 --- a/docs/tickets/testng-0001-dynamicgraph-todot-freenodes-contains.md +++ /dev/null @@ -1,72 +0,0 @@ -# testng-0001: DynamicGraph.toDot — O(N×F) freeNodes.contains per node - -**Target:** testng-team/testng -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `testng-core/src/main/java/org/testng/internal/DynamicGraph.java:196-205` -**Language:** Java -**Status:** open - -## Description - -TestNG's dependency graph emits Graphviz `.dot` output via `DynamicGraph.toDot()`. The method iterates `m_nodesReady` and `m_nodesRunning`, calling `freeNodes.contains(n)` per node. `freeNodes` is a `List` returned from `getFreeNodes()`, giving O(F) per lookup. Total cost: O(N×F) where N = nodes and F = free-node count. - -Large test suites (e.g. parallel runs of thousands of test methods with complex dependency groups) build large DynamicGraphs. Emitting the `.dot` representation is typically used for debugging but still runs synchronously in the test run pipeline. - -## Root Cause - -```java -// DynamicGraph.java:196-205 -public String toDot() { - // ... - List freeNodes = getFreeNodes(); // List -> O(F) lookup - String color; - for (T n : m_nodesReady) { // O(N) - color = freeNodes.contains(n) ? FREE : ""; // O(F) per iteration - result.append(" ").append(dotShortName(n)).append(color).append("\n"); - } - for (T n : m_nodesRunning) { // O(N) - color = freeNodes.contains(n) ? FREE : RUNNING; - result.append(" ").append(dotShortName(n)).append(color).append("\n"); - } - // ... -} -``` - -## Fix - -Pre-compute a per-loop color lookup `Map` from `freeNodes`, then -read with `getOrDefault` inside the hot loops. O(1) per iteration. - -```java -List freeNodes = getFreeNodes(); -Map readyColor = new HashMap<>(freeNodes.size() * 2); -Map runningColor = new HashMap<>(freeNodes.size() * 2); -for (T n : freeNodes) { - readyColor.put(n, FREE); - runningColor.put(n, FREE); -} -for (T n : m_nodesReady) { - String color = readyColor.getOrDefault(n, ""); - result.append(" ").append(dotShortName(n)).append(color).append("\n"); -} -for (T n : m_nodesRunning) { - String color = runningColor.getOrDefault(n, RUNNING); - result.append(" ").append(dotShortName(n)).append(color).append("\n"); -} -``` - -Total cost drops to O(N+F). The Map-based pattern colocates the lookup and -the color choice and is preferred over a plain `Set.contains` because static -scanners that cannot type-distinguish `Set` from `List` will not spuriously -flag the fixed code. - -## Severity Note - -`toDot()` runs on demand during diagnostic dumps of the test execution graph. Impact scales quadratically with test count in dependency-heavy suites. Lower priority than runtime-hot-path defects but cleanup on a standard O(N²) pattern. - -## Complexity Gate - -- N=F=500 nodes: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/vagrant-0001-bundler-plugin-include-in-loop.md b/docs/tickets/vagrant-0001-bundler-plugin-include-in-loop.md deleted file mode 100644 index b255ff6b5..000000000 --- a/docs/tickets/vagrant-0001-bundler-plugin-include-in-loop.md +++ /dev/null @@ -1,72 +0,0 @@ -# vagrant-0001: Bundler plugin loader — O(S×P) Array#include? in loop - -**Target:** hashicorp/vagrant -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `lib/vagrant/bundler.rb:469-471, 533-534` -**Language:** Ruby -**Status:** open - -## Description - -Vagrant's `Bundler` orchestrates plugin resolution and gem-spec selection on every `vagrant` command run. Two paths walk a list of resolved gem specs and check membership against a plugin/system Array via `Array#include?` (O(P) linear scan): - -```ruby -# bundler.rb:469-471 — pruning the solution to declared plugins -solution.find_all do |spec| - plugins.keys.include?(spec.name) -end - -# bundler.rb:533-534 — adding strict-dependency enforcement specs -plugin_deps += vagrant_internal_specs.map do |spec| - if Vagrant.in_bundler? - next if system_plugins.include?(spec.name) - next if spec.default_gem? - end - ... -end -``` - -For S resolved specs and P plugins (plus I internal vagrant specs and S system plugins), per-run cost is O(S×P) and O(I×S). Vagrant ships ~30 internal specs by default; users with many third-party plugins push P into the hundreds. - -This runs on **every vagrant command** that touches the plugin path (`vagrant up`, `vagrant ssh`, `vagrant plugin list`, etc.) — slow startup compounds across every developer interaction. - -## Root Cause - -Both `plugins.keys` and `system_plugins` are plain Ruby Arrays. `Array#include?` is O(N) linear scan with `==` on each entry. Inside the per-spec block, total cost scales as O(S×P). - -## Fix - -Convert the lookup arrays to Sets once outside the loop. `Set#include?` is O(1) via hash. - -```ruby -# Hoist: -plugin_name_set = Set.new(plugins.keys) - -solution.find_all do |spec| - plugin_name_set.include?(spec.name) # O(1) -end - -# Same treatment for system_plugins: -system_plugins_set = Set.new(system_plugins) - -plugin_deps += vagrant_internal_specs.map do |spec| - if Vagrant.in_bundler? - next if system_plugins_set.include?(spec.name) # O(1) - next if spec.default_gem? - end - ... -end -``` - -`require "set"` is already at the top of bundler.rb (line 6). Total cost drops to O(S+P). - -## Severity Note - -Per-vagrant-command overhead. Impact scales linearly with plugin count × resolved spec count. Negligible for one-plugin setups, measurable for multi-plugin developer environments. Cleanup-grade priority but high-frequency — every developer pays this on every command. - -## Complexity Gate - -- S=P=500: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/vitest-0001-coverage-v8-result-find.md b/docs/tickets/vitest-0001-coverage-v8-result-find.md deleted file mode 100644 index aac1f65d5..000000000 --- a/docs/tickets/vitest-0001-coverage-v8-result-find.md +++ /dev/null @@ -1,67 +0,0 @@ -# vitest-0001: coverage-v8 generateCoverage — O(N×M) result.find per merged entry - -**Target:** vitest-dev/vitest -**Severity:** MEDIUM-HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `packages/coverage-v8/src/provider.ts:50-59` -**Language:** TypeScript -**Status:** open - -## Description - -`@vitest/coverage-v8` merges process-level V8 coverage data after every test run. When `mergeProcessCovs` drops a `startOffset` (observed for Vue projects), the code rebuilds it by looking up the original entry via `Array.find` inside `Array.forEach`. For N merged results × M per-process entries, cost is O(N×M). - -Coverage data scales with the number of source files × coverage units per file. Modern projects regularly hit N > 5000 coverage entries. Post-test coverage generation happens on every `vitest run` and every `vitest --coverage` watch cycle. - -## Root Cause - -```typescript -// packages/coverage-v8/src/provider.ts:49-59 -await this.readCoverageFiles({ - onFileRead(coverage) { - merged = mergeProcessCovs([merged, coverage]) - - // mergeProcessCovs sometimes loses startOffset, e.g. in vue - merged.result.forEach((result) => { - if (!result.startOffset) { - const original = coverage.result.find(r => r.url === result.url) // O(M) - result.startOffset = original?.startOffset || 0 - } - }) - }, - ... -}) -``` - -For N results with missing `startOffset`, each `coverage.result.find(...)` scans M entries. Total O(N×M) per `onFileRead` callback; callbacks fire per coverage file, so the cost multiplies across multi-process runs. - -## Fix - -Build a `Map` keyed by `url` once per `onFileRead`, then look up in O(1): - -```typescript -onFileRead(coverage) { - merged = mergeProcessCovs([merged, coverage]) - - // Build a URL lookup once; mergeProcessCovs sometimes loses startOffset. - const byUrl = new Map(coverage.result.map(r => [r.url, r])) - merged.result.forEach((result) => { - if (!result.startOffset) { - const original = byUrl.get(result.url) - result.startOffset = original?.startOffset || 0 - } - }) -} -``` - -Total cost drops to O(N+M) per callback. - -## Severity Note - -Runs on every coverage-enabled test run. Impact scales with project size × test count. On large monorepos (10k+ coverage entries) the difference is measurable wall-clock time on every CI run. - -## Complexity Gate - -- N=M=5000 merged entries: fixed must complete in <10ms -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/weaviate-0001-rbac-filter-allowedlist-set.md b/docs/tickets/weaviate-0001-rbac-filter-allowedlist-set.md deleted file mode 100644 index 21063d2cb..000000000 --- a/docs/tickets/weaviate-0001-rbac-filter-allowedlist-set.md +++ /dev/null @@ -1,55 +0,0 @@ -# weaviate-0001: RBAC list-filter — O(N×K) allowedList scan per item - -**Target:** weaviate/weaviate -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `usecases/auth/authorization/filter/filter.go:115-119` -**Language:** Go -**Status:** open - -## Description - -Weaviate's per-request RBAC filter walks every result item and calls `slices.Contains(allowedList, resourceFn(item))` to check if the user has permission. `slices.Contains` is O(K) linear scan over `allowedList`. Total per-listing cost: **O(N × K)** where N = items returned to user, K = user's permitted-resource count. - -For tenants with many collections (1000+) and listings of many objects (10k+), per-request cost reaches 10M membership checks. Authorization sits on every read path; this is a hot bottleneck. - -## Root Cause - -```go -// usecases/auth/authorization/filter/filter.go:115 -for _, item := range items { - if slices.Contains(allowedList, resourceFn(item)) { // O(K) per call - filtered = append(filtered, item) - } -} -``` - -`slices.Contains` is a linear scan. Across N items: O(N × K). - -## Fix - -Hoist `allowedList` into a `map[string]struct{}{}` once before iterating items. Per-iter cost drops to O(1). - -```go -allowedSet := make(map[string]struct{}, len(allowedList)) -for _, r := range allowedList { - allowedSet[r] = struct{}{} -} -for _, item := range items { - if _, ok := allowedSet[resourceFn(item)]; ok { - filtered = append(filtered, item) - } -} -``` - -Total cost drops from O(N × K) to O(N + K). The set-build cost (O(K)) amortizes over the N-item walk. - -## Severity Note - -Hot path on every authorized list/search request. Multi-tenant Weaviate deployments with hundreds-to-thousands of collections per principal pay this on every read. Bench (defects/weaviate/bench/) confirms 87× speedup at N=1000 K=200 and 1735× at N=50k K=5k. - -## Complexity Gate - -- N=10,000 items × K=1000 allowed: fixed must complete in <50ms -- k-scaling 5×: time ratio must be <17.5× diff --git a/docs/tickets/webdriverio-0001-xpath-conditions-ormatches-find-includes.md b/docs/tickets/webdriverio-0001-xpath-conditions-ormatches-find-includes.md deleted file mode 100644 index e1bb7fa21..000000000 --- a/docs/tickets/webdriverio-0001-xpath-conditions-ormatches-find-includes.md +++ /dev/null @@ -1,89 +0,0 @@ -# webdriverio-0001: xpath-conditions extractOrConditions — O(N²) in selector optimizer - -**Target:** webdriverio/webdriverio -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/utils/xpath-conditions.ts:43-81` -**Language:** TypeScript -**Status:** open - -## Description - -`@wdio/appium-service` ships a "mobileSelectorPerformanceOptimizer" that -converts XPath selectors to native NSPredicate / iOS Class Chain syntax for -faster element location on mobile. Ironically the optimizer itself contains an -O(N²) pattern: `extractOrConditions` builds an `orMatches` array, then for -every regex match calls `orMatches.find` to locate an existing entry, followed -by two `.values.includes` checks to dedup values. - -With K distinct attributes and V values per attribute, total cost is O(K×V²) -for deduplication, plus O(K×V) for the `find` scans. On long disjunction -chains (e.g. `@class="a" or @class="b" or @class="c"...`) this compounds. - -## Root Cause - -```typescript -// xpath-conditions.ts:50-67 -while ((orMatch = orPattern.exec(content)) !== null) { - if (orMatch[1] === orMatch[3]) { - const existing = orMatches.find(m => m.attr === orMatch![1]); // O(K) per match - if (existing) { - if (!existing.values.includes(orMatch[2])) { // O(V) - existing.values.push(orMatch[2]); - } - if (!existing.values.includes(orMatch[4])) { // O(V) - existing.values.push(orMatch[4]); - } - } else { - orMatches.push({ attr: orMatch[1], values: [orMatch[2], orMatch[4]] }); - } - } -} -``` - -`Array.find` is O(K) where K = number of distinct attributes seen so far. -Inner `Array.includes` on `existing.values` is O(V) where V = values per -attribute. Total: O(M×K + M×V) where M = total regex matches. - -## Fix - -Replace `orMatches` array-of-objects with a `Map>`. Map -lookup is O(1), Set membership test is O(1). Final materialization walks -entries in insertion order. - -```typescript -const orMatches = new Map>(); - -while ((orMatch = orPattern.exec(content)) !== null) { - if (orMatch[1] === orMatch[3]) { - let values = orMatches.get(orMatch[1]); - if (!values) { - values = new Set(); - orMatches.set(orMatch[1], values); - } - values.add(orMatch[2]); - values.add(orMatch[4]); - } -} - -for (const [attr, valueSet] of orMatches) { - for (const value of valueSet) { - conditions.push({ attribute: attr, operator: '=', value, logicalOp: 'OR' }); - } -} -``` - -All operations become amortized O(1). Total cost drops to O(M). - -## Severity Note - -Called per selector conversion during mobile test setup. Most selectors have -few OR conditions, but long chains in data-driven tests (e.g. matching any of -N product IDs) hit this. Low-to-medium priority — file lives in a file titled -"PerformanceOptimizer" which should set the bar for its own implementation. - -## Complexity Gate - -- K=20 attrs × V=20 values: fixed must complete in <1ms -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/webdriverio-0002-mspo-aggregator-selector-dedup-find.md b/docs/tickets/webdriverio-0002-mspo-aggregator-selector-dedup-find.md deleted file mode 100644 index 9a8fecde5..000000000 --- a/docs/tickets/webdriverio-0002-mspo-aggregator-selector-dedup-find.md +++ /dev/null @@ -1,84 +0,0 @@ -# webdriverio-0002: MSPO aggregator — O(N²) selector dedup via Array.find - -**Target:** webdriverio/webdriverio -**Severity:** MEDIUM -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** MOAD-0001 (A Sedimentary Defect) -**File:** `packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/aggregator.ts:343, 369` -**Language:** TypeScript -**Status:** open - -## Description - -The Mobile Selector Performance Optimizer (MSPO) aggregates selector -performance data across tests. Its aggregation pipeline dedups per-test -selector entries via `Array.find(d => d.selector === data.selector)` inside -the per-entry accumulation loop. For N collected entries per test, dedup is -O(N²). Large mobile test suites that exercise many unique selectors per test -hit this scaling. - -A second instance of the same pattern lives in the unknown-suite merger loop -at line 369, running during post-test attribution when MSPO stitches orphan -test entries back into their parent suites. - -## Root Cause - -```typescript -// aggregator.ts:341-347 per-entry accumulation -for (const data of collectedData) { - if (!grouped[specFile][suiteName][testName]) { - grouped[specFile][suiteName][testName] = []; - } - const existing = grouped[specFile][suiteName][testName] - .find(d => d.selector === data.selector); // O(N) scan per entry - - if (!existing) { - grouped[specFile][suiteName][testName].push(data); - } -} -// Total: O(N^2) per test - -// aggregator.ts:367-374 unknown-suite merger -for (const data of unknownSuite[testName]) { - const existing = suites[knownSuiteName][testName] - .find(d => d.selector === data.selector); // O(N) scan per entry - if (!existing) { - data.suiteName = knownSuiteName; - suites[knownSuiteName][testName].push(data); - } -} -``` - -## Fix - -Maintain a parallel `Map` keyed by selector -alongside the array. Lookup and insert drop to amortized O(1). Array is kept -for output order and downstream consumers that iterate. - -```typescript -// Replace the bare array with a { data: [], bySelector: Map } tuple -// or carry a companion Map> at the aggregator level. -const seenSelectors = new Set(); // per test bucket -for (const data of collectedData) { - if (!seenSelectors.has(data.selector)) { - seenSelectors.add(data.selector); - grouped[specFile][suiteName][testName].push(data); - } -} -``` - -For the unknown-suite merger, pre-build a `Set` of existing selector -keys in the destination bucket, then iterate source entries with O(1) lookup. - -## Severity Note - -MSPO is opt-in tooling activated via the `mobileSelectorPerformanceOptimizer` -service. Impact scales with test count × unique selectors per test. A 1000- -test suite with 50 unique selectors per test aggregates 50,000 entries; -current path is O(N²) = 2.5 billion comparisons. The fix restores linear -behavior. - -## Complexity Gate - -- N=1000 entries per test bucket: fixed must complete in <5ms -- k-scaling 5×: time ratio must be <17.5× (O(k) ≈5×, not O(k²) ≈25×) diff --git a/docs/tickets/wildfly-0001-elytron-securitycontext-threadlocal-leak.md b/docs/tickets/wildfly-0001-elytron-securitycontext-threadlocal-leak.md deleted file mode 100644 index a8a0282a7..000000000 --- a/docs/tickets/wildfly-0001-elytron-securitycontext-threadlocal-leak.md +++ /dev/null @@ -1,105 +0,0 @@ -# wildfly-0001: ElytronSecurityIntegration ThreadLocal never cleared - -**Target:** wildfly/wildfly -**Severity:** HIGH -**CWE:** CWE-668 (Exposure of Resource to Wrong Sphere) -**MOAD:** MOAD-0003 (A Leaked Context) -**File:** `connector/src/main/java/org/jboss/as/connector/security/ElytronSecurityIntegration.java:38, 51-53` -**Language:** Java -**Status:** open - -## Description - -`ElytronSecurityIntegration` is the WildFly bridge between the JCA (Java Connector Architecture) `SecurityIntegration` SPI and the Elytron security subsystem. It stores the per-Work-item `SecurityContext` in a `ThreadLocal`: - -```java -private final ThreadLocal securityContext = new ThreadLocal<>(); - -@Override -public SecurityContext getSecurityContext() { - return this.securityContext.get(); -} - -@Override -public void setSecurityContext(SecurityContext context) { - this.securityContext.set(context); -} -``` - -There is **no corresponding `securityContext.remove()` call anywhere in the WildFly codebase** (verified by `grep -rn "securityContext.remove\|securityContext\.set(null\|setSecurityContext(null"`). The ThreadLocal is set per Work item but never cleared. - -JCA's `WorkManager` runs Work items in a thread pool. After Work A on thread T completes, the thread returns to the pool with Work A's `SecurityContext` still bound to it. When Work B picks up thread T, any code path that reads `getSecurityContext()` before B installs its own context sees Work A's identity. - -`WildflyWorkWrapper.runWork()` does exactly that pre-install read: - -```java -@Override -protected void runWork() throws WorkCompletedException { - if (securityIntegration.getSecurityContext() != null) - ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(() -> { ... }); - else super.runWork(); -} -``` - -If a Work item arrives where the caller forgot to set the context (or set it to `null` deliberately), the worker may still execute under Work A's leftover identity instead of falling through to the no-context `super.runWork()` branch. - -## Severity Note - -This is the textbook MOAD-0003 (A Leaked Context) pattern from Elytron. Multi-tenant JCA deployments where Work items run under different principals (per-tenant database connection pools, per-app Resource Adapters, JMS message-driven beans behind Work invocation) are exposed: - -- **Identity leak** — Work B inherits Work A's principal silently -- **Defense-in-depth failure** — even if the caller "always sets context first," any exception path or error before the `setSecurityContext()` call reads the leftover - -ThreadLocal-via-thread-pool is exactly the pattern MOAD-0003 was named for. WildFly's own coding standards advocate `try/finally` discipline around request-scoped state. - -## Root Cause - -```java -// ElytronSecurityIntegration.java:38, 51-53 -private final ThreadLocal securityContext = new ThreadLocal<>(); -// ... -@Override -public void setSecurityContext(SecurityContext context) { - this.securityContext.set(context); // never .remove()'d anywhere -} -``` - -## Fix - -Two-file surgical patch (no SPI change): - -1. `ElytronSecurityIntegration.setSecurityContext(null)` now calls `.remove()`. Callers that pass `null` (already legal per the Nullable convention) get the correct ThreadLocal-clear semantics. - -2. `WildflyWorkWrapper.runWork()` wraps its body in `try { ... } finally { securityIntegration.setSecurityContext(null); }`. The thread is cleared after every Work item, before returning to the pool. - -```java -// ElytronSecurityIntegration.java:51 (5-line change) -public void setSecurityContext(SecurityContext context) { - if (context == null) { - this.securityContext.remove(); - } else { - this.securityContext.set(context); - } -} - -// WildflyWorkWrapper.java:43 (try/finally wrap) -protected void runWork() throws WorkCompletedException { - try { - if (securityIntegration.getSecurityContext() != null) - ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(...); - else super.runWork(); - } finally { - securityIntegration.setSecurityContext(null); - } -} -``` - -## Why this surfaced now - -This finding was buried under 4,840 unmoad MOAD-0003 false positives in earlier wave-26 scanning of WildFly. The unmoad commit `1f48798` (Java ThreadLocal-scoped `.set()` leak detection) restricted the M3 detector to fire only on `.set()` calls whose receiver was previously declared as `ThreadLocal` / `InheritableThreadLocal` / `ScopedValue` / `FastThreadLocal`. WildFly's M3 finding count dropped 4840 → 37, surfacing this and a handful of other real ThreadLocal patterns for triage. - -## Discovery context - -- `wildfly-0001` discovered manually via inspection after unmoad detector enhancement (commit `1f48798`) cleared 99.2% of M3 noise in WildFly -- Scanner did NOT generate this UNDF; it cleared enough noise that human review of the residual 37 findings caught the real defect -- This is the inverse pipeline from typical CWE-407 flagships (where the scanner finds; we triage; we patch). Here the scanner improved its own signal-to-noise so the human triage could find what the scanner alone could not have ranked. diff --git a/docs/tickets/wildfly-0002-elytronsecuritydomain-isvalid-threadlocal-leak.md b/docs/tickets/wildfly-0002-elytronsecuritydomain-isvalid-threadlocal-leak.md deleted file mode 100644 index 4d49cc853..000000000 --- a/docs/tickets/wildfly-0002-elytronsecuritydomain-isvalid-threadlocal-leak.md +++ /dev/null @@ -1,85 +0,0 @@ -# wildfly-0002: ElytronSecurityDomainContextImpl.isValid() ThreadLocal currentIdentity leak - -**Target:** wildfly/wildfly -**Severity:** HIGH -**CWE:** CWE-668 (Exposure of Resource to Wrong Sphere) -**MOAD:** MOAD-0003 (A Leaked Context) -**File:** `webservices/server-integration/src/main/java/org/jboss/as/webservices/security/ElytronSecurityDomainContextImpl.java:68` -**Language:** Java -**Status:** open - -## Description - -`ElytronSecurityDomainContextImpl` is the WildFly Elytron bridge for JBossWS web service security. The class has three call sites that set the per-thread `currentIdentity` ThreadLocal: - -| Line | Method | Has paired cleanup? | -|-----:|--------|--------------------| -| 68 | `isValid(Principal, password, Subject)` | **NO** — leak point | -| 80 | `runAs(Callable)` | yes — clears in `try/finally` (same method) | -| 96 | `pushSubjectContext(Subject, Principal, credential)` | yes — paired with `cleanupSubjectContext()` (line 132) | - -`isValid()` validates credentials and populates the caller's `Subject` (line 69). Once it returns true, the caller already has the SecurityIdentity inside the populated Subject — there's no need to also stash a copy in the per-thread `currentIdentity`. JBossWS / Apache CXF callers that use `isValid()` purely for credential validation (without proceeding to `runAs()` or `pushSubjectContext()`/`cleanupSubjectContext()`) leak the prior request's SecurityIdentity into the next Work item on the same pool thread. - -## Root Cause - -```java -// ElytronSecurityDomainContextImpl.java:55-71 -@Override -public boolean isValid(Principal principal, Object password, Subject subject) { - if (subject == null) { - subject = new Subject(); - } - String username = principal.getName(); - if (!(password instanceof String)) { - throw WSLogger.ROOT_LOGGER.onlyStringPasswordAccepted(); - } - SecurityIdentity identity = authenticate(username, (String) password); - if (identity == null) { - return false; - } - this.currentIdentity.set(identity); // <-- LEAK: no paired cleanup - SubjectUtil.fromSecurityIdentity(identity, subject); - return true; -} -``` - -## Severity Note - -Same MOAD-0003 family as wildfly-0001 (UNDF-1305). Multi-tenant JBossWS deployments where SOAP/REST endpoints sit behind a Work-Manager-pooled execution model are exposed: thread N processes Request A's `isValid()` (sets `currentIdentity = Alice`), returns to the pool, then processes Request B which reads `getSecurityContext()` (or downstream code that consults `currentIdentity.get()`) before `setSecurityContext()` overwrites it. - -Defense-in-depth value: even if all current JBossWS callers happen to follow up with `pushSubjectContext()` (which would overwrite the leak), any future caller that uses `isValid()` purely for "is this user/password valid?" intent — without intending to run subsequent work under that identity — silently leaks. - -## Fix - -Drop the `this.currentIdentity.set(identity)` line in `isValid()`. The Subject populated at line 69 remains the canonical handover for credential-validation callers. Callers that actually need the per-thread identity install should use `pushSubjectContext()` (paired with `cleanupSubjectContext()`) or `runAs()` (auto-cleared in finally). - -```java -@Override -public boolean isValid(Principal principal, Object password, Subject subject) { - if (subject == null) { - subject = new Subject(); - } - String username = principal.getName(); - if (!(password instanceof String)) { - throw WSLogger.ROOT_LOGGER.onlyStringPasswordAccepted(); - } - SecurityIdentity identity = authenticate(username, (String) password); - if (identity == null) { - return false; - } - // Removed: this.currentIdentity.set(identity); - // Subject already carries the identity for the caller. ThreadLocal - // installation belongs in pushSubjectContext()/cleanupSubjectContext() - // or runAs() — never in a credential-validator without paired cleanup. - SubjectUtil.fromSecurityIdentity(identity, subject); - return true; -} -``` - -## Companion to wildfly-0001 - -Same project, same MOAD, different entry point. Both finds surfaced after unmoad scanner commit `1f48798` cleared 99.2% of the WildFly M3 noise that had previously buried them. wildfly-0001 fixed the Elytron-JCA bridge; wildfly-0002 fixes the Elytron-JBossWS bridge. - -## Why this surfaced now - -This is the second M3 finding extracted from the cleaned wildfly M3 surface (4840 → 37 after `1f48798`). Manual triage of the residual 37 found this and wildfly-0001 as the two clear flagship-grade defects; the other 35 are properly cleaned ThreadLocals (try/finally pairs) or intentional state toggles. diff --git a/docs/tickets/wildfly-0003-transactionrollbacksetupaction-depth-remove.md b/docs/tickets/wildfly-0003-transactionrollbacksetupaction-depth-remove.md deleted file mode 100644 index bcf227d5f..000000000 --- a/docs/tickets/wildfly-0003-transactionrollbacksetupaction-depth-remove.md +++ /dev/null @@ -1,63 +0,0 @@ -# wildfly-0003: TransactionRollbackSetupAction uses depth.set(null) instead of depth.remove() - -**Target:** wildfly/wildfly -**Severity:** LOW -**CWE:** CWE-668 (Exposure of Resource to Wrong Sphere) -**MOAD:** MOAD-0003 (A Leaked Context — minor) -**File:** `transactions/src/main/java/org/jboss/as/txn/deployment/TransactionRollbackSetupAction.java:102` -**Language:** Java -**Status:** open - -## Description - -`TransactionRollbackSetupAction` tracks transaction depth per thread in a `ThreadLocal`. When the depth counter hits zero, the code does `depth.set(null)` to "clear" the holder. This functionally works (the next caller's `depth.get()` returns null and re-initializes), but it leaves the underlying ThreadLocal entry alive in the thread's internal `threadLocals` map. - -In Java EE app servers with persistent thread pools across application lifecycles, every `set(null)` accumulates an entry that: -1. Pins the WildFly classloader of the deployed application (the ThreadLocal key reference) -2. Survives `undeploy` / `redeploy`, growing the thread's `threadLocals` map slowly -3. Prevents the `Holder` class from being unloaded along with its application classloader - -`ThreadLocal.remove()` actually deletes the entry, allowing both the holder and the application classloader to be reclaimed during deployment churn. - -## Root Cause - -```java -// TransactionRollbackSetupAction.java:99-104 -holder.depth += increment; -if (holder.depth == 0) { - depth.set(null); // <-- should be depth.remove() - return holder.actuallyCleanUp; -} -return false; -``` - -## Severity Note - -This is a **MOAD-0003 minor** finding — no per-request value leak (the value IS nulled). The defect class is classloader retention during deployment churn: -- Long-running production app servers (uptime measured in months) accumulate dangling ThreadLocal entries equal to (active threads) × (deployments × redeploys) -- Each entry pins ~1KB of memory plus the application classloader's reachability graph -- For a deployment with 100 worker threads and 50 redeploys, this is 5,000 dangling entries — modest but real - -Not exploit-grade. Defense-in-depth and memory hygiene. - -## Fix - -One-line change: `depth.set(null)` → `depth.remove()`. - -```java -holder.depth += increment; -if (holder.depth == 0) { - depth.remove(); - return holder.actuallyCleanUp; -} -return false; -``` - -## Related findings - -Same project (WildFly), same MOAD-0003 family: -- `wildfly-0001` (UNDF-1305): ElytronSecurityIntegration — security-grade leak -- `wildfly-0002` (UNDF-1306): ElytronSecurityDomainContextImpl.isValid — security-grade leak -- `wildfly-0003` (this): TransactionRollbackSetupAction — classloader-retention only - -All three surfaced after unmoad scanner commit `1f48798` cleared 99.2% of the WildFly M3 noise. diff --git a/whitepaper/outreach/artemis.md b/whitepaper/outreach/artemis.md index 286c95fac..63b31e64f 100644 --- a/whitepaper/outreach/artemis.md +++ b/whitepaper/outreach/artemis.md @@ -3,7 +3,7 @@ **Project:** ActiveMQ Artemis **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 382× measured · 25× per-defect scenario +**Speedup:** 25× **Status:** PATCHED --- diff --git a/whitepaper/outreach/autonomous-loop-session-summary.md b/whitepaper/outreach/autonomous-loop-session-summary.md deleted file mode 100644 index 7ccecc9a9..000000000 --- a/whitepaper/outreach/autonomous-loop-session-summary.md +++ /dev/null @@ -1,110 +0,0 @@ -# Autonomous-loop session summary — 2026-04-25/26 - -**Session window:** 2026-04-25 13:09 UTC → 2026-04-26 15:38 UTC (~26 hours wall, mostly idle wakeup intervals) -**Operator:** blackops, autonomous-loop-dynamic mode - ---- - -## Headline numbers - -- **6 flagship patches shipped** (UNDF-2026-000001300 → 1305): 5 CWE-407 + 1 MOAD-0003 -- **22 wave breadth surveys** (waves 7-28) → **192 cumulative clean-scan honor roll** -- **10 unmoad scanner enhancements** clearing **~51,679 false positives across 19 codebases** -- **2 intel summary pages** (`scanner-enhancement-session.md`, this one) -- **3 borderline MOAD-0003 candidates flagged** for fox follow-up - -## Three repos affected - -| Repo | Scope | Pushed | -|------|-------|--------| -| `git.unturf.com/engineering/unturf/undefect.com` | 22 wave intel + 6 UNDF + 6 patches + scanner-session intel | yes (`origin/main`) | -| `git.unturf.com/engineering/java-topology` | 22 wave outreach briefs + 6 ticket files + 6 patch files + 6 bench scripts + UNDF registry | yes (`unturf/sync-undf`) | -| `~/git/unmoad.com` (no remote) | 12 commits: 10 scanner enhancements + 2 fixture-pair add-ons | local-only per project CLAUDE.md | - -## Flagship patches - -| UNDF | Project | Speedup | What it fixes | -|------|---------|--------:|---------------| -| 1300 | weaviate | **1735×** @ N=50k K=5k | RBAC filter `slices.Contains(allowedList, ...)` per item — set hoist | -| 1301 | pyroscope | **438×** @ B=10k U=1k | `PhlareDB.GetBlockStats` `slices.Contains(req.Msg.GetUlids(), ...)` per block — set hoist | -| 1302 | ghost | **184×** @ A=110k P=1k | `ReferrersStatsService` `Array.find` multi-key per conversion — `Map` hoist | -| 1303 | ghidra-0001 | **27×** @ F=2k R=500 | `RecoveredClassHelper` `List.contains` + `new ArrayList<>` defensive copy — `Map` rewrite | -| 1304 | ghidra-0002 | **768×** @ C=5k A=2.5k | `RTTIGccClassRecoverer` `getListOfVtableAndVftableTops` rebuilt per-call inside loop — set hoist + parameter-pass | -| 1305 | wildfly | (lifecycle, no bench) | `ElytronSecurityIntegration` ThreadLocal SecurityContext never cleared — `setSecurityContext(null)` calls `.remove()` + `try/finally` in WildflyWorkWrapper | - -## Wave surveys (waves 7-28) - -| Wave | Domain | Honor roll added | Flagship | -|------|--------|------------------|----------| -| 7 | mail/dns/storage/vpn/rtos | 5 | — | -| 8 | observability/streaming | 4 | — | -| 9 | image/pdf/db/editors | 7 | — | -| 10 | crypto/text/geo/flutter | 6 | — | -| 11 | unix/search/ml | 2 | weaviate-0001 | -| 12 | sci/static-site/api-gateway | 5 | — | -| 13 | vms/devtools/graphql | 5 | pyroscope-0001 | -| 14 | mobile/edge/PL/wm | 7 | — | -| 15 | security/data-eng/IDE | 8 | — | -| 16 | cms/workflow/bio/node | 6 | ghost-0001 | -| 17 | PHP/Python/bundler | 6 | — | -| 18 | cloud-sdk/auth/GUI/audio | 10 (full clean) | — | -| 19 | templating/parsers/compilers | 10 (full clean) | — | -| 20 | container/RE/JS-engine | 9 | ghidra-0001 | -| 21 | sci/forensics/bio/network | 10 (full clean) | — | -| 22 | EDA/games/HPC/codecs/httpd | 9 | — (nakama M4 logged for MOAD-0004) | -| 23 | frontend/loggers/image | 10 (full clean) | — (zap genuinely zero) | -| 24 | web/tls/multimodel/wp/audio | 10 (full clean) | — | -| 25 | collab/auth/sync/vectordb/shell | 10 (full clean) | — | -| 26 | middleware/CMS/CM/editor/PDF/CLI/viz | 10 (full clean) | — | -| 27 | pkg-mgr/build/scripting/firmware | 10 (full clean) | — | -| 28 | sci-niches/Lisp/Smalltalk | 8 + 2 partial | — | - -8 of 22 waves were full-clean (10/10 honor roll). The full-clean signal at wave 18 prompted the pivot to scanner enhancements. - -## Scanner enhancements (10 commits on unmoad.com main, local-only) - -| # | Commit | Detector | Fix | FPs cleared | -|---|--------|----------|-----|------------:| -| 1 | `73caddd` | M1 Java/Kotlin/Scala/Groovy | track `Set<...>`/`HashSet<...>`/`EnumSet<...>`/`Map<...>` declarations; suppress `.contains()` on receivers known hash-typed | wildfly **65** | -| 2 | `79dbac6` | M1 Rust | track `HashSet`/`FxHashSet`/`BTreeSet`/`RoaringBitmap`/`SmallBitmap`/`IndexSet`/etc. declarations | meilisearch **25** | -| 3 | `1f48798` | M3 Java/Kotlin/Groovy | scope `.set()` leak detection to known `ThreadLocal`/`InheritableThreadLocal`/`ScopedValue` receivers | wildfly **4803** | -| 4 | `9f62cdf` | M1 C# | track `HashSet`/`Dictionary`/`ImmutableHashSet`/`FrozenSet`/etc.; suppress `IndexOf('X')` char-literal | PowerShell **42** | -| 5 | `e94ec26` | M3 Python | scope `.set()` leak detection to known `ContextVar(...)`/`threading.local()` receivers | paperless-ngx **108** + patroni **49** | -| 6 | `1048451` | scanner all langs | filename-suffix exclusion (`*.min.js`/`*.bundle.js`/`*.umd.js`/etc.) + dir-name (`3rdParty/`, `external/`, `Contrib/`, `third_party/`) | WordPress **540** + TYPO3 **427** | -| 7 | `c152ad9` | scanner all langs | first-16-line scan for `// Code generated by ... DO NOT EDIT` / `` / `@generated` markers; skip the file | aws-sdk-go-v2 **18,582** + azure-sdk-for-go **25,755** | -| 8 | `26958c0` | M1 Lisp/Scheme/Racket | downgrade `list-member-in-loop` (Lisp `(member ...)` idiom) to MEDIUM severity | sbcl **706** + racket **306** | -| 9 | `0fa41ae` | M7 all langs | suppress function definitions (`bool ClassName::contains(...)`, `def`/`fn`/`function` keywords, `) {` openers) + String.contains substring (`'X'`/`"X"`/`b'X'`) | hydrogen **47** + Hyprland **37** + abseil **22** + spack **6** | -| 10 | `7770325` | M1 Rust + M7 all | suppress `bitflags::bitflags!` macro pattern: `.contains(Type::SCREAMING_SNAKE)` is bitwise AND | helix **37** + alacritty **40** + wezterm **81** | - -Total: **~51,679 FPs cleared across 19 codebases**. - -After all 10 enhancements: 173 unmoad tests (111 integration + 29 unit + 33 functional) passing. - -## Borderline candidates flagged for fox review (not autonomously shipped) - -1. **WildFly `ElytronSecurityDomainContextImpl.isValid()`** — `currentIdentity.set(identity)` without contractual cleanup. `runAs()` properly clears via `try/finally`; `isValid()` doesn't. Real defect depends on caller contract — needs JBossWS audit. -2. **log4j2 `Log4jMDCAdapter.tlMapOfStacks`** — `ThreadLocal>>` with `clearByKey()` but no `removeAll()`. SLF4J spec contractually expects host frameworks to call `MDC.clear()`; defect realism depends on host framework reliability. -3. **WildFly `TransactionRollbackSetupAction.depth.set(null)`** — should be `.remove()` to fully clear ThreadLocal entry. Functional clear, but suboptimal (leaves null binding pinning the entry). -4. **nakama OAuth token logging** (Wave 22, MOAD-0004) — `c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken))` across 7 sites in `social/social.go`. Real Logged Secret defect; routed to MOAD-0004 disclosure pipeline (out of CWE-407 scope this session). - -## Methodology notes - -The session demonstrated three pipelines: - -1. **Forward pipeline** (typical CWE-407): scan → triage → flagship patch + bench + ticket + intel + UNDF + fixtures → push. Used for weaviate, pyroscope, ghost, ghidra-0001, ghidra-0002. - -2. **Inverse pipeline** (scanner improves its own SNR): scanner enhancement → noise reduction → human triage of cleaner output → flagship patch. Used for wildfly-0001 — the scanner alone never could have ranked it. - -3. **Wave breadth survey** (zero or low-yield batch): clone batch → scan → triage → write survey documenting clean-scan honor roll + investigated-not-shipped notes. Used for waves 7-28; the diminishing-returns pattern (8 consecutive full-clean waves) prompted the pivot to scanner work. - -## What's left for fox to consider - -1. **Review the 12 unmoad commits** before pushing them to a remote (there is no remote configured on `unmoad.com` per project CLAUDE.md). -2. **Decide on the borderline MOAD-0003 candidates** — particularly `ElytronSecurityDomainContextImpl.isValid()` which may be exploit-grade with a caller audit. -3. **Decide whether to re-run the wave history** with the improved scanner. Each wave's intel page still shows pre-fix counts. Updating ~22 surveys is laborious but documents the actual current state. -4. **MOAD-0004 nakama disclosure** — flagged but not patched (different pipeline, different disclosure cadence). -5. **Wave 17 borderline candidates** still open: symfony `PropertyAccessor::writeCollection` (real O(P×C) but needs type-aware fix), pyright `CallHierarchyProvider._outgoingCalls.find` (composite-key Map<"uri|start|end", entry> needed). - -## Stop condition - -The autonomous loop is pausing here. Per CLAUDE.md "Unsure = ask. Can't ask = stop." — I'm unsure whether to keep finding marginal-value work or wait for fox to redirect. The honest move is to stop scheduling wakeups and let fox resume with intent. diff --git a/whitepaper/outreach/check.md b/whitepaper/outreach/check.md deleted file mode 100644 index d17a8df19..000000000 --- a/whitepaper/outreach/check.md +++ /dev/null @@ -1,53 +0,0 @@ -# libcheck — CWE-407 Disclosure Brief - -**Project:** libcheck (libcheck/check) -**Disclosure date:** 2026-04-23 -**Severity:** LOW-MEDIUM -**Speedup:** 117x at N=1000 tcases (test-name lookup), confirmed by benchmark -**Status:** patch-ready sketch, needs companion hashtable integration - ---- - -## Summary - -`libcheck` (the C unit test framework behind thousands of C/C++ projects) looks up test cases by name via a linear scan of a `List`, calling `strcmp` per entry. The runner filter path invokes this per suite × per filter application. For N tcases × N filter calls, cost is O(N²). - -## The Defects - -**check-0001 (MOAD-0001 — LOW-MEDIUM):** `src/check.c:76-94` - -```c -int suite_tcase(Suite *s, const char *tcname) { - List *l; - if(s == NULL) return 0; - - l = s->tclst; - for(check_list_front(l); !check_list_at_end(l); check_list_advance(l)) { - TCase *tc = (TCase *)check_list_val(l); - if(strcmp(tcname, tc->name) == 0) return 1; - } - return 0; -} -``` - -The same linear-scan pattern repeats in `src/check_run.c` for the suite/tcase name filter applied during run initialization. - -**Fix:** Maintain a parallel hashtable keyed by test-case name alongside the ordered `List`. Lookups drop to O(1) amortized. The List stays authoritative for ordered iteration (test-run order is deterministic-by-design in libcheck). Integration requires adding a small hashtable implementation (or wiring against glib's `GHashTable` where available) and updating `tcase_add`/`suite_add_tcase` to insert into both structures. - -| Benchmark (N tcases, N lookups) | defective | fixed | speedup | -|---------------------------------|-----------|---------|---------| -| 200 | 0.63ms | 0.02ms | 26.8x | -| 500 | 4.13ms | 0.07ms | 61.8x | -| 1000 | 16.80ms | 0.14ms | 117.1x | - -Impact scales with test suite size. Typical unit-test projects have fewer than 50 tcases per suite, where the effect is negligible. Larger integration/e2e harnesses with hundreds of tcases and filter patterns see measurable slowdown. LOW-MEDIUM priority; cleanup rather than hotspot. - -## Scanner Evidence - -`unmoad` detects the pattern at HIGH severity via the `strcmp-in-loop` rule. Trigger + clean fixture pair in `tests/integration/fixtures/moad_0001/`. - -## Patches - -- `check-0001-suite-tcase_by_name-linear-strcmp.patch` (UNDF-2026-000001292) - -Patch is shipped as a design sketch; full upstream integration requires the companion hashtable (libcheck does not currently ship one). Full test + bench suite at `defects/check/` in the java-topology research repo. diff --git a/whitepaper/outreach/docs-pipeline-survey.md b/whitepaper/outreach/docs-pipeline-survey.md deleted file mode 100644 index e4033ff8c..000000000 --- a/whitepaper/outreach/docs-pipeline-survey.md +++ /dev/null @@ -1,58 +0,0 @@ -# Documentation Pipeline — Sphinx, docutils, Pelican - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** the three foundational Python tools that build most reST/Markdown documentation pipelines: Sphinx (the reference docs builder), docutils (the parser/DOM beneath it), and Pelican (the static-site generator that powers undefect.com itself). - ---- - -## Summary - -These three tools together build a non-trivial fraction of the open-source documentation web. We scanned each and triaged the findings against the bar for shipping a CWE-407 patch (must change complexity class with measurable wall-clock impact). - -**Outcome: no patches shipped this pass.** Pelican is essentially clean. Sphinx and docutils have findings that look like O(N²) on first read but turn out to be either bounded-N, false-positive, or constant-factor-only on benchmark. - -## Per-target findings - -| Target | Total | M1 | M11 | CRIT | Outcome | -|--------|------:|---:|----:|-----:|---------| -| Pelican | 2 | 1 | 1 | 1 | one String.index false positive + one ReDoS in pelican_import.py — empirically tested at N=40, 0.11ms, no catastrophic backtracking. Effectively a clean scan. | -| docutils | 99 | 30 | 13 | 16 | most M1 hits in `/sandbox/` experimental subprojects (not core); `nodes.py:338-341` Node.findall parent.index investigated and benchmarked — both old and new code are O(D×S), constant factor 1.1-1.4× only, not a complexity-class change. | -| Sphinx | 45 | 25 | 15 | 19 | hot files: util/cfamily.py (4 hits, no .index/find/contains in actual code — likely scanner false positive), themes/static/*.js (vendored), writers/texinfo.py + manpage.py (`node.parent.index` — same docutils pattern, same constant-factor verdict). | - -## What was investigated - -### Pelican - -- `pelican/utils.py:485` — `self.rawdata.index("\n", line_start)` is **String.index** for a newline character. Single string scan, not a list iteration. **False positive.** -- `pelican/tools/pelican_import.py:663` — `re.sub(r"((-)+([0-9a-f]+|DRAFT))+$", "", slug)` flagged as nested-quantifier ReDoS. Empirical test at N=40 dashes: 0.11ms (linear scaling). **False positive** — pelican_import is a one-shot CMS migration tool, not a per-build hot path. - -**Pelican earns the clean-scan honor roll.** Both findings are non-defects under empirical test. - -### docutils - -- `docutils/nodes.py:336-348` — `Node.findall(siblings=True or ascend=True)` walks up the tree calling `parent.index(node)` per ancestor. Looked like a candidate (Node.findall is the canonical tree walk, called by Sphinx, Pelican, and every reST pipeline). Built a Python bench modelling the parent.index per ancestor vs a single-pass iterator skip-until-is. Both algorithms are **O(D×S)** — same complexity class. The skip-until-is variant only saves the `list.index` constant factor and the value-equality retry overhead. - - Bench: D=3, B=10..30: 1.1-1.4× speedup. Not a CWE-407 complexity-class win. - - **Not patch-shipped.** Real fix requires maintaining a parent_index cache on Element (significant refactor with cache-invalidation surface area). Out of scope for a single-defect patch. - -- 90% of docutils M1 hits are in `/sandbox/` directories — experimental subprojects (movesec, rst2chunkedhtml, viewcvs, py-rest-doc) that are not part of core docutils. Excluded from triage. - -### Sphinx - -- `sphinx/util/cfamily.py` — 4 M1 findings reported by scanner but `grep` of the file shows no `.index`/`.find`/`.contains` patterns. Likely scanner false positive on a different shape (`x in ('a','b','c')` style). -- `sphinx/writers/texinfo.py:696`, `sphinx/writers/manpage.py:61` — same `node.parent.index(node.parent)` pattern as docutils. Same conclusion: O(D×S) → O(D×S), constant-factor only. -- `sphinx/themes/*/static/*.js` — vendored CSS3-mediaqueries.js + searchtools.js. Vendor exclusion. -- `sphinx/builders/_epub_base.py:3 hits` — epub-specific path, runs only when building EPUB output. Bounded impact. - -## Triage outcome - -**Pelican joins the clean-scan honor roll** (now 25 projects). - -**Sphinx and docutils** had findings worth examining. Of the inspectable hot paths, none met the CWE-407 bar of complexity-class change with measurable wall-clock impact. The interesting `Node.findall` pattern would require a parent-index cache to fix properly — a refactor, not a one-line set hoist. - -This is what an honest "investigated, no patch this pass" outcome looks like: the work is documented, the empirical benches are committed-or-discarded as appropriate, and the next reviewer can pick up where we left off without redoing the analysis. - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/` diff --git a/whitepaper/outreach/doris.md b/whitepaper/outreach/doris.md index 6638ce82b..9dcca9d65 100644 --- a/whitepaper/outreach/doris.md +++ b/whitepaper/outreach/doris.md @@ -3,7 +3,7 @@ **Project:** Apache Doris **Disclosure date:** 2026-03-27 **Severity:** MEDIUM -**Speedup:** 372× measured · 2.5× per-defect scenario +**Speedup:** 2.5× **Status:** PATCHED --- diff --git a/whitepaper/outreach/fbneo-0001.md b/whitepaper/outreach/fbneo-0001.md index eb562fee7..64ed301c1 100644 --- a/whitepaper/outreach/fbneo-0001.md +++ b/whitepaper/outreach/fbneo-0001.md @@ -25,8 +25,7 @@ for (UINT32 i = 0; i < nBurnDrvCount; i++) { At N=45,000 drivers: - Defective: up to 45,000 strcmp comparisons per lookup - Fixed: 1 lookup (unordered_map) -- **45,000x worst-case op reduction** — 45,000 strcmp calls per lookup collapse to one hash lookup. -- **2,410× measured wall-clock speedup** at N=45,000 drivers (steady-state, Python model; see `defects/fbneo-0001/bench/results.txt`). The residual op-count vs wall-clock gap reflects Python dict overhead vs C++ `unordered_map` constant factors on short ASCII keys. +- **45,000x worst-case op reduction.** ## Impact diff --git a/whitepaper/outreach/gatsby.md b/whitepaper/outreach/gatsby.md deleted file mode 100644 index 3e6e40d9f..000000000 --- a/whitepaper/outreach/gatsby.md +++ /dev/null @@ -1,49 +0,0 @@ -# Gatsby — CWE-407 Disclosure Brief - -**Project:** Gatsby (gatsbyjs/gatsby) -**Disclosure date:** 2026-04-25 -**Severity:** MEDIUM-HIGH -**Speedup:** 8.4× measured at N=100,000 nodes × T=50 types -**Status:** patch-ready, 1 patch + bench - ---- - -## Summary - -Gatsby's in-memory datastore builds filter caches by walking every node and checking each node's type against a list of declared `nodeTypeNames` via `Array#includes`. Three call sites in `packages/gatsby/src/datastore/in-memory/indexing.ts` use this pattern. Two of them carry a Gatsby-author comment: **`// This loop is expensive at scale (!)`**. The third notes **`// Expensive at scale`**. - -The author's annotation is correct. For N nodes and T type-names, per-cache-build cost is O(N×T). Mature Gatsby sites carry 50K-500K nodes (every Markdown file, image, frontmatter object, GraphQL-introspected source becomes a node). Each query that filters by type rebuilds the cache; `gatsby develop` rebuilds caches per page. The fix is a single-line `Set` hoist per call site. - -## The Defects - -**gatsby-0001 (MOAD-0001 — MEDIUM-HIGH):** `packages/gatsby/src/datastore/in-memory/indexing.ts:326, 378, 504` - -```typescript -// Three call sites with the same shape, e.g. line 326: -} else { - // This loop is expensive at scale (!) - getDataStore().iterateNodes().forEach(node => { - if (!nodeTypeNames.includes(node.internal.type)) { // O(T) per node - return - } - addNodeToFilterCache({ node, ... }) - }) -} -``` - -**Fix:** Hoist `Set` once outside the loop; `Set#has` is O(1). - -| Benchmark (N nodes × T types) | defective | fixed | speedup | -|-------------------------------|-----------|-------|---------| -| 10,000 × 10 | 4.70ms | 1.71ms | 2.7× | -| 50,000 × 20 | 45.70ms | 9.67ms | 4.7× | -| 100,000 × 20 | 92.46ms | 22.26ms | 4.2× | -| 100,000 × 50 | 198.74ms | 23.57ms | 8.4× | - -## Scanner Evidence - -`unmoad` flags all three call sites at HIGH severity via `array-includes-in-loop`. The patch hoists each `nodeTypeNames` array into a `Set` and replaces `.includes` with `.has`. - -## Patches - -- `gatsby-0001-indexing-nodetypenames-includes-set.patch` diff --git a/whitepaper/outreach/ghidra.md b/whitepaper/outreach/ghidra.md deleted file mode 100644 index b30ed95b8..000000000 --- a/whitepaper/outreach/ghidra.md +++ /dev/null @@ -1,129 +0,0 @@ -# Ghidra — CWE-407 Disclosure Brief - -**Project:** Ghidra (NationalSecurityAgency/ghidra) -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** [MOAD-2026-0001 A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -**Speedup:** 27× and 768× across two patches - -## Defect Map - -![]({static}/uploads/intel-ghidra.svg) - -## What it is - -Two coupled CWE-407 patches for ghidra's C++ class recovery infrastructure: - -| Defect | UNDF | Speedup | Pattern | -|--------|------|--------:|---------| -| `ghidra-0001` | [undf-2026-000001303](../undf-2026-000001303/) | 27× @ F=2k R=500 | `RecoveredClassHelper.{addVftableReferencesToFunctionMapping,addFunctionsToClassMapping}` — `List.contains` + `new ArrayList<>(existing)` defensive copy on every add | -| `ghidra-0002` | [undf-2026-000001304](../undf-2026-000001304/) | 768× @ C=5k A=2.5k | `RTTIGccClassRecoverer.{getVttAddresses,addPointerToList,isPossibleVttStart}` — `getListOfVtableAndVftableTops(vtables)` rebuilt on every `isPossibleVttStart` call + `List.contains` on `List
` | - -## Where they live - -### ghidra-0001: `RecoveredClassHelper.java:218-237` - -```java -for (Address vtableReference : keySet) { - if (functionToVftableRefsMap.containsKey(function)) { - List
referenceList = functionToVftableRefsMap.get(function); - if (!referenceList.contains(vtableReference)) { // O(R) per call - List
newList = new ArrayList<>(referenceList); // O(R) defensive copy - newList.add(vtableReference); - functionToVftableRefsMap.replace(function, referenceList, newList); - } - } - // else create new list... -} -``` - -Per binary: O(F × R²) where F = function count, R = references per function. - -### ghidra-0002: `RTTIGccClassRecoverer.java:880-925, 944-960, 988-1005` - -```java -// getVttAddresses(): outer while + per-call rebuild -while (keepChecking) { - for (Address possibleVttStart : addressesToCheck) { - if (isPossibleVttStart(possibleVttStart, vtables, vttStarts)) { ... } - } -} - -// isPossibleVttStart(): rebuilds vtableAndVftableAddrs on EVERY call -private boolean isPossibleVttStart(Address address, List vtables, List
knownVtts) { - List
vtableAndVftableAddrs = getListOfVtableAndVftableTops(vtables); // <- O(V) every call - ... - if (referencedAddress != null && (vtableAndVftableAddrs.contains(referencedAddress) || - knownVtts.contains(referencedAddress))) { ... } -} - -// addPointerToList(): rebuilt-each-time + List.contains -List
vtableAndVftableAddrs = getListOfVtableAndVftableTops(vtables); // built once but List -List
vttStarts = getVttAddresses(vtts); -for (Vtt vtt : vtts) { - while (referencedAddress != null && - (vtableAndVftableAddrs.contains(referencedAddress) || - vttStarts.contains(referencedAddress))) { ... } -} -``` - -Per binary: O(outer_iters × A × V) just for rebuilds, plus O(A × V) for linear-scan contains. - -## Fix - -### ghidra-0001 fix - -`Map>` → `Map>`. LinkedHashSet preserves insertion order and gives O(1) add+contains. Defensive ArrayList copy disappears. - -### ghidra-0002 fix - -1. Build `Set
vtableAndVftableSet` ONCE in `getVttAddresses` (and `addPointerToList`). -2. Change `isPossibleVttStart` signature to accept the prebuilt sets. -3. Maintain `Set
vttStartSet` alongside the existing List for downstream lookups. - -```java -Set
vtableAndVftableSet = - new HashSet<>(getListOfVtableAndVftableTops(vtables)); -Set
vttStartSet = new HashSet<>(); -while (keepChecking) { - for (Address possibleVttStart : addressesToCheck) { - if (isPossibleVttStart(possibleVttStart, vtableAndVftableSet, vttStartSet)) { - vttStarts.add(possibleVttStart); - vttStartSet.add(possibleVttStart); - } - } -} -``` - -## Bench (defects/ghidra/bench/results.txt) - -``` -=== ghidra-0001: RecoveredClassHelper O(F*R^2) -> O(F*R) === - - scale defective fixed speedup ------------------------------------------------------------- - F= 100 R= 50 6.59ms 1.02ms 6.5x - F= 500 R= 50 24.10ms 3.63ms 6.6x - F= 500 R= 200 239.36ms 16.55ms 14.5x - F=1000 R= 200 449.90ms 36.22ms 12.4x - F=2000 R= 500 4730.41ms 173.06ms 27.3x - -=== ghidra-0002: getVttAddresses O(A^2*V + A*V) -> O(A + V) === - - scale defective fixed speedup ------------------------------------------------------------- - C= 200 A= 100 1.27ms 0.04ms 28.4x - C= 500 A= 250 7.25ms 0.09ms 81.0x - C= 1000 A= 500 30.37ms 0.30ms 102.6x - C= 2000 A=1000 126.79ms 0.39ms 323.1x - C= 5000 A=2500 835.46ms 1.09ms 768.5x -``` - -## Why it matters - -Ghidra is the public-domain reverse engineering platform from NSA used by every malware analyst, vulnerability researcher, and binary archaeologist on the planet. Together these two patches drop ghidra's C++ class recovery analysis from seconds-to-minutes per binary to milliseconds: - -- **MSVC-compiled binaries** (Windows malware, AAA games, enterprise software) → ghidra-0001 covers the parallel pattern in `RecoveredClassHelper` -- **gcc-compiled binaries** (Linux desktop apps, Chromium-class projects, LLVM tooling) → ghidra-0002 covers the gcc-specific RTTI recovery path - -For analysts running ghidra against multiple binaries per session (typical malware triage workflows), this is human-attention saved on every reverse-engineering session. diff --git a/whitepaper/outreach/ghost.md b/whitepaper/outreach/ghost.md deleted file mode 100644 index 60c283fa8..000000000 --- a/whitepaper/outreach/ghost.md +++ /dev/null @@ -1,71 +0,0 @@ -# Ghost — CWE-407 Disclosure Brief - -**Project:** Ghost (TryGhost/Ghost) -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** [MOAD-2026-0001 A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -**Speedup:** 184× measured at A=110k P=1k - -## Defect Map - -![]({static}/uploads/intel-ghost.svg) - -## What it is - -`ReferrersStatsService.getReferrersHistory()` builds the analytics dashboard's referrer history by merging paid-conversion events into a base list of signup events keyed by `(source, date)`. The merge does `allEntries.find(e => e.source === entry.source && e.date === entryDate)` per paid conversion — an O(A) linear scan over all signup entries. Total cost: **O(P × A)**. - -For long-running Ghost sites with 200+ referral sources tracked over a year of dates, A reaches 70k-100k entries. Hundreds of paid conversions per dashboard refresh produce 7M+ comparisons per page load. - -| Defect | UNDF | -|--------|------| -| `ghost-0001` | [undf-2026-000001302](../undf-2026-000001302/) | - -## Where it lives - -`ghost/core/core/server/services/stats/referrers-stats-service.js:147-160`: - -```js -paidConversionEntries.forEach((entry) => { - const entryDate = moment(entry.date).format('YYYY-MM-DD'); - const existingEntry = allEntries.find(e => - e.source === entry.source && e.date === entryDate - ); // O(A) per call - ... -}); -``` - -## Fix - -Build a `Map<"source|date", entry>` lookup once before the merge loop. Per-conversion lookup drops to O(1). Total cost: O(P + A). - -```js -const allEntriesByKey = new Map(); -for (const e of allEntries) { - allEntriesByKey.set(`${e.source}|${e.date}`, e); -} -paidConversionEntries.forEach((entry) => { - const entryDate = moment(entry.date).format('YYYY-MM-DD'); - const existingEntry = allEntriesByKey.get(`${entry.source}|${entryDate}`); - ... -}); -``` - -The Map insertion path also caches new entries so subsequent matches against newly pushed items remain O(1). - -## Bench (defects/ghost/bench/results.txt) - -``` -=== ghost-0001: getReferrersHistory O(P*A) -> O(P+A) === - - scale defective fixed speedup ------------------------------------------------------------- - A= 1500 P= 100 4.75ms 0.31ms 15.4x - A= 6000 P= 200 42.47ms 1.30ms 32.7x - A= 18000 P= 300 193.68ms 3.65ms 53.0x - A= 36000 P= 500 693.20ms 7.30ms 95.0x - A=109500 P=1000 4202.31ms 22.88ms 183.7x -``` - -## Why it matters - -Every Ghost site running paid memberships sees the referrers analytics dashboard. Long-running sites with broad referrer networks pay 4 seconds of work to merge paid conversions before the page renders. The patch drops that to 23ms — the difference between "dashboard loads instantly" and "dashboard freezes for several seconds" on every refresh. diff --git a/whitepaper/outreach/gin.md b/whitepaper/outreach/gin.md index 9519caa2b..767c4af3e 100644 --- a/whitepaper/outreach/gin.md +++ b/whitepaper/outreach/gin.md @@ -3,7 +3,7 @@ **Project:** Gin (Go HTTP framework) **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 368× measured · 8× per-defect scenario +**Speedup:** 8× **Status:** PATCHED --- diff --git a/whitepaper/outreach/gstreamer.md b/whitepaper/outreach/gstreamer.md index 23a61daa7..cd496f832 100644 --- a/whitepaper/outreach/gstreamer.md +++ b/whitepaper/outreach/gstreamer.md @@ -3,7 +3,7 @@ **Project:** GStreamer **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 391× measured · 35× per-defect scenario +**Speedup:** 35× **Status:** PATCHED --- diff --git a/whitepaper/outreach/igraph.md b/whitepaper/outreach/igraph.md index ed8a1bfa7..bf9851ea4 100644 --- a/whitepaper/outreach/igraph.md +++ b/whitepaper/outreach/igraph.md @@ -3,7 +3,7 @@ **Project:** python-igraph **Disclosure date:** 2026-03-27 **Severity:** MEDIUM -**Speedup:** 533× measured · 47× per-defect scenario +**Speedup:** 47× **Status:** PATCHED --- diff --git a/whitepaper/outreach/jasmine.md b/whitepaper/outreach/jasmine.md deleted file mode 100644 index 172f9cf11..000000000 --- a/whitepaper/outreach/jasmine.md +++ /dev/null @@ -1,53 +0,0 @@ -# Jasmine — CWE-407 Disclosure Brief - -**Project:** Jasmine (jasmine/jasmine) -**Disclosure date:** 2026-04-23 -**Severity:** MEDIUM -**Speedup:** 61x at D=10, P=300 (SpyRegistry prototype walk), confirmed by benchmark -**Status:** patch-ready, 1 patch plus test suite, benchmarks complete - ---- - -## Summary - -`jasmine-core`'s `spyOnAllFunctions` walks an object's prototype chain, filtering properties at each level against already-seen entries via `Array.indexOf` and growing the skip list via `Array.concat`. For chain depth D and P properties per level, cost scales as O(D × P²). - -Frameworks that build deep class hierarchies (Angular services, Mongoose models, Ember objects) hit this pattern hard when the test suite calls `spyOnAllFunctions` on class instances. - -## The Defects - -**jasmine-0001 (MOAD-0001 — MEDIUM):** `src/core/SpyRegistry.js:203-221` - -```javascript -let propertiesToSkip = []; - -while (pointer && (...)) { - properties = getProps(pointer, includeNonEnumerable); - properties = properties.filter(function(prop) { - return propertiesToSkip.indexOf(prop) === -1; // O(P) per prop - }); - propertiesToSkip = propertiesToSkip.concat(properties); // grows - ... - pointer = Object.getPrototypeOf(pointer); -} -``` - -**Fix:** Replace `propertiesToSkip` Array with a `Set`. Filter lookup and growth drop to O(1). Total cost becomes O(D × P). - -| Benchmark (D levels, P per level) | defective | fixed | speedup | -|-----------------------------------|-----------|--------|---------| -| D=5, P=200 | 5.62ms | 0.29ms | 19.6x | -| D=8, P=200 | 13.81ms | 0.53ms | 26.1x | -| D=10, P=300 | 54.05ms | 0.88ms | 61.2x | - -Per-test overhead in microseconds to milliseconds on average objects; scales dramatically on framework-heavy object graphs. - -## Scanner Evidence - -`unmoad` detects the pattern at HIGH severity. Trigger + clean fixture pair in `tests/integration/fixtures/moad_0001/`. - -## Patches - -- `jasmine-0001-spyregistry-spyonallfunctions-indexof.patch` (UNDF-2026-000001293) - -Full test + bench suite at `defects/jasmine/` in the java-topology research repo. diff --git a/whitepaper/outreach/knex.md b/whitepaper/outreach/knex.md deleted file mode 100644 index 52bded4c5..000000000 --- a/whitepaper/outreach/knex.md +++ /dev/null @@ -1,52 +0,0 @@ -# Knex.js — CWE-407 Disclosure Brief - -**Project:** Knex.js (knex/knex) -**Disclosure date:** 2026-04-25 -**Severity:** MEDIUM-HIGH -**Speedup:** 355× measured at A=C=2000 migrations -**Status:** patch-ready, 1 patch + bench - ---- - -## Summary - -Knex.js is the dominant SQL migration library in the Node ecosystem. Its `Migrator#rollback({all:true})` and `Migrator#down()` methods filter the full migration list against the completed-migrations list using a per-iteration `.map(name).includes(...)` chain. For A all-migrations and C completed-migrations, the per-call cost is O(A×C) compute plus O(A×C) allocation — effectively O(A×C²) when accounting for GC pressure on the rebuilt names array. - -Mature databases (long-lived Rails-style projects ported to Node, monorepos with many service schemas) carry hundreds of migrations. Every `knex migrate:rollback --all` and `knex migrate:down` run pays this. Bench shows 355× speedup at A=C=2000 once the lookup is hoisted into a `Set`. - -## The Defects - -**knex-0001 (MOAD-0001 — MEDIUM-HIGH):** `lib/migrations/migrate/Migrator.js:188-194, 217-222` - -```js -// rollback({all: true}) — line 188 -allMigrations.filter((migration) => { - return completedMigrations - .map((migration) => migration.name) // O(C) array allocation per filter step - .includes(this.config.migrationSource.getMigrationName(migration)); // O(C) scan -}).reverse(); - -// down() — line 217 — same pattern -const completedMigrations = all.filter((migration) => { - return completed - .map((migration) => migration.name) - .includes(this.config.migrationSource.getMigrationName(migration)); -}); -``` - -**Fix:** Hoist a `Set` outside the filter; `Set#has` is O(1). - -| Benchmark (A all × C completed) | defective | fixed | speedup | -|---------------------------------|-----------|-------|---------| -| 200×200 | 4.70ms | 0.08ms | 56.2× | -| 500×500 | 27.91ms | 0.19ms | 144.7× | -| 1000×1000 | 75.14ms | 0.37ms | 202.5× | -| 2000×2000 | 290.10ms | 0.82ms | 355.5× | - -## Scanner Evidence - -`unmoad` flags both call sites at HIGH severity via the `array-includes-in-loop` rule. Trigger captures the `.map().includes()` rebuilt-array pattern. - -## Patches - -- `knex-0001-migrator-completed-name-set.patch` diff --git a/whitepaper/outreach/kylin.md b/whitepaper/outreach/kylin.md index e14a68495..26dfe72eb 100644 --- a/whitepaper/outreach/kylin.md +++ b/whitepaper/outreach/kylin.md @@ -3,7 +3,7 @@ **Project:** Apache Kylin (OLAP on Hadoop) **Disclosure date:** 2026-03-27 **Severity:** MEDIUM -**Speedup:** 382× measured · 21.7× per-defect scenario +**Speedup:** 21.7× **Status:** PATCHED --- diff --git a/whitepaper/outreach/log4j2.md b/whitepaper/outreach/log4j2.md deleted file mode 100644 index 1a536a00e..000000000 --- a/whitepaper/outreach/log4j2.md +++ /dev/null @@ -1,69 +0,0 @@ -# Apache log4j2 — MOAD-0003 (Leaked Context) Disclosure Brief - -**Project:** Apache log4j2 (apache/logging-log4j2) -**Severity:** HIGH -**CWE:** CWE-668 (Exposure of Resource to Wrong Sphere) -**MOAD:** [MOAD-2026-0003 A Leaked Context](https://undefect.com/moad-2026-0003/) -**Pattern:** Log4jMDCAdapter.clear() does not clear SLF4J pushByKey/popByKey stacks - -## Defect Map - -![]({static}/uploads/intel-log4j2.svg) - -## What it is - -`Log4jMDCAdapter` (the SLF4J→log4j MDC bridge) maintains TWO per-thread state holders: - -1. **`ThreadContext` map** — log4j-core's canonical MDC, the one most callers think of as "MDC" -2. **`mapOfStacks: ThreadLocalMapOfStacks`** — the SLF4J adapter's own `ThreadLocal>>` carrying the per-key stack semantics that SLF4J added with `pushByKey/popByKey/peekByKey/clearByKey/getCopyOfDequeByKey` - -The `clear()` method clears holder #1 only. SLF4J's `MDC.clear()` spec mandates "clear all MDC state for this thread." With log4j-slf4j2-impl, the per-key Deques accumulate across requests on a re-used pool thread. - -| Defect | UNDF | -|--------|------| -| `log4j2-0001` | [undf-2026-000001308](../undf-2026-000001308/) | - -## Where it lives - -`log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jMDCAdapter.java:55-57`: - -```java -@Override -public void clear() { - ThreadContext.clearMap(); - // mapOfStacks is NOT cleared — silently leaks pushByKey-set state -} -``` - -`ThreadLocalMapOfStacks` (lines 118-150) has `clearByKey()` per-key but no clear-all. - -## Fix - -Two-line change: - -1. Add `clear()` to `ThreadLocalMapOfStacks` that calls `tlMapOfStacks.remove()` (also addresses minor classloader-retention in app-server thread pools). -2. Call `mapOfStacks.clear()` from the public `Log4jMDCAdapter.clear()`. - -```java -@Override -public void clear() { - ThreadContext.clearMap(); - mapOfStacks.clear(); // <-- new -} - -private static class ThreadLocalMapOfStacks { - public void clear() { - tlMapOfStacks.remove(); - } -} -``` - -## Why it matters - -Web frameworks (Spring, Quarkus, Netty-based stacks) call `MDC.clear()` between requests. If application code uses `pushByKey/popByKey` to track per-request state (tenant IDs, trace contexts, user roles, auth tokens), Request B sees Request A's leftover stack contents on a re-used pool thread. Bounded blast radius (only stack-API callers; the most common `MDC.put/get` users are unaffected because that path goes through `ThreadContext` which IS cleared) but security-grade for callers that DO use the stack API. - -## How it surfaced - -Surfaced after unmoad scanner enhancement `1f48798` (Java ThreadLocal-scoped `.set()` leak detection) cleared 79% of log4j2's M3 false-positive noise (456 → 95). Manual triage of the residual 95 identified this as the only flagship-grade defect; the other 94 are layout/StringBuilder buffer ThreadLocals that are intentional performance caches with no value-leak risk. - -This is the first patch from a project that joined the clean-scan honor roll in Wave 23 — the inverse-pipeline pattern (scanner improves SNR → triage finds defect that previously was invisible) holds beyond WildFly. diff --git a/whitepaper/outreach/mercurial-0001.md b/whitepaper/outreach/mercurial-0001.md index 11266621a..03828c7fd 100644 --- a/whitepaper/outreach/mercurial-0001.md +++ b/whitepaper/outreach/mercurial-0001.md @@ -29,7 +29,6 @@ At R=10,000 revisions: - Defective: ~10,000 × 5,000 avg = 50,000,000 comparisons - Fixed: ~10,000 × O(1) dict lookups = 10,000 operations - **5,000× op reduction** at 10,000 revisions. -- **50× measured wall-clock speedup** at N=1,500 revisions × k=500 parallel branches (Python model ceiling — the O(k²) inner loop makes N=10,000 infeasible in pure Python). The op-count claim scales as N × k across the full bench range; the `defects/mercurial-0001/bench/bench_google_scale.py` companion runs the ops-ratio projection against the actual `graphmod.colored` and reaches the 5,000× figure at Google-scale. ## Impact diff --git a/whitepaper/outreach/nakama.md b/whitepaper/outreach/nakama.md deleted file mode 100644 index db7c0765b..000000000 --- a/whitepaper/outreach/nakama.md +++ /dev/null @@ -1,92 +0,0 @@ -# Nakama — MOAD-0004 (Logged Secret) Disclosure Brief - -**Project:** Nakama (heroiclabs/nakama) -**Severity:** HIGH -**CWE:** CWE-532 (Insertion of Sensitive Information into Log File) -**MOAD:** [MOAD-2026-0004 A Logged Secret](https://undefect.com/moad-2026-0004/) -**Pattern:** OAuth tokens, Steam publisher key, Game Center signatures logged at debug level - -## Defect Map - -![]({static}/uploads/intel-nakama.svg) - -## What it is - -Nakama's social-auth client at `social/social.go` has 11 debug-level `zap.Field` call sites that log third-party authentication SECRETS as full string/object values. Game-server operators run nakama with debug logging enabled in development and frequently leave it on in production — log files routed to centralized aggregators (ELK, Datadog, Loki, Sumo) inherit the leaked tokens and become a credential exfiltration target. - -| Line | Provider | Logged secret | Impact if leaked | -|------|----------|---------------|------------------| -| 235 | Facebook | `accessToken` | Full Graph API access for the user | -| 250 | Facebook | `accessToken` (friends scope) | Same | -| 290 | Facebook Instant Game | `signedPlayerInfo` | HMAC-signed authenticator; replay attack | -| 353 | Google | `idToken` | User identity assertion; reused against ID-token APIs | -| 435 | Google | `auth_token` (= idToken) | Same | -| 439, 443, 448, 452 | Google | `oauth2.Token` object `t` | Contains `AccessToken` AND `RefreshToken`; refresh token grants long-lived backend access | -| 630 | Steam | `publisherKey` + `ticket` | Server's Steam web API key; full developer Steam app access | - -| Defect | UNDF | -|--------|------| -| `nakama-0001` | [undf-2026-000001309](../undf-2026-000001309/) | - -## Where it lives - -`social/social.go:235`: - -```go -c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken)) -``` - -`social/social.go:439`: - -```go -c.logger.Debug("Exchanged an authorization code for an access token.", - zap.Any("token", t), zap.Error(err)) // t carries AccessToken AND RefreshToken -``` - -`social/social.go:630`: - -```go -c.logger.Debug("Getting Steam profile", - zap.String("publisherKey", publisherKey), // SERVER's Steam API key - zap.Int("appID", appID), - zap.String("ticket", ticket)) -``` - -## Fix - -Replace value logging with shape logging — log the FACT that we had a token (and its length) without logging the bytes. Standard CWE-532 remediation: - -```go -// Before -zap.String("token", accessToken) -// After -zap.Int("token_len", len(accessToken)) -``` - -```go -// Before -zap.Any("token", t) // t is *oauth2.Token -// After -zap.Bool("has_token", t != nil) -``` - -For Steam `publisherKey` + `ticket`, redact entirely; neither presence nor length is a useful debug signal here, both are secrets that should never appear in log records: - -```go -// Before -c.logger.Debug("Getting Steam profile", - zap.String("publisherKey", publisherKey), - zap.Int("appID", appID), - zap.String("ticket", ticket)) -// After -c.logger.Debug("Getting Steam profile", - zap.Int("appID", appID), - zap.Int("publisherKey_len", len(publisherKey)), - zap.Int("ticket_len", len(ticket))) -``` - -## Discovery context - -Documented in Wave 22 survey (`/wave22-eda-games-hpc-codecs-httpd-survey/`) as the only real MOAD-0004 finding in that wave. nakama was **excluded from the Wave 22 clean-scan honor roll** because of these real M4 findings — joining the roll requires zero real defects, not just zero false positives. Honor roll status: pending fix-acceptance upstream. - -This is the first MOAD-0004 (Logged Secret) patch shipped this autonomous-loop session. diff --git a/whitepaper/outreach/nifi.md b/whitepaper/outreach/nifi.md index 26528d88f..29e8a9a43 100644 --- a/whitepaper/outreach/nifi.md +++ b/whitepaper/outreach/nifi.md @@ -3,7 +3,7 @@ **Project:** Apache NiFi **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 433× measured · 16.7× per-defect scenario +**Speedup:** 16.7× **Status:** PATCHED --- diff --git a/whitepaper/outreach/open3d.md b/whitepaper/outreach/open3d.md index 71f2ef380..b004835a6 100644 --- a/whitepaper/outreach/open3d.md +++ b/whitepaper/outreach/open3d.md @@ -3,7 +3,7 @@ **Project:** Open3D **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 397× measured · 37.8× (open3d-0001), 4× (open3d-0002) per-defect scenario +**Speedup:** 37.8× (open3d-0001), 4× (open3d-0002) **Status:** PATCHED --- diff --git a/whitepaper/outreach/opencv.md b/whitepaper/outreach/opencv.md index 7a393390d..e69f4ed15 100644 --- a/whitepaper/outreach/opencv.md +++ b/whitepaper/outreach/opencv.md @@ -3,7 +3,7 @@ **Project:** OpenCV **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 368× measured · 8.5× (opencv-0001), 3.5× (opencv-0002) per-defect scenario +**Speedup:** 8.5× (opencv-0001), 3.5× (opencv-0002) **Status:** PATCHED --- diff --git a/whitepaper/outreach/playwright.md b/whitepaper/outreach/playwright.md deleted file mode 100644 index 37c5d5a94..000000000 --- a/whitepaper/outreach/playwright.md +++ /dev/null @@ -1,57 +0,0 @@ -# Playwright — CWE-407 Disclosure Brief - -**Project:** Playwright (microsoft/playwright) -**Disclosure date:** 2026-04-22 -**Severity:** MEDIUM-HIGH -**Speedup:** 11.1x at N=10000 elements (playwright-0001), confirmed by benchmark -**Status:** patch-ready, 1 patch plus test suite, benchmarks complete - ---- - -## Summary - -Playwright injects `roleUtils.ts` into every target page for accessibility snapshots, `getByRole` locators, and ARIA tree walks. Three helpers (`getExplicitAriaRole`, `allowsNameFromContent`, `hasGlobalAriaAttribute`) call `Array.includes` on 20–70 element constant arrays per element. For N=10000 elements with k=70 roles, total cost scales as O(N×k) = 700,000 string comparisons per snapshot. - -Converting the hot-path arrays to `Set` at module load drops per-element lookup from O(k) to O(1), producing O(N+k). Benchmark measures 11× speedup at N=10000 elements with a 70-role array. - -## The Defects - -**playwright-0001 (MOAD-0001 — MEDIUM-HIGH):** `packages/injected/src/roleUtils.ts:51-52, 262-268, 499-500` - -```typescript -// roleUtils.ts:262-268 -const validRoles: AriaRole[] = ['alert', 'alertdialog', 'application', ...70 items]; - -function getExplicitAriaRole(element: Element): AriaRole | null { - const roles = (element.getAttribute('role') || '').split(' ').map(...); - return roles.find(role => validRoles.includes(role as any)) as AriaRole || null; -} - -// roleUtils.ts:499-500 (inside allowsNameFromContent, per element) -const alwaysAllowsNameFromContent = ['button', 'cell', ...20 items].includes(role); -const descendantAllowsNameFromContent = targetDescendant && [...30 items].includes(role); - -// roleUtils.ts:51-52 (hasGlobalAriaAttribute, per attribute per element) -!prohibited?.includes(forRole || '') -``` - -**Fix:** pre-build `validRolesSet`, `kAlwaysAllowsNameFromContentSet`, `kDescendantAllowsNameFromContentSet`, and a parallel `kGlobalAriaAttributeProhibitedSets` at module scope. Per-element lookup drops to O(1). - -| Benchmark (N elements, k=70) | defective | fixed | speedup | -|-------------------------------|-----------|-------|---------| -| 100 | 0.11ms | 0.007ms | 15.3x | -| 1000 | 1.06ms | 0.09ms | 11.4x | -| 5000 | 5.37ms | 0.52ms | 10.4x | -| 10000 | 11.48ms | 1.03ms | 11.1x | - -Impact amplifies on pages with deep accessibility trees: dashboards, data grids, and enterprise SPAs routinely snapshot 5000+ nodes. Every `getByRole` locator pays this per element it scans. - -## Scanner Evidence - -`unmoad` detects the pattern at HIGH severity via `array-includes-in-loop`. Trigger and clean fixture pair in `tests/integration/fixtures/moad_0001/trigger_playwright_roles.ts` and `clean_playwright_roles.ts`. - -## Patches - -- `playwright-0001-roleutils-validroles-array-includes.patch` (UNDF-2026-000001276) - -Full test + bench suite at `defects/playwright/` in the java-topology research repo. diff --git a/whitepaper/outreach/psalm.md b/whitepaper/outreach/psalm.md deleted file mode 100644 index 2fe8e001e..000000000 --- a/whitepaper/outreach/psalm.md +++ /dev/null @@ -1,46 +0,0 @@ -# Psalm — CWE-407 Disclosure Brief - -**Project:** Psalm (vimeo/psalm) -**Disclosure date:** 2026-04-24 -**Severity:** MEDIUM -**Speedup:** 336× measured at C=F=5000 (classes × filter-list entries) -**Status:** patch-ready, 1 patch plus test + bench - ---- - -## Summary - -Psalm's `FileFilter` drives the analyzer's scope — which classes get checked and which get skipped — on every static-analysis run. `allowsClass()` is invoked once per class the analyzer visits. The method's fallback path runs `in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true)`, an O(F) linear scan over the configured filter list. For C classes analyzed against F filter entries, total cost is O(C×F). - -Projects with careful Psalm configuration (monorepos that scope analysis to dozens or hundreds of class patterns) pay this on every CI run. Our bench measures 336× speedup at C=F=5000 on the hash-backed fix. - -## The Defects - -**psalm-0001 (MOAD-0001 — MEDIUM):** `src/Psalm/Config/FileFilter.php:573-584` - -```php -public function allowsClass(string $fq_classlike_name): bool -{ - if ($this->fq_classlike_patterns) { /* regex path unchanged */ } - return in_array(strtolower($fq_classlike_name), $this->fq_classlike_names, true); -} -``` - -**Fix:** Lazy-init an associative array (hash set) keyed by the lowercased class name. `isset($hash[$lowered])` is O(1). Rebuilt once per FileFilter instance. - -| Benchmark (C classes, F filter) | defective | fixed | speedup | -|---------------------------------|-----------|-------|---------| -| 500×500 | 5.13ms | 0.13ms | 39.0x | -| 1000×1000 | 21.32ms | 0.28ms | 77.1x | -| 5000×5000 | 583.25ms | 1.74ms | 336.2x | -| 10000×1000 | 221.37ms | 1.75ms | 126.8x | - -## Scanner Evidence - -`unmoad` flags the pattern at HIGH severity via the `array-includes-in-loop` / `in_array-in-loop` detector. The fix's lazy-init `array_fill_keys` pattern clears the scan. - -## Patches - -- `psalm-0001-filefilter-allowsclass-in-array.patch` - -Full test + bench suite at `defects/psalm/` in the java-topology research repo. diff --git a/whitepaper/outreach/pyright.md b/whitepaper/outreach/pyright.md deleted file mode 100644 index c6ff50c0b..000000000 --- a/whitepaper/outreach/pyright.md +++ /dev/null @@ -1,76 +0,0 @@ -# Pyright — CWE-407 Disclosure Brief - -**Project:** Pyright (microsoft/pyright) -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** [MOAD-2026-0001 A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -**Speedup:** 22× measured at C=2000 - -## Defect Map - -![]({static}/uploads/intel-pyright.svg) - -## What it is - -`CallHierarchyProvider` has two parallel patterns that linear-scan the recorded-calls list to dedup by composite key `(uri, range)`: - -- `_outgoingCalls.find(...)` per discovered outgoing call expression -- `_incomingCalls.find(...)` per discovered incoming call expression - -Per call expression, `Array.find` walks the list from index 0. For C call expressions in a function, total cost is **O(C²)**. Glue functions with 500-2000 call sites (utility/dispatcher/middleware patterns common in large Python codebases — ORM dispatch, RPC routers, event handlers) hit 250k-4M ops per "show outgoing calls" IDE request. - -| Defect | UNDF | -|--------|------| -| `pyright-0001` | [undf-2026-000001311](../undf-2026-000001311/) | - -## Where it lives - -`packages/pyright-internal/src/languageService/callHierarchyProvider.ts:394-396, 608-610`: - -```ts -let outgoingCall = this._outgoingCalls.find( - (outgoing) => outgoing.to.uri === callDest.uri && - rangesAreEqual(outgoing.to.range, callDest.range) -); -``` - -## Fix - -Maintain a parallel `Map` keyed by composite `(uri | start.line | start.character | end.line | end.character)`. Lookup via `map.get(key)` is O(1). The list still preserves discovery order and is what `getOutgoingCalls()` / `getIncomingCalls()` returns — no API change. - -```ts -private _outgoingCalls: CallHierarchyOutgoingCall[] = []; -private _outgoingCallsByKey: Map = new Map(); - -const dedupKey = `${callDest.uri}|${callDest.range.start.line}|...`; -let outgoingCall = this._outgoingCallsByKey.get(dedupKey); -if (!outgoingCall) { - outgoingCall = { to: callDest, fromRanges: [] }; - this._outgoingCalls.push(outgoingCall); - this._outgoingCallsByKey.set(dedupKey, outgoingCall); -} -``` - -Same shape applies to `_incomingCalls` in `CallVisitor`. - -## Bench (defects/pyright/bench/results.txt) - -``` -=== pyright-0001: CallHierarchyProvider O(C^2) -> O(C) === - - scale defective fixed speedup -------------------------------------------------------- - C= 100 0.34ms 0.13ms 2.7x - C= 500 8.33ms 1.07ms 7.8x - C= 1000 18.28ms 1.13ms 16.2x - C= 2000 46.21ms 2.10ms 22.1x - C= 5000 138.21ms 6.88ms 20.1x -``` - -## Why it matters - -Pylance is the dominant Python language server in VS Code, built on pyright. "Show callers" / "Show callees" / Call Hierarchy are the bread-and-butter navigation features for understanding a Python codebase. Glue functions with 500+ call sites are common in mature Python codebases (Django dispatchers, FastAPI routers, ORM glue, event-handler tables). The patch keeps Call Hierarchy responsive at 22× larger scales than today. - -## Discovery context - -Documented in Wave 17 survey as a **borderline real defect** — flagged because the fix is mechanical but needs composite-key serialization design (`Range` is a struct, not directly Map-key-able in TypeScript). This patch is the composite-key-Map fix Wave 17 deferred for follow-up. diff --git a/whitepaper/outreach/pyroscope.md b/whitepaper/outreach/pyroscope.md deleted file mode 100644 index d6d922b10..000000000 --- a/whitepaper/outreach/pyroscope.md +++ /dev/null @@ -1,70 +0,0 @@ -# Pyroscope — CWE-407 Disclosure Brief - -**Project:** Pyroscope (grafana/pyroscope) -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** [MOAD-2026-0001 A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -**Speedup:** 438× measured at B=10k U=1k - -## Defect Map - -![]({static}/uploads/intel-pyroscope.svg) - -## What it is - -Pyroscope's `PhlareDB.GetBlockStats` walks three block sets (heads, flushing, queriers) and for each block calls `slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String())` to check if the requested-ULID list contains it. `slices.Contains` is an O(U) linear scan. Total per-request cost: **O(B × U)** where B = total blocks across all sets, U = requested ULID count. - -Long-retention tenants (Grafana Cloud Profiles, fleet-wide continuous profiling) accumulate thousands of block queriers. Operators issuing block-stats RPC with hundreds of ULIDs pay 1M+ membership checks per call. ULID.String() also re-formats the ULID to its canonical hex string per iteration, multiplying allocations. - -| Defect | UNDF | -|--------|------| -| `pyroscope-0001` | [undf-2026-000001301](../undf-2026-000001301/) | - -## Where it lives - -`pkg/phlaredb/phlaredb.go:597-613`: - -```go -for _, h := range f.heads { - if slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String()) { - res.BlockStats = append(res.BlockStats, h.GetMetaStats().ConvertToBlockStats()) - } -} -for _, h := range f.flushing { /* same */ } -for _, q := range f.blockQuerier.queriers { /* same */ } -``` - -## Fix - -Hoist `req.Msg.GetUlids()` into a `map[string]struct{}{}` once at the start of `GetBlockStats`. Per-iter cost drops from O(U) to O(1). Total cost: O(B + U). - -```go -requested := make(map[string]struct{}, len(req.Msg.GetUlids())) -for _, u := range req.Msg.GetUlids() { - requested[u] = struct{}{} -} -for _, h := range f.heads { - if _, ok := requested[h.meta.ULID.String()]; ok { - res.BlockStats = append(res.BlockStats, h.GetMetaStats().ConvertToBlockStats()) - } -} -``` - -## Bench (defects/pyroscope/bench/results.txt) - -``` -=== pyroscope-0001: PhlareDB.GetBlockStats O(B*U) -> O(B+U) === - - scale defective fixed speedup -------------------------------------------------------- - B= 500 U= 100 1.81ms 0.04ms 47.0x - B= 1000 U= 200 7.59ms 0.08ms 96.3x - B= 2000 U= 200 15.66ms 0.15ms 103.0x - B= 2000 U= 500 38.00ms 0.17ms 224.5x - B= 5000 U= 500 102.96ms 0.36ms 282.2x - B=10000 U=1000 239.79ms 0.55ms 438.8x -``` - -## Why it matters - -Continuous profiling at scale = thousands of blocks per tenant. Block-stats RPC sits on every UI inspect, every retention-pruning path, every cross-tenant aggregation. At B=10k U=1k, the patch drops a single GetBlockStats call from 240ms to 0.55ms — the difference between "profiling tab loads instantly" and "profiling tab freezes UI for a quarter second" on every refresh. diff --git a/whitepaper/outreach/ros2.md b/whitepaper/outreach/ros2.md index ecda4a905..ee5033834 100644 --- a/whitepaper/outreach/ros2.md +++ b/whitepaper/outreach/ros2.md @@ -3,7 +3,7 @@ **Project:** ROS2 (Robot Operating System 2) **Disclosure date:** 2026-03-27 **Severity:** MEDIUM -**Speedup:** 406× measured · 5× (worst case) per-defect scenario +**Speedup:** 5× (worst case) **Status:** PATCHED --- diff --git a/whitepaper/outreach/scanner-enhancement-session.md b/whitepaper/outreach/scanner-enhancement-session.md deleted file mode 100644 index b6247b5d9..000000000 --- a/whitepaper/outreach/scanner-enhancement-session.md +++ /dev/null @@ -1,198 +0,0 @@ -# unmoad scanner enhancement session — 10 fixes, ~51,679 FPs cleared - -**Session date:** 2026-04-26 -**Scope:** Single autonomous-loop session targeting the false-positive backlog -documented across waves 7-28 (scanner FPs noted 30+ times). - ---- - -## Summary - -Ten scanner enhancements landed in `unmoad.com`, all validated end-to-end -against re-cloned source. **~51,679 false positives cleared across 19 -codebases.** Three repos in sync after each commit. All commits remain -local on `unmoad.com` (no remote configured per the project's CLAUDE.md). - -The session pattern: pick the most-documented FP from triage backlog, -write a per-file symbol-table or path-shape suppression, validate against -two real codebases that exhibited the FP, commit. Rinse, repeat. - -## Commits + validated impact - -| # | Commit | Detector | Languages | FPs cleared (validated) | -|---|--------|----------|-----------|-------------------------| -| 1 | `73caddd` | M1 | Java/Kotlin/Scala/Groovy | wildfly **65** | -| 2 | `79dbac6` | M1 | Rust | meilisearch **25** | -| 3 | `1f48798` | M3 | Java/Kotlin/Groovy | wildfly **4803** | -| 4 | `9f62cdf` | M1 | C# | PowerShell **42** | -| 5 | `e94ec26` | M3 | Python | paperless-ngx **108** + patroni **49** | -| 6 | `1048451` | scanner | All | WordPress **540** + TYPO3 **427** | -| 7 | `c152ad9` | scanner | All | aws-sdk-go-v2 **18,582** + azure-sdk-for-go **25,755** | -| 8 | `26958c0` | M1 | Lisp/Scheme/Racket | sbcl **706** + racket **306** | -| 9 | `0fa41ae` | M7 | All | hydrogen **47** + Hyprland **37** + abseil **22** + spack **6** | -| 10 | `7770325` | M1+M7 | Rust + all | helix **37** + alacritty **40** + wezterm **81** | - -**Total: ~51,679 FPs cleared across 19 codebases.** - -## Architecture - -Three reusable pieces of state added to `ScanState`: - -```c -char hash_vars[64][64]; /* moad_0001: vars declared as Set/Map/HashSet */ -int hash_vars_count; -char tl_vars[64][64]; /* moad_0003: vars declared as ThreadLocal/ContextVar */ -int tl_vars_count; -``` - -Eight of ten enhancements use a per-file symbol-table tracker that -recognizes declarations on each line and consults the table at call sites: - -| Tracker | Recognizes | Suppresses | -|---------|------------|------------| -| `track_java_hash_decls` | `Set<...>`, `HashSet<...>`, `EnumSet<...>`, `Map<...>`, `HashMap<...>`, `ConcurrentHashMap<...>`, `ImmutableSet/Map<...>` | `var.contains(...)` / `var.indexOf(...)` | -| `track_rust_hash_decls` | `let var: HashSet<...>`, `let var = HashSet::new()`, plus `FxHashSet`, `BTreeSet`, `RoaringBitmap`, `SmallBitmap`, `IndexSet`, `BitSet`, `DashSet`, etc. | `var.contains(...)` / `var.position(...)` | -| `track_csharp_hash_decls` | `HashSet<...>`, `Dictionary<...>`, `ImmutableHashSet<...>`, `FrozenSet<...>` | `var.Contains(...)` / `var.IndexOf(...)` | -| `track_java_tl_decls` | `ThreadLocal<...>`, `InheritableThreadLocal<...>`, `ScopedValue<...>`, `FastThreadLocal<...>` | `var.set(...)` (no-remove leak check) | -| `track_python_tl_decls` | `var = ContextVar(...)`, `var: ContextVar[T] = ...`, `_local = threading.local()` | `var.set(...)` (no-reset leak check) | - -Two enhancements use file-level path/header heuristics: - -| Heuristic | Suppresses | -|-----------|------------| -| `should_skip_filename` | `*.min.js`, `*.min.css`, `*.bundle.js`, `*.umd.js`, `*.global.prod.js`, `*-bundle.js`, `*-min.js` | -| `is_generated` | First-16-line scan for `// Code generated by ...`, `DO NOT EDIT`, ``, `@generated`, `Auto-generated`, `automatically generated`, `This file was generated` | - -Plus expanded `SKIP_DIRS`: `3rdParty`, `external`, `Externals`, -`third_party`, `thirdparty`, `Contrib`. - -Two enhancements operate on argument-shape and definition-shape: - -| Helper | Recognizes | -|--------|-----------| -| `csharp_indexof_is_char_literal` | `IndexOf('X')` (PowerShell single-char position scan, not collection lookup) | -| `looks_like_definition` (M7) | `bool ClassName::contains(...)`, function body `) {` opener, `def`/`fn`/`function` keywords | -| `looks_like_string_contains` (M7) | `.contains('X')` / `.contains("X")` / `.contains(b'X')` substring search | -| `contains_arg_is_path_constant` (M1+M7) | `.contains(Type::SCREAMING_SNAKE)` — bitflags / enum flag check | - -One severity-only adjustment: - -| Rule | Change | -|------|--------| -| `list-member-in-loop` (Lisp/Scheme/Racket) | `SEV_HIGH` → `SEV_MEDIUM`. Lisp `(member ...)` returns the matched-tail not just bool; idiomatic for small-list membership in graph algorithms. | - -## Test surface - -Throughout the session, the test count grew from 105 → 111 integration + -29 unit + 33 functional. Eight new fixtures: - -- `moad_0001/clean_java_set_decl.java` — `Set.contains` + `EnumSet.contains` + `HashMap.containsKey` -- `moad_0001/clean_rust_hash_decl.rs` — `HashSet.contains` + `BTreeSet.contains` + `let _ = HashSet::new()` constructor pattern -- `moad_0001/clean_csharp_set_decl.cs` — `HashSet.Contains` + `Dictionary.ContainsKey` + `ImmutableHashSet.Contains` + `IndexOf(':')` char position -- `moad_0001/clean_rust_bitflags.rs` — `flags.contains(KeyModifiers::SHIFT)` + `mods.contains(Self::CTRL)` -- `moad_0003/clean_atomic_set_no_threadlocal.java` — `AtomicLong.set(0L)` + `AtomicReference.set(null)` + JavaBean setters -- `moad_0003/clean_python_django_set.py` — Django M2M `relation.set(items)` + `threading.Event.set()` + custom `cache.set(k,v)` -- Functional: vendored UI suffix exclusion (`.min.js`/`.bundle.js`/`.umd.js`) -- Functional: codegen marker suppression (`// DO NOT EDIT` + `// @generated`) - -All 173 tests pass after every commit. - -## Validated impact summary - -By codebase (sorted by FPs cleared): - -| Codebase | Before | After | Cleared | Reduction | -|----------|------:|------:|--------:|----------:| -| azure-sdk-for-go (codegen) | 25,898 | 143 | 25,755 | 99.4% | -| aws-sdk-go-v2 (codegen) | 18,582 | 0 | 18,582 | 100% | -| wildfly (Java Set + ThreadLocal) | 4,933 | 65 | 4,868 | 98.7% | -| sbcl (Lisp member) | 727 | 21 | 706 | 97.1% | -| WordPress (vendored UI) | 1,050 | 510 | 540 | 51.4% | -| TYPO3 (vendored UI) | 934 | 507 | 427 | 45.7% | -| racket (Lisp member) | 383 | 77 | 306 | 79.9% | -| paperless-ngx (Python ContextVar) | 109 | 1 | 108 | 99.1% | -| wezterm (Rust bitflags) | 135 | 54 | 81 | 60.0% | -| patroni (Python ContextVar) | 49 | 0 | 49 | 100% | -| hydrogen (Qt geometry) | 64 | 17 | 47 | 73.4% | -| PowerShell (C# IndexOf char) | 169 | 127 | 42 | 24.9% | -| alacritty (Rust bitflags) | 51 | 11 | 40 | 78.4% | -| Hyprland (geometry) | 46 | 9 | 37 | 80.4% | -| helix (Rust bitflags) | 75 | 38 | 37 | 49.3% | -| meilisearch (Rust HashSet) | 68 | 43 | 25 | 36.8% | -| abseil-cpp (M7 definitions) | 60 | 38 | 22 | 36.7% | -| spack (M7 method calls) | 72 | 66 | 6 | 8.3% | -| ripgrep (Rust HashSet) | 5 | 4 | 1 | 20.0% | -| **Total** | **53,510** | **1,831** | **51,679** | **96.6%** | - -## Findings worth investigating from the cleaner output - -After the M3 detector noise dropped from wildfly 4840 → 37 finds (commit -`1f48798`), the remaining 37 are real ThreadLocal patterns. Manual triage -identified **one clear MOAD-0003 candidate** worth follow-up: - -- `connector/src/main/java/org/jboss/as/connector/security/ElytronSecurityIntegration.java:38` - declares `private final ThreadLocal securityContext = new ThreadLocal<>();` - with `setSecurityContext(...)` at line 51 calling `.set(context)` and zero - `securityContext.remove()` / `securityContext.set(null)` anywhere in the - WildFly codebase (verified by `grep -rn`). For a JCA WorkManager that - reuses thread-pool threads across Work items from different security - principals, a leftover `SecurityContext` from a prior Work item could be - visible to a subsequent one if the new item reads via `getSecurityContext()` - before its own `setSecurityContext(...)` call. Real defense-in-depth - candidate at minimum, possibly an exploitable identity-leak. - -This is out of the CWE-407 disclosure pipeline (MOAD-0001) but goes into -the MOAD-0003 (A Leaked Context) follow-up queue for fox's review. - -## Effect on the wave-survey backlog - -The 30+ scanner-enhancement candidates documented across wave surveys -(every wave from 11 onward listed at least one) are now mostly closed: - -- Java declared-type Set/EnumSet awareness — **shipped** (commit 1) -- Rust HashSet/FxHashSet/Bitmap awareness — **shipped** (commits 2, 10) -- JUnit ExtensionContext suppression — **partially shipped** via Java - ThreadLocal-scoping in commit 3 (eliminates the `.set()` noise; the - `getStore().put()` patterns remain unflagged today) -- Java ThreadLocal-scoped `.set()` — **shipped** (commit 3) -- Python ContextVar-scoped `.set()` — **shipped** (commit 5) -- C# HashSet declared-type — **shipped** (commit 4) -- C# IndexOf(char_literal) — **shipped** (commit 4) -- Codegen artifact suppression — **shipped** (commit 7) -- Vendored UI tree exclusion — **shipped** (commit 6) -- Rust bitflags::bitflags! macro — **shipped** (commit 10) -- Lisp `(member ...)` algorithm awareness — **shipped** (commit 8) -- M7 definition / String.contains distinction — **shipped** (commit 9) -- Qt `.contains()` family awareness — **partially shipped** via M7 - definition heuristic (catches `bool QRect::contains(...)` definitions - but call-site `qrect.contains(point)` still fires; needs Qt-typed - receiver tracking) -- Smalltalk language module — **not shipped** (deferred; pharo still - unscannable) -- Spack/conan-style `intersects()` algorithm awareness — **partially - shipped** via M7 definition heuristic (catches definitions; call-site - `spec.intersects(other)` still fires) - -## What's left - -The remaining noise sources after this session are dominated by: - -- **Test files** that exercise patterns the scanner correctly flags as - defects in production code. A path-prefix suppression for `*Test.java`, - `*_test.go`, `tests/`, `test/`, `__tests__/` directories would help - but requires care not to mask real defects in test-helper code. -- **Spack/conan-style algorithm methods** at call site (intersects / - overlaps / contains / distance) where the method is the algorithm but - the receiver type isn't a recognized geometry primitive. -- **Method-chain receivers** (`a.getX().contains(b)` — extract_receiver - rejects chained calls). This is conservative-correct but misses - legitimate suppressions when the chain returns an O(1) container. - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- ten unmoad commits: `73caddd` through `7770325`, all on `main`, - no remote configured (per CLAUDE.md) -- prior session shipped 5 flagship CWE-407 patches (UNDF-1300 through 1304): - weaviate, pyroscope, ghost, ghidra-0001, ghidra-0002 -- waves 7-28 of breadth scanning: 192 cumulative honor roll, 5 flagships diff --git a/whitepaper/outreach/selenium.md b/whitepaper/outreach/selenium.md deleted file mode 100644 index 68ec64996..000000000 --- a/whitepaper/outreach/selenium.md +++ /dev/null @@ -1,58 +0,0 @@ -# Selenium — CWE-407 Disclosure Brief - -**Project:** Selenium (SeleniumHQ/selenium) -**Disclosure date:** 2026-04-22 -**Severity:** MEDIUM-HIGH -**Speedup:** 191.9x (selenium-0001 N=M=1000) and 253.8x (selenium-0002 N=M=1000), confirmed by benchmark -**Status:** patch-ready, 2 patches plus test suite, benchmarks complete - ---- - -## Summary - -Selenium carries two confirmed CWE-407 defects (MOAD-0001 — [A Sedimentary Defect](https://undefect.com/moad-2026-0001/)) in its capability merge paths. Both patterns live in mainstream code paths every production user hits. `SessionCapabilitiesMutator` runs on every Grid Node session creation; `ChromiumOptions` runs inside every Java client that targets Chrome, Edge, or Chromium-based browsers. Each merge walks client-provided args and extensions against the existing slot stereotype (or builder state) via `ArrayList.contains` inside a `forEach` loop, giving O(N×M) per merge. - -At N=M=1000 args the defective path ran 24.7ms; the patched path ran 0.13ms on our bench. For a CI farm running 50 sessions/second with 30–50 flags plus an extension payload, this adds measurable latency to every session handoff. - -## The Defects - -**selenium-0001 (MOAD-0001 — MEDIUM-HIGH):** `java/src/org/openqa/selenium/grid/node/config/SessionCapabilitiesMutator.java:136-141, 154-159, 194-199` - -Grid Node's session mutator merges slot stereotype caps with client-requested caps. Three forEach loops (Chromium args, Chromium extensions, Firefox args) each carry `!stereotypeArguments.contains(arg)` inside a `forEach`, producing O(N×M) per session creation. - -```java -// SessionCapabilitiesMutator.java:136-141 (mergeChromiumOptions, args path) -arguments.forEach( - arg -> { - if (!stereotypeArguments.contains(arg)) { // O(M) scan per arg - stereotypeArguments.add(arg); - } - }); -``` - -**Fix:** pre-build a `LinkedHashSet` from the stereotype list once, iterate incoming with `Set.add` semantics. Cost drops to O(N+M), order preserved. - -**selenium-0002 (MOAD-0001 — MEDIUM):** `java/src/org/openqa/selenium/chromium/ChromiumOptions.java:283-303, 317-323, 345-361` - -`ChromiumOptions.mergeInPlace` and `mergeInOptionsFromCaps` repeat the same `List.contains` dedup pattern across four merge loops. Every Selenium Java client that builds Chrome, Edge, or Chromium-based capabilities hits this on every `merge` call. - -**Fix:** introduce `addArgumentsUnique(Collection)` and `addEncodedExtensionsUnique(Collection)` helpers that build a `HashSet` view once per call. Four call sites consolidate behind the helpers. - -| Benchmark (N=M) | defective | fixed | speedup | -|-----------------|-----------|-------|---------| -| 100 | 0.21ms | 0.02ms | 11.3x | -| 500 | 5.22ms | 0.12ms | 42.6x | -| 1000 | 24.73ms | 0.13ms | 191.9x | - -(selenium-0001 numbers shown; selenium-0002 reaches 253.8x at N=M=1000 due to the 4-pass repetition of the same merge.) - -## Scanner Evidence - -Our open-source static scanner `unmoad` detects both patterns at HIGH severity via the `array-includes-in-loop` rule. Trigger and clean fixture pairs for both defects ship in `tests/integration/fixtures/moad_0001/` and run as part of our scanner's CI. - -## Patches - -- `selenium-0001-grid-session-mutator-list-contains.patch` (UNDF-2026-000001277) -- `selenium-0002-chromiumoptions-merge-args-extensions-list-contains.patch` (UNDF-2026-000001288) - -Both patches preserve semantics (insertion order, dedup behavior) and compile-check against mainline. Full test + bench suite at `defects/selenium/` in the java-topology research repo. diff --git a/whitepaper/outreach/starrocks.md b/whitepaper/outreach/starrocks.md index 1ad3dea3c..8e89fb4a3 100644 --- a/whitepaper/outreach/starrocks.md +++ b/whitepaper/outreach/starrocks.md @@ -3,7 +3,7 @@ **Project:** StarRocks **Disclosure date:** 2026-03-27 **Severity:** MEDIUM -**Speedup:** 401× measured · 3.5× per-defect scenario +**Speedup:** 3.5× **Status:** PATCHED --- diff --git a/whitepaper/outreach/substrate.md b/whitepaper/outreach/substrate.md index e9488ac79..7dd033a45 100644 --- a/whitepaper/outreach/substrate.md +++ b/whitepaper/outreach/substrate.md @@ -38,8 +38,7 @@ O(n) list scan per block in Aura, BABE, and BEEFY consensus protocols. **Measure **substrate-0001:** For n=100 validators, k=385 nominators: - O(n×k) = 38,500 comparisons per era check - Fixed: pre-built `BTreeMap>` → O(1) per check -- **38,550× measured ratio** (op-count at n=100 validators × k=385 nominators per era check). -- **2,009× measured wall-clock speedup** at N=10,000 in the Python complexity-class bench (`defects/substrate/bench/results.txt`). The residual op-count vs wall-clock gap reflects Python `list.__contains__` vs Rust `HashSet` constant factors; the claim remains the op-count number since the bench cannot model the Rust hasher overhead. +- **38,550× measured ratio.** **substrate-0002:** For n=100 authorities: - O(n) per block × block production rate diff --git a/whitepaper/outreach/symfony.md b/whitepaper/outreach/symfony.md deleted file mode 100644 index 8f90c8b5e..000000000 --- a/whitepaper/outreach/symfony.md +++ /dev/null @@ -1,70 +0,0 @@ -# Symfony — CWE-407 Disclosure Brief - -**Project:** Symfony (symfony/symfony) -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** [MOAD-2026-0001 A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -**Speedup:** 88× measured at P=C=2000 - -## Defect Map - -![]({static}/uploads/intel-symfony.svg) - -## What it is - -`PropertyAccessor::writeCollection()` is the central path for Symfony's collection-typed property updates: Doctrine entity OneToMany / ManyToMany associations, Form `CollectionType` binding, Serializer denormalization. The current implementation does `in_array($item, $collection, true)` per item in `$previousValue`, then `in_array($item, $previousValue, true)` per item in `$collection`. PHP's `in_array(strict=true)` is O(N) per call — total cost: **O(P × C)**. - -For a Symfony Doctrine entity with a deep OneToMany association of 500 items being updated to 500 different items, this is 250,000 strict-equality comparisons per write. - -| Defect | UNDF | -|--------|------| -| `symfony-0001` | [undf-2026-000001310](../undf-2026-000001310/) | - -## Where it lives - -`src/Symfony/Component/PropertyAccess/PropertyAccessor.php:580-595`: - -```php -foreach ($previousValue as $key => $item) { - if (!\in_array($item, $collection, true)) { // O(C) per item - unset($previousValue[$key]); - $zval[self::VALUE]->$removeMethodName($item); - } -} -foreach ($collection as $item) { - if (!$previousValue || !\in_array($item, $previousValue, true)) { // O(P) - $zval[self::VALUE]->$addMethodName($item); - } -} -``` - -## Fix - -Build dual lookup once per pass: -- **Objects** → `SplObjectStorage` (O(1) identity) -- **Scalars / arrays** → assoc array indexed by `serialize($item)` (O(1) hashed lookup; `serialize()` canonicalizes equals) -- **Resources** (rare) → fall back to `in_array` - -Per-write cost drops from O(P × C) to O(P + C). Two private static helpers handle the type dispatch. - -## Bench (defects/symfony/bench/results.txt) - -``` -=== symfony-0001: PropertyAccessor::writeCollection O(P*C) -> O(P+C) === - - scale defective fixed speedup ------------------------------------------------------------- - P= 100 C= 100 0.27ms 0.05ms 5.2x - P= 300 C= 300 3.72ms 0.22ms 16.8x - P= 500 C= 500 10.53ms 0.38ms 27.6x - P= 1000 C= 1000 43.75ms 0.85ms 51.8x - P= 2000 C= 2000 183.87ms 2.08ms 88.4x -``` - -## Why it matters - -Every form submission with a CollectionType field. Every PropertyAccessor write to a collection-valued entity property. Every Serializer denormalization. ORM-heavy Symfony apps with deep entity collections (CRM, e-commerce SKU/variant trees, media-library taggings, RBAC permission assignments) routinely hit P=C in the hundreds. API Platform extends the exposure to all REST endpoints that hydrate collection properties. - -## Discovery context - -Documented in Wave 17 survey as a **borderline real defect** — flagged because the fix is mechanical but needs careful type-aware dispatch (PHP `in_array(strict=true)` differs for objects vs scalars). This patch is the type-aware fix Wave 17 deferred for follow-up. diff --git a/whitepaper/outreach/test-harness-survey.md b/whitepaper/outreach/test-harness-survey.md deleted file mode 100644 index 6e0678a21..000000000 --- a/whitepaper/outreach/test-harness-survey.md +++ /dev/null @@ -1,77 +0,0 @@ -# Test Harness Survey — 42+ Languages — CWE-407 / MOAD-0001 Scan Results - -**Survey date:** 2026-04-23 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 61 test frameworks and related tooling spanning 30+ programming languages - ---- - -## Summary - -We scanned the leading open-source test frameworks across 30+ language ecosystems for the nine active MOAD patterns in our registry. The survey confirmed four confirmed CWE-407 / MOAD-0001 defects with measurable benchmarks (see individual intel briefs), identified dozens of additional findings triaged as bounded-N, false-positive (Set.contains is O(1), not O(N)), or vendored assets, and established fourteen test frameworks as having zero HIGH+ findings under our scanner. - -The clean-scan list is a credit to those projects' maintainers. Inclusion in that list indicates our current scanner's 9 detectors did not fire at HIGH+ severity on the sampled source tree. - -## Confirmed defects with patches (Wave 3) - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| vitest | coverage-v8 `coverage.result.find` inside forEach | **824× @ N=M=10000** | UNDF-2026-000001295 | -| testng | `DynamicGraph.toDot` `List.contains` inside two loops | 64× @ N=2000 | UNDF-2026-000001294 | -| jasmine | `SpyRegistry.spyOnAllFunctions` propertiesToSkip.indexOf | 61× @ D=10 P=300 | UNDF-2026-000001293 | -| libcheck | suite tcase-by-name linear `strcmp` scan | 117× @ N=1000 | UNDF-2026-000001292 | - -## Clean scans (0 HIGH+ findings — 14 projects) - -These frameworks ran clean under our 9 MOAD detectors at HIGH+ severity. They either avoid the O(N×k) sedimentary patterns entirely or keep them bounded below our detection threshold. - -| Framework | Language | -|-----------|----------| -| Midje | Clojure | -| speclj | Clojure | -| alcotest | OCaml | -| qcheck | OCaml | -| hspec | Haskell | -| tasty | Haskell | -| proper | Erlang | -| testify | Go | -| expecto | F# | -| ReTest.jl | Julia | -| bats-core | Shell | -| shunit2 | Shell | -| busted | Lua | -| tape | JavaScript | - -## Targets with findings, triaged but not patched this wave - -Findings reviewed and found to be either: - -- **False positives** under type inference: `Set.contains`, `Map.containsKey`, `String.includes`, `String.contains`, `Set.has` — all O(1), flagged by the scanner conservatively because it cannot type-distinguish inside a loop. Examples: mockito (`mocked.contains(type)` where `mocked` is a `Set`), rspec (`already_run_blocks.include?` where block is a `Set.new`), junit5 (`EnumSet.of(...).contains(...)`). -- **Bounded-N** in configuration-space: arg-list parsing, config-file bucket filters, error-code allowlists with ≤5 elements. Examples: phpunit `TestSuiteMapper` `in_array($suite, $includeTestSuites)`, nunit `Options.cs` IndexOf arg parsing, jest-config `extensionsToTreatAsEsm.includes('.js')`. -- **Vendored third-party assets**: `jquery.min.js`, `lunr.min.js`, docset documentation. Examples: Quick's 44 findings all in `docset/Contents/Resources/Documents/js/*.min.js`; specs2's prettify.js and tipuesearch.js. - -Projects reviewed, bounded/noise-dominated, candidates for future refinement or scanner improvement: - -assertj (DeepDifference, BDDAssumptions), mockito (InlineBytecodeGenerator), scalatest (ArgsParser, Filter), kotest (StringEq, SpringTestExtension), spock (asciidoc-extensions, TempDirExtension, SpecInfo), specs2 (SpecStructure, HtmlUrls), phpunit (Configuration XML readers, TestSuiteMapper), codeception (Dependencies subscriber, Parser), rspec (configuration, memoized_helpers, metadata_filter), nunit (nunitlite Options, Constraints), hypothesis (ghostwriter, ftz_detector), pytest (cacheprovider src, findpaths), xunit (assert tests), nose2 (plugin pipeline), cocotb (ContextVar chain, scheduler), googletest (amalgamated test utils), insta (cargo-insta cli, snapshot glob), ava (like-selector, shared-worker-loader), mocha (runner.globalProps, cli/options), pest (config), Behat (autoload), Catch2 (catch_run_context find_if), munit (junit-interface TagFilter), Unity (generate_test_runner build tool), proptest (bitflags, not actual array contains), quickcheck (minor), criterion.rs (report.rs directory existence check), cucumber-ruby (minor), minitest (small M3 pattern), gomega (minor), ginkgo (ContextVar-style), hypothesis (ghostwriter code-gen), Codeception (Subscriber), tapjs (typeof checks), Nimble (minor). - -Several of these are worth revisiting once the scanner gains type-inference for the `contains`-in-loop detector. - -## Method - -```bash -# Clone targets (shallow, depth=1) -git clone --depth=1 https://github.com/{org}/{repo}.git - -# Scan all MOADs at HIGH+ -unmoad -s high -f json {repo}/ > {repo}.json - -# Filter out test fixtures, node_modules, dist, docs, vendored JS -# Triage confirmed defects by reading the code context -# Confirm via Python-model benchmark + O(N+k) vs O(N×k) scaling -``` - -## References - -- Individual target briefs: `/selenium/`, `/playwright/`, `/webdriverio/`, `/testcafe/`, `/vitest/`, `/testng/`, `/jasmine/`, `/check/` on undefect.com -- MOAD-0001 A Sedimentary Defect: https://undefect.com/moad-2026-0001/ -- `unmoad` detection engine: git.unturf.com/engineering/unmoad.com diff --git a/whitepaper/outreach/testcafe.md b/whitepaper/outreach/testcafe.md deleted file mode 100644 index b11562e41..000000000 --- a/whitepaper/outreach/testcafe.md +++ /dev/null @@ -1,65 +0,0 @@ -# TestCafe — CWE-407 Disclosure Brief - -**Project:** TestCafe (DevExpress/testcafe) -**Disclosure date:** 2026-04-22 -**Severity:** MEDIUM-HIGH -**Speedup:** 398x (filterNodes N=2000) and 1966x (expandSelectorResults N=K=150), confirmed by benchmark -**Status:** patch-ready, 1 patch covering 2 hot paths, benchmarks complete - ---- - -## Summary - -TestCafe's `Selector` API runs as a client function injected into every test page. Two core helpers carry the same O(N²) dedup pattern across different code paths: - -- **filterNodes** (string-filter branch): `matchingArr.indexOf(node) > -1` per node, O(N×M) where N is input nodes and M is CSS-match count. -- **expandSelectorResults**: `result.indexOf(deriv) < 0` against a growing `result` array while walking N origin nodes with K derivatives each. Worst case O(N²×K²) when derivatives are unique. - -Every `Selector('.card').filter(...)` and every `Selector(...).parent()/child()/sibling()` call passes through these functions. On large DOM trees the quadratic behavior escapes fast: our benchmark hits 4985ms for N=K=150 derivatives on the defective path, 2.5ms fixed (1966× speedup). - -## The Defects - -**testcafe-0001 (MOAD-0001 — MEDIUM-HIGH):** `src/client-functions/selectors/add-api.js:30-72` - -```javascript -// filterNodes, string-filter branch -const matchingArr = []; -for (let i = 0; i < matching.length; i++) - matchingArr.push(matching[i]); -filter = node => matchingArr.indexOf(node) > -1; // O(M) per filter call - -// expandSelectorResults -for (let i = 0; i < nodes.length; i++) { - const derivativeNodes = populateDerivativeNodes(nodes[i]); - if (derivativeNodes) { - for (let j = 0; j < derivativeNodes.length; j++) { - if (result.indexOf(derivativeNodes[j]) < 0) // O(|result|) - result.push(derivativeNodes[j]); - } - } -} -``` - -**Fix:** Replace `Array.indexOf` dedup with `Set` membership. `Set` keys by object identity, matching the existing `indexOf` semantics exactly. - -| Benchmark (filterNodes N, M=N/2) | defective | fixed | speedup | -|------------------------------------|-----------|-------|---------| -| N=500 | 1.77ms | 0.03ms | 71.8x | -| N=1000 | 6.12ms | 0.04ms | 151.9x | -| N=2000 | 30.28ms | 0.08ms | 398.1x | - -| Benchmark (expandSelectorResults N=K) | defective | fixed | speedup | -|---------------------------------------|-----------|-------|---------| -| 50 | 49.17ms | 0.15ms | 319x | -| 100 | 934.92ms | 0.64ms | 1451x | -| 150 | 4985ms | 2.54ms | 1966x | - -## Scanner Evidence - -`unmoad` detects 2 findings at HIGH severity in our trigger fixture. Trigger + clean fixture pair in `tests/integration/fixtures/moad_0001/trigger_testcafe_selector.js` and `clean_testcafe_selector.js`. - -## Patches - -- `testcafe-0001-selector-filter-expand-indexof.patch` (UNDF-2026-000001290) - -Full test + bench suite at `defects/testcafe/` in the java-topology research repo. diff --git a/whitepaper/outreach/testng.md b/whitepaper/outreach/testng.md deleted file mode 100644 index 583d0ccb8..000000000 --- a/whitepaper/outreach/testng.md +++ /dev/null @@ -1,48 +0,0 @@ -# TestNG — CWE-407 Disclosure Brief - -**Project:** TestNG (testng-team/testng) -**Disclosure date:** 2026-04-23 -**Severity:** MEDIUM -**Speedup:** 64x at N=2000 (DynamicGraph.toDot), confirmed by benchmark -**Status:** patch-ready, 1 patch plus test suite, benchmarks complete - ---- - -## Summary - -TestNG's `DynamicGraph` carries the runtime test dependency graph. Its `toDot()` emits Graphviz for debugging dependency resolution. The method iterates `m_nodesReady` and `m_nodesRunning`, calling `freeNodes.contains(n)` per node where `freeNodes` is a `List`. For N nodes and F free nodes, cost is O(N×F). - -## The Defects - -**testng-0001 (MOAD-0001 — MEDIUM):** `testng-core/src/main/java/org/testng/internal/DynamicGraph.java:196-205` - -```java -List freeNodes = getFreeNodes(); -String color; -for (T n : m_nodesReady) { - color = freeNodes.contains(n) ? FREE : ""; // O(F) per node - result.append(" ").append(dotShortName(n)).append(color).append("\n"); -} -for (T n : m_nodesRunning) { - color = freeNodes.contains(n) ? FREE : RUNNING; - result.append(" ").append(dotShortName(n)).append(color).append("\n"); -} -``` - -**Fix:** Pre-compute a per-loop `Map` keyed by free node, value = `FREE` color. `Map.getOrDefault(n, DEFAULT_COLOR)` in O(1) replaces the O(F) `List.contains`. - -| Benchmark (N nodes) | defective | fixed | speedup | -|---------------------|-----------|--------|---------| -| 500 | 4.70ms | 0.28ms | 17.0x | -| 1000 | 17.61ms | 0.55ms | 32.3x | -| 2000 | 70.04ms | 1.09ms | 64.4x | - -## Scanner Evidence - -`unmoad` detects the pattern at HIGH severity. Trigger + clean fixture pair for the Map-based fix in `tests/integration/fixtures/moad_0001/`. - -## Patches - -- `testng-0001-dynamicgraph-todot-freenodes-contains.patch` (UNDF-2026-000001294) - -Full test + bench suite at `defects/testng/` in the java-topology research repo. diff --git a/whitepaper/outreach/trino.md b/whitepaper/outreach/trino.md index 409086f3a..590bcb592 100644 --- a/whitepaper/outreach/trino.md +++ b/whitepaper/outreach/trino.md @@ -3,7 +3,7 @@ **Project:** Trino **Disclosure date:** 2026-03-27 **Severity:** MEDIUM -**Speedup:** 364× measured · 3.2× per-defect scenario +**Speedup:** 3.2× **Status:** PATCHED --- diff --git a/whitepaper/outreach/vagrant.md b/whitepaper/outreach/vagrant.md deleted file mode 100644 index a1f568121..000000000 --- a/whitepaper/outreach/vagrant.md +++ /dev/null @@ -1,51 +0,0 @@ -# Vagrant — CWE-407 Disclosure Brief - -**Project:** Vagrant (hashicorp/vagrant) -**Disclosure date:** 2026-04-25 -**Severity:** MEDIUM -**Speedup:** 127× measured at S=2000 specs × P=1000 plugins -**Status:** patch-ready, 1 patch + bench - ---- - -## Summary - -Vagrant runs its `Bundler` plugin resolver on every command — `vagrant up`, `vagrant ssh`, `vagrant plugin list`, every interaction. Two paths in `lib/vagrant/bundler.rb` walk the resolved gem-spec list and check membership against a plugin/system-plugin **Array** via `Array#include?`, an O(P) linear scan per spec. With S resolved specs and P plugins, total per-command cost is O(S×P). - -Multi-plugin developer environments pay this on every command. The fix hoists each lookup into a `Set` — `Set#include?` is O(1). - -## The Defects - -**vagrant-0001 (MOAD-0001 — MEDIUM):** `lib/vagrant/bundler.rb:469-471, 533-534` - -```ruby -# Path 1: prune solution to declared plugins -solution.find_all do |spec| - plugins.keys.include?(spec.name) # O(P) per spec, O(S*P) total -end - -# Path 2: strict-dependency-enforcement filter -plugin_deps += vagrant_internal_specs.map do |spec| - if Vagrant.in_bundler? - next if system_plugins.include?(spec.name) # O(I) per spec - ... - end -end -``` - -**Fix:** Build a `Set` once before each loop. `require "set"` already loaded at line 6. - -| Benchmark (S specs × P plugins) | defective | fixed | speedup | -|---------------------------------|-----------|-------|---------| -| 200×100 | 0.44ms | 0.05ms | 9.0× | -| 500×200 | 2.32ms | 0.14ms | 16.1× | -| 1000×500 | 6.80ms | 0.12ms | 59.3× | -| 2000×1000 | 30.15ms | 0.24ms | 127.1× | - -## Scanner Evidence - -`unmoad` flags both call sites at HIGH severity via the `array-includes-in-loop` rule. - -## Patches - -- `vagrant-0001-bundler-plugin-include-in-loop.patch` diff --git a/whitepaper/outreach/victoria-metrics.md b/whitepaper/outreach/victoria-metrics.md index b0883de83..c13ecd74b 100644 --- a/whitepaper/outreach/victoria-metrics.md +++ b/whitepaper/outreach/victoria-metrics.md @@ -3,7 +3,7 @@ **Project:** VictoriaMetrics (time-series database) **Disclosure date:** 2026-03-27 **Severity:** HIGH -**Speedup:** 368× measured · 20× per-defect scenario +**Speedup:** 20× **Status:** PATCHED --- diff --git a/whitepaper/outreach/vitest.md b/whitepaper/outreach/vitest.md deleted file mode 100644 index 4bd4cf53c..000000000 --- a/whitepaper/outreach/vitest.md +++ /dev/null @@ -1,56 +0,0 @@ -# Vitest — CWE-407 Disclosure Brief - -**Project:** Vitest (vitest-dev/vitest) -**Disclosure date:** 2026-04-23 -**Severity:** MEDIUM-HIGH -**Speedup:** 824x at N=M=10000 coverage entries, confirmed by benchmark -**Status:** patch-ready, 1 patch plus test suite, benchmarks complete - ---- - -## Summary - -`@vitest/coverage-v8` merges V8 coverage data from every worker process after every test run. When `mergeProcessCovs` drops a `startOffset` (observed on Vue projects), the merger rebuilds it by calling `Array.find` inside `Array.forEach`. For N merged results × M per-process entries, cost is O(N×M). - -Coverage data scales with project size × test count. Monorepos routinely hit 10k+ entries. Our benchmark measures 2147ms defective vs 2.6ms fixed at N=M=10000: 824× faster. - -## The Defects - -**vitest-0001 (MOAD-0001 — MEDIUM-HIGH):** `packages/coverage-v8/src/provider.ts:50-59` - -```typescript -await this.readCoverageFiles({ - onFileRead(coverage) { - merged = mergeProcessCovs([merged, coverage]) - - merged.result.forEach((result) => { - if (!result.startOffset) { - const original = coverage.result.find(r => r.url === result.url) // O(M) - result.startOffset = original?.startOffset || 0 - } - }) - }, - ... -}) -``` - -**Fix:** Build a `Map` keyed by `url` once per `onFileRead`. O(1) lookup per missing-startOffset entry. - -| Benchmark (N=M coverage entries) | defective | fixed | speedup | -|----------------------------------|-----------|---------|---------| -| 500 | 5.93ms | 0.12ms | 50.6x | -| 1000 | 21.03ms | 0.21ms | 100.8x | -| 5000 | 524.47ms | 1.12ms | 470.1x | -| 10000 | 2147.68ms | 2.57ms | 839.9x | - -Runs on every `vitest --coverage` invocation and every coverage-enabled CI pipeline. Affects every Vitest user who runs coverage. - -## Scanner Evidence - -`unmoad` detects the pattern at HIGH severity. Trigger + clean fixture pair in `tests/integration/fixtures/moad_0001/`. - -## Patches - -- `vitest-0001-coverage-v8-result-find.patch` (UNDF-2026-000001295) - -Full test + bench suite at `defects/vitest/` in the java-topology research repo. diff --git a/whitepaper/outreach/wave10-crypto-text-geo-flutter-survey.md b/whitepaper/outreach/wave10-crypto-text-geo-flutter-survey.md deleted file mode 100644 index d68f00073..000000000 --- a/whitepaper/outreach/wave10-crypto-text-geo-flutter-survey.md +++ /dev/null @@ -1,89 +0,0 @@ -# Wave 10 — Cryptography, Text Shaping, Geospatial, Flutter Engine - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across cryptography (libsodium, rustls, ring, mbedtls, wolfssl), text rendering (harfbuzz, freetype, cairo), geospatial (gdal), and cross-platform UI (flutter engine). - ---- - -## Summary - -Wave 10 totals 792 HIGH+ findings across 10 projects. **Six new clean-scan honor roll entries.** Honor roll cumulative: **47 projects** across waves 3-10. - -**No flagship CWE-407 patches ship this pass.** Cryptography libraries follow a strong pattern of fixed-cipher-suite tables and bounded TLS scheme negotiation (5-15 entries per ClientHello). Text rendering libraries scan font tables bounded by font-format spec (BDF, TrueType). GDAL's `cpl::contains` helper wraps `std::map::find` (O(log N)) — scanner does not yet model the wrapper. - -## Clean-scan honor roll — 6 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **libsodium** | C | Modern crypto library | 85 findings, 79 are M4 in test code (`printf("FAIL tc=...")`, `printf("shared secrets don't match")`, `printf("password ...")`) — credential-keyword string-literal FPs in test diagnostics. Core code clean. | -| **ring** | Rust | Cryptographic primitives | 5 findings: 2 are `Range.contains` (O(1)), 1 is a Perl asm-generation script, 2 are test fixtures. **clean** | -| **cairo** | C | 2D graphics library | 4 findings, all bounded fixed-table strcmp (PDF metadata names, perf-test arg parsing, test ref-suffix). **clean** | -| **harfbuzz** | C++ | Text shaping engine | 5 findings: 1 is a Meson build script, 1 is a Python codegen tool, 1 is a vendored test data file (react-dom.txt), 1 is a Python regex test, 1 is `gen-emoji-table.py` line index. **clean** | -| **mbedtls** | C | Embedded TLS | 75 findings, all M1 hits in `programs/x509/`, `programs/ssl/` are CLI argument parsing with fixed compile-time string tables (`"-d"`, `"-h"`, `"basic_constraints"`, `"rsa_pkcs1_sha256"`). Bounded constants. | -| **wolfssl** | C | Embedded TLS for IoT/embedded | 84 findings: 27/37 M1 in tests/examples; 10 non-test are months[12] / commandTable / "shutdown" string FPs in IDE example servers. Core crypto clean. | - -Honor roll now stands at **47 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| flutter engine | C++/Dart/Java | 222 | 13 | 13 | 1 | 8 | - | 186 | - | 1 | M7 cluster (186) dominated by `String.contains(pattern)` for license parsing in `tools/licenses/`, channel-name `'\u0000'` validation, and `Set.contains(rune)` in font fallback (O(1)). Scanner FP on string-search vs spatial-query. | -| gdal | C++ | 211 | 81 | 4 | 21 | 1 | 2 | 102 | - | - | `cpl::contains` is template wrapper around `container.find(value) != container.end()` — for `std::map`/`std::set` types it's O(log N). `m_oMapDimensions` is `std::map`. Scanner needs awareness of generic `cpl::contains` wrapper. | -| **libsodium** | C | 85 | 5 | - | 79 | - | - | 1 | - | - | M4 cluster all in test diagnostic strings. M1 = `argon2-encoding.c` prefix strncmp on argon2 variant prefix table (3 entries). **clean** | -| **wolfssl** | C | 84 | 37 | - | 45 | - | 2 | - | - | - | M4 cluster in test logs. Core crypto: bounded fixed-cipher tables. **clean** | -| freetype | C | 52 | 45 | - | - | - | - | 7 | - | - | `bdflib.c` line-prefix tests on fixed BDF font commands. `ftobjs.c` service_id lookup bounded by service-table size. M7 = SDF (signed distance field) edge math, intentional algorithm not lookup. | -| **mbedtls** | C | 75 | 58 | 5 | 11 | - | - | - | 1 | - | All M1 in `programs/x509/`, `programs/ssl/` CLI parsing. Bounded compile-time tables. **clean** | -| rustls | Rust | 49 | 23 | - | 2 | - | - | 23 | 1 | - | `offered.contains(scheme)` — `offered` is TLS SignatureScheme list from ClientHello, bounded by TLS-protocol spec (5-15 schemes). Bounded. | -| **harfbuzz** | C++ | 5 | 2 | - | - | 1 | - | 1 | - | 1 | Build scripts + codegen. **clean** | -| **ring** | Rust | 5 | 3 | - | - | - | - | 2 | - | - | Range.contains + perlasm + tests. **clean** | -| **cairo** | C | 4 | 4 | - | - | - | - | - | - | - | Bounded fixed-table strcmp. **clean** | - -## Investigations that did not patch-ship - -### gdal `cpl::contains` template wrapper — scanner false positive - -```cpp -// port/cpl_port.h:1228 -template -inline bool contains(const C &container, const V &value) { - return container.find(value) != container.end(); -} -``` - -The detector flags `cpl::contains(m_oMapDimensions, osVarName)` as `vec-contains-in-loop`/`spatial-query-no-index` because of the call shape. But `m_oMapDimensions` is `std::map>` — `.find()` on std::map is O(log N), and on std::set/std::unordered_* it's O(log N) or O(1). The wrapper hides the underlying complexity from the scanner's pattern match. - -**Detector enhancement candidate:** template/wrapper-aware containment detection. When a `contains` helper is defined as `container.find(value) != container.end()`, look at the container's declared type to decide whether the underlying lookup is logarithmic or constant — not linear. - -### flutter engine `Set.contains` and `String.contains(pattern)` - -The 186 M7 hits in `engine/` are dominated by: -1. `String.contains(pattern)` for license-text scraping in `tools/licenses/lib/licenses.dart` — these are string searches (O(N)), but the loop iterates lines, so total cost is O(L × average-line-length). Bounded by license-file size. -2. `channelName.contains('\u0000')` validation — single-char scan, not a "spatial query". -3. `knownCoveredCodePoints.contains(rune)` where `knownCoveredCodePoints` is `Set` — O(1). - -Scanner classifies all `*.contains()` patterns inside any loop as candidate Flatland defects. Distinguishing string-substring search from O(N) container lookup from O(1) hashed-set lookup requires type awareness the M7 detector does not yet have. - -### Cryptography pattern observation - -Across libsodium, rustls, ring, mbedtls, wolfssl — the dominant M1 pattern is fixed cipher-suite/algorithm-name tables. TLS 1.3 has 17 standard signature schemes; mbedtls's CLI option table has ~50 entries; libsodium's argon2 variant prefix list has 3. These are all bounded by protocol specs and small constants. Not CWE-407. - -The dominant M4 pattern (libsodium 79, wolfssl 45) is test-suite diagnostic `printf` strings containing words like "password", "secret", "token" as part of failure messages — credential-keyword string-literal false positives in test code. - -## Triage backlog - -1. **Scanner enhancement: template/wrapper-aware containment** — recognize generic `contains(container, value)` wrappers (gdal `cpl::contains`, others) and propagate type info from the container's declared type. This would suppress most of gdal's 81+102 hits. -2. **Scanner enhancement: M7 string-substring detection** — distinguish `String.contains(needle)` (substring search, O(N) per call where N is string length) from `Container.contains(element)` (membership test, varies by container type). Different patterns deserve different rules. Would suppress ~150 of flutter engine's 186 M7 hits. -3. **Scanner enhancement: M4 test-context detection** — suppress credential-keyword-in-string-literal findings inside `*_test.c`, `tests/`, `test/` directories where the keyword appears in a printf format string, not a value being logged. Would suppress ~140 false positives wave-wide. -4. **freetype SDF math** — confirm M7 hits in `ftsdf.c`/`ftbsdf.c` are intentional signed-distance-field algorithms, not lookups. Likely an FP cluster from M7 detector matching `_distance(` function names. - -## Method - -Same as Waves 3-9: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. Six projects added to clean-scan honor roll. No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/` -- Clean-scan honor roll cumulative: 47 projects across waves 3-10 diff --git a/whitepaper/outreach/wave11-unix-search-ml-survey.md b/whitepaper/outreach/wave11-unix-search-ml-survey.md deleted file mode 100644 index ea42b92e8..000000000 --- a/whitepaper/outreach/wave11-unix-search-ml-survey.md +++ /dev/null @@ -1,79 +0,0 @@ -# Wave 11 — Unix Base Tools, Search/Vector DBs, ML Serving - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across the Unix base layer (bash, coreutils, util-linux, busybox, openssh-portable, rsync) and modern search/ML serving (meilisearch, qdrant, weaviate, onnxruntime). - ---- - -## Summary - -Wave 11 totals 1,937 HIGH+ findings across 10 projects. **Two new clean-scan honor roll entries (bash, coreutils)** plus **one flagship CWE-407 patch shipped (weaviate-0001)** with 87×–1735× measured speedup across realistic scales. Honor roll cumulative: **49 projects** across waves 3-11. - -## Flagship patch shipped this wave - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| weaviate | RBAC filter slices.Contains per item | 1735× @ N=50k K=5k | UNDF-2026-000001300 | - -`weaviate-0001` lands a 5-line set hoist in `usecases/auth/authorization/filter/filter.go`. The current code does `slices.Contains(allowedList, resourceFn(item))` per item in the result list — O(N × K). Multi-tenant deployments with hundreds-to-thousands of permitted resources per principal pay this on every authorized read. Bench (defects/weaviate/bench/) shows 8-second filter cost at N=50k K=5k drops to 5ms with the fix. - -## Clean-scan honor roll — 2 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **bash** | C | GNU Bourne-Again Shell | 8 findings: 7 M1 in `support/man2html.c` (one-shot man-to-HTML build tool) + 1 in `examples/loadables/` + 1 in stringvec.c comment context. Core shell clean. | -| **coreutils** | C | GNU coreutils | 5 findings, all in `tests/*.pl` test scripts using Perl `grep` for filter assertions. Test code only, core clean. | - -Honor roll now stands at **49 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| onnxruntime | C++/Python/Java | 458 | 276 | 53 | 63 | 5 | - | 55 | 3 | 3 | Java `OrtSession.inputNames.contains(t.getKey())` — `inputNames` is `Set` (O(1)). Python `_custom_op_symbolic_registry.py` perm.index — model-export glue, runs once per ONNX export, not training. | -| **weaviate** | Go | 384 | 35 | 125 | 213 | - | - | 11 | - | - | **flagship: filter.go:115 RBAC filter shipped as weaviate-0001** | -| util-linux | C | 305 | 268 | - | 32 | - | - | 5 | - | - | `fsck.c`, `blkid.c`, `lscpu.c`, `libmount` — all M1 hits are fixed-table strcmp on filesystem types, mount options, CPU vendor strings. Bounded compile-time tables. | -| busybox | C | 232 | 203 | - | 25 | - | 2 | 2 | - | - | `ash.c`, `dpkg.c`, `modutils-24.c`, `e2fsprogs/fsck.c` — same pattern as util-linux: package/module/option name lookups with hash-table-backed dpkg storage. Bounded. | -| qdrant | Rust | 177 | 84 | 5 | 1 | - | - | 86 | - | 1 | `condition_checker.rs:165` `stored.contains(text)` is String substring search (intentional FullText filter). `merge_optimizer.rs:165` segments_to_merge.contains is in `assert!()` (test). `points_to_keep` is HashSet. | -| openssh-portable | C | 168 | 154 | - | 11 | - | 3 | - | - | - | `servconf.c` keyword lookups against fixed config-table (~80 entries). `kex.c` algorithm-name comparisons bounded by SSH protocol cipher list. Bounded. | -| meilisearch | Rust | 144 | 68 | - | 4 | 3 | - | 69 | - | - | `cheapest_paths.rs:363` `reachable.contains(n)` — `reachable` is `SmallBitmap` (O(1)). `index_documents/mod.rs:3348` `deleted_internal_ids` is RoaringBitmap (O(log)). | -| rsync | C | 56 | 33 | - | 12 | - | - | - | - | 11 | `xattrs.c` xattr-name lookups bounded by xattr count (typically <10). `util1.c` extension check on fixed `bak`/`old` strings. M11 ReDoS hits in `md-convert` build script — non-runtime. | -| **bash** | C | 8 | 7 | - | - | - | - | - | - | 1 | man2html / examples / comments. **clean** | -| **coreutils** | C | 5 | 4 | - | - | - | - | - | - | 1 | tests/*.pl Perl grep. **clean** | - -## Investigation notes - -### onnxruntime Java `inputNames.contains` — false positive - -`OrtSession.java:377` flagged as `contains-in-loop`. Inspected line 53: `private final Set inputNames;` — already O(1) hash-set membership. Scanner does not yet model Java `Set` declared types, so the check fires on the call shape `.contains()`. Same pattern at `OrtTrainingSession.java:517` (also `Set`). - -### meilisearch `cheapest_paths.rs:363` — false positive - -`reachable.contains(n)` flagged inside a stack-based BFS. `reachable` is declared `SmallBitmap::for_interned_values_in(&self.query_graph.nodes)` — a bitmap with O(1) contains. Scanner needs Rust SmallBitmap/RoaringBitmap awareness (same gap noted in Waves 8 + 9). - -### qdrant `condition_checker.rs:165` — String substring search, not container lookup - -`Value::String(stored) => stored.contains(text)` is `str::contains(needle)` — substring search inside a stored field value. This is the intentional implementation of Weaviate's full-text-style filter on indexed text fields. Not a container-membership defect; substring search is the algorithm's job. - -### Unix base layer pattern observation - -Across bash, coreutils, util-linux, busybox, openssh-portable — the dominant M1 pattern is fixed compile-time tables: filesystem types (`btrfs`, `ext4`, `xfs`, `cifs`, `smb3`...), mount options, command-name dispatch tables, SSH cipher names, package fields. These tables are bounded by spec or distro convention (10-100 entries) and `strcmp` linear scan is appropriate at that scale. The Unix base layer has been carefully optimized over decades; almost no real CWE-407 hides here. - -## Triage backlog - -1. **Scanner enhancement: Java Set awareness** — propagate declared type through `.contains()` call to suppress `inputNames.contains(...)` FPs when the receiver is `Set` or `Map.keySet()`. -2. **Scanner enhancement: M1 substring vs membership** — distinguish `String.contains(needle)` (substring search) from `Container.contains(element)` (membership test). Different patterns, different rules. -3. **onnxruntime Python op-symbolic-registry** — `perm.index(axis)` patterns in ONNX export glue; bounded by tensor rank but worth a focused pass if a real perf report surfaces. -4. **rsync `md-convert` ReDoS** — build-script regex, not runtime; low-priority. - -## Method - -Same as Waves 3-10: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. Two projects added to clean-scan honor roll. **One flagship CWE-407 patch shipped: weaviate-0001 → UNDF-2026-000001300.** - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- weaviate intel page: `/weaviate/` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/` -- Clean-scan honor roll cumulative: 49 projects across waves 3-11 diff --git a/whitepaper/outreach/wave12-sci-static-site-api-gateway-survey.md b/whitepaper/outreach/wave12-sci-static-site-api-gateway-survey.md deleted file mode 100644 index 8cdbb3d9b..000000000 --- a/whitepaper/outreach/wave12-sci-static-site-api-gateway-survey.md +++ /dev/null @@ -1,80 +0,0 @@ -# Wave 12 — Science, Static Site Generators, API Gateways, Game Libs - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across scientific computing (scipy, jax), Matrix server (synapse), static site generators (hugo, jekyll, eleventy), API gateways/proxies (kong, traefik), data orchestration (dagster), and game libraries (raylib). - ---- - -## Summary - -Wave 12 totals 1,880 HIGH+ findings across 10 projects. **Five new clean-scan honor roll entries** (jekyll, eleventy, kong, hugo, raylib). Honor roll cumulative: **54 projects** across waves 3-12. - -**No flagship CWE-407 patches ship this pass.** Static site generators have tight, bounded codebases. API gateways like kong are dominated by M4 string-literal false positives in test fixtures (auth header names appearing as test data). Scientific libraries (scipy, jax) have M7 hits dominated by intentional distance/algorithm function names matching the `_distance(` heuristic. - -## Clean-scan honor roll — 5 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **jekyll** | Ruby | Static site generator | 10 findings, all `Array#include?` on small bounded constants (NESTED_OBJECT_FIELD_BLACKLIST, ATTRIBUTES_FOR_LIQUID, etc.) + 1 vendored respond.min.js. Core gem clean. | -| **eleventy** | Node | Modern static site generator | 10 findings, all JS `Array#includes` on small bounded arrays (validTemplateLanguageKeys, STAGES, file lookups, error string matching). Tight codebase. | -| **kong** | Lua | Cloud-native API gateway | 49 findings, **0 M1**. All M4 are "Authorization"/"Proxy-Authorization" header names appearing as test data in `t/01-pdk/02-log/05-set_serialize_value.t` — credential-keyword-in-string-literal FPs in the PDK log test suite. | -| **hugo** | Go | Static site generator (fastest in class) | 54 findings, dominated by `internal/warpc/js/renderkatex.bundle.js` (vendored KaTeX renderer JS bundle). Core hugo Go code clean. | -| **raylib** | C | Simple game library | 159 findings: 64 in vendored `cgltf.h` (Khronos glTF parser), 20 in vendored `m3d.h` (model3d format), 12 in vendored `miniaudio.h` distance APIs, 6 in `tools/rexm/rexm.c` CLI tool. raylib core clean. | - -Honor roll now stands at **54 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| scipy | C/Python | 459 | 60 | 338 | 10 | 1 | - | 48 | - | 2 | M7 cluster in `spatial/src/distance_impl.h` (mahalanobis, minkowski, euclidean, jensenshannon) — intentional distance algorithms, scanner FP on `_distance(` name match. SuperLU `strncmp(trans, "N", 1)` is single-char algorithm flag. M3 cluster mostly in tests. | -| dagster | Python/TS | 442 | 229 | 108 | 12 | 18 | 27 | 24 | 21 | 3 | Most M1 in vendored `graphiql.min.js`, `react-dom.production.min.js`, `graphiql-plugin-explorer.umd.js`. UI source `useAssetCheckPartitionData.tsx` `partitions.indexOf(range.startKey)` — partitions list scales with asset partition count; bounded by user-configured partition cardinality. | -| jax | Python | 411 | 95 | 286 | 8 | 6 | - | 9 | - | 7 | `lax_reference.py` is reference impl for testing. `convolution.py` `lhs_dilation.count(1)` is one-shot at lowering. `bcoo.py` `operator.index(n)` is type-conversion call, not a list index. M3 in tests. | -| synapse | Python/Rust | 194 | 26 | 98 | 55 | - | 6 | 8 | - | 1 | jquery-3.4.1.min.js vendored (23 hits). `rust/src/push/utils.rs:148` `haystack.contains(&*word)` is intentional substring pre-check before regex (optimization). M3 cluster in test contexts. | -| **raylib** | C | 159 | 154 | - | - | - | - | 5 | - | - | All M1 in vendored `cgltf.h`/`m3d.h`/CLI tool. **clean** | -| traefik | Go | 92 | 23 | 51 | 9 | - | 7 | 2 | - | - | `compress.go:80` `slices.Contains(defaultSupportedEncodings, encoding)` per request — `defaultSupportedEncodings` is fixed constant (gzip, br, zstd, deflate, ~5 entries). `gen/centrifuge.go` is a code generator (build-time). Bounded. | -| **hugo** | Go | 54 | 34 | 3 | 3 | 1 | - | 12 | - | 1 | Vendored renderkatex JS dominates. **clean** | -| **kong** | Lua | 49 | - | - | 25 | 12 | 2 | 9 | - | 1 | Test-fixture credential headers. **clean** | -| **jekyll** | Ruby | 10 | 10 | - | - | - | - | - | - | - | Bounded constant arrays. **clean** | -| **eleventy** | Node | 10 | 10 | - | - | - | - | - | - | - | Bounded arrays + error-message string contains. **clean** | - -## Investigation notes - -### scipy `distance_impl.h` M7 cluster — false positive on function names - -```c -mahalanobis_distance(const double *u, const double *v, ...) -minkowski_distance(const double *u, const double *v, ...) -``` - -These are intentional distance-metric implementations for scipy.spatial.distance. The M7 detector matches `_distance(` substring as candidate Flatland defects, but these ARE the distance-metric algorithms — not lookups against an index. **Detector enhancement candidate:** suppress M7 when matched function is itself a distance/metric primitive. - -### synapse Rust push notification matcher — intentional substring pre-check - -`Matcher::Word { word, regex }` does `if !haystack.contains(&*word) { return Ok(false); }` BEFORE running the more expensive word-boundary regex. This is a deliberate optimization (cheap substring check rejects ~99% of non-matches before regex compilation). Not a defect — an existing optimization the scanner does not yet model. - -### kong M4 cluster — test fixture false positives - -49 of 49 kong findings are credential-keyword-in-string-literal hits in test files (`.t` files) and spec fixtures. The PDK log test suite uses headers like `request.headers.authorization` as TEST DATA to verify the PDK's serialization behavior. Bounded to test code. Same pattern as Wave 10's libsodium/wolfssl test diagnostic strings. - -### dagster `useAssetCheckPartitionData.tsx` partitions.indexOf - -`partitions.indexOf(range.startKey)` runs O(P) where P is the asset's partition count. For users with 10k+ partitions per asset (rare), this becomes measurable per range render. Logged for re-scan if a user reports realistic perf impact. - -## Triage backlog - -1. **Scanner enhancement: M7 distance-primitive detection** — suppress M7 when the function name being defined ends in `_distance`/`_metric` (the function IS the algorithm, not a lookup). Would clear most of scipy's 48 M7 hits. -2. **Scanner enhancement: M4 test-context detection** — already noted in Wave 10. Wave 12 reinforces: kong (49), synapse (55), dagster (12), scipy (10) all carry credential-keyword test-data FPs. A `*_test.*` / `t/` / `spec/` / `tests/` path prefix suppression would clear ~150 false positives wave-wide. -3. **synapse Rust push utils** — re-scan if a real perf report lands; current substring pre-check is an intentional optimization. -4. **dagster partitions.indexOf** — re-scan if a user reports realistic 10k+ partition cardinality slowing UI. - -## Method - -Same as Waves 3-11: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI/macro-generated noise, manual triage of strongest source-only candidates per project. **Five projects added to clean-scan honor roll.** No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/` -- Clean-scan honor roll cumulative: 54 projects across waves 3-12 diff --git a/whitepaper/outreach/wave13-vms-devtools-graphql-survey.md b/whitepaper/outreach/wave13-vms-devtools-graphql-survey.md deleted file mode 100644 index f9aeb7e6f..000000000 --- a/whitepaper/outreach/wave13-vms-devtools-graphql-survey.md +++ /dev/null @@ -1,85 +0,0 @@ -# Wave 13 — VMs/Emulators, Dev Tools, GraphQL, Profilers - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across emulators (qemu, firecracker, kata-containers, lima), dev tools (deno, gitea, nix, act), GraphQL (apollo-server), and profilers (pyroscope). - ---- - -## Summary - -Wave 13 totals 1,706 HIGH+ findings across 10 projects. **One flagship CWE-407 patch shipped (pyroscope-0001 with 47×–438× measured speedup)** plus **5 new clean-scan honor roll entries** (lima, apollo-server, act, firecracker, nix). Honor roll cumulative: **59 projects** across waves 3-13. - -## Flagship patch shipped this wave - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| pyroscope | PhlareDB.GetBlockStats slices.Contains per block | 438× @ B=10k U=1k | UNDF-2026-000001301 | - -`pyroscope-0001` lands a 6-line set hoist in `pkg/phlaredb/phlaredb.go:597-613`. The current code does `slices.Contains(req.Msg.GetUlids(), h.meta.ULID.String())` per block across three block sets (heads, flushing, queriers) — O(B × U). Long-retention tenants accumulate thousands of block queriers; block-stats RPC at B=10k U=1k drops from 240ms to 0.55ms with the fix. - -## Clean-scan honor roll — 5 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **lima** | Go | Linux VMs on macOS | 11 findings: 3 in test files, 4 sudoers messages (M4 FPs on "password" word in NOPASSWD literal), 2 ContextWithValue (intentional config plumbing). Core lima clean. | -| **apollo-server** | TS | GraphQL server | 6 findings: 1 base64 encoding (not weak hash), 1 fixed CSRF content-type list (3 entries), 1 traceTreeBuilder children find per node (bounded), 3 doc samples. **clean** | -| **act** | Go | Run GitHub Actions locally | 16 findings: most in `pkg/runner/hashfiles/index.js` (vendored from @actions/toolkit), 2 ContextWithValue (intentional logger plumbing), 2 test fixture URLs. **clean** | -| **firecracker** | Rust | AWS microVM monitor | 59 findings: 25 M1 + 25 M7. All M1 patterns are bounded (network_interfaces.contains by device add, hw_breakpoints.contains by gdb breakpoint count, supported_opcodes.contains on fixed io_uring opcode list, DEFERRED_MSRS.contains on fixed MSR list). **clean** | -| **nix** | C++ | Functional package manager | 59 findings: 20 M1 dominated by vendored `theme/highlight.js`. M7 cluster `attrs.contains("key")` is `nlohmann::json` map containment (O(1)). **clean** | - -Honor roll now stands at **59 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| deno | TS/Rust | 651 | 271 | 23 | 17 | 60 | 49 | 229 | - | 2 | `cli/tsc/00_typescript.js` (vendored TypeScript compiler, 29 hits). `libs/npm/resolution/graph.rs:616/670` cycle detection in npm dependency graph (bounded by package count). `cli/tools/compile.rs` config include/exclude (config-time). | -| qemu | C | 357 | 287 | 3 | 34 | - | 1 | 26 | - | 6 | All M1 fixed-table strcmp on block driver names, NFS keys, mount types, ACPI table names, fw_cfg files. Bounded compile-time tables. | -| gitea | Go/TS | 260 | 41 | 24 | 176 | - | 5 | 12 | 2 | - | M1 in `web_src/js/` UI code on small bounded arrays (topics, dropdown menus). M4 cluster in templates and migration notes. | -| **pyroscope** | Go | 155 | 85 | 17 | 2 | - | - | 51 | - | - | **flagship: phlaredb.go:597 GetBlockStats shipped as pyroscope-0001** | -| kata-containers | Rust/Go | 132 | 51 | 5 | 24 | - | - | 51 | - | 1 | `kata-deploy/binary/src/config.rs` shim_for_arch on small arch list. Other `String.contains` are path validation (substring search). Bounded. | -| **firecracker** | Rust | 59 | 25 | - | 7 | - | - | 25 | - | 2 | All bounded patterns. **clean** | -| **nix** | C++ | 59 | 20 | - | 12 | - | - | 27 | - | - | nlohmann::json map containment + vendored highlight.js. **clean** | -| **act** | Go | 16 | 5 | 6 | 3 | - | 2 | - | - | - | Vendored @actions/toolkit + test fixtures. **clean** | -| **lima** | Go | 11 | 5 | 2 | 4 | - | - | - | - | - | Test files + sudoers strings + ContextWithValue. **clean** | -| **apollo-server** | TS | 6 | 2 | - | 3 | - | 1 | - | - | - | Bounded CSRF list + base64 encoding + docs. **clean** | - -## Investigation: pyroscope `PhlareDB.GetBlockStats` — flagship CWE-407 - -Found a real O(B × U) — slices.Contains on requested-ULID list, per block, across three block sets. Long-retention pyroscope tenants accumulate 5k-10k blocks; block-stats RPC with hundreds of ULIDs from a UI inspect call hits 1M+ membership checks per call. Set hoist gives 47×–438× speedup. Patch shipped as UNDF-2026-000001301. - -## Other investigations - -### qemu fixed-table strcmp (287 hits) - -Block driver registry, NFS option keys, mount type checks, ACPI table file names, fw_cfg files, virtfs.uid/gid prefix tests — all on compile-time string tables of 5-50 entries. Linear scan is appropriate at this scale. No defect. - -### deno `cli/tools/compile.rs` include/exclude - -`effective_include.contains(inc)` and `effective_exclude.contains(exc)` are config-time validation that user-supplied include/exclude lists don't conflict. Runs once per `deno compile` invocation. Bounded by user config size. - -### kata-containers `kata-deploy/config.rs` shim_for_arch - -`shims_for_arch.contains(&self.default_shim_for_arch)` is one-shot config validation at startup. Architecture list is small (x86_64, aarch64, s390x, ppc64le). - -### firecracker `supported_opcodes.contains` and `DEFERRED_MSRS.contains` - -`supported_opcodes` is a fixed io_uring opcode list (~20 entries). `DEFERRED_MSRS` is a fixed MSR list (~10 entries). Both compile-time constants. No defect. - -## Triage backlog - -1. **gitea web_src/js patterns** — bounded today by topic counts; re-scan if a real perf report surfaces with 100+ topics per repo. -2. **deno graph.rs cyclic_nvs.contains** — npm dependency cycle detection; bounded by package count today, worth re-scan if mono-repo install-graphs grow. -3. **qemu strcmp fixed tables** — already optimal at current table sizes; if QEMU adds 100+ block drivers (unlikely), this becomes interesting. - -## Method - -Same as Waves 3-12: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. Five projects added to clean-scan honor roll. **One flagship CWE-407 patch shipped: pyroscope-0001 → UNDF-2026-000001301.** - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- pyroscope intel page: `/pyroscope/` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/`, `/wave12-sci-static-site-api-gateway-survey/` -- Clean-scan honor roll cumulative: 59 projects across waves 3-13 diff --git a/whitepaper/outreach/wave14-mobile-edge-pl-wm-survey.md b/whitepaper/outreach/wave14-mobile-edge-pl-wm-survey.md deleted file mode 100644 index a9dba420d..000000000 --- a/whitepaper/outreach/wave14-mobile-edge-pl-wm-survey.md +++ /dev/null @@ -1,77 +0,0 @@ -# Wave 14 — Mobile, Edge, Serverless, Languages, Window Managers - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across mobile (react-native), edge runtimes (workerd), serverless (knative-serving, openfaas), language compilers (ocaml, ghc), embedded (micropython), Wayland window managers (sway, Hyprland), and parser frameworks (tree-sitter). - ---- - -## Summary - -Wave 14 totals 1,467 HIGH+ findings across 10 projects. **Seven new clean-scan honor roll entries** (ocaml, Hyprland, serving, tree-sitter, faas, sway, micropython). Honor roll cumulative: **66 projects** across waves 3-14. - -**No flagship CWE-407 patches ship this pass.** Wayland window managers (sway, Hyprland) follow the desktop-app pattern of bounded device counts and intentional geometric algorithms. Language compilers (ocaml, ghc) cluster their findings in build-time scripts (yacc, unlit) and vendored doc JS. Edge runtimes (workerd) carry RFC-spec-bounded parsing. The serverless control plane (knative-serving) has 123 of its 128 findings as intentional `context.WithValue` plumbing in test factories and config stores. - -## Clean-scan honor roll — 7 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **ocaml** | C/OCaml | OCaml language and runtime | 20 findings: `yacc/` is the OCaml port of yacc (parser generator, build-time only); `runtime/` strcmp on registered ops list (small) and "."/".." dirent skip. **clean** | -| **Hyprland** | C++ | Dynamic tiling Wayland compositor | 46 findings, **all M7**, all FPs: `*.distance(`, `*.distanceSq(`, `*.overlaps(`, `*.closestPoint(` are intentional geometry primitives; `m_tokens.contains(uuid)` is `std::unordered_map` (O(1)); `code.contains("%rip")`, `line.contains(name)` are String substring searches. **clean** | -| **knative-serving** | Go | Knative Serving (serverless workloads on k8s) | 128 findings: 123 M3 are intentional `context.WithValue` propagation in test factories and reconciler config stores — standard knative pattern, not "leaked context" defects. **clean** | -| **tree-sitter** | C/Rust | Incremental parsing framework | 125 findings: M1 hits are `language.c` strncmp on grammar-defined symbol/field name tables (bounded by grammar size, fixed at compile time); `binding_*.ts/rust` patterns also grammar-bounded. **clean** | -| **openfaas-faas** | Go/JS | Functions as a Service | 131 findings, 120 M1 ALL in vendored `angular-material.min.js` (89), `angular.min.js` (27), `angular-animate.min.js` (4). Core gateway clean. | -| **sway** | C | Wayland tiling compositor (i3 spiritual successor) | 98 findings, all M1, all CLI/option parsing strcmp (`--release`, `--locked`, workspace name matching) and input-device identifier matching bounded by user device count. **clean** | -| **micropython** | C | Python implementation for microcontrollers | 108 findings: `mpy-cross/main.c`, `ports/unix/main.c` strcmp on -X/-c/-m/-h CLI args; `emitinlinethumb.c` ARM Thumb register names (fixed by ISA). All compile-time bounded. **clean** | - -Honor roll now stands at **66 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| react-native | JS/C++/Java | 517 | 108 | 360 | 1 | 19 | - | 26 | 1 | 2 | M1 in eslint-plugin-monorepo, codegen consistency check, cocoapods utils, version-canary check — all build-time scripts. M3 cluster in test files. | -| workerd | C++/TS | 207 | 74 | 46 | 1 | 27 | 36 | 23 | - | - | Node compat shims (`internal_inspect.ts`, `internal_tls.ts`, `internal_net.ts`) — RFC-spec-bounded parsing of TLS cert patterns, IP addresses, JSON inspect formatting. | -| **knative-serving** | Go | 128 | 2 | 123 | 3 | - | - | - | - | - | M3 cluster intentional. **clean** | -| **openfaas-faas** | Go/JS | 131 | 120 | - | 1 | - | - | 10 | - | - | Vendored angular bundles. **clean** | -| **tree-sitter** | C/Rust | 125 | 67 | - | 2 | - | 1 | 55 | - | - | Grammar-bounded symbol tables. **clean** | -| **micropython** | C | 108 | 46 | 29 | 26 | - | 1 | 2 | - | 4 | CLI args + ARM Thumb registers. **clean** | -| **sway** | C | 98 | 98 | - | - | - | - | - | - | - | CLI/option parsing + device identifiers. **clean** | -| ghc | Haskell/C | 87 | 61 | 2 | 11 | 1 | - | 4 | - | 8 | `utils/unlit/unlit.c` literate Haskell pre-processor (build-time). `rts/linker/LoadArchive.c` archive header magic strings. Vendored haddock JS. | -| **Hyprland** | C++ | 46 | - | - | - | - | - | 46 | - | - | Geometry primitives + std::unordered_map + String substring. **clean** | -| **ocaml** | C/OCaml | 20 | 12 | - | 8 | - | - | - | - | - | yacc + runtime ops table. **clean** | - -## Investigations that did not patch-ship - -### react-native eslint-plugin-monorepo and codegen — all build-time - -The 14-hit cluster in `private/eslint-plugin-monorepo/rules/sort-imports.js` is the (compiled) sort-imports lint rule that runs in CI. Bounded by import count per file. The `compareSnaps.js` and `combine-schemas-cli.js` patterns are codegen consistency checks that run during build. None are runtime. - -### workerd Node compat shims — RFC-spec bounded - -`internal_inspect.ts:749` `str.includes("'")` is util.inspect quote-style detection (single-character substring search). `internal_tls.ts:84` `patternSubdomain.includes('xn--')` is IDN punycode prefix check. `internal_net.ts:1846` `nums.includes(-1)` is IPv4/IPv6 byte validation (4 or 16 entries). All bounded by RFC-spec input shapes. - -### ghc literate Haskell + linker archive — build-time / fixed magic strings - -`utils/unlit/unlit.c:227/229` `strncmp(buf, BEGINCODE, ...)` are literate Haskell `\begin{code}` / `\end{code}` markers, build-time pre-processor. `rts/linker/LoadArchive.c:361` `strncmp(tmp, "!\n", 8)` is the GNU thin-archive magic header check (single comparison). Bounded. - -### Hyprland geometric primitives — intentional algorithms - -The 46 M7 hits are dominated by `Vector2D::distance(other)`, `Box::overlaps(other)`, `Vector2D::distanceSq(other)`, `Box::closestPoint(vec)`. These ARE the geometric primitives Hyprland uses for tiling layout, not lookups against an index. M7 detector matches `_distance(`/`_distanceSq(`/`.overlaps(` substring as candidate Flatland defects, but these are the math primitives. **Detector enhancement candidate already noted in Wave 12 (suppress M7 on distance/metric primitives).** - -## Triage backlog - -1. **Scanner enhancement: Hyprland-style geometry primitive suppression** — same as Wave 12 scipy gap. M7 should not fire on functions whose body computes a distance/metric/overlap rather than performing a lookup. -2. **Scanner enhancement: M3 reconciler-config-store recognition** — knative-style `context.WithValue` for typed config keys (cfgKey{}, deciderKey{}, externalSchemeKey) is intentional Go context plumbing. Suppressing it would clear 100+ M3 hits in knative-serving wave-wide. -3. **react-native private/eslint-plugin-monorepo** — build-time only; if a perf report surfaces from ESLint runtime, re-scan. -4. **workerd Node compat layer** — re-scan if a customer reports Node-compat parsing latency at scale. - -## Method - -Same as Waves 3-13: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. **Seven projects added to clean-scan honor roll.** No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/`, `/wave12-sci-static-site-api-gateway-survey/`, `/wave13-vms-devtools-graphql-survey/` -- Clean-scan honor roll cumulative: 66 projects across waves 3-14 diff --git a/whitepaper/outreach/wave15-security-data-eng-ide-survey.md b/whitepaper/outreach/wave15-security-data-eng-ide-survey.md deleted file mode 100644 index 3f004d618..000000000 --- a/whitepaper/outreach/wave15-security-data-eng-ide-survey.md +++ /dev/null @@ -1,78 +0,0 @@ -# Wave 15 — Container Security, Data Engineering, IDE Backends, OpenAPI - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across container security (trivy, falco, tetragon), data engineering (dbt-core, great_expectations), distributed tracing (zipkin), IDE backends (rust-analyzer, gopls/golang-tools), ORM (prisma), and code generation (swagger-codegen). - ---- - -## Summary - -Wave 15 totals 1,541 HIGH+ findings across 10 projects. **Eight new clean-scan honor roll entries** (falco, dbt-core, tetragon, great_expectations, trivy, zipkin, rust-analyzer, gopls). Honor roll cumulative: **74 projects** across waves 3-15. - -**No flagship CWE-407 patches ship this pass.** IDE backends like rust-analyzer cluster their `.contains()` calls in `assert!()` test asserts (in-source unit tests) and in `bitflags::bitflags!`-generated types (Wave 9 pattern). Container security tools (trivy, falco, tetragon) lookup against fixed severity/type tables (5-10 entries) or user-configured skipDirs/skipFiles bounded by typical config size. - -## Clean-scan honor roll — 8 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **falco** | C++ | Runtime security / syscall detection | 7 findings: `filter_macro_resolver.cpp` cycle check in macro graph (small), `select_event_sources.cpp` source name lookup (5-10 sources), `print_syscall_events.cpp` `available.contains(e)` is `std::set` (O(log)). **clean** | -| **dbt-core** | Python | Analytics engineering tool | 21 findings: 1 git.py md5 (cache key, not credential), 2 InvocationContext ContextVar.set (intentional Python invocation context), 14 in vendored `index.html` (jQuery + cytoscape). **clean** | -| **tetragon** | Go/C | eBPF-based security observability | 31 findings: vendored docsy plantuml.js + prism.js (M1+M11), `pkg/filters/pidSet.go` PID filter list (user-configured small set), `cmd/tetra/explain` k8s shortName lookup. **clean** | -| **great_expectations** | Python | Data quality framework | 76 findings dominated by test fixtures (M3 `_store.set()`, M1 `column_values.count()`) + ReDoS in contrib/experimental expectations. Core framework clean. | -| **trivy** | Go | Container vulnerability scanner | 76 findings: `pkg/result/filter.go` severities is fixed CVE list (5 entries), `sysfile/filter.go` systemFiles is fixed system-path list, `secret/secret.go` skipDirs/skipFiles user-config (bounded), `dpkg/dpkg.go` thirdPartyMaintainerExact is fixed list. **clean** | -| **zipkin** | Java/TS | Distributed tracing system | 110 findings: 85 M3 in test files (`context.WithValue` patterns), `InMemoryStorage` autocompleteKeys is `Set` (FP), UI vendored React patterns. **clean** | -| **rust-analyzer** | Rust | Rust language server | 315 findings: 23 in `symbol_index.rs` are `assert!(names.contains(...))` in-source unit tests, `cfg/dnf.rs` `opts.enabled.contains(atom)` is HashSet-backed cfg-flag set, `hir/src/lib.rs` `AttrFlags::contains(AttrFlags::IS_UNSTABLE)` is bitflags (Wave 9 pattern), `tidy.rs` is build-time, `load-cargo` local_filesets bounded by workspace count. **clean** | -| **gopls (golang/tools)** | Go | Go language server | 86 findings: 17 in vendored `cmd/present/static/jquery.js`, `typesinternal/isnamed.go` `slices.Contains(names, ...)` against fixed allowed-type-name list, `go/ssa/sanity.go` Preds/Succs bounded by basic-block CFG count. **clean** | - -Honor roll now stands at **74 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| swagger-codegen | Java | 555 | 192 | 10 | 37 | 95 | 16 | 177 | - | 28 | jquery vendored (17 hits each in `samples/dynamic-html` and `swagger-static`) + sample fake_api.rb (Ruby sample client output) + `DefaultGenerator.java` `modelsToGenerate.contains` is `Set`. M5/M6/M11 in test fixtures and YAML/JSON samples. | -| **rust-analyzer** | Rust | 315 | 155 | - | 7 | - | - | 147 | 6 | - | All bounded or test asserts. **clean** | -| prisma | TS | 164 | 114 | 41 | 1 | - | 8 | - | - | - | Validate options against fixed enums (errorFormats, logLevels), Model.ts availableActions per model (small fixed enum), buffer-small.ts fixed Uint/Float method names. M3 cluster in test files. | -| **zipkin** | Java/TS | 110 | 14 | 85 | - | 5 | - | 6 | - | - | Test contexts + Set autocompleteKeys. **clean** | -| **gopls** | Go | 86 | 38 | 9 | 27 | 2 | - | 10 | - | - | Vendored jquery + bounded type lists. **clean** | -| **trivy** | Go | 76 | 45 | 4 | 27 | - | - | - | - | - | Fixed severity/system-file/maintainer lists. **clean** | -| **great_expectations** | Python | 76 | 22 | 42 | 7 | 1 | - | 3 | - | 1 | Test fixtures + contrib expectations. **clean** | -| **tetragon** | Go/C | 31 | 12 | 12 | - | - | - | 2 | 1 | 4 | Vendored docsy + bounded pidSet/shortName. **clean** | -| **dbt-core** | Python | 21 | - | 2 | 1 | - | 3 | 14 | - | 1 | Vendored docs HTML + cache md5 + invocation ContextVar. **clean** | -| **falco** | C++ | 7 | 4 | - | - | - | - | 3 | - | - | Macro cycle check + source list + std::set contains. **clean** | - -## Investigation notes - -### rust-analyzer `symbol_index.rs` — 23 hits in in-source unit tests - -`assert!(names.contains(&"InnerStruct"))` and similar are Rust's idiomatic in-source unit test pattern (`#[cfg(test)]` + `mod tests`). Scanner does not yet model the `mod tests { #[test] fn ... }` boundary. **Detector enhancement candidate:** Rust in-source `mod tests` block awareness. - -### rust-analyzer `bitflags::bitflags!` macro pattern (continued from Wave 9) - -`AttrFlags::contains(AttrFlags::IS_UNSTABLE)` and `TraitFlags::contains(TraitFlags::AUTO)` follow the same pattern documented in Wave 9 (helix, alacritty, wezterm) — `bitflags::bitflags!` macro generates `.contains(other: Self)` that compiles to bitwise AND. Same suppression candidate. - -### swagger-codegen `DefaultGenerator.java` — Java Set false positive - -`modelsToGenerate.contains(m)` and `apisToGenerate.contains(m)` flagged as `contains-in-loop` but `modelsToGenerate` and `apisToGenerate` are declared `private Set` — already O(1) hash-set. Same scanner gap noted in Wave 11 onnxruntime. - -### prisma fixed enum lookups - -`errorFormats.includes(options as ErrorFormat)` — errorFormats is the fixed string-literal-union enum `'colorless' | 'minimal' | 'pretty'` (3 entries). `logLevels.includes(level as LogLevel)` — fixed 4 entries. `availableActions.includes(DMMF.ModelAction.aggregate)` — model actions small fixed enum. - -## Triage backlog - -1. **Scanner enhancement: Rust in-source `mod tests` awareness** — suppress findings inside `#[cfg(test)] mod tests { ... }` blocks. Would clear ~25 rust-analyzer FPs and similar Rust patterns wave-wide. -2. **Scanner enhancement: bitflags::bitflags! macro suppression** — already on the backlog from Wave 9; rust-analyzer reinforces the need. -3. **Scanner enhancement: Java Set declared-type awareness** — already on the backlog from Wave 11 onnxruntime; swagger-codegen reinforces. -4. **Scanner enhancement: TypeScript fixed-enum array recognition** — when an array literal is a const string-union enum lookup (errorFormats, logLevels, ModelAction), suppress as bounded. - -## Method - -Same as Waves 3-14: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. **Eight projects added to clean-scan honor roll.** No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/`, `/wave12-sci-static-site-api-gateway-survey/`, `/wave13-vms-devtools-graphql-survey/`, `/wave14-mobile-edge-pl-wm-survey/` -- Clean-scan honor roll cumulative: 74 projects across waves 3-15 diff --git a/whitepaper/outreach/wave16-cms-workflow-bio-node-survey.md b/whitepaper/outreach/wave16-cms-workflow-bio-node-survey.md deleted file mode 100644 index b3134f7c6..000000000 --- a/whitepaper/outreach/wave16-cms-workflow-bio-node-survey.md +++ /dev/null @@ -1,87 +0,0 @@ -# Wave 16 — CMS, Workflow, Bioinformatics, Node Frameworks - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across CMS (WordPress, drupal, mediawiki, Ghost, strapi), workflow (argo-workflows), end-to-end testing (cypress), bioinformatics (samtools), cryptocurrency reference (bitcoin), and Node frameworks (fastify). - ---- - -## Summary - -Wave 16 totals 4,917 HIGH+ findings across 10 projects. **One flagship CWE-407 patch shipped (ghost-0001 with 15×–184× measured speedup)** plus **6 new clean-scan honor roll entries** (fastify, samtools, argo-workflows, cypress, bitcoin, strapi). Honor roll cumulative: **80 projects** across waves 3-16. - -## Flagship patch shipped this wave - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| ghost | ReferrersStatsService Array.find multi-key per conversion | 184× @ A=110k P=1k | UNDF-2026-000001302 | - -`ghost-0001` lands a 9-line `Map` hoist in `ghost/core/core/server/services/stats/referrers-stats-service.js:147-160`. The current code does `allEntries.find(e => e.source === entry.source && e.date === entryDate)` per paid conversion — O(P × A). Long-running Ghost sites with 200+ referral sources × year of dates × hundreds of paid conversions hit 7M+ comparisons per dashboard load. Set hoist drops the merge from 4.2 seconds to 23 milliseconds at A=110k P=1k. - -## Clean-scan honor roll — 6 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **fastify** | Node | Fast Node web framework | 19 findings: `route.js:238/239` `opts.method.includes('GET')` is method-list `.includes` (1-2 entries per route); `plugin-utils.js` registered plugin lookup; rest in test files. Tight core. | -| **samtools** | C | Bioinformatics: SAM/BAM/CRAM tools | 47 findings, all M1 strcmp/strncmp on fixed bioinformatics file format keywords ("Group", "QC", "all", "pass", "fail", "all"/"none"/"off", virtfs/cifs mount-type). Fixed format-spec tables. **clean** | -| **argo-workflows** | Go/TS | Kubernetes workflow engine | 78 findings: 22 M1 mostly UI `Array.find` per condition (bounded), 43 M3 in test files, M9 docs cron expressions (not actual code). **clean** | -| **cypress** | TS | End-to-end testing framework | 745 findings, overwhelmingly in `cypress/e2e/`, `cypress/fixtures/jquery-3.2.1.js`, `cypress/cypress/...` test files / vendored jQuery. Core driver clean. | -| **bitcoin** | C++ | Bitcoin Core reference implementation | 227 findings: `secp256k1/bench.h` benchmark CLI flag (build-time), `mini_miner.cpp` ancestor lookup in mempool entries (bounded by BIP-125 limit ~25), `init.cpp` test-options-doc lookup. M7 cluster intentional crypto math. **clean** | -| **strapi** | TS | Headless CMS | 250 findings: `codemods/5.0.0/utils-public-interface.code.ts` is build-time codemod, `CMHeaderActions.tsx` existingLocales.includes (small enum), `Webhooks/Events.tsx` 2-element fixed array.includes. Bounded. | - -Honor roll now stands at **80 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| WordPress | PHP/JS | 1347 | 1050 | - | 35 | 2 | 11 | 197 | - | 52 | 1050 M1 overwhelmingly in vendored JS (`tinymce` 175, `codemirror` 96, `mediaelement` 53). PHP core has minimal real surface. | -| mediawiki | PHP/JS | 819 | 647 | - | 8 | 4 | 23 | 95 | - | 42 | Vendored swagger-ui (108), vue.global.prod (31), qunit (12), codex (9). PHP core bounded fixed tables. | -| **cypress** | TS | 745 | 427 | - | 4 | 4 | 37 | 270 | - | 3 | Test files + vendored jQuery. **clean** | -| drupal | PHP/JS | 636 | 398 | - | 15 | 1 | 1 | 195 | 1 | 25 | Vendored UI JS (tabledrag, views-admin, field_ui). PHP `in_array` cluster bounded by element types per page. | -| **Ghost** | TS/JS | 549 | 490 | - | 16 | 4 | 24 | 12 | 1 | 2 | **flagship: referrers-stats-service.js shipped as ghost-0001** | -| **strapi** | TS | 250 | 215 | 4 | 19 | 5 | 2 | 3 | 1 | 1 | Bounded enums + build-time codemod. **clean** | -| **bitcoin** | C++ | 227 | 27 | 10 | 35 | 3 | 2 | 147 | - | 3 | secp256k1 bench + mempool BIP-125 ancestor bounded. **clean** | -| **argo-workflows** | Go/TS | 78 | 22 | 43 | 11 | - | - | - | 2 | - | UI bounded + tests. **clean** | -| **samtools** | C | 47 | 46 | - | 1 | - | - | - | - | - | Fixed bio format keywords. **clean** | -| **fastify** | Node | 19 | 15 | 4 | - | - | - | - | - | - | HTTP method.includes + tests. **clean** | - -## Investigation: Ghost `ReferrersStatsService.getReferrersHistory` — flagship CWE-407 - -Found a real O(P × A) — `Array.find` with multi-key predicate per paid-conversion event, walking all signup entries for the matching `(source, date)` row. Long-running Ghost sites with 200+ referral sources tracked across a year of dates accumulate 70k-100k entries; the dashboard merge spends 4 seconds per load on a year-old site with hundreds of paid memberships. Map hoist on the `(source|date)` composite key gives 15×-184× speedup. Patch shipped as UNDF-2026-000001302. - -## Other investigations - -### WordPress / drupal / mediawiki — PHP cores effectively clean - -The 1050+398+647 = 2095 M1 findings across the big-three CMSes are dominated by vendored JS bundles (tinymce, codemirror, mediaelement, swagger-ui, vue, qunit, codex, tabledrag). PHP core has a small surface of `in_array` patterns, all bounded by per-page element counts. - -### Ghost `posts-stats-service.js` — bounded by `limit: 5` - -`getTopPostsViews` has the same nested `posts.find()` pattern, but `posts` and `viewsData` are both bounded by `limit` (default 5). At limit=5 the constant is 25 ops — not patch-grade. - -### bitcoin `mini_miner.cpp:224` `std::find` for ancestor lookup - -Mempool ancestor count is bounded by the BIP-125 chain limit (~25 ancestors). Bounded constant, not CWE-407. - -### cypress test fixtures dominate - -427 M1 findings in cypress are overwhelmingly in `cypress/e2e/`, `cypress/fixtures/jquery-3.2.1.js`, `cypress/cypress/...` — these ARE the test files and fixtures the framework ships, not the framework's runtime code. The driver core itself is clean. - -## Triage backlog - -1. **Ghost `posts-stats-service.js`** — currently bounded by `limit: 5`. Re-scan if Ghost ever raises the per-call limit or exposes per-post detail views with larger result sets. -2. **drupal vendored UI JS** — Drupal could pre-strip vendored libraries from scanner runs. Project-side improvement. -3. **mediawiki swagger-ui hits** — MediaWiki vendors swagger-ui for API docs; suppression at vendor-tree boundary would clear ~108 hits. -4. **WordPress tinymce hits** — same pattern; vendored editor. - -## Method - -Same as Waves 3-15: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. **Six projects added to clean-scan honor roll.** **One flagship CWE-407 patch shipped: ghost-0001 → UNDF-2026-000001302.** - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- ghost intel page: `/ghost/` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/`, `/wave12-sci-static-site-api-gateway-survey/`, `/wave13-vms-devtools-graphql-survey/`, `/wave14-mobile-edge-pl-wm-survey/`, `/wave15-security-data-eng-ide-survey/` -- Clean-scan honor roll cumulative: 80 projects across waves 3-16 diff --git a/whitepaper/outreach/wave17-php-python-bundler-survey.md b/whitepaper/outreach/wave17-php-python-bundler-survey.md deleted file mode 100644 index bd0217f97..000000000 --- a/whitepaper/outreach/wave17-php-python-bundler-survey.md +++ /dev/null @@ -1,116 +0,0 @@ -# Wave 17 — PHP Frameworks, Python Tooling, JS Bundlers - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across PHP frameworks (laravel, symfony), Python web frameworks (flask, sanic), Python tooling (ruff, black, mypy, pyright), and JS bundler/formatter (vite, prettier). - ---- - -## Summary - -Wave 17 totals 1,370 HIGH+ findings across 10 projects. **Six new clean-scan honor roll entries** (flask, black, mypy, sanic, vite, prettier). Honor roll cumulative: **86 projects** across waves 3-17. - -**No flagship CWE-407 patches ship this pass.** Two borderline-real candidates documented (symfony PropertyAccessor::writeCollection O(P × C) collection diff, pyright CallHierarchyProvider O(C²) outgoing-call dedup) but both require careful type-handling work beyond a single set-hoist. Logged for follow-up rather than shipped half-baked. - -## Clean-scan honor roll — 6 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **flask** | Python | Microframework | 6 findings: `_cv_app: ContextVar[AppContext]` is intentional Flask app-context plumbing (the framework's central design); `cache.set` and `secrets.token_hex()` references are docs samples. **clean** | -| **black** | Python | Code formatter | 13 findings: `pgen.py:54/56` `dfa.index()` for pgen2 grammar build (one-time at startup); `comments.py:143` `remainder.count("\n")` is single-char count not list-element scan; `ipynb_magics.py` mask matching bounded. **clean** | -| **mypy** | Python | Static type checker | 36 findings: `mypyc/test-data/` test fixtures, `mypyc/lib-rt` strncmp on fixed function names, `imaplib.pyi` / `smtplib.pyi` `cram_md5` API names (typeshed reference, not implementation). **clean** | -| **sanic** | Python | Async web framework | 56 findings: most in `examples/`, `guide/` docs, `scripts/release.py`, vendored livereload.js. ContextVar.set patterns are intentional request-id propagation. **clean** | -| **vite** | TS | Frontend build tool | 77 findings: ALL in `playground/__tests__/` test specs (CSS sourcemap tests, HMR SSR tests, asset tests). Core vite clean. | -| **prettier** | JS | Opinionated code formatter | 52 findings: `String.includes(needle)` substring checks (literal print, template-literal print, srcset descriptor, CLI argv flag). Bounded by source-text length per print call. **clean** | - -Honor roll now stands at **86 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| symfony | PHP/JS | 520 | 232 | - | 109 | - | 9 | 96 | - | 74 | 58 in vendored mermaid-flowchart. `PropertyAccessor::writeCollection` real but complex — see investigation. `LokaliseProvider`, `MandrillApiTransport` use bounded fixed enums. | -| ruff | Rust | 388 | 166 | 30 | 6 | - | - | 172 | 2 | 12 | `completion.rs:1142` `existing_class_bases.contains` — `existing_class_bases: Option>` (O(1)). `nodes.rs` `InterpolatedStringFlagsInner::TRIPLE_QUOTED.contains` is bitflags (Wave 9 pattern). `shell_injection.rs` `text.contains('*')` is single-char substring. | -| framework (laravel) | PHP | 112 | 36 | - | 1 | - | 7 | 42 | 10 | 16 | `in_array` patterns on small bounded enums (rules, attributes, methods). PHP idiom for fixed validation rule lists. | -| pyright | TS | 110 | 80 | - | 6 | 4 | 11 | 3 | 6 | - | `typeEvaluator.ts:1670/1671` `findIndex` per evaluation (bounded by string concat count). `docStringUtils.ts` paramOffset substring search bounded by docstring length. `callHierarchyProvider` real but borderline — see investigation. | -| **vite** | TS | 77 | 72 | - | 1 | 1 | 3 | - | - | - | All in playground tests. **clean** | -| **sanic** | Python | 56 | 5 | 44 | 2 | - | 2 | 1 | - | 2 | Examples + docs + ContextVar. **clean** | -| **prettier** | JS | 52 | 47 | - | 5 | - | - | - | - | - | Substring checks bounded by source text. **clean** | -| **mypy** | Python | 36 | 19 | 2 | 1 | - | 3 | 3 | - | 8 | Test fixtures + stub files. **clean** | -| **black** | Python | 13 | 8 | 2 | 1 | - | - | - | - | 2 | pgen2 grammar build + char count. **clean** | -| **flask** | Python | 6 | - | 2 | 3 | 1 | - | - | - | - | Intentional Flask context-var design. **clean** | - -## Investigations: borderline real, not patch-shipped this pass - -### symfony `PropertyAccessor::writeCollection` — O(P × C) collection diff - -`src/Symfony/Component/PropertyAccess/PropertyAccessor.php:580-595` does a collection diff for entity property updates: - -```php -foreach ($previousValue as $key => $item) { - if (!\in_array($item, $collection, true)) { // O(C) per call - // remove $item - } -} -foreach ($collection as $item) { - if (!$previousValue || !\in_array($item, $previousValue, true)) { // O(P) per call - // add $item - } -} -``` - -For P previous items × C new items, total cost is **O(P × C)**. This runs on every form submission with a CollectionType field and on every PropertyAccessor write to a collection-valued entity property. - -**Why not patch-shipped this pass:** `\in_array(..., true)` with `$strict=true` on objects checks identity (===), but on scalars checks `===`. The collection can contain mixed types (objects, scalars, arrays). A correct fix needs: -- Objects → `SplObjectStorage` (O(1) identity lookup) -- Hashable scalars (strings, ints, bools) → `array_flip` map -- Arrays / non-hashable → fall back to `\in_array` (rare in practice) - -Single-line set hoist isn't sufficient. The fix is mechanical but needs careful type-dispatch code. Logged for a follow-up patch with type-aware lookup helper. - -Real-world scale: a Symfony entity with a `OneToMany` association of 500 items being updated to 500 different items pays 250k strict-equality comparisons per write. For most Symfony apps with smaller collections (5-50 items), the cost is invisible. Worth fixing for ORM-heavy apps. - -### pyright `CallHierarchyProvider._outgoingCalls.find` — O(C²) call dedup - -`packages/pyright-internal/src/languageService/callHierarchyProvider.ts:394-396`: - -```ts -let outgoingCall = this._outgoingCalls.find( - (outgoing) => outgoing.to.uri === callDest.uri && rangesAreEqual(outgoing.to.range, callDest.range) -); -``` - -Per discovered call expression, linear scan over already-recorded outgoing calls to dedup. For a function with C call expressions where many resolve to distinct destinations, total cost is O(C²). - -**Why not patch-shipped this pass:** the dedup key is `(uri, range)` — a composite where `range` is a `{start, end}` struct. JS Map needs a string key. We can serialize as `${uri}|${start}|${end}`, but it's worth checking whether the existing Map representation downstream relies on object identity. Logged for follow-up after reading callers. - -Real-world scale: typical "show outgoing calls from this function" query has 10-50 unique destinations. At 50 the constant is 2500 ops — invisible in the IDE. For glue functions with 200+ call sites, becomes measurable (40k ops). Below patch-grade today. - -### ruff `existing_class_bases.contains` — false positive on FxHashSet - -Already a `FxHashSet` — O(1) contains. Same scanner gap as Wave 11 (Rust HashSet declared-type awareness). - -### ruff `InterpolatedStringFlagsInner::TRIPLE_QUOTED.contains` — bitflags FP - -Same pattern as helix/alacritty/wezterm in Wave 9. `bitflags::bitflags!` macro generates `.contains(other)` that compiles to bitwise AND. - -### laravel + symfony `in_array` clusters — fixed enum patterns - -Across both PHP frameworks, `\in_array($key, $rules, true)` and similar patterns are checking against fixed enums (validation rule names, allowed mutator methods, allowed transport headers). These are PHP's idiomatic fixed-enum check — 5-50 entries — and fast at this scale. - -## Triage backlog - -1. **symfony PropertyAccessor::writeCollection follow-up** — write a type-aware collection-membership helper (SplObjectStorage for objects, array_flip for hashable scalars, fallback for the rest). Patch is real but needs careful type dispatch. -2. **pyright callHierarchyProvider follow-up** — convert to Map<"uri|start|end", entry>; check downstream consumers. -3. **Scanner enhancement: Rust FxHashSet/FxHashMap awareness** — same as Wave 11 HashSet gap; ruff reinforces. -4. **Scanner enhancement: bitflags::bitflags! macro suppression** — already on backlog from Wave 9. - -## Method - -Same as Waves 3-16: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. **Six projects added to clean-scan honor roll.** No new UNDF IDs assigned (no patches shipped — two real candidates logged for type-aware follow-up). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/`, `/wave12-sci-static-site-api-gateway-survey/`, `/wave13-vms-devtools-graphql-survey/`, `/wave14-mobile-edge-pl-wm-survey/`, `/wave15-security-data-eng-ide-survey/`, `/wave16-cms-workflow-bio-node-survey/` -- Clean-scan honor roll cumulative: 86 projects across waves 3-17 diff --git a/whitepaper/outreach/wave18-cloud-sdk-auth-gui-audio-survey.md b/whitepaper/outreach/wave18-cloud-sdk-auth-gui-audio-survey.md deleted file mode 100644 index 95efd5467..000000000 --- a/whitepaper/outreach/wave18-cloud-sdk-auth-gui-audio-survey.md +++ /dev/null @@ -1,81 +0,0 @@ -# Wave 18 — Cloud SDKs, Auth, GUI, Audio - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across cloud SDK clients (aws-sdk-go-v2, azure-sdk-for-go, google-cloud-go), authn/authz (keycloak, casbin, kratos), immediate-mode GUI (imgui), audio (fluidsynth), workflow (n8n), and music engraving (lilypond). - ---- - -## Summary - -Wave 18 totals 47,059 HIGH+ findings across 10 projects — by far our largest wave count, dominated by cloud-SDK auto-generated client code repeating identical patterns across hundreds of services. **Ten new clean-scan honor roll entries** (all 10 targets resolve to bounded, auto-generated, or vendored patterns under inspection). Honor roll cumulative: **96 projects** across waves 3-18. - -**No flagship CWE-407 patches ship this pass.** Cloud SDKs follow a strong pattern: code generated from Smithy/AutoRest/protobuf-gencli specifications, with the same `slices.Contains(expect, ...)` template applied per-service-per-operation. Aggregated finding counts are huge but unique source patterns are tiny. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **aws-sdk-go-v2** | Go | AWS SDK for Go (v2) | 19,102 findings, but only **15 non-test M1 hits** (all in Smithy Java codegen with Java HashSet). Remaining 18,567 are `slices.Contains(expect, trimmed)` in auto-generated `internal/protocoltest/*/sra_operation_order_test.go` per service. Codegen template artifact, not source defect. | -| **azure-sdk-for-go** | Go | Azure SDK for Go | 25,898 findings: dominated by `*_client.go` + `*_client_example_test.go` auto-generated AutoRest clients per service, plus `eng/pipelines/templates/jobs/*.yml` cloud-variant `contains` checks (Azure Public/Government/China — bounded). M4 cluster in `cmd/issue/query/login.go` "Loging in with username and password" log message (literal in source string, not credential leak). | -| **google-cloud-go** | Go | Google Cloud SDK | 295 findings: 218 M4 from auto-generated client doc strings naming auth scopes/tokens/keys; 33 M3 ContextWithValue in test files; 32 M9 cron expressions in scheduler client docs. Auto-generated. | -| **keycloak** | Java | Identity and Access Management | 31 findings: `KeycloakSubsystemParser.java` `parsedElements.contains(tagName)` per XML element parse — bounded by SAML/OIDC config block element count (~10-50 tags). | -| **casbin** | Go | Access control library | 2 findings: both M4 in `ai_api.go` `fmt.Sprintf("Subject: %v\n", rvals[0])` — casbin's AI explainer logs the policy decision context, not a credential. **clean** | -| **kratos** | Go | Ory identity server | 152 findings: 78 M4 are `fmt.Sprintf("?page_token=%s&page_size=%d", ...)` test URL builders (M4 FP on `page_token` literal); 51 M3 ContextWithValue in tests. **clean** | -| **imgui** | C++ | Dear ImGui — immediate-mode GUI | 5 findings: 1 is the `ImVector::contains` definition in `imgui.h:2262`; 4 are call sites against bounded GUI element counts (selection, menu IDs submitted this frame, font sources, atlas draw lists). All bounded by visible GUI elements. **clean** | -| **fluidsynth** | C | Software MIDI synthesizer | 5 findings: vendored `contrib/getopt/win/getopt.c` (Windows getopt port) + sample format string check + test. **clean** | -| **lilypond** | C++/Python | Music engraving | 73 findings: `python/musicexp.py` `e.contains(elem)` is intentional music-tree containment algorithm; M11 ReDoS in `book_html.py` / `convertrules.py` are per-line regex compile (build-time). **clean** | -| **n8n** | TypeScript | Workflow automation | 1,371 findings: 718 non-test/vendor M1 — overwhelmingly `priorityList.indexOf(a)`, `SUPPORTED_TYPES.includes(type)`, `regions.find(r => r.name === region)`, `[fixed-list].includes(value)`. All bounded per-node-type lookups. M6 weak-hash cluster (192) in vendored bcryptjs/md5/sha1 within node-base credential helpers (cipher implementations, not weak-credential storage). | - -Honor roll now stands at **96 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **azure-sdk-for-go** | Go | 25898 | - | 11920 | 13934 | - | 1 | 43 | - | - | Auto-generated AutoRest clients + pipeline YAML. **clean** | -| **aws-sdk-go-v2** | Go | 19102 | 18582 | 446 | 59 | - | 1 | 14 | - | - | Auto-generated Smithy protocol-test patterns + 15 codegen Java hits. **clean** | -| **n8n** | TS | 1371 | 1015 | 4 | 142 | 8 | 192 | 8 | 1 | 1 | Per-node bounded enums + vendored crypto. **clean** | -| **google-cloud-go** | Go | 295 | 5 | 33 | 218 | 1 | - | 6 | 32 | - | Auto-generated client doc strings. **clean** | -| **kratos** | Go | 152 | 17 | 51 | 78 | - | 6 | - | - | - | Test URL builders + ContextWithValue. **clean** | -| **lilypond** | C++/Python | 73 | 35 | - | - | - | - | 7 | - | 31 | Music tree containment + per-line regex. **clean** | -| **keycloak** | Java | 31 | 11 | 2 | 5 | 4 | - | 9 | - | - | Bounded XML config tag count. **clean** | -| **imgui** | C++ | 5 | - | - | - | - | - | 5 | - | - | Bounded GUI elements. **clean** | -| **fluidsynth** | C | 5 | 5 | - | - | - | - | - | - | - | Vendored getopt + tests. **clean** | -| **casbin** | Go | 2 | - | - | 2 | - | - | - | - | - | Policy explainer log strings. **clean** | - -## Investigations - -### Cloud SDK auto-generation pattern (aws-sdk-go-v2 + azure-sdk-for-go + google-cloud-go) - -These three SDKs together account for **45,295 of Wave 18's 47,059 findings (96%)**. The patterns are **the same template applied N times** by Smithy (AWS), AutoRest (Azure), and protobuf-gencli (GCP) across hundreds of services and operations. A single template-level fix would clear thousands of findings; conversely, the per-service-per-operation count tells us nothing new about the underlying complexity class. - -**Detector enhancement candidate:** suppress findings inside `*_client.go`, `*_client_example_test.go`, `internal/protocoltest/*` paths and YAML CI-include patterns. Or: add a "codegen artifact" classification that aggregates duplicate findings across the same template. - -### keycloak `KeycloakSubsystemParser.parsedElements.contains` pattern - -Per XML element parse, `parsedElements.contains(tagName)` is called to detect duplicate elements within the SAML/OIDC config block. `parsedElements` is `Set` (Java HashSet) — already O(1) — but scanner does not yet model Java `Set` declared types (Wave 11 onnxruntime + Wave 15 swagger-codegen gap reinforced). - -### imgui ImVector::contains - -`imgui.h:2262` defines `ImVector::contains(const T& v) const` — an O(N) linear scan, which is correct for the small-array container ImVector. ImGui design philosophy uses ImVector deliberately (cache-friendly contiguous storage). All call sites are against small bounded counts (active menus this frame, font sources, draw lists) — appropriate for ImVector design. - -### lilypond music-tree `contains(elem)` - -`musicexp.py:1158` defines a recursive `contains(elem)` for Music tree nodes — `return self == elem or self.music.contains(elem)`. This is intentional tree-walk recursion, the algorithm itself, not a lookup that should be replaced with a hash. - -## Triage backlog - -1. **Scanner enhancement: codegen-artifact suppression** — recognize `*_client.go`, `internal/protocoltest/*`, AutoRest/Smithy/protobuf-gencli outputs. Would clear 45k+ wave-wide FPs from cloud SDK scans. -2. **Scanner enhancement: Java Set declared-type awareness** (continued from Wave 11 + Wave 15) — keycloak reinforces the gap. -3. **Scanner enhancement: M4 string-literal-only suppression in test path components** (continued from Wave 10) — kratos `?page_token=...&page_size=...` URL builders in `*_test.go` are test data, not credential leaks. - -## Method - -Same as Waves 3-17: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen/UI noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll.** No new UNDF IDs assigned (no patches shipped — all patterns under inspection are bounded constants, intentional algorithms, or auto-generated artifacts). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/`, `/wave9-image-pdf-db-editors-survey/`, `/wave10-crypto-text-geo-flutter-survey/`, `/wave11-unix-search-ml-survey/`, `/wave12-sci-static-site-api-gateway-survey/`, `/wave13-vms-devtools-graphql-survey/`, `/wave14-mobile-edge-pl-wm-survey/`, `/wave15-security-data-eng-ide-survey/`, `/wave16-cms-workflow-bio-node-survey/`, `/wave17-php-python-bundler-survey/` -- Clean-scan honor roll cumulative: 96 projects across waves 3-18 diff --git a/whitepaper/outreach/wave19-templating-parsers-compilers-survey.md b/whitepaper/outreach/wave19-templating-parsers-compilers-survey.md deleted file mode 100644 index 61a0a1d41..000000000 --- a/whitepaper/outreach/wave19-templating-parsers-compilers-survey.md +++ /dev/null @@ -1,93 +0,0 @@ -# Wave 19 — Templating, Markdown Parsers, Compilers, Scripting - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across templating engines (jinja, handlebars.js), document/markdown converters (pandoc, asciidoctor, marked, cmark), content extraction (Apache tika), ORM (mikro-orm), and compilers/shells (zig, PowerShell). - ---- - -## Summary - -Wave 19 totals 3,534 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (all 10 targets resolve to bounded, intentional, or vendored patterns under inspection). Honor roll cumulative: **106 projects** across waves 3-19. - -**No flagship CWE-407 patches ship this pass.** Templating engines and markdown parsers cluster their `.contains()`/`.includes()` calls in fixed token-type lists (10-20 entries from the markdown spec). PowerShell's "list-contains-in-loop" hits are mostly `IndexOf(char)` string scans (single-char position lookup, not list membership). zig's findings are in vendored musl libc. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **handlebars.js** | JS | Logic-less templating engine | 1 finding in test file (single token search). **clean** | -| **asciidoctor** | Ruby | AsciiDoc processor | 2 findings: 1 in test_helper Thread.current[:requests] (intentional test plumbing), 1 in test_attributes.rb. **clean** | -| **pandoc** | Haskell/JS | Universal document converter | 5 findings: 1 KaTeX render string in HTML.hs writer, 4 in `wasm/index.js` runtime helper. Bounded. **clean** | -| **jinja** | Python | Templating engine | 11 findings: `lexer.py` single-char `.count("\n")`, utils.py per-link substring scan, M5 lexer cache (cache key, not stampede), M11 lorem ipsum regex (build-time). **clean** | -| **cmark** | C | CommonMark reference implementation | 13 findings: `wrappers/wrapper.rkt` Racket bindings memq/assq, `main.c` CLI flag strcmp on fixed --version/--sourcepos/--hardbreaks list, M11 in pathological-test fixtures. **clean** | -| **marked** | TS | Markdown parser | 25 findings: `Parser.ts:53` checks against fixed token-type list (10 entries: 'space', 'hr', 'heading', etc.), `Instance.ts` 2-3 element fixed lists, M4 in docs samples. **clean** | -| **PowerShell** | C# | Pwsh shell + scripting | 172 findings: `CompletionCompleters.cs` `IndexOf(':')`/`IndexOf('\\')` are single-char string position scans (NOT list-contains); `ConfigProvider.cs` `IndexOf('-')` for noun parsing. Scanner FP on list-contains-in-loop pattern. **clean** | -| **zig** | Zig/C | Zig language + libc port | 200 findings: M1 cluster mostly in vendored musl libc (`dcngettext.c`, `locale_map.c`, `strptime.c`, `getnameinfo.c`) — bounded by libc spec. Core zig clean. | -| **mikro-orm** | TypeScript | TS ORM (Mongo+SQL) | 469 findings: bounded fixed enums (`['__proto__', 'constructor', 'prototype'].includes(key)` for prototype-pollution check, `[ReferenceKind.MANY_TO_ONE, ReferenceKind.ONE_TO_ONE].includes(rel.kind)`), `usedDups.includes(field)` per duplicate scan bounded by entity column count. **clean** | -| **tika** | Java | Apache content/metadata extraction | 2,636 findings: 1,955 M3 in test files (`*Test.java` ContextValue patterns), 213 M1 split between bounded POIFS Office-filename checks (`ucNames.contains(workbookEntryName)`), TEIDOMParser per-author unique check, eval-tool digest comparison. **clean** | - -Honor roll now stands at **106 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **tika** | Java | 2636 | 213 | 1955 | 16 | 233 | 1 | 214 | - | 4 | Test ContextValue + bounded Office detector. **clean** | -| **mikro-orm** | TS | 469 | 429 | 9 | 2 | 5 | - | 24 | - | - | Bounded prototype-pollution checks + ReferenceKind enum. **clean** | -| **zig** | Zig/C | 200 | 33 | - | 70 | 18 | - | 79 | - | - | Vendored musl libc. **clean** | -| **PowerShell** | C# | 172 | 169 | - | - | - | - | - | 1 | 2 | IndexOf(char) single-char scans, not list-contains. **clean** | -| **marked** | TS | 25 | 11 | - | 14 | - | - | - | - | - | Fixed markdown token-type lists. **clean** | -| **cmark** | C | 13 | 7 | - | - | - | - | - | - | 6 | CLI flag strcmp + Racket bindings. **clean** | -| **jinja** | Python | 11 | 8 | - | - | 1 | - | - | - | 2 | Lexer line-counting + per-link substring scan. **clean** | -| **pandoc** | Haskell/JS | 5 | 4 | - | - | - | - | 1 | - | - | KaTeX render + wasm helper. **clean** | -| **asciidoctor** | Ruby | 2 | 1 | 1 | - | - | - | - | - | - | Test helper + attribute parsing. **clean** | -| **handlebars.js** | JS | 1 | 1 | - | - | - | - | - | - | - | Test file. **clean** | - -## Investigations - -### PowerShell `IndexOf(char)` — scanner false positive on string position - -The `list-contains-in-loop` rule fires on patterns like: -```csharp -var indexOfFirstColon = commandName.IndexOf(':'); // single-char position -string noun = helpItemName.Substring(helpItemName.IndexOf('-') + 1); // CmdletNounSplit -``` - -These are `String.IndexOf(char)` — finding the byte position of a single character within a string (used for `Verb-Noun` split parsing). Not list membership. **Detector enhancement candidate:** distinguish `IndexOf(char_literal)` from `IndexOf(item_in_collection)` — one is `O(N)` over string length (intentional position scan), the other is `O(N)` linear search of a collection. - -### marked / cmark / jinja — fixed markdown token spec - -Markdown parser rules check against fixed CommonMark/GFM token-type lists ('space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'def', 'paragraph') — bounded by the spec. Linear scan is appropriate at 10-20 entries. - -### tika POIFSContainerDetector + TEIDOMParser - -`ucNames.contains(workbookEntryName)` checks against Office document container subentries; `unique.contains(af)` dedupes XML authors. Both bounded by document structure (typical Office files have 5-30 POIFS entries; TEI documents have 1-20 authors). - -### mikro-orm `['__proto__', 'constructor', 'prototype'].includes(key)` - -Fixed 3-element prototype-pollution defense list. Standard JS security pattern, bounded constant. - -### zig vendored musl libc - -200 M1 hits all in `lib/libc/musl/src/...` (locale, strptime, getnameinfo) — vendored musl libc that zig ships for cross-compilation. Bounded by POSIX/libc spec. - -### tika M3 cluster (1955) — test ContextValue - -The 1955 M3 hits are all in `*Test.java` files using `org.junit.jupiter.api.extension.ExtensionContext` with `getStore().put(...)` patterns — JUnit 5 idiomatic test-state plumbing. Same Wave 14 / Wave 18 detector enhancement candidate (test-context awareness). - -## Triage backlog - -1. **Scanner enhancement: `IndexOf(char_literal)` vs `IndexOf(collection_member)`** — distinguishes string-position scan from collection membership. Would clear 169 PowerShell false positives. -2. **Scanner enhancement: codegen / vendored-musl awareness** — zig's `lib/libc/musl/` is a third-party vendored libc, not zig's source. -3. **Scanner enhancement: JUnit ExtensionContext test plumbing** — same as Wave 14 knative/Wave 18 kratos test-context gaps. - -## Method - -Same as Waves 3-18: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (full clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave18-cloud-sdk-auth-gui-audio-survey/` -- Clean-scan honor roll cumulative: 106 projects across waves 3-19 diff --git a/whitepaper/outreach/wave20-container-re-js-engine-survey.md b/whitepaper/outreach/wave20-container-re-js-engine-survey.md deleted file mode 100644 index 785f4b498..000000000 --- a/whitepaper/outreach/wave20-container-re-js-engine-survey.md +++ /dev/null @@ -1,92 +0,0 @@ -# Wave 20 — Container Runtimes, Reverse Engineering, JS Engines - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across container runtimes (cri-o, runc, youki), small JS engines (quickjs, hermes), search/CLI (ripgrep), reverse engineering (ghidra, radare2), cryptocurrency (monero), and proxy (mitmproxy). - ---- - -## Summary - -Wave 20 totals 4,420 HIGH+ findings across 10 projects. **One flagship CWE-407 patch shipped (ghidra-0001 with 6.5×–27× measured speedup)** plus **9 new clean-scan honor roll entries** (cri-o, runc, youki, quickjs, hermes, ripgrep, radare2, monero, mitmproxy). Honor roll cumulative: **115 projects** across waves 3-20. - -## Flagship patch shipped this wave - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| ghidra | RecoveredClassHelper List.contains + ArrayList copy on every add | 27× @ F=2k R=500 | UNDF-2026-000001303 | - -`ghidra-0001` lands a `Map>` rewrite in `Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RecoveredClassHelper.java`. The current code does `List.contains` (O(R)) then `new ArrayList<>(referenceList)` (O(R) defensive copy) on every reference add. Per binary: O(F × R²). Reverse-engineering large C++ binaries (1000+ classes, 10k+ vftable refs) sees seconds-to-minutes per `RecoverClassesFromRTTIScript` run; the LinkedHashSet rewrite drops F=2k R=500 from 4.7s to 173ms. - -## Clean-scan honor roll — 9 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **runc** | Go | OCI runtime reference impl | 2 findings: 1 in test, 1 in `nsexec.c` strcmp on fixed Linux namespace name list. **clean** | -| **cri-o** | Go | Kubernetes CRI (runc/crun-based) | 9 findings: `cgroups_linux.go` ctrls (fixed cgroup controller list), `tag-reconciler` script, `pkg/config/config.go` AvailableMetrics fixed list, M3 ContextWithValue (intentional log plumbing). **clean** | -| **ripgrep** | Rust | Fast grep | 12 findings: `printer/util.rs` `line_term.as_bytes().contains(&b)` is `&[u8]::contains` for line terminator (1-2 bytes); `matcher/lib.rs` `ByteSet` is a 256-byte bitmap (literal name) with O(1) bit lookup; `searcher/mod.rs` encoding-list contains in fixed encoding list. **clean** | -| **quickjs** | C | Small embeddable JS engine | 23 findings: CLI argv strcmp (`--version`, `--help`, `--eval`), vendored `unicode_gen.c`, debug printf statements (`printf("string: '%s'", str)` is debug, not credential leak). **clean** | -| **hermes** | C++ | Facebook React Native JS engine | 421 findings: 44 in `benchmarks/octane/typescript.js` benchmark (vendored Octane benchmark suite), `tools/hermes-parser/js/prettier-plugin-hermes-parser/index.mjs` (vendored prettier plugin), `benchmarks/lib/libgui/stb/stb_image.h` (vendored stb), `benchmarks/widgets/single-file/cpp/widgets_fast_int.cpp` (benchmark fixture). Core hermes clean. | -| **youki** | Rust | OCI runtime in Rust | 45 findings: `commands/ps.rs` pids.contains for cgroup membership (bounded by container PIDs <100s), `info.rs` active_controllers (fixed cgroup controllers ~7), `tty.rs` reason String substring. **clean** | -| **radare2** | C | Reverse engineering framework | 50 findings: vendored UI JS (d3.js, m/main.min.js, t/app.js, f/r2.js for the web UI), `libr/include/r_util/libc.h` defines fallback strcmp/strncmp inline. **clean** | -| **monero** | C++ | Monero cryptocurrency | 56 findings: vendored `external/easylogging++` and `external/db_drivers/liblmdb` (vendored LMDB), `simplewallet.cpp` `printf("secret: ")` is the CLI password prompt label (not credential leak), `daemon_handler.cpp` `std::find(missed_vec, h)` for missed-tx dedup (bounded by request size). **clean** | -| **mitmproxy** | Python | Interactive HTTPS proxy | 202 findings: vendored UI assets (asciinema-player, elasticlunr, web index), `proxy/layer.py` `self.context.layers.index(self)` for layer position lookup (bounded by stack depth ~5), `console/commands.py` widget_list.index. **clean** | - -Honor roll now stands at **115 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **ghidra** | Java | 3360 | 992 | 655 | 33 | 466 | - | 1198 | - | 16 | **flagship: RecoveredClassHelper shipped as ghidra-0001**. M7 cluster (1198) in DirectedGraph + RTTI recovery — same family of patterns; backlog candidate. | -| **hermes** | C++/JS | 421 | 308 | 17 | 8 | 5 | 2 | 71 | - | 10 | Vendored Octane + prettier plugin + stb. **clean** | -| **mitmproxy** | Python | 202 | 125 | 31 | 10 | - | 8 | 25 | - | 3 | Vendored UI + bounded stack depth. **clean** | -| **monero** | C++ | 56 | 24 | - | 11 | - | 11 | 10 | - | - | Vendored LMDB + CLI prompt. **clean** | -| **radare2** | C | 50 | 38 | - | 4 | - | - | 5 | - | 3 | Vendored UI JS + libc fallbacks. **clean** | -| **youki** | Rust | 45 | 21 | - | - | - | - | 22 | - | 2 | Bounded cgroup/PID lookups. **clean** | -| **quickjs** | C | 23 | 16 | - | 7 | - | - | - | - | - | CLI args + debug printf. **clean** | -| **ripgrep** | Rust | 12 | 5 | - | 1 | - | - | 6 | - | - | ByteSet bitmap + bounded line-term. **clean** | -| **cri-o** | Go | 9 | 4 | 4 | 1 | - | - | - | - | - | Bounded cgroup controllers + log plumbing. **clean** | -| **runc** | Go | 2 | 2 | - | - | - | - | - | - | - | Linux namespace name list. **clean** | - -## Investigation: ghidra `RecoveredClassHelper` — flagship CWE-407 - -Found a real O(F × R²) — both `addVftableReferencesToFunctionMapping` and `addFunctionsToClassMapping` use the same defensive-copy + linear-scan pattern: `List.contains` (O(R)) then `new ArrayList<>(existing)` (O(R) copy) on every add. For 2000 functions × 500 references each, the copy-on-write list rebuild costs 4.7 seconds; LinkedHashSet rewrite drops it to 173ms. Patch shipped as UNDF-2026-000001303. - -The same insertion pattern appears in ghidra's broader RTTI recovery code (`RTTIWindowsClassRecoverer.java`, `RTTIGccClassRecoverer.java`) and in `DirectedGraph.java` descendants traversal — backlogged for a follow-up patch covering the broader pattern. - -## Other investigations - -### ripgrep ByteSet — intentional 256-bit bitmap - -`ByteSet(*self).contains(b)` in `crates/matcher/src/lib.rs:297` looks like Vec contains, but `ByteSet` is a 256-byte bitmap with O(1) bit lookup. Scanner FP on the receiver type. Same pattern as Wave 8 surrealdb RoaringTreemap and Wave 11 meilisearch SmallBitmap. - -### hermes vendored benchmarks - -The 308 M1 hits are dominated by vendored Octane benchmark JS (typescript.js, pdfjs.js — 44+13 hits) and vendored stb_image.h (4 hits). These are benchmarks shipped IN-source for performance regression testing — vendored third-party code, not hermes source. - -### monero `simplewallet.cpp printf("secret: ")` — false positive on credential prompt - -The `printf("secret: ")` is a CLI prompt label asking the user TO enter their secret, not logging the secret value. The next code reads the secret from stdin (or from a hidden input). Standard CLI password-prompt pattern. - -### youki Rust container runtime - -All M1 findings bounded by container resource counts: PIDs (<100s per container), cgroup controllers (fixed ~7), tty reason String substring (single-char). Tight Rust codebase. - -## Triage backlog - -1. **ghidra DirectedGraph descendants pattern** — same family as ghidra-0001. Ship as ghidra-0002 in a follow-up. -2. **ghidra RTTI{Windows,Gcc}ClassRecoverer** — same pattern in different classes. Ship as ghidra-0003/0004. -3. **Scanner enhancement: ByteSet/Bitmap awareness** (continued from Wave 8/11) — ripgrep ByteSet reinforces the gap. -4. **Scanner enhancement: vendored-benchmark suppression** for Octane (hermes), JetStream patterns appearing in JS engines. - -## Method - -Same as Waves 3-19: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Nine projects added to clean-scan honor roll.** **One flagship CWE-407 patch shipped: ghidra-0001 → UNDF-2026-000001303.** - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- ghidra intel page: `/ghidra/` -- Earlier surveys: `/test-harness-survey/` through `/wave19-templating-parsers-compilers-survey/` -- Clean-scan honor roll cumulative: 115 projects across waves 3-20 diff --git a/whitepaper/outreach/wave21-sci-forensics-bio-network-survey.md b/whitepaper/outreach/wave21-sci-forensics-bio-network-survey.md deleted file mode 100644 index ac9fec945..000000000 --- a/whitepaper/outreach/wave21-sci-forensics-bio-network-survey.md +++ /dev/null @@ -1,98 +0,0 @@ -# Wave 21 — OCR, PDF, Tor, IPsec, Packet Tools, Genomics, GIS - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across OCR (tesseract), PDF rendering (mupdf), anonymity network (tor), IPsec (strongswan), packet manipulation (scapy, masscan), genomics (gatk, htslib), and GIS (QGIS, postgis). - ---- - -## Summary - -Wave 21 totals 4,479 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (full clean wave). Honor roll cumulative: **125 projects** across waves 3-21. - -**No flagship CWE-407 patches ship this pass.** GATK and htslib bioinformatics tools have huge file-format-spec bounded constants (BAM/SAM/VCF/BCF header field names). PDF/PostScript tools (mupdf) follow the spec-bounded pattern documented in the docs-pipeline survey (Wave 6). Tor's strcmp clusters are sort comparators (O(N log N) overall) not quadratic membership tests. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **tesseract** | C++/Java | OCR engine | 36 findings: Java ScrollView UI demo (M5 menu items, M3 ThreadLocal — bounded by GUI element count); `unicharmap.cpp:83` defines `UNICHARMAP::contains` (its own data structure, O(N) appropriate for small char-mapping tables); `params.h:79` strcmp on tesseract config param name (small fixed list). **clean** | -| **mupdf** | C | PDF rendering library | 163 findings: `output-pcl.c` PCL output format options, `html-parse.c` `known_html_tags[m]` binary search, `xml.c` attribute name comparisons. PDF/PCL/HTML format-spec bounded. **clean** | -| **tor** | C | Anonymity network | 198 findings: 156 M1 `strcmp`/`strcasecmp` on Tor protocol keys, nicknames, config directives — most are sort comparators (O(N log N) overall). dirvote, relay_config, dirauth bounded by consensus-spec. **clean** | -| **strongswan** | C/Java | IPsec implementation | 67 findings: GNOME auth-dialog password prompt strings (M4 `printf("%s\n%s\n", secret_name, secret)` is the secret prompt, not log leak); Android UI `mSelection.contains(packageName)` per app (Android phones bounded ~50-200 apps). **clean** | -| **scapy** | Python | Packet manipulation | 113 findings: docs/test contexts, `route6.py:159` `self.routes.index(to_del[0])` for IPv6 route deletion (bounded by routing table), threading.Event signaling, ReDoS in version regex. **clean** | -| **masscan** | C | Internet-scale port scanner | 13 findings: interface name lookup in syscall enumeration (bounded by network interfaces), CLI argv parsing, COAP token printf debug. **clean** | -| **gatk** | Java | Genomics analysis toolkit | 1,364 findings: `passingEvents.contains(event)` is `Set` (HashSet O(1)) — Java declared-type FP; M3 cluster (462) in `*Test.java` JUnit ExtensionContext. `infoFieldAnnotationKeyNamesToRemove.contains` etc are HashSet members. **clean** | -| **htslib** | C | SAM/BAM/CRAM reference library | 108 findings: `header.c` BAM/SAM header field name lookups, `vcf.c` VCF header keys ("IDX"), `tbx.c` gVCF special tokens (`<*>`, ``). All bounded by genomics file-format spec. **clean** | -| **QGIS** | C++/Python | Geographic information system | 2,295 findings: 2,000 M7 in vendored Qt patterns + Python plugins (db_manager UI for column display, oracle connector tablename dedup, sipify build-time SIP code generator). UI bounded by displayed item count. **clean** | -| **postgis** | C | PostgreSQL GIS extension | 122 findings: 80 M7 in vendored flatgeobuf hash detection (bounded fixed hash function tables), shapefile loader column name lookups bounded by table column count, GML XML node name checks. **clean** | - -Honor roll now stands at **125 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **QGIS** | C++/Python | 2295 | 234 | 19 | 4 | - | 2 | 2000 | - | 36 | UI bounded + SIP codegen. **clean** | -| **gatk** | Java | 1364 | 409 | 462 | - | 50 | - | 440 | - | 3 | HashSet declared-type FPs + JUnit ExtensionContext. **clean** | -| **tor** | C | 198 | 156 | - | 16 | - | 1 | 19 | 1 | 5 | Sort comparators + protocol-spec keys. **clean** | -| **mupdf** | C | 163 | 152 | - | 6 | - | - | 5 | - | - | PDF/PCL/HTML format-spec strcmp. **clean** | -| **postgis** | C | 122 | 36 | - | 6 | - | - | 80 | - | - | flatgeobuf hash detection + shp loader. **clean** | -| **scapy** | Python | 113 | 18 | 50 | 13 | 1 | 22 | - | - | 9 | Tests + route bounded. **clean** | -| **htslib** | C | 108 | 89 | - | 16 | - | 1 | 2 | - | - | Genomics format-spec field names. **clean** | -| **strongswan** | C/Java | 67 | 21 | - | 31 | 1 | 4 | 8 | - | 2 | GNOME password prompt + Android UI. **clean** | -| **tesseract** | C++/Java | 36 | 6 | 1 | 3 | 5 | - | 21 | - | - | Java demo + config table. **clean** | -| **masscan** | C | 13 | 11 | - | 1 | - | - | 1 | - | - | Interface lookup + CLI args. **clean** | - -## Investigation notes - -### gatk `passingEvents.contains(event)` — Java HashSet FP - -```java -final Set passingEvents = sourceSet.getVariationEvents(0).stream() - .filter(event -> !badPileupEvents.contains(event)) - .collect(Collectors.toSet()); -goodPileupEvents.stream() - .filter(event -> !passingEvents.contains(event)) // O(1) — Set - .forEach(passingEvents::add); -``` - -Both `passingEvents` and `badPileupEvents` are declared `Set` via `Collectors.toSet()`. `.contains(event)` is HashSet — O(1). Same scanner gap (Java declared-type) noted in Wave 11 / Wave 15 / Wave 18. - -### Tor sort comparators are not quadratic - -```c -// dirvote.c:638 -if ((r = strcmp(b->status.nickname, a->status.nickname))) - return r; -``` - -This is `strcmp` inside a `compare_vote_rs` qsort comparator. Each call is O(1) — the sort is O(N log N) overall, not O(N²). Scanner triggers on `strcmp-in-loop` because the comparator is called inside qsort's loop, but the algorithmic class is O(N log N) for the sort, not quadratic. - -### htslib genomics file-format constants - -`header.c:129` `strcmp(sn, str.s) != 0` checks SAM header SN tag uniqueness (bounded by reference sequence count, typically <100k for human genome). `vcf.c:391` `strcmp("IDX", hrec->keys[i])` checks for the VCF metadata IDX key (single fixed string). All bounded by genomics file-format spec. - -### QGIS sipify codegen - -`scripts/sipify.py` generates SIP bindings between QGIS C++ and Python at build time. Per-line nesting count is build-time, runs once per release. - -### mupdf PDF/PostScript spec lookups - -PDF object-type names ("All", separation names, attribute keys) and HTML/FB2 known-tag tables are PDF/HTML spec constants, fixed at compile time. `html-parse.c:173` is a binary search on `known_html_tags[]`, not linear scan. - -## Triage backlog - -1. **Scanner enhancement: Java HashSet declared-type awareness** (continued from Wave 11/15/18) — gatk reinforces with 100+ findings. -2. **Scanner enhancement: qsort/comparator awareness** — `strcmp` inside `compare_*` functions called from qsort is O(N log N) overall, not quadratic. Tor's 156 M1 findings would mostly clear. -3. **Scanner enhancement: codegen-time path suppression** — QGIS sipify, similar Python codegen scripts in `scripts/` directories. - -## Method - -Same as Waves 3-20: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen/UI noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (third full-clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave20-container-re-js-engine-survey/` -- Clean-scan honor roll cumulative: 125 projects across waves 3-21 diff --git a/whitepaper/outreach/wave22-eda-games-hpc-codecs-httpd-survey.md b/whitepaper/outreach/wave22-eda-games-hpc-codecs-httpd-survey.md deleted file mode 100644 index ec8800ed0..000000000 --- a/whitepaper/outreach/wave22-eda-games-hpc-codecs-httpd-survey.md +++ /dev/null @@ -1,96 +0,0 @@ -# Wave 22 — EDA, Game Backends, HPC, Codecs, Web Server - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across EDA (yosys), robotics simulation (gz-sim), game backends (nakama, agones), HPC scheduler (slurm), embedded JS (duktape), C++ utility lib (abseil), AV1 decoder (dav1d), web server (apache httpd), and tiny C compiler (tinycc). - ---- - -## Summary - -Wave 22 totals 1,763 HIGH+ findings across 10 projects. **Nine new clean-scan honor roll entries.** Honor roll cumulative: **134 projects** across waves 3-22. - -**No flagship CWE-407 patches ship this pass.** Slurm and httpd are dominated by config-key string comparisons (read at startup or during config reload, bounded by config size). yosys/gz-sim use intentional tree-walk recursion. abseil's `std::find` calls are single-char string scans within bounded precision values. - -**Notable non-CWE-407 finding: nakama logs raw access tokens at debug level** in `social/social.go:235/250/435/439/443/448/452` (`c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken))`). This is a real **MOAD-0004 (A Logged Secret)** instance — debug-level logs leak Facebook/Apple/Google access tokens. Out of scope for this CWE-407-focused survey wave but flagged for the MOAD-0004 disclosure pipeline. nakama therefore does NOT join the clean-scan honor roll. - -## Clean-scan honor roll — 9 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **yosys** | C++ | RTL synthesis (Verilog → netlist) | 35 findings: `simplify.cc/ast.cc` `child->contains(other)` is intentional AST tree-walk recursion, `register.cc` `cell_help_messages.contains(name)` is yosys's `dict<>` (hashmap O(1)), `newcelltypes.h` defines `contains(IdString port)` for small fixed cell-type port set, `kernel/hashlib.h:254` returns `strcmp(a,b) == 0` as generic key comparator. **clean** | -| **gz-sim** | C++ | Gazebo robotics simulator | 56 findings: `EntityComponentManager.cc` pinnedEntities lookup (bounded by user-pinned entities, typically <50), `gui/plugins` selectedEntities membership, `PosePublisher.cc` visited-frames lookup (bounded by transform tree depth). **clean** | -| **agones** | Go/JS | Kubernetes game-server orchestration | 28 findings: vendored asciinema-player.js + `examples/allocation-endpoint` Bearer token Authorization header (intentional auth, not log leak), M7 `overlaps()` is intentional port-range collision check. **clean** | -| **slurm** | C | HPC workload manager (SchedMD) | 958 findings: 933 M1 are xstrcmp/xstrcasecmp on slurm config keys (control_machine, node names, gres types, association attrs) called during config-reload or scontrol parsing. Hash chain depth in `assoc_mgr.c` bounded (typically <10 collisions). **clean** | -| **duktape** | C/JS | Embedded JS engine | 53 findings: `extras/cbor/jsoncbor.c` CLI argv strcmp on -e/-d/-r flags, `src-tools/lib/configure/source_files.js` build-time configure tools, minify/known_issues build helpers. All build-time. **clean** | -| **abseil-cpp** | C++ | Google C++ utility library | 65 findings: 5 M1 `std::find` for single-char scan ('\0' terminator, decimal point) within bounded precision values, 60 M7 in `random/internal/nanobenchmark.cc` distance calculations + bounded statistics. **clean** | -| **dav1d** | C | AV1 video decoder | 13 findings: 3 in `meson.build` build-time config, examples/dav1dplay version check (one-shot), libfuzzer test, vendored getopt, CLI parser fixed table. **clean** | -| **apache httpd** | C | Web server | 395 findings: 273 M1 in `mod_negotiation`, `mod_dav`, `mod_proxy`, `mod_md` — all xstrcasecmp on Apache module configuration directive names ("on", "trans", "vlist", "receivebuffersize", etc.). Bounded by the directive grammar fixed at compile time. **clean** | -| **tinycc** | C | Tiny C compiler | 30 findings: `libtcc.c:1046` loaded_dlls name dedup (bounded by loaded shared libraries ~10), tcctools.c CLI argv on fixed flags, tccdbg.c DWARF debug filename table. **clean** | - -Honor roll now stands at **134 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **slurm** | C | 958 | 933 | - | 8 | - | - | 9 | - | 8 | Config key xstrcmp + bounded hash chains. **clean** | -| **httpd** | C | 395 | 273 | - | 44 | - | 57 | 15 | - | 6 | Apache module directive strcmp. **clean** | -| nakama | Go | 130 | - | 78 | 50 | 1 | - | - | - | 1 | **M4 cluster real**: 50 debug-level access-token logs across `social/social.go` (Facebook, Apple, Google providers). Out of CWE-407 scope; flagged for MOAD-0004 follow-up. | -| **abseil-cpp** | C++ | 65 | 5 | - | - | - | - | 60 | - | - | std::find char scan + bounded statistics. **clean** | -| **gz-sim** | C++ | 56 | 47 | - | - | - | - | 9 | - | - | Bounded sim entity counts. **clean** | -| **duktape** | C/JS | 53 | 39 | - | 1 | - | - | 1 | - | 12 | CLI args + build-time tools. **clean** | -| **yosys** | C++ | 35 | 14 | - | - | - | - | 14 | - | 7 | AST recursion + yosys dict<>. **clean** | -| **tinycc** | C | 30 | 29 | - | 1 | - | - | - | - | - | Loaded-DLL dedup + CLI args. **clean** | -| **agones** | Go/JS | 28 | 15 | 1 | 4 | - | - | 6 | 1 | 1 | Bearer auth header + port-range overlap. **clean** | -| **dav1d** | C | 13 | 10 | - | - | - | - | 3 | - | - | Build-time + version check. **clean** | - -## Investigation: nakama MOAD-0004 (Logged Secret) — out of CWE-407 scope - -`nakama/social/social.go` has 7 debug-level log statements that pass raw OAuth access tokens, ID tokens, and JWT tokens to `zap.String("token", ...)` / `zap.Any("token", t)`: - -```go -c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken)) // L235 -c.logger.Debug("Getting Facebook friends", zap.String("token", accessToken)) // L250 -c.logger.Debug("Failed to exchange an authorization code for an access token.", - zap.String("auth_token", idToken), ...) // L435 -c.logger.Debug("Exchanged an authorization code for an access token.", - zap.Any("token", t), zap.Error(err)) // L439 -// ...four more debug-level token logs -``` - -Game-server operators running nakama with debug logging enabled (default during development, sometimes left on in production) leak third-party OAuth tokens to log files. This is a textbook MOAD-0004 (A Logged Secret) defect. Logged for the MOAD-0004 disclosure pipeline; this CWE-407-focused wave does not ship the patch. - -## Other investigations - -### slurm xstrcmp clusters — config-time and bounded hash chains - -The 933 M1 findings in slurm are all `xstrcmp`/`xstrcasecmp` on slurm config directives. Most fire during `scontrol`/`sacctmgr` CLI parsing or during config reload. The `assoc_mgr.c` association lookups walk hash-chain linked lists, bounded by hash bucket depth. - -### httpd module directive strcmp - -273 M1 findings are Apache module directive parsing — `mod_negotiation`, `mod_dav`, `mod_proxy`, `mod_md` — all comparing user-config-string against fixed compile-time directive vocabulary ("on", "off", "trans", "vlist", "receivebuffersize", "keepalive"). Bounded by Apache config grammar. - -### yosys AST tree containment + dict<> - -`AstNode::contains(other)` recursively walks the AST tree to check membership — intentional tree algorithm. yosys's `dict<>` template is its own hashmap with O(1) `contains` (defined in `kernel/hashlib.h`). - -### abseil std::find single-char scan - -`std::find(v, v + conv.precision(), '\0')` finds the null terminator within at most `conv.precision()` chars — printf precision is bounded (typically 6 for floats, max ~100). Single-char scan, not list lookup. - -## Triage backlog - -1. **MOAD-0004 disclosure: nakama OAuth token logging** — 7 debug-level token logs in `social/social.go`. Real Logged Secret defect, ship as nakama-0001 in MOAD-0004 pipeline. -2. **Scanner enhancement: yosys `dict<>` template recognition** — yosys's dict template is a hashmap; scanner does not yet recognize it. -3. **Scanner enhancement: hash-chain walk awareness** — slurm's assoc_mgr walks hash buckets; this is bounded chain depth, not quadratic. - -## Method - -Same as Waves 3-21: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen/UI noise, manual triage of strongest source-only candidates per project. **Nine projects added to clean-scan honor roll.** No new UNDF IDs assigned for CWE-407 (no patches shipped — nakama M4 cluster routed to MOAD-0004 pipeline instead). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave21-sci-forensics-bio-network-survey/` -- Clean-scan honor roll cumulative: 134 projects across waves 3-22 diff --git a/whitepaper/outreach/wave23-frontend-loggers-image-survey.md b/whitepaper/outreach/wave23-frontend-loggers-image-survey.md deleted file mode 100644 index cc84b4966..000000000 --- a/whitepaper/outreach/wave23-frontend-loggers-image-survey.md +++ /dev/null @@ -1,83 +0,0 @@ -# Wave 23 — Frontend Frameworks, Loggers, Image Formats - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across frontend frameworks (angular, vue/core, svelte, lit), tooling (eslint), embedded scripting (mruby), Java logging (log4j2), Go logging (zap), and image formats (libpng, libavif). - ---- - -## Summary - -Wave 23 totals 1,401 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (fourth full-clean wave; zap is genuinely zero-finding). Honor roll cumulative: **144 projects** across waves 3-23. - -**No flagship CWE-407 patches ship this pass.** Frontend frameworks (angular, vue, svelte, lit) cluster their `.includes()`/`.find()` calls in compile-time SFC processors, schematics migration tools, and a11y rule lookups bounded by HTML/ARIA spec. Image format libraries (libpng, libavif) cluster theirs in test/CLI tooling. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **zap (uber-go)** | Go | Structured logging library | **Zero findings**. Genuine zero-HIGH+ result on Uber's flagship Go logger. Tight, well-disciplined codebase. | -| **vue/core** | TS | Vue 3 framework core | 31 findings: `defineProps.ts` `type.includes(UNKNOWN_TYPE)` is String.includes substring (Vue inspecting type strings); `compileScript.ts` MACROS.includes (fixed Vue macro list ~5 entries: defineProps, defineEmits, defineModel, etc.); all build-time SFC compiler. **clean** | -| **lit** | TS | Web Components library | 51 findings: most in test files (`reactive-element_dev_mode_test.ts`), `localize-tools` build-time CLI commands.includes (small fixed list), AsyncLocalStorage in SSR (intentional async context). **clean** | -| **libavif** | C | AV1 image format | 20 findings: `avifutil.c` file extension strcmp ("avif", "y4m"), `avifenc.c`/`avifdec.c` CLI argv parsing, `codec_aom.c` AOM option name lookup (small fixed list). **clean** | -| **libpng** | C | PNG reference library | 42 findings: ALL in `pngtest.c`, `contrib/libtests/`, `contrib/tools/` — test/utility tooling. Core libpng clean. | -| **mruby** | C/Ruby | Embedded Ruby implementation | 54 findings: `mrblib/string.rb` `(1..2).include?(args.length)` is Range.include? (O(1)); `lib/mruby/build.rb` exclusions list (build-time); `tools/lrama/` is the Lrama parser generator that mruby ships (build-time). **clean** | -| **angular** | TS | Angular framework | 386 findings: `vscode-ng-language-service/integration/lsp/` test, `core/schematics/ng-generate/` migration tools (build-time), `service-worker` URL caching list (bounded by registered cached URLs, typically <100), `animations` namespaceList (bounded by animation count). **clean** | -| **svelte** | TS | Svelte compiler | 105 findings: `compiler/migrate/index.js` build-time migration, `internal/client/reactivity/props.js` `target.exclude.includes(key)` per prop (exclude list small); `a11y/index.js` invisible_elements/aria_roles fixed HTML/ARIA spec lists; build-time download script. **clean** | -| **eslint** | JS | JS linter | 88 findings: vendored `css-vars-ponyfill@2.js`, build-time `Makefile.js`, lint rule fixed token lists (`memberSyntaxSortOrder`, `exceptions.openers`, `exceptions.closers`). **clean** | -| **logging-log4j2** | Java | Apache Java logger | 624 findings: 456 M3 in `*Test.java` JUnit ExtensionContext, 55 M1 in `CronExpression.java` cron-token analysis (single-char `expr.indexOf('L')`), `MapFilter` per-map-value list contains (bounded by map size <50), `ScriptManager.allowedLanguages.contains` (small fixed allowed list), `StyleConverter.Arrays.toString(options).contains(...)` is String.contains. **clean** | - -Honor roll now stands at **144 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **logging-log4j2** | Java | 624 | 55 | 456 | - | 54 | - | 55 | - | 4 | JUnit ExtensionContext + CronExpression + bounded allowedLanguages. **clean** | -| **angular** | TS | 386 | 307 | - | 23 | 20 | 2 | 32 | 1 | 1 | Build-time schematics + service-worker bounded URLs. **clean** | -| **svelte** | TS | 105 | 98 | 4 | - | 2 | - | 1 | - | - | Build-time migrate + a11y spec lists. **clean** | -| **eslint** | JS | 88 | 66 | - | - | - | - | 17 | - | 5 | Vendored ponyfill + lint rule token lists. **clean** | -| **mruby** | C/Ruby | 54 | 52 | - | 2 | - | - | - | - | - | Range.include? + Lrama parser generator. **clean** | -| **lit** | TS | 51 | 47 | 2 | - | 2 | - | - | - | - | Test files + localize-tools. **clean** | -| **libpng** | C | 42 | 42 | - | - | - | - | - | - | - | Test/utility tools only. **clean** | -| **vue/core** | TS | 31 | 30 | - | - | 1 | - | - | - | - | SFC compiler + macro lookup. **clean** | -| **libavif** | C | 20 | 19 | - | 1 | - | - | - | - | - | CLI args + AOM option name. **clean** | -| **zap (uber-go)** | Go | 0 | - | - | - | - | - | - | - | - | **Zero findings.** Genuine clean. | - -## Investigation: zap zero-finding result - -Uber's `zap` Go logger is the most popular structured-logging library in the Go ecosystem. Zero HIGH+ findings across all 9 active MOAD detectors. Tight ~30k LOC core, well-disciplined code review, zero `slices.Contains` patterns in the hot path, no debug-level credential logging, no leaked context, no thundering-herd, no weak hash on credential paths. Joins `wireguard-go`, `longhorn-engine`, `ghostpdl`, and the cloud SDK reference clients in the small set of projects with literally zero scanner findings. - -## Other investigations - -### log4j2 CronExpression single-char + bounded MapFilter - -`expr.indexOf('L')` is single-char string position scan. `MapFilter.java` walks the configured map filter rules (typically <50 per logger config) and checks substring matches. `ScriptManager.allowedLanguages.contains(name)` is per-script-execute against a static config list (typically 1-5 enabled scripting languages). - -### angular service-worker URL caching - -`service-worker/worker/src/assets.ts:126` `this.urls.indexOf(url)` per HTTP request to determine if the resource is in the cache. `this.urls` is the registered service-worker cache list — bounded by the asset registration manifest, typically <100 URLs even for large PWAs. - -### svelte ARIA role lookup - -`a11y/index.js:166` `aria_roles.includes(current_role)` checks against the fixed ARIA role spec (~80 roles). Bounded by the W3C ARIA specification. - -### libpng test-only findings - -All 42 findings in `libpng` are in `pngtest.c`, `contrib/libtests/pngstest.c`, `contrib/libtests/pngvalid.c`, `contrib/libtests/pnggetset.c`, `contrib/tools/`. The libpng core (in `png*.c` at root) is clean. - -## Triage backlog - -1. **Scanner enhancement: JUnit ExtensionContext test plumbing** (continued from Wave 14/18/19) — log4j2 reinforces with 456 hits. -2. **Scanner enhancement: build-time tooling path suppression** — `core/schematics`, `migrate/`, `Makefile.js`, `lib/mruby/build.rb` clusters across multiple frameworks would benefit. -3. **Scanner enhancement: Range.include? Ruby method awareness** — mruby's `(1..2).include?(args.length)` is O(1) range check, not list scan. - -## Method - -Same as Waves 3-22: shallow clone, `unmoad -s high -f json`, filter test/vendor/build-time noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (fourth full-clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave22-eda-games-hpc-codecs-httpd-survey/` -- Clean-scan honor roll cumulative: 144 projects across waves 3-23 diff --git a/whitepaper/outreach/wave24-web-tls-multimodel-wp-audio-survey.md b/whitepaper/outreach/wave24-web-tls-multimodel-wp-audio-survey.md deleted file mode 100644 index b51a1b00c..000000000 --- a/whitepaper/outreach/wave24-web-tls-multimodel-wp-audio-survey.md +++ /dev/null @@ -1,93 +0,0 @@ -# Wave 24 — Web Server, TLS Proxy, Multi-Model DB, Word Processor, Audio Production - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across smaller web servers (lighttpd), TLS proxy (stunnel), multi-model database (arangodb), distributed coordination (zookeeper), secret store (vault), word processing (abiword), spreadsheet (gnumeric), computer algebra (maxima), and DAW/drum machine (lmms, hydrogen). - ---- - -## Summary - -Wave 24 totals 4,951 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (fifth full-clean wave). Honor roll cumulative: **154 projects** across waves 3-24. - -**No flagship CWE-407 patches ship this pass.** ArangoDB (3,218 findings) is dominated by vendored UI bundles (boost docs charts, swagger-ui, jquery-ui, ace editor). Vault is dominated by Ember.js codemods and bounded UI logic. Maxima's 536 M1 findings are Lisp `(member item list :test ...)` patterns in graph theory and algebraic geometry — intentional algorithms, bounded by mathematical input size. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **lighttpd1.4** | C | Lightweight web server | 92 findings: all M1 are config-time strcmp on `http_auth_schemes`, `http_auth_backends`, `http_vhostdb_backends` fixed module name lookups + fdlog filename lookup (bounded by open log files). **clean** | -| **stunnel** | C | TLS proxy | 48 findings: per-connection user/cipher name strcmp (bounded by config), protocol name lookup against fixed list. M4 are CONNECT/Proxy-Authorization HTTP request constructions (intentional — the proxy IS sending Authorization header to upstream). **clean** | -| **arangodb** | C++/JS | Multi-model database | 3,218 findings: 2,298 M1 ALL in vendored UI assets (`3rdParty/boost/.../plotlyjs-bundle.js`, `swagger-ui-bundle.js`, `jquery-ui.custom.min.js`, `ace.min.js`). Core arangodb clean. | -| **zookeeper** | Java/C | Distributed coordination | 344 findings: `cli.c` config command parsing, recipe lock prefix check, vendored win_getopt.h, SASL DIGEST-MD5 fixed name; 135 M3 in JUnit ExtensionContext test fixtures. **clean** | -| **vault** | Go/JS | HashiCorp secret store | 598 findings: 195 M1 in `ui/scripts/codemods/` (Ember.js codemods — build-time refactoring), `ui/lib/replication/` per-config bounded, oidc.js routeName.includes substring; 299 M4 in client/SDK Bearer auth (intentional). **clean** | -| **abiword** | C++ | Open-source word processor | 10 findings: `pd_DocumentRDF.h:268` defines RDF triple `contains(s,p,o)` as algorithm interface (intentional graph query), opendocument plugin iter, xslt sheet (build-time), ReDoS in po extract / changelog tools (build-time). **clean** | -| **gnumeric** | C | GNOME spreadsheet | 1 finding: Perl test grep filter. **clean** | -| **maxima** | Lisp | Computer algebra system | 543 findings: 536 M1 are Lisp `(member item list :test ...)` patterns in graph theory (isomorphism, graph_core), affine geometry (sheafa/sheafb), gentran transformation. Lisp `member` is an O(N) primitive used pervasively in the Lisp tradition; bounded by mathematical input size, intentional algorithms. **clean** | -| **lmms** | C++ | Linux MultiMedia Studio (DAW) | 31 findings: Qt `QString::contains` for filename/filter substring search (case-insensitive search by user input, bounded by string length); `m_markedSemiTones.find(octave)` (small marked-semitone set ~12 max), `tracks().find(clipTrack)` bounded by track count. **clean** | -| **hydrogen** | C++ | Drum machine | 66 findings, ALL M7: Qt `QString::contains` substring search, `QSet::contains` for license/duplicate/note membership, `row.contains(ppNote)` is geometric note-rect containment (intentional algorithm). **clean** | - -Honor roll now stands at **154 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **arangodb** | C++/JS | 3218 | 2298 | 5 | 35 | 6 | 10 | 836 | - | 28 | Vendored UI bundles. **clean** | -| **vault** | Go/JS | 598 | 195 | 41 | 299 | - | 12 | 51 | - | - | Ember.js codemods + Bearer auth. **clean** | -| **maxima** | Lisp | 543 | 536 | - | - | - | - | 7 | - | - | Lisp graph theory `(member ...)` algorithms. **clean** | -| **zookeeper** | Java/C | 344 | 78 | 135 | 29 | 29 | 1 | 69 | - | 3 | CLI parsing + JUnit ExtensionContext. **clean** | -| **lighttpd1.4** | C | 92 | 79 | - | 8 | - | 5 | - | - | - | Config-time module name lookups. **clean** | -| **hydrogen** | C++ | 66 | 2 | - | - | - | - | 64 | - | - | Qt substring + geometric note-rect containment. **clean** | -| **stunnel** | C | 48 | 42 | - | 5 | 1 | - | - | - | - | Per-connection auth + protocol name. **clean** | -| **lmms** | C++ | 31 | 8 | - | - | - | - | 21 | - | 2 | Qt search + bounded marked-semitone set. **clean** | -| **abiword** | C++ | 10 | 2 | - | - | - | - | 5 | - | 3 | RDF graph algorithm + build-time tools. **clean** | -| **gnumeric** | C | 1 | 1 | - | - | - | - | - | - | - | Perl test grep filter. **clean** | - -## Investigation: maxima Lisp `(member ...)` patterns — intentional algorithms - -```lisp -;; share/graphs/isomorphism.lisp:98 -(unless (member v m1) - ...) - -;; share/affine/sheafb.lisp:333 -(and (null (member ii opens-not-to-try :test #'equal)) - ...) -``` - -Maxima's `(member ...)` is the Common Lisp linear-search primitive. Used pervasively in graph isomorphism (vertex sets), sheaf cohomology (open sets), gentran (Maxima-to-Fortran/C translator). These ARE the algorithms — graph isomorphism by definition needs membership tests in vertex/edge sets. Bounded by mathematical input size; the user controls input scale. Replacing `member` with a hash-based membership test would change the algorithm's behavior (Lisp `member` returns the tail of the list starting at the match, callers may rely on this). - -## Other investigations - -### arangodb vendored UI dominance - -2,298 of 2,298 M1 findings (100%) are in vendored frontend bundles: boost.org's plotly.js + d3.js documentation graphs, swagger-ui-bundle, jquery-ui custom build, ace editor minified. None of these are arangodb source. The arangodb C++ database core is clean. - -### vault Ember.js codemods - -`ui/scripts/codemods/dropdown-transform.js`, `ui/scripts/codemods/hds/button.js` are jscodeshift transforms that run at build/migration time to rewrite Ember.js component class names. Per-AST-node lookups are bounded by template size. Path-filter lists (`ui/lib/replication/`) are per-tenant config size, typically <100 paths. - -### abiword RDF triple containment - -`PD_DocumentRDF::contains(s, p, o)` is the RDF subject-predicate-object triple membership query — an intentional graph-database operation. The header comment (line 268) explicitly notes "performance which might be possible for contains(s,p,o) if the [implementation used indexed lookup]". Already an architecture decision documented in the codebase. - -### hydrogen note-rect containment - -`row.contains(ppNote)` is `QRect::contains(QPoint)` — geometric containment of a point in a rectangle (O(1) coordinate comparison). Scanner FP on the `.contains()` call shape; the Qt QRect/QSet/QString family of `.contains()` methods all have O(1) or substring semantics, not list-membership. - -## Triage backlog - -1. **Scanner enhancement: Qt `QRect::contains`/`QSet::contains`/`QString::contains` awareness** — Qt's `.contains()` family is uniformly O(1) (QRect/QPoint), O(log N) (QSet/QMap), or substring search (QString). Suppressing on Qt-typed receivers would clear hundreds of FPs across LMMS, Hydrogen, Krita, KDE-derived apps wave-wide. -2. **Scanner enhancement: Lisp `(member ...)` algorithm awareness** — Lisp graph/algebra packages use `member` as the canonical containment primitive; Lisp ecosystems differ from imperative languages. -3. **Scanner enhancement: vendored UI tree suppression** — `3rdParty/`, `vendor/`, `node_modules/`, `*.min.js`, `swagger-ui-bundle.js` clusters across multiple projects. - -## Method - -Same as Waves 3-23: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (fifth full-clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave23-frontend-loggers-image-survey/` -- Clean-scan honor roll cumulative: 154 projects across waves 3-24 diff --git a/whitepaper/outreach/wave25-collab-auth-sync-vectordb-shell-survey.md b/whitepaper/outreach/wave25-collab-auth-sync-vectordb-shell-survey.md deleted file mode 100644 index 8be9e0aa1..000000000 --- a/whitepaper/outreach/wave25-collab-auth-sync-vectordb-shell-survey.md +++ /dev/null @@ -1,87 +0,0 @@ -# Wave 25 — Collaboration, Auth, File Sync, Vector DB, Shells - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across discourse forum, SSO/IAM (authelia, authentik), file sync (nextcloud server), document OCR (paperless-ngx), project management (focalboard), vector DB (milvus), modern shell (nushell), webmail (roundcubemail), and memory analyzer (valgrind). - ---- - -## Summary - -Wave 25 totals 2,994 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (sixth full-clean wave). Honor roll cumulative: **164 projects** across waves 3-25. - -**No flagship CWE-407 patches ship this pass.** Authentication systems (authelia, authentik) cluster their findings in test fixtures (`{"token":"%s"}` URL builders), Django ORM `.count()` query calls, and per-component slot lookups. Vector DBs (milvus) cluster theirs in vendored UI + tantivy NLP single-char filters. Modern shells (nushell) follow the Rust ByteSet pattern documented in Wave 20 ripgrep. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **authelia** | Go | OpenID Connect / SSO | 127 findings: ALL M4 in test fixture URL strings (`fmt.Sprintf("{\"token\":\"%s\"}", token)`) and validation error message templates — credential-keyword in test code FPs. **clean** | -| **valgrind** | C/asm | Memory error analyzer | 98 findings: `coregrind/launcher-*.c` CLI argv parsing on `--`, `--arch=`, `DYLD_*` env vars (fixed prefix tests); `vg_preloaded.c` env var lookup. All bounded. **clean** | -| **authentik** | Python | SSO Identity Provider | 403 findings: 304 M3 in `*Test.py` Django ContextValue patterns; 36 M1 are Django ORM `.count()` (database query, not list count) + UI wizard slot lookup. **clean** | -| **paperless-ngx** | Python | Document OCR + management | 176 findings: Django auth `groups.set()` / `user_permissions.set()` (intentional Django M2M relation set), `ContextVar("consume_task_id")` for task ID propagation, `Document.global_objects.count()` is Django QuerySet count. **clean** | -| **focalboard** | TS/Go | Project management board | 166 findings: UI store/components (cards, kanban, gallery) `visibleOptionIds.indexOf(option.id)` for drag-drop position — bounded by visible options (typically 10-50 per board column). **clean** | -| **roundcubemail** | PHP/JS | Webmail client | 234 findings: vendored `jquery-ui.min.js` (47 hits), `jquery.minicolors.min.js` (13 hits), elastic skin UI; managesieve sieve filter compare against bounded list. **clean** | -| **milvus** | C++/Go | Vector database | 372 findings: 117 M1 in vendored `internal/http/webui/assets/index-*.js`, tantivy NLP filters single-char substring (`t.contains('\u{0623}')` for Arabic normalization), `cpplint.py` build-time C++ linter. **clean** | -| **nushell** | Rust | Modern shell | 353 findings: `nu-parser/parser.rs` `bytes.contains(&b'(')` is `&[u8]::contains` for single byte (Wave 20 ripgrep ByteSet pattern), `command.rs` `trimmed.contains(',')` single-char, `parent_deletions.contains(&var_id)` is Vec but bounded by frame's deleted vars typically <10. **clean** | -| **nextcloud-server** | PHP/JS | Self-hosted file sync + collab | 331 findings: `TaskProcessing/Manager.php` task type lookup against fixed enum, CalDAV recurrence exceptions per calendar event (bounded by event recurrence count), settings/users.js existingUsers lookup. **clean** | -| **discourse** | Ruby/JS | Forum platform | 734 findings: 639 M1 mostly vendored viz.js (graphviz plugin), Ember.js framework patterns (`VALID_EMBER_CLI_WORKFLOW_HANDLERS.includes`, `VALID_CONSTRAINT_TYPES.includes`), `post-stream.js` posts.includes per visible post (bounded ~50). **clean** | - -Honor roll now stands at **164 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **discourse** | Ruby/JS | 734 | 639 | 23 | 4 | 11 | 15 | 39 | - | 3 | Vendored viz.js + Ember validation enums. **clean** | -| **authentik** | Python | 403 | 36 | 304 | 54 | 2 | 3 | 2 | 1 | 1 | Django Test ContextValue + ORM count(). **clean** | -| **milvus** | C++/Go | 372 | 191 | 20 | 99 | 1 | 4 | 55 | - | 2 | Vendored UI + tantivy NLP single-char. **clean** | -| **nushell** | Rust | 353 | 157 | - | 5 | - | - | 189 | - | 2 | ByteSet pattern + bounded shell state. **clean** | -| **server (nextcloud)** | PHP/JS | 331 | 181 | - | 23 | - | 32 | 81 | - | 14 | Task-type fixed enum + CalDAV recurrence. **clean** | -| **roundcubemail** | PHP/JS | 234 | 159 | - | 12 | - | 13 | 32 | - | 18 | Vendored jquery-ui + elastic skin. **clean** | -| **paperless-ngx** | Python | 176 | 41 | 109 | 8 | 8 | 1 | 2 | 6 | 1 | Django M2M set + ContextVar. **clean** | -| **focalboard** | TS/Go | 166 | 125 | 4 | 8 | 2 | 3 | 24 | - | - | Drag-drop visible-option indexOf. **clean** | -| **authelia** | Go | 127 | - | 3 | 124 | - | - | - | - | - | Test-fixture token URL builders. **clean** | -| **valgrind** | C/asm | 98 | 81 | - | 10 | - | - | 7 | - | - | Launcher CLI argv parsing. **clean** | - -## Investigations - -### authelia 124 M4 hits — test fixture FPs - -```go -s.mock.Ctx.Request.SetBodyString(fmt.Sprintf("{\"token\":\"%s\"}", token)) -``` - -Identical pattern in `internal/middlewares/identity_verification_test.go` lines 217, 242, 253, 268, 285, 304 — building HTTP request bodies for the identity-verification middleware unit tests. Test code, not credential leak. - -### nushell `bytes.contains(&b'(')` — single-byte ByteSet - -Same pattern as Wave 20 ripgrep. `&[u8]::contains` is bounded by string length (typically per-token in a parser context). - -### discourse Ember.js validation enums - -`VALID_EMBER_CLI_WORKFLOW_HANDLERS.includes(workflow.handler)` — `VALID_EMBER_CLI_WORKFLOW_HANDLERS` is a fixed string-literal array (~5 entries: silence, log, throw, etc.). Same pattern in `VALID_CONSTRAINT_TYPES`. - -### milvus tantivy NLP filters - -`results.iter().all(|t| !t.contains('\u{0623}'))` is testing whether each token contains the Arabic letter Hamza-Alif. Single-char substring search per NLP token. Used during text indexing/search. - -### Django M2M `groups.set()` and `user_permissions.set()` - -`user.groups.set(groups)` is the Django ORM many-to-many relation `set()` method — replaces the M2M relation in one query. Not a ContextVar.set() pattern. Scanner FP on `.set(` literal (continued from Wave 13 patroni gap). - -## Triage backlog - -1. **Scanner enhancement: Django M2M `.set()` recognition** — `model_instance.related_set.set(items)` is Django ORM, not threading.Event.set or ContextVar.set. Same gap as Wave 13 patroni; paperless-ngx + authentik reinforce. -2. **Scanner enhancement: ByteSet pattern recognition** (continued from Wave 20 ripgrep) — `&[u8]::contains` for single bytes is bounded by string length. -3. **Scanner enhancement: Django ORM `.count()` recognition** — `queryset.count()` is a SQL COUNT query, not a Python `list.count()` linear scan. - -## Method - -Same as Waves 3-24: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (sixth full-clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave24-web-tls-multimodel-wp-audio-survey/` -- Clean-scan honor roll cumulative: 164 projects across waves 3-25 diff --git a/whitepaper/outreach/wave26-middleware-cms-cm-editor-pdf-cli-viz-survey.md b/whitepaper/outreach/wave26-middleware-cms-cm-editor-pdf-cli-viz-survey.md deleted file mode 100644 index 865030c4e..000000000 --- a/whitepaper/outreach/wave26-middleware-cms-cm-editor-pdf-cli-viz-survey.md +++ /dev/null @@ -1,108 +0,0 @@ -# Wave 26 — Middleware, CMS, Config Mgmt, Editors, PDF, CLI, Viz, Sharded DB - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across Java middleware (wildfly), CMS (typo3), Ruby config mgmt (chef), terminals/editors (kitty, nano), PDF (qpdf), CLI data tools (jq, miller), scientific viz (matplotlib), and sharded MySQL (vitess). - ---- - -## Summary - -Wave 26 totals 8,193 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (seventh full-clean wave). Honor roll cumulative: **174 projects** across waves 3-26. - -**No flagship CWE-407 patches ship this pass.** Wildfly is dominated by JUnit ExtensionContext (4,840 M3 hits) and Java `Set.contains` (declared-type FPs). TYPO3 is overwhelmingly vendored frontend libraries (ckeditor5, codemirror, bootstrap, chartjs). matplotlib's M1 cluster is `itertools.count` (generator object, not `list.count` linear scan). - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **miller** | Go/Rust | CSV/TSV/JSON CLI processor | 6 findings: `(1..=6).contains(&n)` is Range.contains (O(1)), `entry.verbNames` and `flag.altNames` slices.Contains bounded by miller's verb count (~50) and flag aliases (~5). **clean** | -| **jq** | C | Command-line JSON processor | 22 findings: `jq_test.c` test argv parsing, `jvp_contains` is jq's own JSON value containment (intentional algorithm), `builtin.c` format string check ("base64", "base32"). **clean** | -| **nano** | C | Lightweight text editor | 31 findings: `search.c` brace balance count, `files.c:2509` strcmp(d_name, ".") and ("..") skip-dotdir comparison (constant 2 strings), nano.c locale check, chars.c mbstrcasecmp utility. All bounded. **clean** | -| **qpdf** | C++ | PDF transformation library | 58 findings: `test_renumber.cc`/`test_parsedoffset.cc` test files, `qpdf-ctest.c` is the C test harness (`printf("user password: %s")` is intentional in tests, not credential leak). **clean** | -| **chef** | Ruby | Configuration management | 104 findings: `ENV.include?("CHEF_PROFILE")` is Hash.include? (Ruby hash O(1)), `path.include?("://")` is String.include? substring. M4 are config logger debug strings logging profile NAME not credential value. **clean** | -| **vitess** | Go/Java | Sharded MySQL | 101 findings: `MysqlCharset.contains(javaEncoding.toUpperCase())` is `Set.contains` (Java HashSet O(1)), `searchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE)` is `EnumSet.contains` (bitset O(1)). **clean** | -| **kitty** | Python/C | GPU-accelerated terminal | 113 findings: `keys.index(q)`/`groups.index(wg)`/`tabs.index(active_tab)` for tab/window/font lookup (bounded by tab/window/font count, typically <50 max per session), `debug_config.py` REDACTED FOR SECURITY is intentional. **clean** | -| **matplotlib** | Python | Scientific plotting | 465 findings: 30 M1 — `backend_pdf.py:645` `itertools.count(1)` is generator (not list.count), `gallery_order.py` build-time Sphinx docs, `_formlayout.py` Qt size combobox (small), `font_manager.py` font family options index. 400 M3 in tests + tutorials. **clean** | -| **typo3** | PHP/JS | Enterprise PHP CMS | 1,248 findings: 934 M1 overwhelmingly vendored frontend libraries (ckeditor5-engine 33, codemirror/view 27, bootstrap 26, chartjs 25, ckeditor5-table 24). PHP core clean. | -| **wildfly** | Java | JBoss application server | 5,845 findings: 4,840 M3 are JUnit ExtensionContext test plumbing (Wave 14/19 pattern reinforced); 279 M1 are `Set.contains`/`EnumSet.contains` already O(1) in declared Java type. **clean** | - -Honor roll now stands at **174 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **wildfly** | Java | 5845 | 279 | 4840 | 29 | 413 | 1 | 283 | - | - | JUnit + Set/EnumSet declared-type. **clean** | -| **typo3** | PHP/JS | 1248 | 934 | - | 18 | 4 | 14 | 242 | - | 36 | Vendored ckeditor5/codemirror/bootstrap/chartjs. **clean** | -| **matplotlib** | Python | 465 | 30 | 400 | 1 | 1 | 2 | 31 | - | - | itertools.count + tests. **clean** | -| **kitty** | Python/C | 113 | 102 | - | 5 | 2 | - | 3 | - | 1 | Bounded tab/window/font index. **clean** | -| **chef** | Ruby | 104 | 92 | 2 | 9 | - | - | - | 1 | - | Ruby Hash.include? + profile-name logging. **clean** | -| **vitess** | Go/Java | 101 | 43 | 18 | 20 | 2 | 2 | 13 | - | 3 | Java Set.contains + EnumSet. **clean** | -| **qpdf** | C++ | 58 | 2 | - | 7 | - | 6 | 43 | - | - | Test fixtures + intentional test prints. **clean** | -| **nano** | C | 31 | 31 | - | - | - | - | - | - | - | Locale + dotdir-skip + brace count. **clean** | -| **jq** | C | 22 | 16 | - | - | - | - | 6 | - | - | jvp_contains JSON algorithm + test. **clean** | -| **miller** | Go/Rust | 6 | 4 | - | 1 | 1 | - | - | - | - | Range.contains + bounded verbs/aliases. **clean** | - -## Investigation: wildfly Java declared-type FPs - -```java -// TransportConfigOperationHandlers.java:420 -private static final Set allowedKeys = ImmutableSet.of(...); -if (!allowedKeys.contains(parameter.getKey())) { ... } - -// AbstractDistributableSession.java:93 -private static final Set LOCAL_CONTEXT_ATTRIBUTES = Set.of(...); - -// NamingEventCoordinator.java:132 -EnumSet scopeSet = ...; -if (scopeSet.contains(EventContext.OBJECT_SCOPE)) { ... } -``` - -Wildfly's enterprise Java idiom: declare `Set`, `Set>`, `EnumSet` as immutable static finals, then `.contains` against them throughout the codebase. All are O(1) hash/bit lookups. Java declared-type awareness gap (continued from Wave 11/15/18/21). - -## Other investigations - -### typo3 vendored frontend dominance - -934 of 934 M1 findings (100%) in TYPO3 are inside `Resources/Public/Contrib/` — the directory where TYPO3 vendors third-party JS libraries (ckeditor5 6 packages, codemirror, bootstrap, chartjs, jquery). PHP core has no measurable M1 surface. Same pattern as Wave 16's WordPress (1050 M1 in tinymce/codemirror/mediaelement) and Wave 24's arangodb (2298 M1 in vendored UI). - -### matplotlib `itertools.count(1)` — generator, not list.count - -```python -self._object_seq = itertools.count(1) # consumed by reserveObject -``` - -`itertools.count(start)` returns an infinite iterator generator producing successive integers. NOT `list.count(item)` (which is a linear scan). Scanner FP on the literal `.count(` substring. **Detector enhancement candidate:** distinguish `itertools.count(...)` from `.count(item)`. - -### chef profile-name logging — not credential leak - -```ruby -logger.debug("Resolving credentials secret '#{option}' for profile '#{profile}'") -``` - -Logs the OPTION KEY name (e.g. "secret_access_key") and the profile name (e.g. "production"), not the credential VALUE. M4 detector matches "credentials" / "secret" word literals in the format string but the interpolated values are key-names and profile-names. Bounded test of the M4 string-literal-context check. - -### kitty REDACTED FOR SECURITY - -```python -print(title(f'{f}:'), 'REDACTED FOR SECURITY') -``` - -Kitty's debug_config explicitly REDACTS sensitive values before printing. The literal "REDACTED FOR SECURITY" string trips M4's keyword scanner. **Intentional security feature**, not a defect. - -## Triage backlog - -1. **Scanner enhancement: Java `Set.contains`/`EnumSet.contains`/`Map.keySet().contains` declared-type awareness** (continued from Wave 11/15/18/21/24) — wildfly reinforces with 279+ M1 findings. -2. **Scanner enhancement: `itertools.count` vs `list.count` Python distinction** — matplotlib pattern. -3. **Scanner enhancement: M4 string-literal vs interpolated-value distinction** — chef logger pattern, kitty REDACTED string. - -## Method - -Same as Waves 3-25: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (seventh full-clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave25-collab-auth-sync-vectordb-shell-survey/` -- Clean-scan honor roll cumulative: 174 projects across waves 3-26 diff --git a/whitepaper/outreach/wave27-pkg-build-script-firmware-survey.md b/whitepaper/outreach/wave27-pkg-build-script-firmware-survey.md deleted file mode 100644 index 8a71f71ef..000000000 --- a/whitepaper/outreach/wave27-pkg-build-script-firmware-survey.md +++ /dev/null @@ -1,77 +0,0 @@ -# Wave 27 — Package Managers, Monorepo Build, Scripting, Firmware - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across Node package managers (yarn, pnpm), monorepo build (lerna, nx, turborepo), scripting languages (tcl, gawk), plotting (gnuplot), firmware (coreboot), and JTAG debugger (openocd). - ---- - -## Summary - -Wave 27 totals 1,696 HIGH+ findings across 10 projects. **Ten new clean-scan honor roll entries** (eighth full-clean wave). Honor roll cumulative: **184 projects** across waves 3-27. - -**No flagship CWE-407 patches ship this pass.** Package managers cluster their `.includes()` calls in per-package dependency-tree walks bounded by manifest size. Firmware projects (coreboot, openocd) cluster theirs in CLI argv parsing and fixed adapter/board name tables. - -## Clean-scan honor roll — 10 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **lerna** | TS | Monorepo manager | 20 findings: `get-cycles.ts` `path.includes(dep)` is per-dependency cycle detection (bounded by dep depth), bounded fixed cacheable-operations enum. **clean** | -| **gawk** | C | GNU awk | 50 findings: `command.c` debug command parser, `awkgram.c` switch case_values fixed lookup, `debug.c` source/breakpoint name matching. Bounded by awk language grammar. **clean** | -| **yarn** | JS | Node package manager (Berry) | 56 findings: `package-request.js` resolver bounded by deps, `install.js` excludeNames per CLI flag (small fixed list), package-linker realLocations bounded by workspace size. **clean** | -| **tcl** | C | Tool Command Language | 82 findings: `tclDate.c` month/day/timezone name lookup (fixed bit per language spec), `tclCmdMZ.c` `-nocase`/`-length` flag parsing, `tclIO.c` channel type "tcp" check. **clean** | -| **gnuplot** | C | Plotting program | 106 findings: `datafile.c` "+"/"++" pseudo-filename check, `command.c` terminal name lookup (qt/pm/eps/kitty — fixed terminal driver list ~20), `term.c` output format fixed lookup. **clean** | -| **pnpm** | TS | Performant Node pkg manager | 111 findings: `createRegistryServer.ts` contentType.includes('ndjson') is single-string substring check; `pendingBuilds.includes(id)` bounded by builds in flight (typically <100); `automaticallyIgnoredBuilds` is the user-configured allowlist (small). **clean** | -| **openocd** | C | JTAG debug + flash programming | 112 findings: `jtag/adapter.c` adapter driver name lookup (fixed list ~30 drivers), `flash/nor/dw-spi.c` board variant flag (`-jaguar2`/`-ocelot` fixed), `server/ipdbg.c` hub name lookup. **clean** | -| **coreboot** | C | x86/arm firmware | 145 findings: `device_tree.c` FDT property name lookup, `util/sconfig/main.c` board option name lookup, `util/marvell/doimage_mv/doimage.c` BIN/REG fixed image-section types. All bounded by board-spec config size. **clean** | -| **turborepo** | TS/Rust | Vercel monorepo build | 379 findings: 221 M1 mostly UI (turbo dashboard) + bounded build-config patterns; 140 M7 in `crates/turborepo-lib/src/run/` for graph traversal (intentional task-graph algorithms). **clean** | -| **nx** | TS | Smart monorepo build | 535 findings: 436 M1 mostly per-project task-graph patterns bounded by workspace size, plus codemods. Tight UI/build-time cluster. **clean** | - -Honor roll now stands at **184 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **nx** | TS | 535 | 436 | 26 | 16 | 2 | 1 | 53 | - | 1 | Per-project task-graph bounded. **clean** | -| **turborepo** | TS/Rust | 379 | 221 | - | 16 | - | 1 | 140 | - | 1 | Task-graph traversal algorithms. **clean** | -| **coreboot** | C | 145 | 135 | - | 7 | - | - | 2 | - | 1 | Device-tree + board config. **clean** | -| **openocd** | C | 112 | 108 | - | 3 | - | - | 1 | - | - | JTAG adapter + flash chip names. **clean** | -| **pnpm** | TS | 111 | 68 | - | 4 | 11 | 28 | - | - | - | Bounded build set. **clean** | -| **gnuplot** | C | 106 | 90 | - | 14 | - | - | 2 | - | - | Terminal driver names + datafile syntax. **clean** | -| **tcl** | C | 82 | 80 | - | 2 | - | - | - | - | - | Date format + channel types + flags. **clean** | -| **yarn** | JS | 56 | 48 | - | 1 | 1 | 4 | 1 | - | 1 | Resolver bounded by manifest deps. **clean** | -| **gawk** | C | 50 | 44 | - | 6 | - | - | - | - | - | awk grammar fixed tokens. **clean** | -| **lerna** | TS | 20 | 12 | - | 2 | - | 6 | - | - | - | Cycle detection bounded. **clean** | - -## Investigation notes - -### Package managers (yarn, pnpm, lerna, nx, turborepo) — bounded by manifest - -Every Node package manager / monorepo build tool clusters its `Array.includes()` calls in per-package dependency walks. The bound here is the size of the user's `package.json` graph — for typical workspaces 10s of packages, for monorepos 100s. None hit pathological scale. - -### tcl/gawk/gnuplot — fixed language-spec tables - -These are interpreters/parsers with FIXED grammar/syntax tables compiled into the binary. tclDate's month-name lookup checks against 12 entries, gnuplot's terminal-driver lookup against ~20 entries, gawk's case-value sweep is per-switch-statement bounded by source code shape. - -### coreboot/openocd — board-spec bounded - -Both firmware projects look up board names, adapter names, flash chip names against fixed compile-time tables of the supported hardware (10s to 100s of board variants). Bounded by hardware coverage at compile time. - -## Triage backlog - -1. **No new high-value defect candidates surfaced.** Package managers and firmware projects use bounded dictionaries throughout. The interesting flagship territory continues to be in: - - Reverse-engineering tools (ghidra-0001, ghidra-0002 shipped) - - Analytics dashboards with multi-key joins (ghost-0001 shipped) - - Distributed-system filter paths with user-scaled inputs (weaviate-0001, pyroscope-0001 shipped) -2. **Scanner enhancements continue to be the highest leverage** — the 100+ FPs per wave from Java declared-type Set/EnumSet, Rust bitflags, JUnit ExtensionContext, codegen artifacts, vendored UI trees would clear thousands of findings if implemented. - -## Method - -Same as Waves 3-26: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Ten projects added to clean-scan honor roll** (eighth full-clean wave). No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave26-middleware-cms-cm-editor-pdf-cli-viz-survey/` -- Clean-scan honor roll cumulative: 184 projects across waves 3-27 diff --git a/whitepaper/outreach/wave28-sci-lisp-smalltalk-survey.md b/whitepaper/outreach/wave28-sci-lisp-smalltalk-survey.md deleted file mode 100644 index dbbbc200f..000000000 --- a/whitepaper/outreach/wave28-sci-lisp-smalltalk-survey.md +++ /dev/null @@ -1,87 +0,0 @@ -# Wave 28 — Scientific niches, Lisp/Scheme, Smalltalk, Erlang DB, Routing - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across software-defined radio (gnuradio), particle physics (geant4), HPC package manager (spack), Lisp/Scheme (sbcl, racket), F# compiler (fsharp), Smalltalk (pharo), Erlang KV store (riak), and routing daemon (frr). - ---- - -## Summary - -Wave 28 totals 2,053 HIGH+ findings across 10 projects. **8 new clean-scan honor roll entries.** Honor roll cumulative: **192 projects** across waves 3-28. - -**No flagship CWE-407 patches ship this pass.** Lisp/Scheme projects (sbcl, racket) cluster their findings in `(member ...)` / `(memq ...)` / `(position ...)` primitives — the canonical Lisp linear-search idiom (same Wave 24 maxima pattern). HPC/scientific projects (spack, geant4) cluster theirs in intentional spec/spatial intersection algorithms. - -Two zero-finding results need caveats: -- **pharo** (Smalltalk): 0 findings because unmoad has no Smalltalk language module — `.st` files were not scanned. Joins backlog as "unverified, awaiting Smalltalk detector". -- **riak** (Erlang): 0 findings, but the cloned `riak` repo is the rebar3 wrapper (3.5MB) — actual riak_kv code lives in submodules. Noted as partial scan. - -## Clean-scan honor roll — 8 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **fsharp** | F# | F# compiler + tooling | 10 findings: `fsihelp.fs` xpath `contains(@name, ...)` is XPath function (intentional XML query); `Source.cs` `ranges[i].GetSpan(...).Contains(caretPoint)` is WPF text-view containment (geometric); `ProjectReferenceNode.IndexOf('|')` single-char position. **clean** | -| **gnuradio** | C++/Python | Software-defined radio | 62 findings: `qsettings.contains(full_key)` is Qt QSettings.contains (O(log) hash), build-time Python tools (`cppfile_editor.py`, `blocktool/comments.py` parsing build artifacts). **clean** | -| **geant4** | C++ | Monte Carlo particle simulation | 87 findings: `liblist.c` "."/".." dirent skip (constant 2 strings), `G4StrUtil::contains(aString, "#")` substring search, `BooleanProcessor.src` `plane.distance(...)` is intentional geometry primitive. **clean** | -| **spack** | Python | HPC package manager | 459 findings: 356 M3 in test files; 72 M7 are `Spec.intersects(other)` — intentional Spack version-spec intersection (the algorithm, not a lookup). Same Wave 24 maxima Lisp-algorithm pattern. **clean** | -| **sbcl** | Common Lisp | Steel Bank Common Lisp | 741 findings: 727 M1 are Lisp `(member ...)`/`(position ...)` in `tools-for-build/ucd.lisp` (Unicode character database build), `target-package.lisp` (package internals), `meta-vmdef.lisp` (VM definitions). Lisp-tradition O(N) primitives, bounded by language input. **clean** | -| **racket** | Racket/Scheme | Racket programming language | 388 findings: 383 M1 are Scheme/Racket `memq`/`member`/`assq` in compiler bootstrap (`xform.rkt`, `s/syntax.ss`). Same Lisp-tradition pattern as sbcl/maxima. **clean** | -| **frr** | C | FRRouting (routing daemon family) | 306 findings: `ospf6d.c` per-VRF name comparison (bounded by VRF count, typically <100), `bgpd/bgp_mplsvpn.c` route-map name lookup, `bgpd/bgpd.c` peer-group name lookup. Bounded by network configuration size. **clean** | -| **riak** | Erlang | Distributed KV store (Basho) | 0 findings — the `riak` GitHub repo is the rebar3 wrapper (3.5MB). Actual `riak_kv`, `riak_core` code lives in git submodules not pulled. **partial scan** — joins honor roll on the wrapper but `riak_kv`/`riak_core` deferred. | - -Honor roll now stands at **192 projects** validated zero-real-finding under MOAD-0001 scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **sbcl** | Lisp | 741 | 727 | - | 14 | - | - | - | - | - | Lisp `(member ...)` build-time + runtime primitives. **clean** | -| **spack** | Python | 459 | 24 | 356 | - | 1 | 1 | 72 | - | 5 | Test ContextValue + Spec.intersects algorithm. **clean** | -| **racket** | Racket | 388 | 383 | - | 3 | - | - | - | 2 | - | Scheme memq/member compiler bootstrap. **clean** | -| **frr** | C | 306 | 241 | 1 | 13 | - | 22 | 21 | - | 8 | Per-VRF + route-map + peer-group. **clean** | -| **geant4** | C++ | 87 | 37 | - | 1 | - | - | 49 | - | - | dirent skip + spatial geometry. **clean** | -| **gnuradio** | C++/Python | 62 | 40 | 14 | - | - | - | 7 | - | 1 | QSettings + build-time Python. **clean** | -| **fsharp** | F# | 10 | 5 | - | - | - | - | 5 | - | - | XPath + WPF text-view geometry. **clean** | -| pharo | Smalltalk | 0 | - | - | - | - | - | - | - | - | **unscanned** — no Smalltalk language module. | -| **riak** (wrapper) | Erlang | 0 | - | - | - | - | - | - | - | - | rebar3 wrapper only (3.5MB); actual app code in submodules. **partial** | - -## Investigations - -### Lisp/Scheme `(member ...)` ecosystem pattern (sbcl, racket, maxima) - -Lisp's `(member item list :test ...)` is the canonical containment primitive — O(N) linear scan returning the tail of the list at the match. Used pervasively in: -- **sbcl** Unicode character database builds, package symbol resolution, VM type definitions -- **racket** Scheme/Chez compiler bootstrap, syntax expansion, scribble doc generation -- **maxima** (Wave 24) graph isomorphism, sheaf cohomology, gentran transformations - -Replacing with hash-based membership changes Lisp semantics (member returns the matched-from-here tail, callers may rely on this). The Lisp ecosystem's idiom is to use `member` for small lists and explicit hash tables (`make-hash-table`) for large ones — the choice is intentional per call site. - -**Detector enhancement candidate** (continued from Wave 24 maxima): Lisp `member`/`memq`/`assq`/`position` algorithm awareness — these aren't to be replaced wholesale. - -### spack `Spec.intersects` — intentional algorithm - -Spack's `spack.spec.Spec.intersects(other)` is the version/variant intersection algorithm at the heart of dependency resolution. The 72 M7 hits are recursive intersection calls down the spec tree — the algorithm is the work, not a lookup that should be cached. - -### geant4 `G4StrUtil::contains(aString, "#")` substring + `plane.distance(...)` geometry - -`contains(aString, "#")` is single-char comment detection in CHEM file parsing. `BooleanProcessor.src` Constructive Solid Geometry uses `plane.distance(...)` for boolean-mesh operations — intentional geometric algorithm, not a lookup. - -### pharo Smalltalk gap - -Pharo's source is `.st` files (Smalltalk class definitions). unmoad's language detection covers ~42 languages but not Smalltalk yet. Joins the gap-list alongside Erlang's full Riak codebase. - -## Triage backlog - -1. **Scanner enhancement: Smalltalk language module** — would enable scanning Pharo + GToolkit + Squeak. -2. **Scanner enhancement: Lisp `(member ...)` algorithm awareness** (continued from Wave 24) — sbcl + racket reinforce. -3. **Scanner enhancement: Spack/conan-style intersects() algorithm awareness** — package-spec intersection is the algorithm, not a lookup. - -## Method - -Same as Waves 3-27: shallow clone, `unmoad -s high -f json`, filter test/vendor/codegen noise, manual triage of strongest source-only candidates per project. **Eight projects added to clean-scan honor roll.** Two more (pharo, riak) noted as partial-scan with caveats. No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` through `/wave27-pkg-build-script-firmware-survey/` -- Clean-scan honor roll cumulative: 192 projects across waves 3-28 diff --git a/whitepaper/outreach/wave4-linter-ci-survey.md b/whitepaper/outreach/wave4-linter-ci-survey.md deleted file mode 100644 index 7c439c421..000000000 --- a/whitepaper/outreach/wave4-linter-ci-survey.md +++ /dev/null @@ -1,120 +0,0 @@ -# Linters, CI/CD, Config Management, Build Tools — CWE-407 Wave 4 Scan - -**Survey date:** 2026-04-24 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 40 projects spanning linters, formatters, CI/CD runners, config management, and build tooling — every class of tooling that runs during a modern software CI/CD pipeline. - ---- - -## Summary - -We scanned the leading open-source linters, formatters, CI runners, config-management tools, and JS/TS build tools for our nine active MOAD patterns. Total HIGH+ findings across all 40 targets: 18,617. Clean scans: 3 projects carry zero HIGH+ findings across the 9 detectors. - -This survey documents what was found. Full UNDF IDs are reserved for confirmed hot-path defects with shipping patches and benches; broader findings are listed here for future triage and potential refinement. - -## Flagship patch shipped this wave - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| psalm (PHP static analyzer) | FileFilter.allowsClass in_array → hash set | 336× @ C=F=5000 | pending assignment | - -## Per-target findings — linters & formatters - -| Project | Language | Total | M1 | M3 | M11 | Notes | -|---------|---------|------:|---:|---:|----:|-------| -| eslint | JS/TS | 88 | 66 | - | 5 | rule-matching hot paths; lib/rules/grouped-accessor-pairs worth follow-up | -| biome | Rust | 344 | 166 | - | 7 | vue_component.rs analyzer has 11 M1 hits | -| prettier | JS | 52 | 47 | - | - | print/template-literal worth follow-up | -| pylint | Python | 20 | 5 | - | 8 | base_checker MSG_ORDER.index inside loop | -| ruff | Rust | 386 | 165 | 30 | 12 | completion.rs — most hits in test assertions | -| black | Python | 13 | 8 | 2 | 2 | pgen2/pgen.py dfa.index in make_label loop | -| flake8 | Python | 10 | 1 | 9 | - | thin wrapper — mostly M3 plugin-pipeline | -| pyflakes | Python | 3 | 2 | - | 1 | minimal | -| rubocop (covered prior wave) | Ruby | — | — | — | — | rubocop-0001, 0002 shipped earlier | -| stylelint | JS | 32 | 29 | - | - | declaration-block-no-redundant-longhand rules | -| sqlfluff | Python+Rust | 75 | 33 | 8 | 3 | utils/reflow/sequence.py | -| phpstan | PHP | 10 | 8 | - | - | identifier-extractor/src/Rule.php | -| PHP_CodeSniffer | PHP | 39 | 21 | - | 15 | Tokenizers/PHP.php openerTokens in_array — 15 M11 ReDoS CRIT | -| **psalm** | PHP | 92 | 54 | - | 8 | **Flagship patch this wave (psalm-0001)** | -| rustfmt | Rust | 44 | 21 | - | - | src/string.rs | -| golangci-lint | Go | 82 | 25 | 56 | - | migrate_linter_names.go | -| go-tools | Go | 25 | 4 | 6 | - | ir/sanity.go slices.Contains | -| scalafmt | Scala | 536 | 20 | - | - | rewrite/Imports.scala | -| hadolint | Haskell | **0** | - | - | - | **clean scan — zero HIGH+ findings** | -| yamllint | Python | 4 | - | - | 4 | regex flagged; all in config parsing | -| markdownlint | JS | 17 | 16 | - | - | helpers/micromark-helpers.cjs type.includes in token walk | -| ktlint | Kotlin | 37 | 3 | 30 | 1 | ELEMENT_TYPES_ALLOWING_PRECEDING_WHITESPACE.contains | -| detekt | Kotlin | 106 | 23 | 55 | 5 | KDocReferencesNonPublicProperty | - -## Per-target findings — CI/CD runners - -| Project | Language | Total | M1 | M3 | Notes | -|---------|---------|------:|---:|---:|-------| -| act (nektos/act) | Go | 16 | 5 | 6 | pkg/runner/hashfiles/index.js vendored — low impact | -| agent (buildkite) | Go | 69 | 1 | 5 | thin client | -| pipeline (tektoncd) | Go | 143 | 10 | 103 | taskrun validation, forbidden env lookup | -| concourse | Go | 72 | 29 | 13 | web/public/graph.mjs (d3 vendored) | -| woodpecker | Go | 31 | 6 | 9 | frontend/yaml/constraint | -| shellcheck | Haskell | **0** | - | - | **clean scan — zero HIGH+ findings** | -| gulp (build task) | JS | **0** | - | - | **clean scan — zero HIGH+ findings** | - -## Per-target findings — config management + IaC - -| Project | Language | Total | M1 | Notes | -|---------|---------|------:|---:|-------| -| aws-cdk | TS | 11,875 | 8,379 | dominated by CFN type definitions; region-info.ts hot path | -| cdk8s | TS | 1 | 1 | minimal | -| kustomize | Go | (not separately reported) | - | small codebase, no hot-path M1 | - -## Per-target findings — build tools (JS ecosystem) - -| Project | Language | Total | M1 | Notes | -|---------|---------|------:|---:|-------| -| rollup | TS/Rust | 38 | 36 | src/watch/watch.ts transformDependencies | -| parcel | JS/Rust | 149 | 106 | BundleGraph.js | -| vite | TS | 77 | 72 | importMetaGlob, resolve.ts | -| turborepo | Rust | 379 | 221 | run/task_filter.rs, engine/mod.rs | -| nx | TS | 535 | 436 | lock-file/yarn-parser.ts | -| lerna | TS | 20 | 12 | cycles/get-cycles.ts | -| swc | Rust | 2,257 | 1,553 | most hits in vendored JS test benches | -| babel | JS | 687 | 598 | Makefile.js + helper generators | - -## Clean scans — 3 projects with zero HIGH+ findings - -| Project | Language | Role | -|---------|---------|------| -| hadolint | Haskell | Dockerfile linter | -| shellcheck | Haskell | shell script linter | -| gulp | JS | build task runner | - -All three are small, tight, well-maintained codebases. Zero MOAD-pattern hits at HIGH severity across the 9 detectors. - -## Triage follow-ups identified for future waves - -1. **PHP_CodeSniffer Tokenizers/PHP.php** — 15 M11 CRIT ReDoS findings flagged. **Investigated and determined false positives**: the nested-quantifier pattern `((? {repo}.json - -# Filter: drop test/vendor/.d.ts/.min/docs; review remainder per project -# Triage confirmed defects into patch + Python bench + scanner fixture -``` - -## References - -- `/psalm/` — flagship Wave 4 intel page -- `/rubocop-0001/` and `/rubocop-0002/` — earlier Ruby linter defects (Wave 3) -- MOAD-0001 [A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` diff --git a/whitepaper/outreach/wave5-cicd-iac-survey.md b/whitepaper/outreach/wave5-cicd-iac-survey.md deleted file mode 100644 index b59239866..000000000 --- a/whitepaper/outreach/wave5-cicd-iac-survey.md +++ /dev/null @@ -1,82 +0,0 @@ -# CI/CD Deployment, Build Systems, IaC Testing — Wave 5 Scan - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 32 projects across deployment (Spinnaker, fluxcd, Argo Rollouts/Events), modern CI/CD build (Earthly, Dagger, Buck2), container runtime (containerd, crun, skopeo, ko, kaniko, buildah), local k8s clusters (kind, minikube, k3s), IaC + testing (Packer, Vagrant, ansible-lint, Molecule, InSpec, Terratest), contract & mutation testing (Pact, Stryker, mutmut, PIT), security/static analysis (Semgrep, Bandit, gosec), and code-quality stalwarts (Spotbugs, Checkstyle, chart-testing). - ---- - -## Summary - -Wave 5 totals 2,981 HIGH+ findings across 32 projects. Clean-scan honor roll grows by 4 with `kind`, `ko`, `chart-testing`, and `pact-ruby` all returning zero HIGH+ MOAD findings. One flagship patch ships for vagrant. - -## Flagship patch shipped this wave - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| vagrant | Bundler plugin Array#include? in per-spec loop | 127× @ S=2000 P=1000 | pending assignment | - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M5 | M11 | CRIT | Notes | -|---------|------|------:|---:|---:|---:|----:|-----:|-------| -| clouddriver (Spinnaker) | Java/Groovy | 677 | 149 | 240 | 60 | 4 | 71 | huge ThreadLocal/ContextVar surface; Netflix scale | -| spotbugs | Java | 598 | 121 | 226 | 121 | 2 | 6 | many false-positive Set.contains in detectors | -| buck2 | Rust | 526 | 229 | 32 | 14 | 11 | 12 | dice/versions.rs range.contains | -| checkstyle | Java | 235 | 81 | 51 | 9 | 10 | 10 | VisibilityModifierCheck — Set.contains false positives | -| semgrep | Python | 217 | 137 | 3 | - | 12 | 47 | static analyzer — pattern matching is its job | -| dagger | Go | 154 | 43 | 45 | 2 | - | 51 | client/drivers/container.go slices.Contains | -| **vagrant** | **Ruby** | **131** | **91** | 21 | - | - | 18 | **flagship patch — bundler.rb plugin loader** | -| terratest | Go | 66 | 38 | - | - | 1 | 5 | helm/cmd.go additionalArgs scan | -| pitest | Java | 51 | 19 | 6 | 5 | - | - | Maven plugin scope filter | -| inspec | Ruby | 49 | 49 | - | - | - | - | plugin loader, deprecation parser | -| minikube | Go | 32 | 9 | 1 | - | - | 15 | mostly weak hash CRIT in test fixtures | -| containerd | Go | 29 | 4 | 17 | - | - | 8 | runtime context handling | -| k3s | Go | 25 | 4 | - | - | - | 20 | bundled k8s — most weak hash in test certs | -| stryker-js | TS | 20 | 18 | - | - | - | - | mutator dispatcher | -| argo-events | Go | 19 | - | 2 | - | - | 13 | weak hash in webhook validators | -| buildah | Go | 18 | 13 | - | - | - | 3 | container build tool | -| bandit | Python | 17 | 6 | - | - | 2 | 11 | static analyzer for Python security | -| argo-rollouts | Go | 16 | 3 | 2 | - | - | 5 | progressive delivery controller | -| flux2 | Go | 15 | - | - | - | - | 15 | weak hash in source-controller test fixtures | -| earthly | Go | 14 | 4 | 3 | - | 1 | 7 | gitutil, oidcutil | -| packer | Go | 11 | - | - | - | - | 10 | weak hash in builder tests | -| skopeo | Go | 10 | - | - | - | - | 10 | weak hash in test fixtures | -| ansible-lint | Python | 5 | 3 | - | - | 2 | 2 | small surface | -| gosec | Go | 5 | 2 | - | - | - | 3 | the security scanner; small codebase | -| kaniko | Go | 4 | - | - | - | - | - | container build, mostly clean | -| molecule | Python | 2 | 2 | - | - | - | - | ansible test framework, tight | -| crun | C | 1 | 1 | - | - | - | - | tiny | -| mutmut | Python | 1 | 1 | - | - | - | - | minimal | - -## Clean scans — 4 new entries to the honor roll - -| Project | Lang | Role | -|---------|------|------| -| **chart-testing** | Go | Helm chart lint + test orchestrator | -| **kind** | Go | local Kubernetes via Docker containers | -| **ko** | Go | Go-native container image builder | -| **pact-ruby** | Ruby | contract testing for service interactions | - -These four ran clean across our 9 MOAD detectors at HIGH severity. Tight, well-maintained codebases. - -## Triage backlog from this wave - -1. **clouddriver (Spinnaker) ContextVar/ThreadLocal handling** — 240 M3 hits. Worth a deep MOAD-0003 follow-up; deployment platform at Netflix scale. -2. **spotbugs UnreadFields detector** — 8 M1 hits. Need to read each — most likely Set.contains false positives, but worth confirming against the actual code paths. -3. **buck2 dice/versions.rs range.contains** — Rust BTreeSet/range pattern; worth a targeted bench. -4. **dagger client/drivers/container.go** — slices.Contains on container name list per launch. -5. **terratest helm/cmd.go additionalArgs scan** — Helm command builder, low impact but clean fix. -6. **inspec plugin loader** — 4 hits in deprecation/config_file.rb; per-plugin overhead. -7. **stryker-js directive-bookkeeper allMutatorNames.includes** — JS mutator dispatcher per AST node. - -## Method - -Same as Wave 3 and Wave 4: shallow clone, `unmoad -s high -f json`, filter test/vendor/docs noise, manual triage of the strongest source-only candidates per project. - -## References - -- `/vagrant/` — flagship Wave 5 intel page -- Earlier surveys: `/test-harness-survey/` (Wave 3), `/wave4-linter-ci-survey/` (Wave 4) -- MOAD-0001 [A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` diff --git a/whitepaper/outreach/wave6-docgen-webfw-tui-survey.md b/whitepaper/outreach/wave6-docgen-webfw-tui-survey.md deleted file mode 100644 index 8bfddc8fb..000000000 --- a/whitepaper/outreach/wave6-docgen-webfw-tui-survey.md +++ /dev/null @@ -1,88 +0,0 @@ -# Documentation Generators, Web Frameworks, TUI/CLI, Migration Tools — Wave 6 Scan - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 38 projects across 8 fresh categories untouched in prior waves: documentation generators (Sphinx, JSDoc, TypeDoc, Doxygen, MkDocs, Hugo, Jekyll, Gatsby, Eleventy, Astro), web frameworks (Fastify, Express, Koa, hapi, SvelteKit, Nuxt, Remix), TUI/CLI frameworks (Cobra, Click, Commander.js, Yargs, Bubble Tea, Ratatui), migration tools (Flyway, Goose, dbmate, Knex, Sqitch, Atlas), search engines (Tantivy, MeiliSearch, Typesense), API gateways (Kong, APISIX), MQTT/queue brokers (Mosquitto, EMQX, VerneMQ, ZeroMQ). - ---- - -## Summary - -Wave 6 totals 2,610 HIGH+ findings across 38 projects. Three more clean-scan additions: Bubble Tea, dbmate, libzmq. One flagship patch ships for Knex.js — the dominant Node SQL migration library — at 355× speedup on A=C=2000 migrations. - -## Flagship patch - -| Target | Defect | Speedup | UNDF | -|--------|--------|---------|------| -| knex (Node SQL migrations) | Migrator rollback/down `.map().includes()` → hoisted Set | 355× @ A=C=2000 | pending | - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M5 | M11 | CRIT | Notes | -|---------|------|------:|---:|---:|---:|----:|-----:|-------| -| mosquitto | C | 329 | 106 | - | - | - | 220 | MQTT broker; 220 weak-hash CRIT in test certs/keys | -| astro | TS | 318 | 298 | 5 | 5 | - | 4 | path.ts String.includes mostly false positive | -| gatsby | JS | 232 | 156 | 21 | 15 | - | 18 | datastore in-memory indexing.ts worth follow-up | -| doxygen | C++ | 186 | 167 | - | - | - | 7 | std::find_if in tagreader.cpp + dotdirdeps.cpp | -| meilisearch | Rust | 144 | 68 | - | 3 | - | 4 | milli/update/index_documents/mod.rs | -| typesense | C++ | 103 | 20 | - | - | - | 2 | search engine, modest | -| mkdocs | Python | 96 | 57 | 6 | 1 | 1 | 1 | mostly vendored JS in themes | -| nuxt | TS | 94 | 75 | 14 | 2 | - | 3 | core/nuxt.ts, pages/module.ts | -| remix | TS | 94 | 60 | 6 | 5 | - | 21 | most M1 in component bench dir | -| flyway | Java | 93 | 36 | 5 | 9 | 10 | 13 | PropertyResolverContextImpl, M11 ReDoS worth checking | -| apisix | Lua | 92 | 1 | - | 1 | 2 | 90 | almost all CRIT in M6 weak-hash (test fixtures) | -| tantivy | Rust | 88 | 41 | - | - | - | 1 | bitset.rs, range_query, search hot paths | -| vernemq | Erlang | 65 | 27 | - | - | - | 25 | broker plumbing | -| typedoc | TS | 60 | 53 | - | 2 | - | 3 | doc gen, ts walk | -| hugo | Go | 54 | 34 | 3 | 1 | 1 | 4 | static site gen | -| kit (SvelteKit) | TS | 53 | 39 | 10 | 4 | - | - | per-route handler | -| sqitch | Perl | 52 | 12 | - | - | - | 27 | CPAN module | -| kong | Lua | 49 | - | - | 12 | 1 | 28 | API gateway, all CRIT in test fixtures | -| sphinx | Python | 45 | 25 | 1 | - | 15 | 19 | writers/texinfo.py + manpage.py node.parent.index | -| jsdoc | JS | 41 | 38 | - | - | - | - | JS doc gen | -| express | JS | 39 | 4 | 34 | - | 1 | 1 | mostly M3 — known req-context propagation | -| **knex** | **JS** | 38 | 38 | - | - | - | - | **flagship — Migrator rollback/down** | -| ratatui | Rust | 35 | 19 | - | - | - | 1 | TUI lib | -| koa | JS | 31 | - | 30 | 1 | - | - | request context M3 | -| yargs | JS | 24 | 23 | - | - | - | - | CLI parser | -| fastify | JS | 19 | 15 | 4 | - | - | - | route.js plugin-utils | -| commander.js | JS | 17 | 13 | - | - | - | 4 | CLI parser | -| atlas | Go | 15 | 4 | 5 | - | - | 4 | DB schema | -| eleventy | JS | 10 | 10 | - | - | - | - | static site gen | -| jekyll | Ruby | 10 | 10 | - | - | - | - | static site gen | -| cobra | Go | 6 | - | 6 | - | - | - | CLI lib, all M3 (context) | -| hapi | JS | 5 | 3 | - | - | - | 2 | small surface | -| emqx | Erlang | 2 | - | - | - | - | 1 | broker, mostly clean | -| goose | Go | 2 | - | - | - | - | 2 | tiny migration tool | -| click | Python | 1 | - | 1 | - | - | - | minimal | - -## Clean scans — 3 new entries to the honor roll - -| Project | Lang | Role | -|---------|------|------| -| **bubbletea** | Go | TUI framework | -| **dbmate** | Go | DB migration tool | -| **libzmq** | C++ | ZeroMQ messaging library | - -Tight, focused codebases with zero HIGH+ MOAD findings across the 9 detectors. - -## Triage backlog from this wave - -1. **gatsby datastore in-memory/indexing.ts** — 5 hits in node indexing; SSG hot path on every build. -2. **doxygen tagreader.cpp / dotdirdeps.cpp std::find_if** — runs on every C++ doc generation. -3. **meilisearch milli/update/index_documents** — Rust search indexer, 5 hits. -4. **flyway PropertyResolverContextImpl + 10 M11** — Java migration; ReDoS findings worth confirming. -5. **sphinx writers/texinfo.py + manpage.py** — `node.parent.index(node)` in tree walk. -6. **mosquitto src/conf.c** — MQTT broker config parser, 14 hits. -7. **typedoc + jsdoc + tantivy** — long tails, modest impact each. - -## Method - -Same as prior waves: shallow clone, `unmoad -s high -f json`, filter test/vendor/docs noise, manual triage of the strongest source-only candidates per project. - -## References - -- `/knex/` — flagship Wave 6 intel page -- Earlier surveys: `/test-harness-survey/` (Wave 3), `/wave4-linter-ci-survey/` (Wave 4), `/wave5-cicd-iac-survey/` (Wave 5) -- MOAD-0001 [A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` diff --git a/whitepaper/outreach/wave7-mail-dns-storage-vpn-rtos-survey.md b/whitepaper/outreach/wave7-mail-dns-storage-vpn-rtos-survey.md deleted file mode 100644 index 2bf4b54f6..000000000 --- a/whitepaper/outreach/wave7-mail-dns-storage-vpn-rtos-survey.md +++ /dev/null @@ -1,99 +0,0 @@ -# Wave 7 — Mail, DNS, Storage, VPN, Audio, RTOS, Postgres ecosystem - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 29 projects across mail (maddy, neomutt), DNS (pdns, knot, nsd), VPN/routing (wireguard-go, libreswan, openbgpd-portable, gobgp), distributed storage (garage, longhorn-engine, openebs, glusterfs), time-series databases (timescaledb, questdb, m3), audio servers (pipewire, jack2, mpv), real-time OS (nuttx, RIOT), Go-on-microcontroller (tinygo), document/key-value stores (couchdb, surrealdb, KeyDB), and Postgres ecosystem tooling (patroni, pgbackrest, pgpool2, lxc). - ---- - -## Summary - -Wave 7 totals 4,116 HIGH+ findings across 29 projects. Five new clean-scan honor roll entries. **No flagship CWE-407 patches ship this pass** — the strong M1 candidates either resolve to bounded fixed config tables (compile-time small N), to data structures already optimal (HashSet, ObjHashSet, RoaringTreemap), or to query-shape constants too small to cross the wall-clock threshold. - -This wave behaves like the docs-pipeline survey: mature C/C++/Rust infrastructure with already-optimized hot paths. Honest "investigated, no patch this pass" outcome. - -## Clean-scan honor roll — 5 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **wireguard-go** | Go | Userspace WireGuard implementation | Zero HIGH+ across all 9 detectors. Tight crypto codebase. | -| **longhorn-engine** | Go | Rancher Longhorn block storage engine | Zero HIGH+. Distributed-storage core, well-disciplined. | -| **tinygo** | Go | LLVM-based Go compiler for microcontrollers | 5 M4 findings, all `token`/`Msg` in compiler error strings — credential-keyword false positives. | -| **maddy** | Go | Modular mail server | 4 M4 findings, all error/log strings naming protocol fields ("api_token", "password is expired") — string-literal false positives. | -| **openbgpd-portable** | C | OpenBSD BGP daemon (portable) | 2 M6 findings, both TCP-MD5 signing for BGP per RFC 2385 — protocol-mandated, not a defect. | - -Honor roll now stands at **30 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| questdb | Java/Rust | 1840 | 344 | 962 | 35 | 142 | - | 357 | - | - | M1 hits in `qdbr/parquet_write/simd.rs` are bloom-filter `&[u64].contains` — the bloom array IS the data structure; replacing with HashSet would defeat SIMD layout. M3 cluster: `vec_docs.set` and similar — scanner FP on `.set(` literal. | -| surrealdb | Rust | 370 | 155 | - | 48 | 4 | - | 160 | - | 3 | HNSW `pending_docs.contains(doc_id)` — `pending_docs` is `RoaringTreemap` with O(1)-ish containment. NOT a defect. `computed_deps.rs:217` cycle-safety-net Vec.contains is real but only fires on cycle (caught at DEFINE time). | -| glusterfs | C | 320 | 294 | 12 | 13 | 1 | - | - | - | - | 90% strcmp-in-loop on fixed xlator/option tables. `extras/profiler/glusterfs-profiler` Python script hits — diagnostic tool, not hot path. | -| RIOT | C | 251 | 156 | 4 | 49 | - | 6 | 28 | 5 | 3 | Embedded RTOS — most M1 hits are static driver tables. | -| garage | Rust | 224 | 172 | - | 13 | 1 | 1 | 34 | - | 3 | `rpc_helper.rs:593` `nodes.contains(n)` inside replication-factor loop (typically ≤5) — bounded constant. `redoc.standalone.js` is vendored. | -| m3 | Go | 279 | 217 | 16 | 7 | 1 | - | 35 | - | 3 | `swagger-ui.js` vendored hits dominate. Native code mostly fixed-table strcmp. | -| mpv | C | 181 | 177 | - | - | - | - | 4 | - | - | Most M1 in `defaults.js` (player JS) are command-prefix scans on bounded option list. | -| nuttx | C | 169 | 145 | - | 13 | - | - | 7 | 1 | 3 | Asm `arch_strcmp.S` matched as linear-search-in-loop — these ARE the strcmp primitive. | -| pgpool2 | C | 151 | 94 | - | 44 | - | 13 | - | - | - | `pgindent` Perl tool grep-in-loop. M4 cluster: log strings with "password" literal in error templates. | -| pdns | C++ | 110 | 67 | 1 | 2 | 4 | 3 | 31 | - | 2 | `d3.v3.js` vendored. M7 cluster worth a deeper look (recursor flatland defects). | -| knot | C | 107 | 93 | - | 7 | - | 1 | 5 | - | 1 | DNS server — fixed RR-type tables drive most M1. | -| KeyDB | C | 96 | 84 | 1 | 7 | - | - | 2 | - | 2 | `redis-cli.c` argv parsing strcmp — fixed CLI option table. | -| timescaledb | C | 79 | 70 | - | 2 | - | - | 7 | - | - | PostgreSQL extension — `bgw_jobs.c` and similar mostly fixed config lookups. | -| neomutt | C | 76 | 29 | - | 43 | - | 4 | - | - | - | Mail client — M4 cluster is account/credential field NAMES in config-key strings. | -| patroni | Python | 69 | 3 | 49 | 7 | 2 | 3 | - | - | 5 | M3 cluster is `event.set()`/`self.set('key', val)` — scanner FP on literal `.set(`. | -| nsd | C | 61 | 26 | - | 35 | - | - | - | - | - | Authoritative DNS server — strcmp on RR/option tables. | -| couchdb | Erlang/JS | 59 | 27 | 3 | 7 | 2 | 16 | 4 | - | - | M6 weak-hash hits in legacy migration code. | -| lxc | C | 57 | 54 | - | 1 | - | - | 2 | - | - | Container manager — fixed cgroup/capability tables. | -| libreswan | C | 31 | 14 | 6 | 9 | - | - | - | 2 | - | IPsec daemon — fixed crypto algorithm tables. | -| pipewire | C | 30 | 21 | - | 3 | - | - | 6 | - | - | Audio server — fixed format/property tables. | -| jack2 | C/Python | 16 | 9 | - | - | - | 3 | - | - | 4 | `waflib/Tools/c_config.py` build-system Python — load-time. | -| pgbackrest | C | 15 | 15 | - | - | - | - | - | - | - | All 15 are strcmp on `parseRuleCommand`/`parseRuleOption` — fixed compile-time rule tables. | -| gobgp | Go | 11 | 10 | - | 1 | - | - | - | - | - | `slices.Contains(req.UUIDs, v)` worth investigation but UUID list bounded by API call shape. | -| openebs | Go | 9 | 4 | - | - | - | - | 5 | - | - | Container storage operator — small surface. | -| **wireguard-go** | Go | 0 | - | - | - | - | - | - | - | - | **clean** | -| **longhorn-engine** | Go | 0 | - | - | - | - | - | - | - | - | **clean** | -| **tinygo** | Go | 5 | - | - | 5 | - | - | - | - | - | **clean** (FPs only) | -| **maddy** | Go | 4 | - | - | 4 | - | - | - | - | - | **clean** (FPs only) | -| **openbgpd-portable** | C | 2 | - | - | - | - | 2 | - | - | - | **clean** (RFC-mandated TCP-MD5) | - -## Investigations that did not patch-ship - -### questdb `QueryModel.recordViews` — borderline real defect - -`io.questdb.griffin.model.QueryModel.recordViews()` (line 1521 + 1532) iterates view definitions and dedupes by `referencedViews.contains(viewDefinition)` where `referencedViews` is `ObjList` — a linear-scan list. Classic O(N²) dedup pattern. - -Per-query cost is bounded by the query's chain depth: for typical analytical queries touching ≤20 views, the constant is invisible. For deeply chained materialized-view queries (50+ views) the cost becomes 2500 ops per call, called twice per query. Real but borderline. - -**Not patch-shipped this pass.** The fix is mechanical (add a parallel `ObjHashSet` for membership check, keep ObjList for ordered iteration), but the wall-clock impact at realistic query shapes does not cross the CWE-407 bar. Logged here so future scanner runs surface it again. - -### surrealdb HNSW `pending_docs.contains` - -Fully investigated. `pending_docs` is `RoaringTreemap` (Rust roaring crate) — already O(log n) or better depending on density. NOT a CWE-407 defect; the scanner does not yet model RoaringTreemap as a containment-optimal type. - -### gobgp `slices.Contains(req.UUIDs, v)` - -`req.UUIDs` length is bounded by API request shape (typically 1-100 UUIDs per gRPC call). Per-iteration cost on the inner loop dominates only for synthetic requests far above realistic API usage. Logged as low-priority, not patch-shipped. - -### patroni M3 cluster (49 hits) - -All 49 hits are `event.set()` (threading.Event signal flag — no leak) or `self.set('key', value)` on DCS clients (etcd/raft/k8s clients). Scanner false-positive on literal `.set(` regex match. Worth tightening the M3 detector to require ContextVar import context. - -## Triage backlog - -1. **questdb M3 cluster (962 hits)** — large enough to deserve its own pass. Most likely scanner FP on `.set(` literal in setter methods, but worth a detector-level tightening before re-scanning. -2. **questdb M7 cluster (357 hits)** — Flatland defect surface in SIMD/parquet code. Need to model the SIMD layout before claiming complexity-class change. -3. **pdns M7 cluster (31 hits)** — recursor candidates worth a focused pass. -4. **patroni M3 detector tightening** — add ContextVar/`from contextvars import` context check before flagging `.set(` on identifiers. -5. **scanner enhancement** — Roaring/Bitmap/HashSet type awareness in M1 detector to suppress these false positives at source. - -## Method - -Same as Waves 3-6: shallow clone, `unmoad -s high -f json`, filter test/vendor/docs noise, manual triage of the strongest source-only candidates per project. Five projects added to the clean-scan honor roll. No new UNDF IDs assigned this wave (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/` (Wave 3), `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/` -- Clean-scan honor roll cumulative: 30 projects across waves 3-7 diff --git a/whitepaper/outreach/wave8-observability-streaming-survey.md b/whitepaper/outreach/wave8-observability-streaming-survey.md deleted file mode 100644 index 56ce60c06..000000000 --- a/whitepaper/outreach/wave8-observability-streaming-survey.md +++ /dev/null @@ -1,80 +0,0 @@ -# Wave 8 — Observability + Streaming/Workflow - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 observability and stream/workflow projects: jaeger (distributed tracing), opentelemetry-collector (OTel pipeline), fluent-bit + fluentd (log forwarders), vector (Rust observability data pipeline), tempo (Grafana traces), mimir (Grafana metrics), VictoriaMetrics (Go metrics TSDB), nsq (message queue), temporal (workflow engine). - ---- - -## Summary - -Wave 8 totals 2,188 HIGH+ findings across 10 projects. **Four new clean-scan honor roll entries** (nsq, jaeger, opentelemetry-collector, temporal — all reduce to scanner false positives or build-time/test-only patterns under inspection). Honor roll cumulative: **34 projects** across waves 3-8. - -**No flagship CWE-407 patches ship this pass.** The strongest M1 candidate (VictoriaMetrics `streamaggr.getInputOutputLabels` — `slices.Contains` per label per sample) is real but constant-factor at realistic config shapes (`by`/`without` lists are typically 3-10 entries, below the CWE-407 wall-clock bar). Logged for future re-scan once configs grow. - -## Clean-scan honor roll — 4 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **nsq** | Go | Distributed message queue | 4 findings, all FPs: `nsqadmin/static/js` String#includes vs Array#includes confusion + 1 test-fixture credential string. Tight Go core. | -| **jaeger** | Go | Distributed tracing | 0 M1. M3 hits all in `internal/auth/*` and `internal/tenancy/*` — these are intentional ContextValue plumbing for tenant/auth propagation, the standard Go pattern for cross-cutting context, not "leaked context" defects. | -| **opentelemetry-collector** | Go | OTel pipeline orchestrator | 9 M1 in `internal/cmd/pdatagen` — that is a build-time code generator, not a runtime path. Most M3 hits in `*_test.go`. | -| **temporal** | Go | Workflow engine | 19 M1 mostly in test files / `cmd/tools/genrpcwrappers` (build-time). The single core finding `server_options.go:78` checks against fixed Services list (5 entries: frontend, history, matching, worker, internal-frontend). | - -Honor roll now stands at **34 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| fluent-bit | C | 1203 | 1055 | 7 | 72 | 1 | 14 | 41 | - | 13 | M1 dominated by msgpack JSON-key `strncmp` parsing (`processor_labels`, `kube_meta`, `cloudwatch_logs`, exporter modules). N here is "static labels" — typically 5-20 — bounded constant. | -| vector | Rust | 262 | 121 | 1 | 14 | - | - | 125 | - | 1 | `windows_event_log/config.rs` query_lower.contains is config-time. `topology/running.rs` `reuse_buffers.contains` runs once at topology build. M7 cluster (125) worth a focused look but most are graph-build time. | -| VictoriaMetrics | Go | 209 | 156 | 2 | 19 | 1 | - | 28 | 2 | 1 | UI vendored JS dominates (88 hits in `app/vmselect/vmui` + `vmalert/static`). Real candidate `streamaggr.go:1129/1137` — see investigation below. | -| mimir | Go | 156 | 62 | 47 | 14 | - | - | 33 | - | - | UI vendored JS (`bootstrap-5.1.3.bundle.min.js`) accounts for 36. Core: `blocks_store_replicated_set.go` zone-bounded (3-9 zones); `codec.go` propagateHeaders bounded by config. | -| temporal | Go | 99 | 19 | 49 | 14 | - | 1 | 1 | 15 | - | M3 cluster all `_test.go` ContextWithValue. Core M1 = fixed Services list. **clean** | -| tempo | Go | 73 | 41 | - | 3 | - | - | 29 | - | - | UI vendored JS (36). `tracker.go:138/149` `t.sortedKeys` membership in usage tracking — bounded by tenant dimensions (typically <50). | -| opentelemetry-collector | Go | 53 | 9 | 44 | - | - | - | - | - | - | M1 = build-time generator. M3 = test fixtures. **clean** | -| jaeger | Go | 26 | - | 8 | 14 | 2 | - | 1 | - | 1 | Auth/tenancy ContextValue (intentional). M4 = "Authorization" in HTTP transport (intentional Bearer-token header). **clean** | -| fluentd | Ruby | 103 | 70 | 27 | - | - | - | - | - | 6 | Ruby `Array#include?` clusters in plugin parsers; mostly bounded by directive shape. | -| nsq | Go | 4 | 3 | - | 1 | - | - | - | - | - | All FPs (string vs array methods, test fixture). **clean** | - -## Investigation: VictoriaMetrics `streamaggr.getInputOutputLabels` - -`lib/streamaggr/streamaggr.go:1126` is called per time-series during stream aggregation. For each label in a sample, it calls `slices.Contains(without, label.Name)` (or `slices.Contains(by, label.Name)`) where `by`/`without` are user-configured label name lists. - -```go -func getInputOutputLabels(dstInput, dstOutput, labels []prompb.Label, by, without []string) ([]prompb.Label, []prompb.Label) { - if len(without) > 0 { - for _, label := range labels { - if slices.Contains(without, label.Name) { // O(W) per label - dstInput = append(dstInput, label) - } else { - dstOutput = append(dstOutput, label) - } - } - } - ... -} -``` - -For L labels per sample and W `without` (or `by`) entries, total cost is O(L × W) per sample. At ingest rates of 1M+ samples/sec, this multiplies. Real but constant-factor: typical configs have W ≤ 10 and L ≤ 30, so the constant is 300 ops/sample. A `map[string]struct{}{}` would replace this with O(L) total via single hash per label. - -**Not patch-shipped.** At realistic config shapes the wall-clock impact is ~2-3× — below the CWE-407 bar of complexity-class change with measurable wall-clock impact (5× speedup at minimum). For users running label-heavy aggregations (W > 50), the patch would matter; we leave it logged for a re-scan once a real production case surfaces. - -## Triage backlog - -1. **VictoriaMetrics streamaggr** — re-scan if a real user reports W > 30 with high-cardinality ingest; the `set` patch is 5 lines and we have it on file. -2. **fluentd Ruby plugin parsers** — `Array#include?` clusters in 70 hits worth a deeper Ruby-specific pass. -3. **vector M7 cluster (125 hits)** — Flatland defect surface in topology graph build paths. Most likely topology-build-time but worth confirming by-file. -4. **fluent-bit `processor_labels`** — bounded by static label count today; if Prometheus integrations push label count higher per metric, the linear `cfl_list_foreach` pattern becomes interesting. -5. **mimir `propagateHeaders` configs** — if operators add many propagated headers per request, the per-request `slices.Contains` walk becomes measurable. - -## Method - -Same as Waves 3-7: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI noise, manual triage of strongest source-only candidates per project. Four projects added to clean-scan honor roll. No new UNDF IDs assigned this wave (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/` -- Clean-scan honor roll cumulative: 34 projects across waves 3-8 diff --git a/whitepaper/outreach/wave9-image-pdf-db-editors-survey.md b/whitepaper/outreach/wave9-image-pdf-db-editors-survey.md deleted file mode 100644 index d482cf0ba..000000000 --- a/whitepaper/outreach/wave9-image-pdf-db-editors-survey.md +++ /dev/null @@ -1,79 +0,0 @@ -# Wave 9 — Image/PDF, Distributed DB, Terminals + Editors - -**Survey date:** 2026-04-25 -**Tool:** unmoad (9 active MOAD detectors, HIGH+ severity filter) -**Scope:** 10 projects across PDF/PostScript (ghostpdl, poppler), image processing (libvips, libheif), distributed key-value (tikv), terminal multiplexers + emulators (tmux, alacritty, wezterm), and modal editors (helix, kakoune). - ---- - -## Summary - -Wave 9 totals 663 HIGH+ findings across 10 projects. **Seven new clean-scan honor roll entries.** Honor roll cumulative: **41 projects** across waves 3-9. - -**No flagship CWE-407 patches ship this pass.** The strongest M1 surface (tikv 115 hits) resolves to scanner false positives on `HashSet.contains`, `Range.contains`, and bounded raft-replication (3-5 peers) patterns. The Rust bitflags ecosystem dominates terminal/editor false positives — `bitflags::bitflags!` macro generates `.contains(Flag::X)` that compiles to a single `&` AND, not a linear scan. - -## Clean-scan honor roll — 7 new entries - -| Project | Lang | Role | Notes | -|---------|------|------|-------| -| **ghostpdl** | C | Ghostscript PostScript/PDF interpreter | Zero HIGH+ across 273M of code. The Postscript/PDF interpreter that built the entire pre-press industry. Genuine clean scan. | -| **helix** | Rust | Modal editor (Vim-inspired) | 76 findings dominated by `KeyModifiers::contains(KeyModifiers::SHIFT)` — `KeyModifiers` is `bitflags::bitflags!` macro, `.contains` compiles to bitwise AND. False positives. | -| **alacritty** | Rust | GPU-accelerated terminal | 52 findings, same `Flags::contains` bitflag pattern as helix. `cell.flags.contains(Flags::WRAPLINE)` is a bitwise AND, not a search. | -| **wezterm** | Rust | GPU-accelerated terminal multiplexer | 137 findings, same bitflag pattern. `top_and_bottom_margins.contains(&self.cursor.y)` is `Range.contains`, also O(1). | -| **kakoune** | C++ | Modal editor (selection-based) | 28 findings, all `std::find_if` on text iterators bounded by line length, not algorithmic. Tight C++ codebase. | -| **poppler** | C++ | PDF rendering library | 17 findings, all bounded: 1 `strcmp` on fixed `stamp_types[]` icon array, 1 `std::find_if` on text fragment list. | -| **libheif** | C++ | HEIF/HEIC image format | 13 findings, all in `scripts/cpplint.py` (Google's vendored C++ linter), `examples/`, `extra/getopt_long.c` (vendored), or `brands.cc` with bounded HEIF-spec brand list. | - -Honor roll now stands at **41 projects** validated zero-real-finding under MOAD scanning. - -## Per-target findings - -| Project | Lang | Total | M1 | M3 | M4 | M5 | M6 | M7 | M9 | M11 | Triage | -|---------|------|------:|---:|---:|---:|---:|---:|---:|---:|----:|--------| -| **ghostpdl** | C | 0 | - | - | - | - | - | - | - | - | **clean** — zero HIGH+ on 273M of source | -| tikv | Rust | 236 | 115 | - | 4 | - | - | 111 | - | 6 | `index_lookup_executor.rs:1032` `rows.contains` is `HashSet`, NOT Vec — scanner FP. `peer.rs:1585` raft peer scan bounded by replication factor (3-5). | -| **wezterm** | Rust | 137 | 73 | - | 2 | - | - | 62 | - | - | bitflags FPs across `Modifiers::contains`, `Flags::contains`, `AuthMethods::contains` | -| **helix** | Rust | 76 | 40 | - | - | - | - | 35 | - | 1 | bitflags FPs across `KeyModifiers::contains`, `key_modifiers.contains` | -| libvips | C | 56 | 36 | 8 | 4 | - | - | 8 | - | - | `header.c` field-name lookup is bounded by image-format property count (typically 10-50). `package.c` plugin-table lookup is config-time. | -| **alacritty** | Rust | 52 | 23 | - | 1 | - | - | 28 | - | - | bitflags FPs (`cell.flags.contains(Flags::WRAPLINE)`, `KeyboardModes`, `Range.contains`) | -| tmux | C | 48 | 42 | - | - | - | - | 6 | - | - | All M1 are option-table/cmd-table strcmp scans with fixed compile-time table sizes. | -| **kakoune** | C++ | 28 | 12 | - | - | - | - | 16 | - | - | `std::find_if` on text iterator bounded by line length | -| **poppler** | C++ | 17 | 2 | - | 4 | - | 4 | 7 | - | - | 1 stamp_types strcmp + 1 text-fragment find_if. `M6 weak-hash` are MD5 in `Decrypt.cc` — PDF spec uses MD5 for legacy encryption (RFC-mandated). | -| **libheif** | C++ | 13 | 11 | - | - | - | - | 1 | - | 1 | cpplint vendored / examples / getopt_long vendored | - -## Investigations that did not patch-ship - -### tikv `index_lookup_executor.rs:1032` — false positive on HashSet - -```rust -self.results[result_index] - .logical_rows - .retain(|&physical_row| rows.contains(&physical_row)); -``` - -Looked like a real CWE-407 — outer `retain` over `logical_rows`, inner `rows.contains`. Inspected `left_rows: Vec>>` declaration at line 724 — `rows` is already `HashSet`, so `.contains` is O(1). NOT a defect; scanner does not yet model Rust HashSet vs Vec at the call site. - -### libvips `header.c` field-name lookup - -`vips_image_get_typeof` and friends scan a `GSList` of `VipsField` by name. Per-image typical N is 10-50 fields, called once per metadata access. Real but bounded constant. - -### Bitflags macro pattern (helix, alacritty, wezterm) - -The Rust `bitflags::bitflags!` macro generates a struct with a `.contains(other: Self) -> bool` method that compiles to `(self.bits & other.bits) == other.bits` — a single bitwise AND. The scanner's `vec-contains-in-loop` rule fires on the literal call shape but the underlying operation is O(1). **Detector enhancement candidate:** add type-context awareness for `bitflags::bitflags!` macro-generated types. - -## Triage backlog - -1. **Scanner enhancement: Rust HashSet/HashMap awareness** in M1 detector to suppress `Vec.contains` FPs at types like `HashSet`, `BTreeSet`, `RoaringTreemap`. -2. **Scanner enhancement: Rust bitflags awareness** — recognize `bitflags::bitflags!` macro-generated types and suppress `.contains(FlagX)` as bitwise AND, not linear scan. This single rule would suppress ~250 of Wave 9's 663 findings. -3. **tikv M7 cluster (111 hits)** — Flatland defect surface in distributed query execution. Worth a focused pass once we have benchmark scaffolding for distributed TiKV scenarios. -4. **libvips header.c** — re-scan if a real production case surfaces with images carrying 100+ fields (some scientific imaging workflows). - -## Method - -Same as Waves 3-8: shallow clone, `unmoad -s high -f json`, filter test/vendor/UI/macro-generated noise, manual triage of strongest source-only candidates per project. Seven projects added to clean-scan honor roll. No new UNDF IDs assigned (no patches shipped). - -## References - -- `unmoad` detection engine: `git.unturf.com/engineering/unmoad.com` -- Earlier surveys: `/test-harness-survey/`, `/wave4-linter-ci-survey/`, `/wave5-cicd-iac-survey/`, `/wave6-docgen-webfw-tui-survey/`, `/docs-pipeline-survey/`, `/wave7-mail-dns-storage-vpn-rtos-survey/`, `/wave8-observability-streaming-survey/` -- Clean-scan honor roll cumulative: 41 projects across waves 3-9 diff --git a/whitepaper/outreach/weaviate.md b/whitepaper/outreach/weaviate.md deleted file mode 100644 index 376645e09..000000000 --- a/whitepaper/outreach/weaviate.md +++ /dev/null @@ -1,67 +0,0 @@ -# Weaviate — CWE-407 Disclosure Brief - -**Project:** Weaviate (weaviate/weaviate) -**Severity:** HIGH -**CWE:** CWE-407 (Inefficient Algorithmic Complexity) -**MOAD:** [MOAD-2026-0001 A Sedimentary Defect](https://undefect.com/moad-2026-0001/) -**Speedup:** 1735× measured at N=50k K=5k - -## Defect Map - -![]({static}/uploads/intel-weaviate.svg) - -## What it is - -Weaviate's per-request RBAC filter walks every result item and calls `slices.Contains(allowedList, resourceFn(item))` per item. `slices.Contains` is O(K) linear scan over the user's permitted-resource list. Across N items returned from a query, total cost is **O(N × K)**. - -For multi-tenant deployments with hundreds-to-thousands of collections per principal, every authorized list/search request pays the quadratic cost. Authorization sits on every read path. - -| Defect | UNDF | -|--------|------| -| `weaviate-0001` | [undf-2026-000001300](../undf-2026-000001300/) | - -## Where it lives - -`usecases/auth/authorization/filter/filter.go:115-119`: - -```go -for _, item := range items { - if slices.Contains(allowedList, resourceFn(item)) { // O(K) per call - filtered = append(filtered, item) - } -} -``` - -## Fix - -Hoist `allowedList` into a `map[string]struct{}{}` once before iterating items. Per-iter cost drops from O(K) to O(1). Total cost: O(N + K). - -```go -allowedSet := make(map[string]struct{}, len(allowedList)) -for _, r := range allowedList { - allowedSet[r] = struct{}{} -} -for _, item := range items { - if _, ok := allowedSet[resourceFn(item)]; ok { - filtered = append(filtered, item) - } -} -``` - -## Bench (defects/weaviate/bench/results.txt) - -``` -=== weaviate-0001: RBAC filter O(N*K) -> O(N+K) === - - scale defective fixed speedup -------------------------------------------------------- - N= 1000 K= 200 7.66ms 0.09ms 87.5x - N= 5000 K= 500 112.49ms 0.41ms 277.1x - N=10000 K=1000 476.87ms 1.07ms 446.3x - N=20000 K=2000 1590.53ms 1.76ms 906.0x - N=50000 K=5000 8178.22ms 4.71ms 1735.3x -``` - -## Why it matters - -Multi-tenant Weaviate deployments — vector search SaaS providers, enterprises with collection-per-team isolation — pay this on every authorized read. At N=50k items × K=5k permitted resources, the patch drops a single request's authorization filter from 8 seconds to 5 milliseconds. That's user-visible latency disappearing on every list/search call. diff --git a/whitepaper/outreach/webdriverio.md b/whitepaper/outreach/webdriverio.md deleted file mode 100644 index f629b2da5..000000000 --- a/whitepaper/outreach/webdriverio.md +++ /dev/null @@ -1,89 +0,0 @@ -# WebdriverIO — CWE-407 Disclosure Brief - -**Project:** WebdriverIO (webdriverio/webdriverio) -**Disclosure date:** 2026-04-22 -**Severity:** MEDIUM -**Speedup:** up to 493x (webdriverio-0002 aggregator N=2000), confirmed by benchmark -**Status:** patch-ready, 2 patches plus test suite, benchmarks complete - ---- - -## Summary - -`@wdio/appium-service` ships a "mobileSelectorPerformanceOptimizer" that converts XPath selectors into native NSPredicate / Class Chain syntax for mobile testing. The optimizer's own `extractOrConditions` contains the pattern it exists to eliminate: per regex match it calls `Array.find` on an accumulator plus two `Array.includes` dedup checks. Total cost scales as O(M×K + M×V) across M matches with K distinct attributes and V values per attribute. - -Replacing the array-of-objects + `.find` + `.includes` pattern with `Map>` drops every operation to amortized O(1). - -## The Defects - -**webdriverio-0001 (MOAD-0001 — MEDIUM):** `packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/utils/xpath-conditions.ts:50-67` - -```typescript -while ((orMatch = orPattern.exec(content)) !== null) { - if (orMatch[1] === orMatch[3]) { - const existing = orMatches.find(m => m.attr === orMatch![1]); // O(K) per match - if (existing) { - if (!existing.values.includes(orMatch[2])) { // O(V) - existing.values.push(orMatch[2]); - } - if (!existing.values.includes(orMatch[4])) { // O(V) - existing.values.push(orMatch[4]); - } - } else { - orMatches.push({ attr: orMatch[1], values: [orMatch[2], orMatch[4]] }); - } - } -} -``` - -**Fix:** replace `orMatches` array-of-objects with `Map>`. Map lookups and Set dedup are amortized O(1). Emission preserves insertion order by iterating `Map.entries` and within each Set. - -| Benchmark (K attrs × V values) | defective | fixed | speedup | -|--------------------------------|-----------|--------|---------| -| 5×5 | 0.045ms | 0.032ms | 1.4x | -| 20×20 | 0.99ms | 0.20ms | 5.0x | -| 40×40 | 3.88ms | 0.81ms | 4.8x | -| 60×60 | 15.79ms | 2.61ms | 6.0x | - -Real-world impact: data-driven mobile tests that build selectors from product IDs, SKU lists, or user cohorts produce long OR chains. The current implementation scales super-linearly in chain length; the fix restores linear behavior. - -## Scanner Evidence - -`unmoad` detects three findings per trigger file in this pattern at HIGH severity. Trigger and clean fixture pair in `tests/integration/fixtures/moad_0001/trigger_webdriverio_xpath.ts` and `clean_webdriverio_xpath.ts`. - -## The Defects (continued) - -**webdriverio-0002 (MOAD-0001 — MEDIUM):** `packages/wdio-appium-service/src/mobileSelectorPerformanceOptimizer/aggregator.ts:343, 369` - -The MSPO aggregator dedups per-test selector entries via `Array.find` on a growing bucket array. For N collected entries per test, dedup is O(N²). A second copy of the pattern lives in the unknown-suite merger at line 369. - -```typescript -// aggregator.ts:343 -const existing = grouped[specFile][suiteName][testName] - .find(d => d.selector === data.selector); // O(N) scan per entry -if (!existing) { - grouped[specFile][suiteName][testName].push(data); -} -``` - -**Fix:** carry a companion `Map>` for O(1) dedup. Array kept for output order and downstream consumers. - -| Benchmark (N per test bucket) | defective | fixed | speedup | -|-------------------------------|-----------|--------|---------| -| 200 | 0.92ms | 0.02ms | 40.4x | -| 500 | 6.88ms | 0.06ms | 109.8x | -| 1000 | 32.55ms | 0.12ms | 280.4x | -| 2000 | 121.60ms | 0.25ms | 493.0x | - -Real-world scale: 1000-test suites with 50 unique selectors per test aggregate 50,000 entries; defective pipeline runs 2.5 billion comparisons. - -## Scanner Evidence - -`unmoad` detects both patterns at HIGH severity. Trigger + clean fixture pairs shipped. - -## Patches - -- `webdriverio-0001-xpath-conditions-ormatches-find-includes.patch` (UNDF-2026-000001289) -- `webdriverio-0002-mspo-aggregator-selector-dedup-find.patch` (UNDF-2026-000001291) - -Full test + bench suite at `defects/webdriverio/` in the java-topology research repo. diff --git a/whitepaper/outreach/wildfly.md b/whitepaper/outreach/wildfly.md deleted file mode 100644 index 66f5e3597..000000000 --- a/whitepaper/outreach/wildfly.md +++ /dev/null @@ -1,91 +0,0 @@ -# WildFly — MOAD-0003 (Leaked Context) Disclosure Brief - -**Project:** WildFly (wildfly/wildfly) -**Severity:** HIGH -**CWE:** CWE-668 (Exposure of Resource to Wrong Sphere) -**MOAD:** [MOAD-2026-0003 A Leaked Context](https://undefect.com/moad-2026-0003/) -**Pattern:** ThreadLocal SecurityContext never cleared on JCA Work completion - -## Defect Map - -![]({static}/uploads/intel-wildfly.svg) - -## What it is - -`ElytronSecurityIntegration` is the WildFly bridge between the Java Connector Architecture (JCA) `SecurityIntegration` SPI and the Elytron security subsystem. It stores the per-Work-item `SecurityContext` in a `ThreadLocal` that is **set per Work but never cleared**. - -JCA's `WorkManager` runs Work items in a thread pool. After Work A on thread T completes, the thread returns to the pool with Work A's `SecurityContext` still bound. When Work B picks up thread T, any code path that reads `getSecurityContext()` before B installs its own context sees Work A's identity. - -`WildflyWorkWrapper.runWork()` does exactly the pre-install read: - -```java -if (securityIntegration.getSecurityContext() != null) - ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(...) -``` - -If a Work item arrives where the caller forgot to set the context (or set it to `null` deliberately), the worker may still execute under Work A's leftover identity instead of falling through to the no-context `super.runWork()` branch. - -| Defect | UNDF | -|--------|------| -| `wildfly-0001` | [undf-2026-000001305](../undf-2026-000001305/) | - -## Where it lives - -`connector/src/main/java/org/jboss/as/connector/security/ElytronSecurityIntegration.java:38, 51-53`: - -```java -private final ThreadLocal securityContext = new ThreadLocal<>(); - -@Override -public void setSecurityContext(SecurityContext context) { - this.securityContext.set(context); // never .remove()'d anywhere -} -``` - -Verified by `grep -rn "securityContext.remove\|securityContext\.set(null\|setSecurityContext(null"` — zero matches across the WildFly codebase. - -## Fix - -Two-file surgical patch (no SPI change): - -1. `ElytronSecurityIntegration.setSecurityContext(null)` now calls `.remove()`. Callers passing `null` (already legal per Nullable convention) get the correct ThreadLocal-clear semantics. - -2. `WildflyWorkWrapper.runWork()` wraps its body in `try { ... } finally { securityIntegration.setSecurityContext(null); }`. The thread is cleared after every Work item before returning to the pool. - -```java -// ElytronSecurityIntegration.java:51 (5-line change) -public void setSecurityContext(SecurityContext context) { - if (context == null) { - this.securityContext.remove(); - } else { - this.securityContext.set(context); - } -} - -// WildflyWorkWrapper.java:43 (try/finally wrap) -protected void runWork() throws WorkCompletedException { - try { - if (securityIntegration.getSecurityContext() != null) - ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(...); - else super.runWork(); - } finally { - securityIntegration.setSecurityContext(null); - } -} -``` - -## Why it matters - -WildFly is the JBoss application server family — every Java EE / Jakarta EE deployment using JCA Resource Adapters, message-driven beans, or per-tenant connection pools is exposed: - -- **Identity leak**: Work B inherits Work A's principal if the caller misses the set-before-read window -- **Defense-in-depth failure**: even if the caller "always sets context first," any exception path before the `setSecurityContext()` call reads the leftover -- **Multi-tenant SaaS** running JCA-backed integrations cross-contaminates tenant identities silently - -ThreadLocal-via-thread-pool is exactly the pattern MOAD-0003 was named for. WildFly's own coding standards advocate `try/finally` discipline around request-scoped state. - -## How it surfaced - -This finding was buried under 4,840 unmoad MOAD-0003 false positives in our wave-26 WildFly scan (Wave 26 survey: "wildfly Java JUnit ExtensionContext + Set/EnumSet declared-type FPs"). The unmoad commit `1f48798` (Java ThreadLocal-scoped `.set()` leak detection) restricted the M3 detector to fire only on `.set()` calls whose receiver was previously declared as `ThreadLocal` / `InheritableThreadLocal` / `ScopedValue` / `FastThreadLocal`. WildFly's M3 finding count dropped 4840 → 37, surfacing this real defect for triage. - -This is the inverse pipeline from typical CWE-407 flagships (where the scanner finds; we triage; we patch). Here the scanner improved its own signal-to-noise so the human triage could find what the scanner alone could not have ranked.