diff --git a/Ghidra/Features/Base/data/ElfFunctionsThatDoNotReturn b/Ghidra/Features/Base/data/ElfFunctionsThatDoNotReturn index 9185c630e7..54e9a5e04f 100644 --- a/Ghidra/Features/Base/data/ElfFunctionsThatDoNotReturn +++ b/Ghidra/Features/Base/data/ElfFunctionsThatDoNotReturn @@ -19,5 +19,5 @@ assert_fail assert_rtn fortify_fail ZSt9terminatev -_ZN10__cxxabiv111__terminateEPFvvE +ZN10__cxxabiv111__terminateEPFvvE pthread_exit diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/memstate/MemoryFaultHandler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/memstate/MemoryFaultHandler.java index 956e95768c..6b4176ff6b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/memstate/MemoryFaultHandler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcode/memstate/MemoryFaultHandler.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,10 +22,10 @@ public interface MemoryFaultHandler { /** * An attempt has been made to read uninitialized memory at the * specified address. - * @param address - * @param size - * @param buf - * @param bufOffset + * @param address uninitialized storage address (memory, register or unique) + * @param size number of uninitialized bytes + * @param buf storage buffer + * @param bufOffset read offset within buffer * @return true if data should be treated as initialized */ boolean uninitializedRead(Address address, int size, byte[] buf, int bufOffset); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java index 12ccf90095..1249c92d96 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/register/ProgramRegisterContextDB.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +15,13 @@ */ package ghidra.program.database.register; +import java.io.IOException; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.HashMap; + +import db.*; +import db.util.ErrorHandler; import ghidra.program.database.ManagerDB; import ghidra.program.database.ProgramDB; import ghidra.program.database.code.CodeManager; @@ -30,13 +36,6 @@ import ghidra.util.Msg; import ghidra.util.exception.*; import ghidra.util.task.TaskMonitor; -import java.io.IOException; -import java.math.BigInteger; -import java.util.*; - -import db.*; -import db.util.ErrorHandler; - public class ProgramRegisterContextDB extends AbstractStoredProgramContext implements ManagerDB { private DBHandle dbHandle; @@ -63,8 +62,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple throw new VersionException(true); } - registerValueMap = new HashMap(); - defaultRegisterValueMap = new HashMap(); + registerValueMap = new HashMap<>(); + defaultRegisterValueMap = new HashMap<>(); initializeDefaultValues(lang, compilerSpec); initializedCurrentValues(); @@ -154,8 +153,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple String registerName = table.getName().substring(tableNamePrefix.length()); Register register = getRegister(registerName); if (register != null) { - RangeMapAdapter adapter = - new DatabaseRangeMapAdapter(register, dbHandle, addrMap, lock, errorHandler); + RangeMapAdapter adapter = new DatabaseRangeMapAdapter(register, dbHandle, + addrMap, lock, errorHandler); createRegisterValueStore(register, adapter); } } @@ -220,7 +219,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple } @Override - public void remove(Address start, Address end, Register register) throws ContextChangeException { + public void remove(Address start, Address end, Register register) + throws ContextChangeException { lock.acquire(); boolean restore = false; try { @@ -269,6 +269,9 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple lock.acquire(); boolean restore = false; try { + // FIXME: We do not properly handle painting context across the full + // address space which should be avoided. A non-zero image + // base offset can result in a improperly coalesced long key-range. checkContextWrite(value.getRegister(), start, end); restore = !changing; // indicates that we just initiated a change changing = true; @@ -293,12 +296,7 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple // Sort the registers by size so that largest come first. // This prevents the remove call below from incorrectly clearing // smaller registers that are part of a larger register. - Arrays.sort(registers, new Comparator() { - @Override - public int compare(Register r1, Register r2) { - return r2.getBitLength() - r1.getBitLength(); - } - }); + Arrays.sort(registers, (r1, r2) -> r2.getBitLength() - r1.getBitLength()); // Map all register stores to new registers for (Register register : registers) { @@ -314,7 +312,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple // Update storage range map if (!store.setLanguage(translator, monitor)) { // Clear and remove old register value store - Msg.warn(this, "WARNING! Discarding all context for register " + register.getName()); + Msg.warn(this, + "WARNING! Discarding all context for register " + register.getName()); store.clearAll(); } registerValueMap.remove(register); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractStoredProgramContext.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractStoredProgramContext.java index 5154d2acde..ca34ca2956 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractStoredProgramContext.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/AbstractStoredProgramContext.java @@ -36,8 +36,8 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex protected AbstractStoredProgramContext(Register[] registers) { super(registers); - registerValueMap = new HashMap(); - defaultRegisterValueMap = new HashMap(); + registerValueMap = new HashMap<>(); + defaultRegisterValueMap = new HashMap<>(); } /** @@ -79,7 +79,7 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex public void setRegisterValue(Address start, Address end, RegisterValue value) throws ContextChangeException { if (value == null) { - throw new IllegalArgumentException("Value cannot be null, use clear() instead!"); + throw new IllegalArgumentException("Value cannot be null, use remove() instead!"); } Register baseRegister = value.getRegister().getBaseRegister(); RegisterValueStore store = registerValueMap.get(baseRegister); @@ -177,8 +177,8 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex if (store == null) { return new AddressSet().getAddressRanges(); } - return new RegisterAddressRangeIterator(register, - store.getAddressRangeIterator(start, end), registerValueMap); + return new RegisterAddressRangeIterator(register, store.getAddressRangeIterator(start, end), + registerValueMap); } @Override @@ -198,14 +198,14 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex if (store == null) { return new AddressSet().getAddressRanges(); } - return new RegisterAddressRangeIterator(register, - store.getAddressRangeIterator(start, end), defaultRegisterValueMap); + return new RegisterAddressRangeIterator(register, store.getAddressRangeIterator(start, end), + defaultRegisterValueMap); } @Override public Register[] getRegistersWithValues() { if (registersWithValues == null) { - registersWithValues = new HashSet(); + registersWithValues = new HashSet<>(); for (Register register : registers) { RegisterValueStore store = registerValueMap.get(register.getBaseRegister()); if (store != null && !store.isEmpty()) { @@ -247,7 +247,8 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex } @Override - public void remove(Address start, Address end, Register register) throws ContextChangeException { + public void remove(Address start, Address end, Register register) + throws ContextChangeException { if (start.getAddressSpace() != end.getAddressSpace()) { throw new AssertException("start and end address must be in the same address space"); }