mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-3975 Corrected StructureDB component type parent tracking issue for
replace by ordinal
This commit is contained in:
parent
e832fc2a10
commit
9d52aeeeb6
2 changed files with 81 additions and 0 deletions
|
@ -19,6 +19,7 @@ import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
|
|
||||||
|
import db.Transaction;
|
||||||
import ghidra.program.database.ProgramBuilder;
|
import ghidra.program.database.ProgramBuilder;
|
||||||
import ghidra.program.model.listing.Program;
|
import ghidra.program.model.listing.Program;
|
||||||
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
|
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
|
||||||
|
@ -147,6 +148,84 @@ public class DataTypeTest extends AbstractGhidraHeadedIntegrationTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStructureReplace() {
|
||||||
|
|
||||||
|
try (Transaction tx = program.openTransaction("Test")) {
|
||||||
|
|
||||||
|
Structure struct1 = createStruct("abc", Undefined1DataType.dataType,
|
||||||
|
2 * dtm.getDataOrganization().getPointerSize());
|
||||||
|
struct1.setExplicitMinimumAlignment(
|
||||||
|
dtm.getDataOrganization().getDefaultPointerAlignment());
|
||||||
|
|
||||||
|
Structure resolvedStruct1 = (Structure) dtm.resolve(struct1, null);
|
||||||
|
assertEquals(0, resolvedStruct1.getParents().size());
|
||||||
|
|
||||||
|
Structure struct2 = createStruct("xyz", resolvedStruct1, 1);
|
||||||
|
struct2.setPackingEnabled(true);
|
||||||
|
Structure resolvedStruct2 = (Structure) dtm.resolve(struct2, null);
|
||||||
|
|
||||||
|
assertEquals(1, resolvedStruct1.getParents().size());
|
||||||
|
|
||||||
|
DataType dt =
|
||||||
|
new ArrayDataType(new PointerDataType(new IntegerDataType(dtm), dtm), 2, -1);
|
||||||
|
|
||||||
|
resolvedStruct2.replace(0, dt, -1);
|
||||||
|
|
||||||
|
assertEquals(0, resolvedStruct1.getParents().size());
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
assertEquals(
|
||||||
|
"/xyz\n" +
|
||||||
|
"pack()\n" +
|
||||||
|
"Structure xyz {\n" +
|
||||||
|
" 0 int *[2] 8 \"\"\n" +
|
||||||
|
"}\n" +
|
||||||
|
"Size = 8 Actual Alignment = 4\n",
|
||||||
|
resolvedStruct2.toString());
|
||||||
|
//@formatter:on
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStructureReplace2() {
|
||||||
|
|
||||||
|
try (Transaction tx = program.openTransaction("Test")) {
|
||||||
|
|
||||||
|
Structure struct1 = new StructureDataType("abc", 0);
|
||||||
|
struct1.setPackingEnabled(true);
|
||||||
|
struct1.setExplicitMinimumAlignment(
|
||||||
|
dtm.getDataOrganization().getDefaultPointerAlignment());
|
||||||
|
|
||||||
|
Structure resolvedStruct1 = (Structure) dtm.resolve(struct1, null);
|
||||||
|
assertEquals(0, resolvedStruct1.getParents().size());
|
||||||
|
|
||||||
|
Structure struct2 = createStruct("xyz", resolvedStruct1, 1);
|
||||||
|
struct2.setPackingEnabled(true);
|
||||||
|
Structure resolvedStruct2 = (Structure) dtm.resolve(struct2, null);
|
||||||
|
|
||||||
|
assertEquals(1, resolvedStruct1.getParents().size());
|
||||||
|
|
||||||
|
DataType dt =
|
||||||
|
new ArrayDataType(new PointerDataType(new IntegerDataType(dtm), dtm), 0, -1);
|
||||||
|
|
||||||
|
resolvedStruct2.replace(0, dt, -1);
|
||||||
|
|
||||||
|
assertEquals(0, resolvedStruct1.getParents().size());
|
||||||
|
|
||||||
|
//@formatter:off
|
||||||
|
assertEquals(
|
||||||
|
"/xyz\n" +
|
||||||
|
"pack()\n" +
|
||||||
|
"Structure xyz {\n" +
|
||||||
|
" 0 int *[0] 0 \"\"\n" +
|
||||||
|
"}\n" +
|
||||||
|
"Size = 1 Actual Alignment = 4\n",
|
||||||
|
resolvedStruct2.toString());
|
||||||
|
//@formatter:on
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private StructureDataType createStruct(String name, DataType contentType, int count) {
|
private StructureDataType createStruct(String name, DataType contentType, int count) {
|
||||||
StructureDataType struct = new StructureDataType(name, 0, dtm);
|
StructureDataType struct = new StructureDataType(name, 0, dtm);
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
|
|
|
@ -1317,6 +1317,8 @@ class StructureDB extends CompositeDB implements StructureInternal {
|
||||||
(!isPackingEnabled() || dataType.getAlignment() == oldDt.getAlignment())) {
|
(!isPackingEnabled() || dataType.getAlignment() == oldDt.getAlignment())) {
|
||||||
|
|
||||||
oldComponent.update(componentName, dataType, comment);
|
oldComponent.update(componentName, dataType, comment);
|
||||||
|
oldDt.removeParent(this);
|
||||||
|
dataType.addParent(this);
|
||||||
|
|
||||||
setLastChangeTime(System.currentTimeMillis());
|
setLastChangeTime(System.currentTimeMillis());
|
||||||
dataMgr.dataTypeChanged(this, false);
|
dataMgr.dataTypeChanged(this, false);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue