mirror of
https://github.com/github/codeql.git
synced 2026-02-16 23:13:43 +01:00
@rdmarsh2 has been working on various queries and libraries on top of the IR, and has pointed out that having to always refer to an operand of an instruction by the pair of (instruction, operandTag) makes using the IR a bit clunky. This PR adds a new `Operand` IPA type that represents an operand of an instruction. `OperandTag` still exists, but is now an internal type used only in the IR implementation.
31 lines
1.3 KiB
Plaintext
31 lines
1.3 KiB
Plaintext
import default
|
|
import semmle.code.cpp.ir.IR
|
|
import semmle.code.cpp.ir.internal.IntegerConstant
|
|
|
|
language[monotonicAggregates]
|
|
IntValue getConstantValue(Instruction instr) {
|
|
result = instr.(IntegerConstantInstruction).getValue().toInt() or
|
|
exists(BinaryInstruction binInstr, IntValue left, IntValue right |
|
|
binInstr = instr and
|
|
left = getConstantValue(binInstr.getLeftOperand()) and
|
|
right = getConstantValue(binInstr.getRightOperand()) and
|
|
(
|
|
binInstr instanceof AddInstruction and result = add(left, right) or
|
|
binInstr instanceof SubInstruction and result = sub(left, right) or
|
|
binInstr instanceof MulInstruction and result = mul(left, right) or
|
|
binInstr instanceof DivInstruction and result = div(left, right)
|
|
)
|
|
) or
|
|
result = getConstantValue(instr.(CopyInstruction).getSourceValue()) or
|
|
exists(PhiInstruction phi |
|
|
phi = instr and
|
|
result = max(PhiOperand operand | operand = phi.getAnOperand() | getConstantValue(operand.getDefinitionInstruction())) and
|
|
result = min(PhiOperand operand | operand = phi.getAnOperand() | getConstantValue(operand.getDefinitionInstruction()))
|
|
)
|
|
}
|
|
|
|
from FunctionIR funcIR, int value
|
|
where
|
|
value = getValue(getConstantValue(funcIR.getReturnInstruction().(ReturnValueInstruction).getReturnValue()))
|
|
select funcIR, value
|