2016-06-18 9 views
0

В настоящее время я разрабатываю статический анализ 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».

Может ли кто-нибудь объяснить мне, как это может произойти?

ответ

1

Представления «этого»

Чтобы получить правильное представление для «этого» ссылки вы должны использовать метод

InitializedObjectValue(
    origin:  ValueOrigin, 
    objectType: ObjectType ): DomainReferenceValue 

создать представление этого значения. Разница в том, что в этом случае ИИ попытается использовать информацию, которая (а) гарантирует, что значение будет не нулевым, а также гарантированно будет инициализировано. В частности, прежнее свойство часто интересно и обычно приводит к более точным результатам.

Инициализация Местных

Функции: org.opalj.ai.parameterToValueIndex только вычисляет информацию логического происхождения (далее «ПК», который связан со значением, чтобы сделать возможным, чтобы идентифицировать соответствующие значения в качестве параметров позже).

Чтобы правильно отобразить операнды для местных жителей вы можете использовать метод mapOperandsToParameters или просто добавить все значения к IndexedSeq но добавить еще null значение для категории 2 значений вычислительного типа.

+0

Благодарим вас за подход к добавлению нулевого значения после работы ctc2-типа. Однако подход с mapOperandsToParameters не работает. Он добавил значение null перед ctc2-Type, а не после него. – mariotrageser

 Смежные вопросы

  • Нет связанных вопросов^_^