com.pnfsoftware.jeb.core.units.code.IDFA<InsnType extends com.pnfsoftware.jeb.core.units.code.IInstruction> |
Known Indirect Subclasses
DFA4<InsnType extends IInstruction>
|
Specification of a data flow analysis objects for control flow graphs.
Constants | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
int | STANDARD_COLLECTION_FLAGS | Standard setting for variable collection flags: conservative. | |||||||||
boolean | STANDARD_INTEGRATE_INPUTS | Standard setting for routine inputs integration into output maps and reaching-register chains: enabled. |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
abstract int |
checkNoUse(long insnAddress, int varId, boolean reachOutIsUse, int maxBlocks)
Check whether a variable, defined at the provided instruction, is not used.
| ||||||||||
abstract boolean |
checkNoUse(long insnAddress, int varId)
Check whether a variable, defined at the provided instruction, is not used.
| ||||||||||
abstract boolean |
checkNoUse(long insnAddress, int varId, boolean reachOutIsUse)
Check whether a variable, defined at the provided instruction, is not used.
| ||||||||||
abstract boolean | checkSingleDef(long addr, int varid, long expectedDefAddress) | ||||||||||
abstract Long |
checkSingleDef(long addr, int varid)
Check whether a used variable has a single definition point.
| ||||||||||
abstract Long |
checkSingleDefNoInput(long addr, int varid)
Check whether a used variable has a single explicit definition point.
| ||||||||||
abstract Long | checkSingleSource(long addr, int varid, boolean liveInIsDef) | ||||||||||
abstract Long | checkSingleSource(long addr, int varid) | ||||||||||
abstract boolean | checkSingleSource(long addr, int varid, long expectedSourceAddress) | ||||||||||
abstract Long | checkSingleUse(long addr, int varid) | ||||||||||
abstract boolean | checkSingleUse(long addr, int varid, long expectedUseAddress) | ||||||||||
abstract void | collectInstructionAllDefs(long addr, Collection<Integer> r) | ||||||||||
abstract void | collectInstructionAllUses(long addr, Collection<Integer> r) | ||||||||||
abstract Collection<Long> | getBlockDefUses(long addr, int varid) | ||||||||||
abstract IControlFlowGraph<InsnType, IBasicBlock<InsnType>> |
getCfg()
Retrieve a reference to the CFG object that will be accessed and modified when performing an
analysis.
| ||||||||||
abstract DUI | getDUI(AddressableInstruction<InsnType> a) | ||||||||||
abstract DUI | getDUI(long addr) | ||||||||||
abstract DUI | getDUI(long addr, InsnType insn) | ||||||||||
abstract Map<Integer, Collection<Long>> | getDefUseChains(long addr) | ||||||||||
abstract Collection<Long> | getDefUses(long addr, int varid, int stopCount, boolean recordReachOut) | ||||||||||
abstract Collection<Long> | getDefUses(long addr, int varid, int stopCount) | ||||||||||
abstract Collection<Long> | getDefUses(long addr, int varid) | ||||||||||
abstract Collection<Long> | getInputMap(int varid) | ||||||||||
abstract Map<Integer, Collection<Long>> | getInputMap() | ||||||||||
abstract Collection<Integer> | getInputs() | ||||||||||
abstract Collection<Integer> | getInstructionAllDefs(long addr) | ||||||||||
abstract Collection<Integer> | getInstructionAllUses(long addr) | ||||||||||
abstract Collection<Integer> | getInstructionDefs(long addr) | ||||||||||
abstract Collection<Integer> | getInstructionPotentialDefs(long addr) | ||||||||||
abstract Collection<Integer> | getInstructionPotentialUses(long addr) | ||||||||||
abstract Collection<Integer> | getInstructionSpoiledDefs(long addr) | ||||||||||
abstract Collection<Integer> | getInstructionUses(long addr) | ||||||||||
abstract Map<Integer, Collection<Long>> | getLiveChains(IBasicBlock<InsnType> b, int idx) | ||||||||||
abstract Collection<Long> | getLiveChains(IBasicBlock<InsnType> b, int idx, int varid) | ||||||||||
abstract int |
getMaxBlocks()
Retrieve the maximum block count used for common DFA operations.
| ||||||||||
abstract Map<Integer, Collection<Long>> | getOutputMap() | ||||||||||
abstract Collection<Long> | getOutputMap(IBasicBlock<InsnType> blk, int varid) | ||||||||||
abstract Collection<Long> | getOutputMap(int varid) | ||||||||||
abstract Map<Integer, Collection<Long>> | getOutputMap(IBasicBlock<InsnType> blk) | ||||||||||
abstract Collection<Integer> | getOutputs(IBasicBlock<InsnType> blk) | ||||||||||
abstract Collection<Integer> | getOutputs() | ||||||||||
abstract Collection<Long> | getReachChains(IBasicBlock<InsnType> b, int idx, int varid) | ||||||||||
abstract Map<Integer, Collection<Long>> | getReachChains(IBasicBlock<InsnType> b, int idx) | ||||||||||
abstract Map<Integer, Collection<Long>> | getUseDefChains(long addr) | ||||||||||
abstract Collection<Long> | getUseDefs(long addr, int varid, int stopCount) | ||||||||||
abstract Collection<Long> | getUseDefs(long addr, int varid) | ||||||||||
abstract Collection<Integer> |
getUseDiscrepancies(long addr)
Retrieve the list of use-discrepancies at the provided instruction address.
| ||||||||||
abstract int |
getVariableCollectionFlags()
Retrieve the variable collection flags.
| ||||||||||
abstract ICFGOwnerContext | getVariableInformationProvider() | ||||||||||
abstract void |
invalidate()
Invalidate the analysis.
| ||||||||||
abstract boolean | isAlive(IBasicBlock<InsnType> b, int idx, int varid) | ||||||||||
abstract boolean |
isConservative()
Convenience method used to determine whether the variable collection flags are
CONSERVATIVE . | ||||||||||
abstract boolean | isIntegrateCalculatedInputRegisters() | ||||||||||
abstract boolean |
isNotRedefined(int varid, long addr0, long addr1)
Determine if a variable reaching a start instruction has not been redefined when it reaches a
final instruction.
| ||||||||||
abstract boolean |
isNotRedefined(int varid, IBasicBlock<InsnType> b0, int i0, IBasicBlock<InsnType> b1, int i1)
Determine if a variable reaching a start instruction has not been redefined when it reaches a
final instruction.
| ||||||||||
abstract boolean | isReaching(IBasicBlock<InsnType> b, int idx, int varid) | ||||||||||
abstract boolean |
isTerminator(IBasicBlock<InsnType> blk)
Determine whether the provided block is a terminator.
| ||||||||||
abstract boolean | isUseDiscrepancy(long addr, int varid) | ||||||||||
abstract boolean |
isValid()
Determine whether the current analysis was performed and is valid.
| ||||||||||
abstract Boolean |
isVarReachingFromTo(int varid, IBasicBlock<InsnType> b0, int i0, IBasicBlock<InsnType> b1, int i1)
Determine if a variable used by the start instruction reaches the final instruction with the
same value.
| ||||||||||
abstract Boolean |
isVarReachingFromTo(int varid, long addr0, long addr1)
Determine if a variable used by the start instruction reaches the final instruction with the
same value.
| ||||||||||
abstract void | notifyInstructionUpdate(long addr) | ||||||||||
abstract void |
perform()
Perform data flow analysis on the CFG.
| ||||||||||
abstract void |
setConservative()
Convenience method used to set or remove
CONSERVATIVE variable collection
flags. | ||||||||||
abstract void | setIntegrateCalculatedInputRegisters(boolean integrateCalculatedInputRegisters) | ||||||||||
abstract int |
setMaxBlocks(int maxBlocks)
Set an exploration threshold for most DFA operations.
| ||||||||||
abstract void |
setVariableCollectionFlags(int varCollectionFlags)
Set the variable collection flags.
| ||||||||||
abstract void | setVariableInformationProvider(ICFGOwnerContext varInfoProvider) |
Standard setting for variable collection flags: conservative.
Standard setting for routine inputs integration into output maps and reaching-register chains: enabled.
Check whether a variable, defined at the provided instruction, is not used.
insnAddress | initial instruction address |
---|---|
varId | defined variable at the initial instruction |
Check whether a variable, defined at the provided instruction, is not used.
insnAddress | initial instruction address |
---|---|
varId | defined variable at the initial instruction |
Check whether a variable, defined at the provided instruction, is not used.
insnAddress | initial instruction address |
---|---|
varId | defined variable at the initial instruction |
Check whether a used variable has a single definition point. The def point may be explicit (e.g. resulting from an assignment) or implicit (e.g. provided as a parameter to the routine, which is always represented as the address -1).
addr | initial instruction address |
---|---|
varid | used variable at the initial instruction |
Check whether a used variable has a single explicit definition point. The def point cannot be a routine input (i.e. the definition must be explicit).
addr | initial instruction address |
---|---|
varid | used variable at the initial instruction |
Retrieve a reference to the CFG object that will be accessed and modified when performing an analysis.
addr | instruction address |
---|---|
varid | a variable, which must be defined by the provided instruction |
stopCount | optional stop count (-1 to collect as many uses as possible) |
recordReachOut | if true, a variable reaching is considered used (if so, the output list will contain -1) |
addr | instruction address |
---|---|
varid | a variable, which must be defined by the provided instruction |
stopCount | optional stop count (-1 to collect as many uses as possible) |
addr | instruction address |
---|---|
varid | a variable, which must be defined by the provided instruction |
Retrieve the maximum block count used for common DFA operations. See
setMaxBlocks(int)
for details.
addr | instruction address |
---|---|
varid | a variable, which must be used by the provided instruction |
addr | instruction address |
---|---|
varid | a variable, which must be used by the provided instruction |
Retrieve the list of use-discrepancies at the provided instruction address.
addr | instruction address |
---|
Retrieve the variable collection flags.
DefUseInfo
Invalidate the analysis. Clients have the responsibility to invalidate an analysis if the CFG was modified in such a way that data flow should be recalculated.
Convenience method used to determine whether the variable collection flags are
CONSERVATIVE
.
Determine if a variable reaching a start instruction has not been redefined when it reaches a final instruction. (Note that this method does not verify that varid actually has definitions reaching the start or final instruction; it is up to the caller to verify that.)
varid | variable id |
---|---|
addr0 | start address, exclusive |
addr1 | final address, also exclusive |
Determine if a variable reaching a start instruction has not been redefined when it reaches a final instruction. (Note that this method does not verify that varid actually has definitions reaching the start or final instruction; it is up to the caller to verify that.)
varid | variable id |
---|---|
b0 | start block |
i0 | final block |
b1 | index of the start instruction in the start block, exclusive |
i1 | index of the final instruction in the final block, also exclusive |
Determine whether the provided block is a terminator. A terminator has no output and its final instruction is a clean routine terminator.
blk | block to test |
---|
Determine whether the current analysis was performed and is valid.
Determine if a variable used by the start instruction reaches the final instruction with the same value. This method provides a must-reach result: if a multiple paths exist from start to end, where the variable reaches the end via some paths, but not on others (it is overwritten), the method returns false.
varid | variable id |
---|---|
b0 | start block |
i0 | final block |
b1 | index of the start instruction in the start block, exclusive |
i1 | index of the final instruction in the final block, also exclusive |
Determine if a variable used by the start instruction reaches the final instruction with the same value.
Important notes:
- This method provides a must-reach result: if a multiple paths exist from start to
end, where the variable reaches the end via some paths, but not on others (it is
overwritten), the method returns false.
- This method works from the start point to an end point, and provides the guarantee that the
variable was not overwritten when it reached the end-point. There is no guarantee provided at
the end-point itself.
varid | variable id |
---|---|
addr0 | start address, exclusive |
addr1 | final address, also exclusive |
Perform data flow analysis on the CFG. Upon return, basic blocks will have their data chains (ud and du, full and simple) set up and accessible.
Convenience method used to set or remove CONSERVATIVE
variable collection
flags.
Set an exploration threshold for most DFA operations. By default, there is no threshold. The threshold is a block count; if a block count is reached, a chain may contain a reference to the invalid address -2 in order to indicate an incomplete result.
maxBlocks | -1 means no limit |
---|
Set the variable collection flags.
varCollectionFlags | flags, see DefUseInfo
|
---|