From 2b5ef59d87d2eedf713fdd424c923852f7828e77 Mon Sep 17 00:00:00 2001 From: caheckman <48068198+caheckman@users.noreply.github.com> Date: Fri, 24 Mar 2023 15:41:20 -0400 Subject: [PATCH] GP-3261 Strip PartialUnion in NoisyStructureBuilder --- .../ghidra/program/model/data/NoisyStructureBuilder.java | 7 +++++++ .../main/java/ghidra/program/model/pcode/PartialUnion.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java index 56b207963c..e88712769e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java @@ -19,6 +19,8 @@ import java.util.Iterator; import java.util.Map.Entry; import java.util.TreeMap; +import ghidra.program.model.pcode.PartialUnion; + /** * Build a structure from a "noisy" source of field information. * Feed it field records, either via addDataType(), when we @@ -92,6 +94,11 @@ public class NoisyStructureBuilder { dt = manager.getPointer(DataType.DEFAULT, dt.getLength()); } } + else if (dt instanceof PartialUnion) { + // The decompiler can produce the internal data-type PartialUnion, which must + // be replaced with a suitable formal data-type within the structure being built + dt = ((PartialUnion) dt).getStrippedDataType(); + } computeMax(offset, dt.getLength()); Entry firstEntry = checkForOverlap(offset, dt.getLength()); if (firstEntry != null) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java index 4c8cd70dd3..b552f487ef 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java @@ -119,4 +119,11 @@ public class PartialUnion extends AbstractDataType { return 0; } + /** + * Get a data-type that can be used as a formal replacement for this (internal) data-type + * @return a replacement data-type + */ + public DataType getStrippedDataType() { + return Undefined.getUndefinedDataType(size); + } }