mirror of
https://github.com/github/codeql.git
synced 2025-12-18 18:10:39 +01:00
71 lines
2.3 KiB
Plaintext
71 lines
2.3 KiB
Plaintext
/** Provides the `Instruction` class. */
|
|
|
|
private import CIL
|
|
|
|
/** An instruction. */
|
|
class Instruction extends Element, ControlFlowNode, DataFlowNode, @cil_instruction {
|
|
override string toString() { result = this.getOpcodeName() }
|
|
|
|
/** Gets a more verbose textual representation of this instruction. */
|
|
string toStringExtra() {
|
|
result = this.getIndex() + ": " + this.getOpcodeName() + this.getExtraStr()
|
|
}
|
|
|
|
/** Gets the method containing this instruction. */
|
|
override MethodImplementation getImplementation() { cil_instruction(this, _, _, result) }
|
|
|
|
override Method getMethod() { result = this.getImplementation().getMethod() }
|
|
|
|
/**
|
|
* Gets the index of this instruction.
|
|
* Instructions are sequenced from 0.
|
|
*/
|
|
int getIndex() { cil_instruction(this, _, result, _) }
|
|
|
|
/** Gets the opcode of this instruction. */
|
|
final int getOpcode() { cil_instruction(this, result, _, _) }
|
|
|
|
/** Gets the opcode name of this instruction, for example `ldnull`. */
|
|
string getOpcodeName() { none() }
|
|
|
|
/** Gets an extra field to display for this instruction, if any. */
|
|
string getExtra() { none() }
|
|
|
|
private string getExtraStr() {
|
|
if exists(this.getExtra()) then result = " " + this.getExtra() else result = ""
|
|
}
|
|
|
|
/** Gets the declaration accessed by this instruction, if any. */
|
|
Declaration getAccess() { cil_access(this, result) }
|
|
|
|
/** Gets a successor instruction to this instruction. */
|
|
override Instruction getASuccessorType(FlowType t) {
|
|
t instanceof NormalFlow and
|
|
this.canFlowNext() and
|
|
result = this.getImplementation().getInstruction(this.getIndex() + 1)
|
|
}
|
|
|
|
/** Holds if this instruction passes control flow into the next instruction. */
|
|
predicate canFlowNext() { any() }
|
|
|
|
/**
|
|
* Gets the `i`th handler that applies to this instruction.
|
|
* Indexed from 0.
|
|
*/
|
|
Handler getHandler(int i) {
|
|
result.isInScope(this) and
|
|
result.getIndex() =
|
|
rank[i + 1](int hi | exists(Handler h | h.isInScope(this) and hi = h.getIndex()))
|
|
}
|
|
|
|
override Type getType() { result = ControlFlowNode.super.getType() }
|
|
|
|
override Location getALocation() {
|
|
cil_instruction_location(this, result) // The source code, if available
|
|
or
|
|
result = this.getImplementation().getLocation() // The containing assembly
|
|
}
|
|
|
|
override Location getLocation() { result = Element.super.getLocation() }
|
|
}
|