Merge remote-tracking branch

'origin/GP-0_dev747368_definedstringiterator_morefixes_for_unions' into
Ghidra_11.4 (Closes #8134)
This commit is contained in:
Ryan Kurtz
2025-05-19 05:56:06 -04:00
2 changed files with 27 additions and 5 deletions

View File

@@ -161,6 +161,23 @@ public class DefinedStringIteratorTest extends AbstractGhidraHeadlessIntegration
assertEquals(1, list.size());
}
@Test
public void test_UnionOfStrings() throws Exception {
int unionAddr = 0x100;
Union unionDT = new UnionDataType("unionOfStrings");
unionDT.add(charArray);
unionDT.add(new ArrayDataType(charDT, 5));
builder.applyFixedLengthDataType(addrStr(unionAddr), unionDT, -1);
DefinedStringIterator it = DefinedStringIterator.forProgram(program);
List<Data> list = IteratorUtils.toList(it);
assertEquals(0x100, list.get(0).getAddress().getOffset());
assertEquals(0x100, list.get(1).getAddress().getOffset());
assertEquals(2, list.size());
}
private long arrayElementAddr(long arrayAddr, int elemSize, int elemIndex) {
return arrayAddr + (elemSize * elemIndex);
}

View File

@@ -133,12 +133,14 @@ public class DefinedStringIterator implements DataIterator {
// be handled earlier by isString(data)
DataType elementDT = arrayDT.getDataType();
if (containsStringDataType(elementDT)) {
itStack.addLast(new ArrayElementIterator(data));
itStack.addLast(new DataComponentIterator(data));
}
// side-effect: don't iterate arrays that have elements that aren't strings
}
else if (dt instanceof Composite comp && containsStringDataType(comp)) {
itStack.addLast(new StructDtcIterator(data, comp));
itStack.addLast(comp instanceof Structure
? new StructDtcIterator(data, comp)
: new DataComponentIterator(data));
}
}
}
@@ -176,6 +178,7 @@ public class DefinedStringIterator implements DataIterator {
}
private static class StructDtcIterator implements DataIterator {
// this iterator only examines defined components of the data struct item
private Data data;
private int currentIndex = -1;
private DataTypeComponent[] dtcs;
@@ -194,7 +197,8 @@ public class DefinedStringIterator implements DataIterator {
private void advanceToNextGoodDtcIndex() {
currentIndex++;
while (currentIndex < dtcs.length &&
(dtcs[currentIndex].getLength() == 0 || dtcs[currentIndex].isBitFieldComponent())) {
(dtcs[currentIndex].getLength() == 0 || dtcs[currentIndex].isBitFieldComponent() ||
data.getComponentContaining(dtcs[currentIndex].getOffset()) == null)) {
currentIndex++;
}
}
@@ -208,12 +212,13 @@ public class DefinedStringIterator implements DataIterator {
}
private static class ArrayElementIterator implements DataIterator {
private static class DataComponentIterator implements DataIterator {
// use this iterator for datatypes that only have defined components (array, union)
private Data data;
private int currentIndex;
private int elementCount;
public ArrayElementIterator(Data data) {
public DataComponentIterator(Data data) {
this.data = data;
this.elementCount = data.getNumComponents();
}