Skip to content

Commit 750129d

Browse files
committed
Binary: More consistent distinquishing of local variables and temp variables in the IR.
1 parent 2af26f8 commit 750129d

15 files changed

Lines changed: 378 additions & 202 deletions

File tree

binary/ql/lib/semmle/code/binary/ast/internal/CilInstructions.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import binary
1+
private import binary
22

33
// TODO
44
class CilVariable instanceof @method {

binary/ql/lib/semmle/code/binary/ast/internal/instructions.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ module MakeInstructions<InstructionInputSig InstructionInput> {
8585

8686
Location getLocation() { result instanceof EmptyLocation }
8787

88+
X86Instruction getAPredecessor() { this = result.getASuccessor() }
89+
8890
X86Instruction getASuccessor() {
8991
result.getIndex() = this.getIndex() + this.getLength().toBigInt()
9092
}

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/Instruction.qll

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,7 @@ class Instruction extends TInstruction {
7979

8080
Location getLocation() { result instanceof EmptyLocation }
8181

82-
Function getEnclosingFunction() {
83-
exists(TranslatedFunction f |
84-
result = TMkFunction(f) and
85-
f.getEntry() = this
86-
)
87-
or
88-
result = this.getAPredecessor().getEnclosingFunction()
89-
}
82+
Function getEnclosingFunction() { result = TMkFunction(te.getEnclosingFunction()) }
9083

9184
BasicBlock getBasicBlock() { result.getANode().asInstruction() = this }
9285

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/Instruction0.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ module Instruction0 implements InstructionSig {
77
import Variable
88
import BasicBlock
99
import InstructionTag
10-
import VariableTag
10+
import TempVariableTag
1111
}

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/VariableTag.qll renamed to binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/TempVariableTag.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
newtype TVariableTag =
1+
newtype TTempVariableTag =
22
X86JumpInstrRefVarTag() or
33
X86CJumpInstrRefVarTag() or
44
TestVarTag() or
@@ -30,7 +30,7 @@ newtype TVariableTag =
3030
CilBoolBranchRefVarTag() or
3131
CilUnconditionalBranchRefVarTag()
3232

33-
class VariableTag extends TVariableTag {
33+
class TempVariableTag extends TTempVariableTag {
3434
string toString() {
3535
this = X86JumpInstrRefVarTag() and
3636
result = "j_ir"

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/TranslatedElement.qll

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ private import semmle.code.binary.ast.instructions as Raw
22
private import codeql.controlflow.SuccessorType
33
private import semmle.code.binary.ast.ir.internal.Tags
44
private import InstructionTag
5-
private import VariableTag
5+
private import TempVariableTag
66
private import Instruction
77
private import semmle.code.binary.ast.ir.internal.Opcode as Opcode
88
private import codeql.util.Either
@@ -109,13 +109,17 @@ TranslatedCilInstruction getTranslatedCilInstruction(Raw::CilInstruction raw) {
109109
abstract class TranslatedElement extends TTranslatedElement {
110110
abstract predicate hasInstruction(Opcode opcode, InstructionTag tag, Option<Variable>::Option v);
111111

112-
predicate hasTempVariable(VariableTag tag) { none() }
112+
predicate hasTempVariable(TempVariableTag tag) { none() }
113113

114114
predicate hasJumpCondition(InstructionTag tag, Opcode::ConditionKind kind) { none() }
115115

116-
predicate hasSynthVariable(SynthRegisterTag tag) { none() }
116+
predicate hasLocalVariable(LocalVariableTag tag) { none() }
117117

118-
Variable getVariable(VariableTag tag) { result = TTempVariable(this, tag) }
118+
final Variable getLocalVariable(LocalVariableTag tag) {
119+
result = TLocalVariable(this.getEnclosingFunction(), tag)
120+
}
121+
122+
Variable getVariable(TempVariableTag tag) { result = TTempVariable(this, tag) }
119123

120124
final Instruction getInstruction(InstructionTag tag) { result = MkInstruction(this, tag) }
121125

@@ -143,10 +147,17 @@ abstract class TranslatedElement extends TTranslatedElement {
143147
abstract string getDumpId();
144148

145149
TranslatedFunction getStaticCallTarget(InstructionTag tag) { none() }
150+
151+
abstract TranslatedFunction getEnclosingFunction();
146152
}
147153

148154
predicate hasInstruction(TranslatedElement te, InstructionTag tag) { te.hasInstruction(_, tag, _) }
149155

150-
predicate hasTempVariable(TranslatedElement te, VariableTag tag) { te.hasTempVariable(tag) }
156+
predicate hasTempVariable(TranslatedElement te, TempVariableTag tag) { te.hasTempVariable(tag) }
151157

152-
predicate hasSynthVariable(SynthRegisterTag tag) { any(TranslatedElement te).hasSynthVariable(tag) }
158+
predicate hasLocalVariable(TranslatedFunction tf, LocalVariableTag tag) {
159+
exists(TranslatedElement te |
160+
te.getEnclosingFunction() = tf and
161+
te.hasLocalVariable(tag)
162+
)
163+
}

binary/ql/lib/semmle/code/binary/ast/ir/internal/Instruction0/TranslatedFunction.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ abstract class TranslatedFunction extends TranslatedElement {
2727
abstract predicate isExported();
2828

2929
final override string getDumpId() { result = this.getName() }
30-
}
3130

32-
TranslatedX86Function getTranslatedFunction(Raw::X86Instruction entry) {
33-
result.getRawElement() = entry
31+
final override TranslatedFunction getEnclosingFunction() { result = this }
3432
}
3533

34+
TranslatedFunction getTranslatedFunction(Raw::Element raw) { result.getRawElement() = raw }
35+
3636
class TranslatedX86Function extends TranslatedFunction, TTranslatedX86Function {
3737
Raw::X86Instruction entry;
3838

@@ -58,6 +58,12 @@ class TranslatedX86Function extends TranslatedFunction, TTranslatedX86Function {
5858
tag = InitStackPtrTag() and
5959
succType instanceof DirectSuccessor and
6060
result = getTranslatedInstruction(entry).getEntry()
61+
}
62+
63+
override predicate hasLocalVariable(LocalVariableTag tag) {
64+
tag = X86RegisterTag(any(Raw::RspRegister sp))
65+
or
66+
tag = X86RegisterTag(any(Raw::RbpRegister fp))
6167
}
6268

6369
override Instruction getChildSuccessor(TranslatedElement child, SuccessorType succType) { none() }

0 commit comments

Comments
 (0)