minor cleanup

This commit is contained in:
ghidra1 2019-05-23 13:40:49 -04:00
parent c5fdf6f9ec
commit 86bc0cc80b
4 changed files with 34 additions and 35 deletions

View File

@ -19,5 +19,5 @@ assert_fail
assert_rtn assert_rtn
fortify_fail fortify_fail
ZSt9terminatev ZSt9terminatev
_ZN10__cxxabiv111__terminateEPFvvE ZN10__cxxabiv111__terminateEPFvvE
pthread_exit pthread_exit

View File

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 * An attempt has been made to read uninitialized memory at the
* specified address. * specified address.
* @param address * @param address uninitialized storage address (memory, register or unique)
* @param size * @param size number of uninitialized bytes
* @param buf * @param buf storage buffer
* @param bufOffset * @param bufOffset read offset within buffer
* @return true if data should be treated as initialized * @return true if data should be treated as initialized
*/ */
boolean uninitializedRead(Address address, int size, byte[] buf, int bufOffset); boolean uninitializedRead(Address address, int size, byte[] buf, int bufOffset);

View File

@ -1,6 +1,5 @@
/* ### /* ###
* IP: GHIDRA * IP: GHIDRA
* REVIEWED: YES
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +15,13 @@
*/ */
package ghidra.program.database.register; 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.ManagerDB;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.code.CodeManager; import ghidra.program.database.code.CodeManager;
@ -30,13 +36,6 @@ import ghidra.util.Msg;
import ghidra.util.exception.*; import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor; 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 { public class ProgramRegisterContextDB extends AbstractStoredProgramContext implements ManagerDB {
private DBHandle dbHandle; private DBHandle dbHandle;
@ -63,8 +62,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
throw new VersionException(true); throw new VersionException(true);
} }
registerValueMap = new HashMap<Register, RegisterValueStore>(); registerValueMap = new HashMap<>();
defaultRegisterValueMap = new HashMap<Register, RegisterValueStore>(); defaultRegisterValueMap = new HashMap<>();
initializeDefaultValues(lang, compilerSpec); initializeDefaultValues(lang, compilerSpec);
initializedCurrentValues(); initializedCurrentValues();
@ -154,8 +153,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
String registerName = table.getName().substring(tableNamePrefix.length()); String registerName = table.getName().substring(tableNamePrefix.length());
Register register = getRegister(registerName); Register register = getRegister(registerName);
if (register != null) { if (register != null) {
RangeMapAdapter adapter = RangeMapAdapter adapter = new DatabaseRangeMapAdapter(register, dbHandle,
new DatabaseRangeMapAdapter(register, dbHandle, addrMap, lock, errorHandler); addrMap, lock, errorHandler);
createRegisterValueStore(register, adapter); createRegisterValueStore(register, adapter);
} }
} }
@ -220,7 +219,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
} }
@Override @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(); lock.acquire();
boolean restore = false; boolean restore = false;
try { try {
@ -269,6 +269,9 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
lock.acquire(); lock.acquire();
boolean restore = false; boolean restore = false;
try { 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); checkContextWrite(value.getRegister(), start, end);
restore = !changing; // indicates that we just initiated a change restore = !changing; // indicates that we just initiated a change
changing = true; changing = true;
@ -293,12 +296,7 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
// Sort the registers by size so that largest come first. // Sort the registers by size so that largest come first.
// This prevents the remove call below from incorrectly clearing // This prevents the remove call below from incorrectly clearing
// smaller registers that are part of a larger register. // smaller registers that are part of a larger register.
Arrays.sort(registers, new Comparator<Register>() { Arrays.sort(registers, (r1, r2) -> r2.getBitLength() - r1.getBitLength());
@Override
public int compare(Register r1, Register r2) {
return r2.getBitLength() - r1.getBitLength();
}
});
// Map all register stores to new registers // Map all register stores to new registers
for (Register register : registers) { for (Register register : registers) {
@ -314,7 +312,8 @@ public class ProgramRegisterContextDB extends AbstractStoredProgramContext imple
// Update storage range map // Update storage range map
if (!store.setLanguage(translator, monitor)) { if (!store.setLanguage(translator, monitor)) {
// Clear and remove old register value store // 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(); store.clearAll();
} }
registerValueMap.remove(register); registerValueMap.remove(register);

View File

@ -36,8 +36,8 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex
protected AbstractStoredProgramContext(Register[] registers) { protected AbstractStoredProgramContext(Register[] registers) {
super(registers); super(registers);
registerValueMap = new HashMap<Register, RegisterValueStore>(); registerValueMap = new HashMap<>();
defaultRegisterValueMap = new HashMap<Register, RegisterValueStore>(); defaultRegisterValueMap = new HashMap<>();
} }
/** /**
@ -79,7 +79,7 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex
public void setRegisterValue(Address start, Address end, RegisterValue value) public void setRegisterValue(Address start, Address end, RegisterValue value)
throws ContextChangeException { throws ContextChangeException {
if (value == null) { 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(); Register baseRegister = value.getRegister().getBaseRegister();
RegisterValueStore store = registerValueMap.get(baseRegister); RegisterValueStore store = registerValueMap.get(baseRegister);
@ -177,8 +177,8 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex
if (store == null) { if (store == null) {
return new AddressSet().getAddressRanges(); return new AddressSet().getAddressRanges();
} }
return new RegisterAddressRangeIterator(register, return new RegisterAddressRangeIterator(register, store.getAddressRangeIterator(start, end),
store.getAddressRangeIterator(start, end), registerValueMap); registerValueMap);
} }
@Override @Override
@ -198,14 +198,14 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex
if (store == null) { if (store == null) {
return new AddressSet().getAddressRanges(); return new AddressSet().getAddressRanges();
} }
return new RegisterAddressRangeIterator(register, return new RegisterAddressRangeIterator(register, store.getAddressRangeIterator(start, end),
store.getAddressRangeIterator(start, end), defaultRegisterValueMap); defaultRegisterValueMap);
} }
@Override @Override
public Register[] getRegistersWithValues() { public Register[] getRegistersWithValues() {
if (registersWithValues == null) { if (registersWithValues == null) {
registersWithValues = new HashSet<Register>(); registersWithValues = new HashSet<>();
for (Register register : registers) { for (Register register : registers) {
RegisterValueStore store = registerValueMap.get(register.getBaseRegister()); RegisterValueStore store = registerValueMap.get(register.getBaseRegister());
if (store != null && !store.isEmpty()) { if (store != null && !store.isEmpty()) {
@ -247,7 +247,8 @@ abstract public class AbstractStoredProgramContext extends AbstractProgramContex
} }
@Override @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()) { if (start.getAddressSpace() != end.getAddressSpace()) {
throw new AssertException("start and end address must be in the same address space"); throw new AssertException("start and end address must be in the same address space");
} }