diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTrace.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTrace.java index f166b1c0bb..d16a14af42 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTrace.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTrace.java @@ -229,6 +229,9 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace if (as == AddressSpace.OTHER_SPACE) { return; } + if (as == Address.NO_ADDRESS.getAddressSpace()) { + return; + } if (baseAddressFactory.getAddressSpace(as.getSpaceID()) != as) { throw new IllegalArgumentException( "AddressSpace '" + as + "' is not in this trace (language=" + getBaseLanguage() + diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/space/AbstractDBTraceSpaceBasedManager.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/space/AbstractDBTraceSpaceBasedManager.java index 2bd9c037cb..4e63de954a 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/space/AbstractDBTraceSpaceBasedManager.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/space/AbstractDBTraceSpaceBasedManager.java @@ -25,8 +25,7 @@ import org.apache.commons.lang3.tuple.Pair; import db.DBHandle; import db.DBRecord; import generic.CatenatedCollection; -import ghidra.program.model.address.AddressFactory; -import ghidra.program.model.address.AddressSpace; +import ghidra.program.model.address.*; import ghidra.program.model.lang.Language; import ghidra.trace.database.*; import ghidra.trace.database.thread.DBTraceThreadManager; @@ -42,6 +41,8 @@ import ghidra.util.task.TaskMonitor; public abstract class AbstractDBTraceSpaceBasedManager implements DBTraceManager { + protected static final AddressSpace NO_ADDRESS_SPACE = Address.NO_ADDRESS.getAddressSpace(); + @DBAnnotatedObjectInfo(version = 0) public static class DBTraceSpaceEntry extends DBAnnotatedObject { static final String SPACE_COLUMN_NAME = "Space"; @@ -127,7 +128,13 @@ public abstract class AbstractDBTraceSpaceBasedManager { } default void checkIsInMemory(AddressSpace space) { - if (!space.isMemorySpace()) { - throw new IllegalArgumentException("Address must be in memory"); + if (!space.isMemorySpace() && space != Address.NO_ADDRESS.getAddressSpace()) { + throw new IllegalArgumentException("Address must be in memory or NO_ADDRESS"); } } diff --git a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/property/DBTraceAddressPropertyManagerTest.java b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/property/DBTraceAddressPropertyManagerTest.java index e092d5ef6b..c907ea12b3 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/property/DBTraceAddressPropertyManagerTest.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/database/property/DBTraceAddressPropertyManagerTest.java @@ -25,6 +25,7 @@ import org.junit.*; import com.google.common.collect.Range; +import ghidra.program.model.address.Address; import ghidra.program.model.util.TypeMismatchException; import ghidra.test.AbstractGhidraHeadlessIntegrationTest; import ghidra.trace.database.ToyDBTraceBuilder; @@ -375,4 +376,24 @@ public class DBTraceAddressPropertyManagerTest extends AbstractGhidraHeadlessInt public void testSaveableMap() throws Exception { doTestMap(MySaveable.class, new MySaveable(6, "MyString")); } + + @Test + public void testStringMapAtNoAdress() throws Exception { + TracePropertyMap map; + try (UndoableTransaction tid = tb.startTransaction()) { + map = propertyManager.createPropertyMap("MyProp", String.class); + + map.set(Range.atLeast(0L), Address.NO_ADDRESS, "Value"); + } + + assertEquals("Value", map.get(4, Address.NO_ADDRESS)); + + File file = tb.save(); + + try (ToyDBTraceBuilder tb = new ToyDBTraceBuilder(file)) { + TracePropertyMap map2 = + tb.trace.getAddressPropertyManager().getPropertyMap("MyProp", String.class); + assertEquals("Value", map2.get(4, Address.NO_ADDRESS)); + } + } }