В настоящее время я разрабатываю статический анализ Java-кода с использованием рамки OPAL. я хочу проанализировать следующий метод Java:OPAL: null-value в operandsArray
private void indirectCaller2b(double d, Object o1, Object o2) {
indirectCaller1(d, o1, o2);
}
Я знаю, что indirectCaller2b только вызывается с параметрами (двойной, ArrayList, LinkedList).
Имея это в виду, я построил IndexedSeq of DomainValues, который я передаю методу выполнения ob BaseAI. Это выглядит следующим образом:
Vector ({ai.native_methods_parameter_type_approximation.PublicClass, NULL} [@ 0; т = 101], ADoubleValue, {_ <: java.util.ArrayList, NULL} [@ - 4 ; Т = 102], {_ <: java.util.LinkedList, NULL} [@ - 5; т = 103])
этого-параметра ({ai.native_methods_parameter_type_approximation.PublicClass, NULL} [@ 0; t = 101]) был создан со следующим кодом:
domain.TypedValue(0, project.classFile(caller).thisType)
другие значения домена были созданы с использованием метода parameterToValueIndex:
org.opalj.ai.parameterToValueIndex(caller.isStatic, caller.descriptor, index), t)
Здесь, вызывающий абонент обозначает метод indirectCaller2b и т является известным типом среды выполнения параметра (ArrayList для индекса параметра 1 и LinkedList для индекса параметра 2).
Когда я теперь выполнить абстрактную интерпретацию метода с
BaseAI.perform(classFile, caller, domain)(Some(parameters))
и печать индекса стека на счетчик программ, где вызов indirectCaller1 происходит с помощью следующего кода,
for (i <- 0 to analysisResult.operandsArray(pc).size - 1) {
println(s"stack index $i: ${analysisResult.operandsArray(pc)(i)}")
}
Я получаю следующий результат:
индекс стека 0: null
индекс стека 1: {_ <: java.util.LinkedList, NULL} [@ - 5; т = 103]
индекс стека 2: ADoubleValue
индекс стека 3: {ai.native_methods_parameter_type_approximation.PublicClass , null} [@ 0; t = 101]
Это немного сбивает с толку, так как я просто передаю аргументы косвенного вызова Caller2b косвенному Caller1. Следовательно, вывод должен быть таким же, как IndexedSeq передается методу выполнения.
Но на выходе параметр после двойного параметра является LinkedList вместо ArrayList. Параметр ArrayList каким-то образом исчез, а последний параметр в операндеStack равен «null».
Может ли кто-нибудь объяснить мне, как это может произойти?
Благодарим вас за подход к добавлению нулевого значения после работы ctc2-типа. Однако подход с mapOperandsToParameters не работает. Он добавил значение null перед ctc2-Type, а не после него. – mariotrageser