2016-06-24 11 views
0

In meiner OPAL-Analyse erstellen I-Domäne Werte auf folgende Weise:Arbeiten mit präzisem/ungenauem DomainValues ​​in der abstrakten Interpretation ist OPAL

domain.TypedValue(org.opalj.ai.parameterToValueIndex(
    caller.isStatic, caller.descriptor, index), typeApproximation.upperTypeBound) 

In meinen typeApproximation Objekten, ich die Informationen habe, ob seine Art ist ein oberer typgebundener oder ein genauer Laufzeittyp. Ich weiß jedoch nicht, wie ich diese Information an den jeweiligen DomainValue weitergeben soll.

I geben diese an die DomainValues ​​BaseAI.perform Verfahren eine abstrakte Interpretation eines Java-Methode auszuführen:

BaseAI.perform(classFile, caller, domain)(Some(parameters)) 

Die DomainValues ​​sind in dem Parameter-Wert enthalten.

Gibt es eine Möglichkeit, die abstrakte Interpretation zu erklären, dass einige meiner Parameter präzise Laufzeittypen sind, während einige andere Parameter nur obere Typgrenzen sind?

Antwort

1

Mit den Factory-Methoden, die durch org.opalj.ai.ReferenceValuesFactory definiert sind (immer verfügbar), können Sie Werte mit den erforderlichen Eigenschaften erstellen. Z.B. Unter Verwendung von InitializedObjectValue wird ein DomainValue erstellt, in dem der Typ als genau angenommen wird. Mit der Factory-Methode ReferenceValue wird der angegebene Typ als obere Typgrenze behandelt. Außerdem definiert org.opalj.ai.l1.DefaultReferenceValuesBinding die generische Fabrikmethode:

def ObjectValue(
    origin:   ValueOrigin, 
    isNull:   Answer, 
    isPrecise:   Boolean, 
    theUpperTypeBound: ObjectType, 
    t:     Timestamp 
): SObjectValue 

, die Ihnen die vollständige Kontrolle.

+0

Vielen Dank. Da ich einige präzise Typen sowie einige obere Typgrenzen habe, habe ich die flexible Methode ObjectValue verwendet. Allerdings musste ich eine neue Domäne definieren, die diese Methode öffentlich zugänglich machte, da sie als geschützt deklariert ist. – mariotrageser