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);
}
/**