Add 88 new defect entries to HIGH and MEDIUM tables:
HIGH: mysql-0001/0002, mariadb-0001, redis-0001/0002, valkey-0001/0002, openvpn-0001,
vlc-0001, prometheus-0001, otel-collector-0001, cockroachdb-0001..0004,
tidb-0001..0008, kubernetes-0001/0002, go-0001, kotlin-0002, scala-0001,
allegro5-0001, sdl2-0001, grafana-0001, clickhouse-0001, duckdb-0001,
mongodb-0001, envoy-0001, istio-0001, cilium-0001, linkerd2-0001,
linux-0001/0002/0003, tor-0002/0003, curl-0001, julia-0001, lua-0001,
perl5-0001, nats-0001, spring-0003/0004, tomcat-0001, onos-0002, odl-0002
MEDIUM: helm-0001, mariadb-0002, openssl-0001/0002, memcached-0001,
cassandra-0001..0004, flink-0001, storm-0001/0002, zookeeper-0001..0003,
pip-0001, gradle-0001, nginx-0001, haproxy-0001, caddy-0001, varnish-0001,
ffmpeg-0001, gstreamer-0001, raylib-0001, love2d-0001, php-0001/0002,
r-source-0001, cpython-0002, ruby-0001, rabbitmq-0003/0004, activemq-0001,
ovs-0001, onos-0003, odl-0002, jetty-0001
PDF: 976K
115 lines
3.9 KiB
Java
115 lines
3.9 KiB
Java
package unit;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Sdl2JoystickLookupTest — CWE-407 sdl2-0001
|
|
*
|
|
* Models SDL_GetJoystickFromID(SDL_JoystickID instance_id):
|
|
* slow() = O(n) linked-list walk (current defect)
|
|
* fast() = O(1) hash map lookup (patch using SDL_HashTable/SDL_HashID)
|
|
*
|
|
* Assert: slowOps > fastOps * Nx at N=128 open joysticks.
|
|
*/
|
|
public class Sdl2JoystickLookupTest {
|
|
|
|
// Simulates SDL_Joystick linked-list node
|
|
static class Joystick {
|
|
final int instanceId;
|
|
Joystick next;
|
|
Joystick(int id) { this.instanceId = id; }
|
|
}
|
|
|
|
static long slowOps;
|
|
static long fastOps;
|
|
|
|
/**
|
|
* slow: O(n) linked-list walk — models SDL_GetJoystickFromID defect.
|
|
*/
|
|
static Joystick getJoystickFromIDSlow(Joystick head, int instanceId) {
|
|
for (Joystick j = head; j != null; j = j.next) {
|
|
slowOps++;
|
|
if (j.instanceId == instanceId) return j;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* fast: O(1) hash map lookup — models SDL_joystick_by_id patch.
|
|
*/
|
|
static Joystick getJoystickFromIDFast(Map<Integer, Joystick> byId, int instanceId) {
|
|
fastOps++;
|
|
return byId.get(instanceId);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
final int N = 128; // open joystick count (e.g. Gamecube adapter: 4 ports * 32)
|
|
final int NX = 10; // minimum required speedup factor
|
|
final int CALLS = 3000; // lookup calls (hidapi update loops: N devices * per-packet)
|
|
|
|
// Build linked list (head = most recently opened, like SDL_joysticks)
|
|
// Instance IDs: 1..N
|
|
Joystick head = null;
|
|
Map<Integer, Joystick> byId = new HashMap<>();
|
|
for (int i = 1; i <= N; i++) {
|
|
Joystick j = new Joystick(i);
|
|
j.next = head;
|
|
head = j;
|
|
byId.put(i, j);
|
|
}
|
|
|
|
// Target: joystick with instanceId=1 is at tail (worst case for list walk)
|
|
int targetId = 1;
|
|
|
|
slowOps = 0;
|
|
fastOps = 0;
|
|
|
|
for (int c = 0; c < CALLS; c++) {
|
|
getJoystickFromIDSlow(head, targetId);
|
|
}
|
|
long totalSlowOps = slowOps;
|
|
|
|
for (int c = 0; c < CALLS; c++) {
|
|
getJoystickFromIDFast(byId, targetId);
|
|
}
|
|
long totalFastOps = fastOps;
|
|
|
|
// Correctness
|
|
Joystick slowResult = getJoystickFromIDSlow(head, targetId);
|
|
Joystick fastResult = getJoystickFromIDFast(byId, targetId);
|
|
boolean correctnessOk = (slowResult != null && fastResult != null
|
|
&& slowResult.instanceId == fastResult.instanceId
|
|
&& slowResult == fastResult); // same object
|
|
|
|
boolean speedupOk = totalSlowOps > totalFastOps * NX;
|
|
|
|
System.out.printf("N=%d joysticks, target instanceId=%d, CALLS=%d%n",
|
|
N, targetId, CALLS);
|
|
System.out.printf("slow (linked-list) ops: %d%n", totalSlowOps);
|
|
System.out.printf("fast (hashmap) ops: %d%n", totalFastOps);
|
|
System.out.printf("speedup ratio: %.1fx (required >%dx)%n",
|
|
(double) totalSlowOps / totalFastOps, NX);
|
|
|
|
int passed = 0, total = 2;
|
|
if (correctnessOk) {
|
|
System.out.println("1/2 PASS correctness: same Joystick object returned");
|
|
passed++;
|
|
} else {
|
|
System.out.printf("1/2 FAIL correctness: slow=%s fast=%s%n",
|
|
slowResult == null ? "null" : slowResult.instanceId,
|
|
fastResult == null ? "null" : fastResult.instanceId);
|
|
}
|
|
if (speedupOk) {
|
|
System.out.printf("2/2 PASS speedup: %d > %d * %d%n",
|
|
totalSlowOps, totalFastOps, NX);
|
|
passed++;
|
|
} else {
|
|
System.out.printf("2/2 FAIL speedup: %d not > %d * %d%n",
|
|
totalSlowOps, totalFastOps, NX);
|
|
}
|
|
|
|
System.out.printf("%d/%d PASS%n", passed, total);
|
|
if (passed < total) System.exit(1);
|
|
}
|
|
}
|