diff --git a/Ghidra/Features/CodeCompare/src/main/java/ghidra/feature/vt/api/correlator/address/CodeCompareAddressCorrelation.java b/Ghidra/Features/CodeCompare/src/main/java/ghidra/feature/vt/api/correlator/address/CodeCompareAddressCorrelation.java index 0cbf8cdeea..c286955ec4 100755 --- a/Ghidra/Features/CodeCompare/src/main/java/ghidra/feature/vt/api/correlator/address/CodeCompareAddressCorrelation.java +++ b/Ghidra/Features/CodeCompare/src/main/java/ghidra/feature/vt/api/correlator/address/CodeCompareAddressCorrelation.java @@ -378,34 +378,30 @@ public class CodeCompareAddressCorrelation implements AddressCorrelation { computeParamCorrelation(); } - protected void computeParamCorrelation() { - int sourceCount = sourceFunction.getParameterCount(); - int destinationCount = destinationFunction.getParameterCount(); + private void computeParamCorrelation() { Parameter[] sourceParameters = sourceFunction.getParameters(); Parameter[] destinationParameters = destinationFunction.getParameters(); - boolean allMatch = false; + if (sourceParameters.length != destinationParameters.length) { + return; + } Map map = new HashMap(); - if (sourceCount == destinationCount) { - allMatch = true; - for (int i = 0; i < sourceParameters.length; i++) { - Parameter sourceParameter = sourceParameters[i]; - Parameter destinationParameter = destinationParameters[i]; - if (!sourceParameter.isValid() || !destinationParameter.isValid() || - sourceParameter.getLength() != destinationParameter.getLength()) { - // - an invalid parameter does not have defined storage (or address) - // - length must also match - allMatch = false; - break; - } - Address dest = destinationParameter.getVariableStorage().getMinAddress(); - Address src = sourceParameter.getVariableStorage().getMinAddress(); - map.put(src, new CorrelationContainer(CorrelationKind.PARAMETERS, - new AddressRangeImpl(dest, dest))); + for (int i = 0; i < sourceParameters.length; i++) { + Parameter sourceParameter = sourceParameters[i]; + Parameter destinationParameter = destinationParameters[i]; + if (!sourceParameter.isValid() || !destinationParameter.isValid()) { + return; } + VariableStorage sourceParamStorage = sourceParameter.getVariableStorage(); + VariableStorage destParamStorage = destinationParameter.getVariableStorage(); + if (!sourceParamStorage.equals(destParamStorage)) { + return; + } + Address dest = sourceParamStorage.getMinAddress(); + Address src = destParamStorage.getMinAddress(); + map.put(src, new CorrelationContainer(CorrelationKind.PARAMETERS, + new AddressRangeImpl(dest, dest))); } - if (allMatch) { - cachedForwardAddressMap.putAll(map); - } + cachedForwardAddressMap.putAll(map); } private void defineRange(Map> sourceMap, diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/LinearFunctionAddressCorrelation.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/LinearFunctionAddressCorrelation.java index b983c038c5..c8b5d77b20 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/LinearFunctionAddressCorrelation.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/LinearFunctionAddressCorrelation.java @@ -15,16 +15,14 @@ */ package ghidra.feature.vt.api.correlator.address; +import java.util.*; + import ghidra.program.model.address.*; -import ghidra.program.model.data.DataType; -import ghidra.program.model.listing.Function; -import ghidra.program.model.listing.Parameter; +import ghidra.program.model.listing.*; import ghidra.program.util.AddressCorrelation; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; -import java.util.*; - public class LinearFunctionAddressCorrelation implements AddressCorrelation { public static final String NAME = "LinearFunctionAddressCorrelation"; @@ -103,32 +101,29 @@ public class LinearFunctionAddressCorrelation implements AddressCorrelation { return srcBody.getMaxAddress(); } - protected void computeParamCorrelation() { - int sourceCount = sourceFunction.getParameterCount(); - int destinationCount = destinationFunction.getParameterCount(); + private void computeParamCorrelation() { Parameter[] sourceParameters = sourceFunction.getParameters(); Parameter[] destinationParameters = destinationFunction.getParameters(); - boolean allMatch = false; + if (sourceParameters.length != destinationParameters.length) { + return; + } Map map = new HashMap(); - if (sourceCount == destinationCount) { - allMatch = true; - for (int i = 0; i < sourceParameters.length; i++) { - Parameter sourceParameter = sourceParameters[i]; - Parameter destinationParameter = destinationParameters[i]; - DataType sourceDataType = sourceParameter.getDataType(); - DataType destinationDataType = destinationParameter.getDataType(); - int sourceLength = sourceDataType.getLength(); - int destinationLength = destinationDataType.getLength(); - Address dest = destinationParameter.getMinAddress(); - map.put(sourceParameter.getMinAddress(), new AddressRangeImpl(dest, dest)); - if (sourceLength != destinationLength) { - allMatch = false; - break; - } + for (int i = 0; i < sourceParameters.length; i++) { + Parameter sourceParameter = sourceParameters[i]; + Parameter destinationParameter = destinationParameters[i]; + if (!sourceParameter.isValid() || !destinationParameter.isValid()) { + return; } + VariableStorage sourceParamStorage = sourceParameter.getVariableStorage(); + VariableStorage destParamStorage = destinationParameter.getVariableStorage(); + if (!sourceParamStorage.equals(destParamStorage)) { + return; + } + Address dest = sourceParamStorage.getMinAddress(); + Address src = destParamStorage.getMinAddress(); + map.put(src, new AddressRangeImpl(dest, dest)); } - if (allMatch) { - cachedForwardAddressMap.putAll(map); - } + cachedForwardAddressMap.putAll(map); } + } diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/StraightLineCorrelation.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/StraightLineCorrelation.java index 6be7478ace..a0b2234657 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/StraightLineCorrelation.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/StraightLineCorrelation.java @@ -15,15 +15,15 @@ */ package ghidra.feature.vt.api.correlator.address; +import java.util.HashMap; +import java.util.Map; + import ghidra.program.model.address.*; -import ghidra.program.model.data.DataType; import ghidra.program.model.listing.*; -import ghidra.program.util.*; +import ghidra.program.util.AddressCorrelation; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; -import java.util.*; - /** * Generate address correlations by viewing each function as a list of instructions in address order * Instructions are paired one at a time, in order, if the mnemonics of the instructions match. @@ -93,33 +93,29 @@ public class StraightLineCorrelation implements AddressCorrelation { /** * Add address correlations for the parameters. */ - protected void computeParamCorrelation() { - int sourceCount = sourceFunction.getParameterCount(); - int destinationCount = destinationFunction.getParameterCount(); + private void computeParamCorrelation() { Parameter[] sourceParameters = sourceFunction.getParameters(); Parameter[] destinationParameters = destinationFunction.getParameters(); - boolean allMatch = false; + if (sourceParameters.length != destinationParameters.length) { + return; + } Map map = new HashMap(); - if (sourceCount == destinationCount) { - allMatch = true; - for (int i = 0; i < sourceParameters.length; i++) { - Parameter sourceParameter = sourceParameters[i]; - Parameter destinationParameter = destinationParameters[i]; - DataType sourceDataType = sourceParameter.getDataType(); - DataType destinationDataType = destinationParameter.getDataType(); - int sourceLength = sourceDataType.getLength(); - int destinationLength = destinationDataType.getLength(); - Address dest = destinationParameter.getMinAddress(); - map.put(sourceParameter.getMinAddress(), new AddressRangeImpl(dest, dest)); - if (sourceLength != destinationLength) { - allMatch = false; - break; - } + for (int i = 0; i < sourceParameters.length; i++) { + Parameter sourceParameter = sourceParameters[i]; + Parameter destinationParameter = destinationParameters[i]; + if (!sourceParameter.isValid() || !destinationParameter.isValid()) { + return; } + VariableStorage sourceParamStorage = sourceParameter.getVariableStorage(); + VariableStorage destParamStorage = destinationParameter.getVariableStorage(); + if (!sourceParamStorage.equals(destParamStorage)) { + return; + } + Address dest = sourceParamStorage.getMinAddress(); + Address src = destParamStorage.getMinAddress(); + map.put(src, new AddressRangeImpl(dest, dest)); } - if (allMatch) { - cachedForwardAddressMap.putAll(map); - } + cachedForwardAddressMap.putAll(map); } /**