class BoundedInterruptableAI[D <: Domain] extends InstructionCountBoundedAI[D]
An abstract interpreter that interrupts itself after the evaluation of
the given number of instructions or if the callback function doInterrupt
returns
false
or if the maximum allowed time is exceeded.
- Alphabetic
- By Inheritance
- BoundedInterruptableAI
- InstructionCountBoundedAI
- AI
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new BoundedInterruptableAI(code: Code, maxEvaluationFactor: Double, maxEvaluationTime: Milliseconds, doInterrupt: () => Boolean, identifyDeadVariables: Boolean = true)(implicit logContext: LogContext)
- new BoundedInterruptableAI(maxEvaluationCount: Int, maxEvaluationTime: Nanoseconds, doInterrupt: () => Boolean, IdentifyDeadVariables: Boolean)
- maxEvaluationCount
- maxEvaluationTime
The maximum number of nanoseconds the abstract interpreter is allowed to run. It starts with the evaluation of the first instruction.
- doInterrupt
This function is called by the abstract interpreter to check if the abstract interpretation should be aborted. Given that this function is called very often (before the evaluation of each instruction), it is important that it is efficient.
Type Members
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final val IdentifyDeadVariables: Boolean
- Definition Classes
- AI
- final val RegisterStoreMayThrowExceptions: Boolean
- Definition Classes
- AI
- def apply(method: Method, theDomain: D): AIResult { val domain: theDomain.type }
Performs an abstract interpretation of the given method using the given domain.
Performs an abstract interpretation of the given method using the given domain.
- method
The method - which has to have a body - that will be analyzed. All parameters are automatically initialized with sensible default values.
- theDomain
The domain that will be used to perform computations related to values.
- Definition Classes
- AI
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native() @IntrinsicCandidate()
- def continueInterpretation(code: Code, cfJoins: IntTrieSet, liveVariables: LiveVariables, theDomain: D)(initialWorkList: List[PC], alreadyEvaluatedPCs: IntArrayStack, subroutinesWereEvaluated: Boolean, theOperandsArray: AI.D.OperandsArray, theLocalsArray: AI.D.LocalsArray, theMemoryLayoutBeforeSubroutineCall: List[(Int, AI.D.OperandsArray, AI.D.LocalsArray)], theSubroutinesOperandsArray: AI.D.OperandsArray, theSubroutinesLocalsArray: AI.D.LocalsArray): AIResult { val domain: theDomain.type }
Continues the interpretation of/performs an abstract interpretation of the given method (code) using the given domain.
Continues the interpretation of/performs an abstract interpretation of the given method (code) using the given domain.
- code
The bytecode that will be interpreted using the given domain.
- cfJoins
The set of instructions where two or more control flow paths join. The abstract interpretation framework will only perform a join operation for those instructions.
- theDomain
The domain that will be used to perform the domain dependent computations.
- initialWorkList
The list of program counters with which the interpretation will continue. If the method was never analyzed before, the list should just contain the value "0"; i.e., we start with the interpretation of the first instruction (see
initialWorkList
). Note that the worklist may contain negative values. These values are not related to a specific instruction per-se but encode the necessary information to handle subroutines. In case of calls to a subroutine we add the special valuesSUBROUTINE
andSUBROUTINE_START
to the list to encode when the evaluation started. This is needed to completely process the subroutine (to explore all paths) before we finally return to the main method.- alreadyEvaluatedPCs
The list of the program counters (PC) of the instructions that were already evaluated. Initially (i.e., if the given code is analyzed the first time) this list is empty. This list is primarily needed to correctly resolve jumps to sub routines (
JSR(_W)
andRET
instructions.) For each instruction that was evaluated, the operands array and the locals array must be non-empty (notnull
).- subroutinesWereEvaluated
True if a subroutine was already evaluated. I.e., at least one JSR instruction can be found in the list of already evaluated pcs.
- theOperandsArray
The array that contains the operand stacks. Each value in the array contains the operand stack before the instruction with the corresponding index is executed. This array can be empty except of the indexes that are referred to by the
initialWorklist
. TheoperandsArray
data structure is mutated by OPAL-AI and it is recommended that aDomain
does not directly mutate the state of this array.- theLocalsArray
The array that contains the local variable assignments. Each value in the array contains the local variable assignments before the instruction with the corresponding program counter is executed. The
localsArray
data structure is mutated by OPAL-AI and it is recommended that aDomain
does not directly mutate the state of this array.- theSubroutinesOperandsArray
The array that contains the intermediate information about the subroutines' operands. This value should be
null
unless we are continuing an aborted computation and a subroutine was already analyzed.- theSubroutinesLocalsArray
The array that contains the intermediate information about the subroutines' locals. This value should be
null
unless we are continuing an aborted computation and a subroutine was already analyzed.
- Definition Classes
- AI
- def continueInterpretation(code: Code, theDomain: D)(initialWorkList: List[Int], alreadyEvaluatedPCs: IntArrayStack, subroutinesWereEvaluated: Boolean, theOperandsArray: AI.D.OperandsArray, theLocalsArray: AI.D.LocalsArray): AIResult { val domain: theDomain.type }
- Definition Classes
- AI
- def currentEvaluationCount: Int
- Definition Classes
- InstructionCountBoundedAI
- val doInterrupt: () => Boolean
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
- def initialLocals(method: Method, domain: D)(someLocals: SomeLocals[AI.D.DomainValue] = None): AI.D.Locals
Returns the initial register assignment (the initialized locals) that is used when analyzing a new method.
Returns the initial register assignment (the initialized locals) that is used when analyzing a new method.
Initially, only the registers that contain the method's parameters (including the self reference (
this
)) are used. If no initial assignment is provided (someLocals == None
) a valid assignment is automatically created using the domain. Seeperform(...)
for further details regarding the initial register assignment.This method is called by the
perform
method with the same signature. It may be overridden by subclasses to perform some additional processing. In that case, however, it is highly recommended to call this method to finalize the initial assignment.- method
A non-native, non-abstract method. I.e., a method that has an implementation in Java bytecode (e.g.,
method.body.isDefined === true
).- domain
The domain that will be used to perform computations related to values.
- Definition Classes
- AI
- def initialOperands(method: Method, domain: D): AI.D.Operands
Returns the initial set of operands that will be used for the abstract interpretation of the given method.
Returns the initial set of operands that will be used for the abstract interpretation of the given method.
In general, an empty list is returned as the JVM specification mandates that the operand stack is empty at the very beginning of a method.
This method is called by the
perform
method with the same signature. It may be overridden by subclasses to perform some additional processing.- Definition Classes
- AI
- Note
This method is (basically only) useful when interpreting code snippets!
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def isInterrupted: Boolean
Determines whether a running (or to be started) abstract interpretation should be interrupted (default:
false
).Determines whether a running (or to be started) abstract interpretation should be interrupted (default:
false
).In general, interrupting the abstract interpreter may be meaningful if the abstract interpretation takes too long or if the currently used domain is not sufficiently precise enough/if additional information is needed to continue with the analysis.
Called during the abstract interpretation of a method to determine whether the computation should be aborted. This method is always called directly before the evaluation of the first/next instruction. I.e., before the very first instruction or after the ai has completely evaluated an instruction, updated the memory and stated all constraints.
- Definition Classes
- BoundedInterruptableAI → InstructionCountBoundedAI → AI
- Note
When the abstract interpreter is currently waiting on the result of the interpretation of a called method it may take some time before the interpretation of the current method (this abstract interpreter) is actually aborted. This method needs to be overridden in subclasses to identify situations in which a running abstract interpretation should be interrupted.
- val maxEvaluationCount: Int
- Definition Classes
- InstructionCountBoundedAI
- val maxEvaluationTime: Nanoseconds
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- def perform(method: Method, theDomain: D)(someLocals: Option[IndexedSeq[AI.D.DomainValue]] = None): AIResult { val domain: theDomain.type }
Analyzes the given method using the given domain and the pre-initialized parameter values (if any).
Analyzes the given method using the given domain and the pre-initialized parameter values (if any). Basically, first the set of initial operands and locals is calculated before the respective
perform(...,initialOperands,initialLocals)
method is called.Controlling the AI
The abstract interpretation of a method is aborted if the AI's
isInterrupted
method returns true.- method
A non-abstract, non-native method of the given class file. I.e., a method with a body.
- theDomain
The abstract domain that will be used for the abstract interpretation of the given method.
- someLocals
The initial register assignment (the parameters passed to the method). If the values passed to a method are already known, the abstract interpretation will be performed under that assumption. The specified number of locals has to be equal or larger than the number of parameters (including
this
in case of a non-static method.). If the number is lower thanmethod.body.maxLocals
it will be adjusted as required.- returns
The result of the abstract interpretation. Basically, the calculated memory layouts; i.e., the list of operands and local variables before each instruction. Each calculated memory layout represents the layout before the instruction with the corresponding program counter was interpreted. If the interpretation was aborted, the returned result object contains all necessary information to continue the interpretation if needed/desired.
- Definition Classes
- AI
- def performInterpretation(code: Code, theDomain: D)(initialOperands: AI.D.Operands, initialLocals: AI.D.Locals): AIResult { val domain: theDomain.type }
Performs an abstract interpretation of the given (byte)code using the given domain and the initial operand stack and initial register assignment.
Performs an abstract interpretation of the given (byte)code using the given domain and the initial operand stack and initial register assignment.
- Definition Classes
- AI
- def preInterpretationInitialization(code: Code, instructions: Array[Instruction], cfJoins: IntTrieSet, liveVariables: LiveVariables, theDomain: D)(theOperandsArray: AI.D.OperandsArray, theLocalsArray: AI.D.LocalsArray, theMemoryLayoutBeforeSubroutineCall: List[(Int, AI.D.OperandsArray, AI.D.LocalsArray)], theSubroutinesOperandsArray: AI.D.OperandsArray, theSubroutinesLocalsArray: AI.D.LocalsArray): Unit
Performs additional initializations of the Domain, if the
Domain
implements the trait TheAI, TheCodeStructure, TheMemoryLayout or CustomInitialization.Performs additional initializations of the Domain, if the
Domain
implements the trait TheAI, TheCodeStructure, TheMemoryLayout or CustomInitialization.This method is called before the abstract interpretation is started/continued.
- Attributes
- protected[this]
- Definition Classes
- AI
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- def tracer: Option[AITracer]
The tracer (default:
None
) that is called by OPAL while performing the abstract interpretation of a method.The tracer (default:
None
) that is called by OPAL while performing the abstract interpretation of a method.This method is called at different points to report on the analysis progress (see org.opalj.ai.AITracer for further details)
It is possible to attach/detach a tracer at any time.
To attach a tracer to the abstract interpreter override this method in subclasses and return some tracer object.
- Definition Classes
- AI
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
Deprecated Value Members
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable]) @Deprecated
- Deprecated