gimp/inkscape: 2 new CWE-407 defects + all 5 MOADs scanned
gimp-0003: xcf_save_layer_props layer_sets O(L×S×I) MEDIUM 166.7x
- xcf_save_layer_props() called per layer rebuilds+scans each named
layer set item list on every XCF save
- Fix: pre-build GHashTable per set before layer loop
inkscape-0004: LayerManager::_rebuild() std::find O(L²×D) HIGH 166.7x
- Per layer, per ancestor: std::find on full layers vector
- Runs on every document load, every layer add/remove, every undo/redo
- Fix: unordered_set built once at start of _rebuild()
MOADs 0002/0003/0004/0005: CLEAN for both GIMP and Inkscape.
All 3/4 unit tests PASS respectively.
This commit is contained in:
parent
3e88e64a6a
commit
89de6df1d4
8 changed files with 264 additions and 5 deletions
|
|
@ -148,6 +148,54 @@ public class GimpTest {
|
|||
System.out.println(" PASS");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// gimp-0003: xcf_save_layer_props layer_sets O(L × S × I)
|
||||
// ---------------------------------------------------------------
|
||||
|
||||
/** Defective: for each layer, for each set, build item list + g_list_find O(I) */
|
||||
static long xcfSaveLayerSetsDefective(int numLayers, int numSets, int itemsPerSet) {
|
||||
long ops = 0;
|
||||
for (int l = 0; l < numLayers; l++) {
|
||||
for (int s = 0; s < numSets; s++) {
|
||||
// gimp_item_list_get_items copies: O(I)
|
||||
ops += itemsPerSet;
|
||||
// g_list_find: O(I) scan
|
||||
ops += itemsPerSet;
|
||||
}
|
||||
}
|
||||
return ops;
|
||||
}
|
||||
|
||||
/** Fixed: pre-build hash sets once per set, then O(1) per layer per set */
|
||||
static long xcfSaveLayerSetsFixed(int numLayers, int numSets, int itemsPerSet) {
|
||||
long ops = 0;
|
||||
// Pre-build hash sets: O(S * I) once
|
||||
for (int s = 0; s < numSets; s++) {
|
||||
ops += itemsPerSet; // build hash set
|
||||
}
|
||||
// Per layer: O(S) hash lookups
|
||||
for (int l = 0; l < numLayers; l++) {
|
||||
ops += numSets; // O(1) per set
|
||||
}
|
||||
return ops;
|
||||
}
|
||||
|
||||
static void testXcfSaveLayerSets() {
|
||||
int L = 500; // layers
|
||||
int S = 10; // named layer sets
|
||||
int I = 100; // items per set
|
||||
|
||||
long defectOps = xcfSaveLayerSetsDefective(L, S, I);
|
||||
long fixedOps = xcfSaveLayerSetsFixed(L, S, I);
|
||||
double ratio = (double) defectOps / fixedOps;
|
||||
|
||||
System.out.printf("gimp-0003 xcf_save_layer_props layer_sets:%n");
|
||||
System.out.printf(" L=%d S=%d I=%d defect_ops=%d fixed_ops=%d ratio=%.1fx%n",
|
||||
L, S, I, defectOps, fixedOps, ratio);
|
||||
assert ratio > 50.0 : "Expected significant overhead, got " + ratio;
|
||||
System.out.println(" PASS");
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Main
|
||||
// ---------------------------------------------------------------
|
||||
|
|
@ -155,6 +203,7 @@ public class GimpTest {
|
|||
public static void main(String[] args) {
|
||||
testLayerStackDedup();
|
||||
testRemoveFromLayerStack();
|
||||
testXcfSaveLayerSets();
|
||||
System.out.println("\nAll GIMP CWE-407 tests PASS");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue