GP-0 more fixes for new definedstringiterator and unions

This commit is contained in:
dev747368 2025-05-16 22:00:33 +00:00
parent f30aee4535
commit 2ea66d6fb4
2 changed files with 27 additions and 5 deletions

View file

@ -161,6 +161,23 @@ public class DefinedStringIteratorTest extends AbstractGhidraHeadlessIntegration
assertEquals(1, list.size()); 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) { private long arrayElementAddr(long arrayAddr, int elemSize, int elemIndex) {
return arrayAddr + (elemSize * elemIndex); return arrayAddr + (elemSize * elemIndex);
} }

View file

@ -133,12 +133,14 @@ public class DefinedStringIterator implements DataIterator {
// be handled earlier by isString(data) // be handled earlier by isString(data)
DataType elementDT = arrayDT.getDataType(); DataType elementDT = arrayDT.getDataType();
if (containsStringDataType(elementDT)) { 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 // side-effect: don't iterate arrays that have elements that aren't strings
} }
else if (dt instanceof Composite comp && containsStringDataType(comp)) { 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 { private static class StructDtcIterator implements DataIterator {
// this iterator only examines defined components of the data struct item
private Data data; private Data data;
private int currentIndex = -1; private int currentIndex = -1;
private DataTypeComponent[] dtcs; private DataTypeComponent[] dtcs;
@ -194,7 +197,8 @@ public class DefinedStringIterator implements DataIterator {
private void advanceToNextGoodDtcIndex() { private void advanceToNextGoodDtcIndex() {
currentIndex++; currentIndex++;
while (currentIndex < dtcs.length && 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++; 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 Data data;
private int currentIndex; private int currentIndex;
private int elementCount; private int elementCount;
public ArrayElementIterator(Data data) { public DataComponentIterator(Data data) {
this.data = data; this.data = data;
this.elementCount = data.getNumComponents(); this.elementCount = data.getNumComponents();
} }