Skip to content

Commit 2a2ef2b

Browse files
committed
x86: Abstract away rsp and rbp.
1 parent 7de93f0 commit 2a2ef2b

3 files changed

Lines changed: 33 additions & 12 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ class TranslatedX86Function extends TranslatedFunction, TTranslatedX86Function {
4242
override predicate hasInstruction(Opcode opcode, InstructionTag tag, Option<Variable>::Option v) {
4343
tag = InitStackPtrTag() and
4444
opcode instanceof Opcode::Init and
45-
v.asSome() = getTranslatedVariableReal(any(Raw::RspRegister r)) // TODO: This assumes rsp is present in the DB
45+
v.asSome() = getStackPointer()
4646
or
4747
tag = InitFramePtrTag() and
4848
opcode instanceof Opcode::Init and
49-
v.asSome() = getTranslatedVariableReal(any(Raw::RbpRegister r)) // TODO: This assumes rsp is present in the DB
49+
v.asSome() = getFramePointer()
5050
}
5151

5252
override Instruction getSuccessor(InstructionTag tag, SuccessorType succType) {

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -525,8 +525,6 @@ class TranslatedX86Movdqa extends TranslatedCopy, TTranslatedX86Movdqa {
525525
TranslatedX86Movdqa() { this = TTranslatedX86Movdqa(instr) }
526526
}
527527

528-
private Variable getEspVariable() { result = getTranslatedVariableReal(any(Raw::RspRegister r)) }
529-
530528
class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
531529
override Raw::X86Push instr;
532530

@@ -545,7 +543,7 @@ class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
545543
// esp = esp - x
546544
tag = PushSubTag() and
547545
opcode instanceof Opcode::Sub and
548-
v.asSome() = getEspVariable()
546+
v.asSome() = getStackPointer()
549547
or
550548
// store [esp], y
551549
tag = PushStoreTag() and
@@ -564,7 +562,7 @@ class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
564562
tag = PushSubTag() and
565563
(
566564
operandTag = LeftTag() and
567-
result = getEspVariable()
565+
result = getStackPointer()
568566
or
569567
operandTag = RightTag() and
570568
result = this.getInstruction(PushSubConstTag()).getResultVariable()
@@ -576,7 +574,7 @@ class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
576574
result = this.getTranslatedOperand().getResultVariable()
577575
or
578576
operandTag = StoreAddressTag() and
579-
result = getEspVariable()
577+
result = getStackPointer()
580578
)
581579
}
582580

@@ -969,7 +967,7 @@ class TranslatedX86Pop extends TranslatedX86Instruction, TTranslatedX86Pop {
969967
// esp = esp + x
970968
tag = PopAddTag() and
971969
opcode instanceof Opcode::Add and
972-
v.asSome() = getEspVariable()
970+
v.asSome() = getStackPointer()
973971
}
974972

975973
override int getConstantValue(InstructionTag tag) {
@@ -982,12 +980,12 @@ class TranslatedX86Pop extends TranslatedX86Instruction, TTranslatedX86Pop {
982980
override Variable getVariableOperand(InstructionTag tag, OperandTag operandTag) {
983981
tag = PopLoadTag() and
984982
operandTag = UnaryTag() and
985-
result = getEspVariable()
983+
result = getStackPointer()
986984
or
987985
tag = PopAddTag() and
988986
(
989987
operandTag = LeftTag() and
990-
result = getEspVariable()
988+
result = getStackPointer()
991989
or
992990
operandTag = RightTag() and
993991
result = this.getInstruction(PopAddConstTag()).getResultVariable()

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ private import Operand
66

77
newtype TVariable =
88
TTempVariable(TranslatedElement te, Tags::VariableTag tag) { hasTempVariable(te, tag) } or
9-
TRegisterVariableReal(Raw::X86Register r) or
9+
TStackPointer() or
10+
TFramePointer() or
11+
TRegisterVariableReal(Raw::X86Register r) {
12+
not r instanceof Raw::RbpRegister and // Handled by FramePointer
13+
not r instanceof Raw::RspRegister // Handled by StackPointer
14+
} or
1015
TRegisterVariableSynth(Tags::SynthRegisterTag tag) { hasSynthVariable(tag) }
1116

1217
abstract class Variable extends TVariable {
@@ -26,6 +31,18 @@ class TempVariable extends Variable, TTempVariable {
2631
override string toString() { result = te.getDumpId() + "." + Tags::stringOfVariableTag(tag) }
2732
}
2833

34+
class StackPointer extends Variable, TStackPointer {
35+
override string toString() { result = "sp" }
36+
}
37+
38+
Variable getStackPointer() { result instanceof StackPointer }
39+
40+
class FramePointer extends Variable, TFramePointer {
41+
override string toString() { result = "fp" }
42+
}
43+
44+
Variable getFramePointer() { result instanceof FramePointer }
45+
2946
class TRegisterVariable = TRegisterVariableReal or TRegisterVariableSynth;
3047

3148
class RegisterVariable extends Variable, TRegisterVariable {
@@ -46,7 +63,13 @@ private class RegisterVariableReal extends RegisterVariable, TRegisterVariableRe
4663
override Raw::X86Register getRegister() { result = r }
4764
}
4865

49-
RegisterVariable getTranslatedVariableReal(Raw::X86Register r) { result.getRegister() = r }
66+
Variable getTranslatedVariableReal(Raw::X86Register r) {
67+
result.(RegisterVariable).getRegister() = r
68+
or
69+
r instanceof Raw::RspRegister and result instanceof StackPointer
70+
or
71+
r instanceof Raw::RbpRegister and result instanceof FramePointer
72+
}
5073

5174
private class RegisterVariableSynth extends RegisterVariable, TRegisterVariableSynth {
5275
Tags::SynthRegisterTag tag;

0 commit comments

Comments
 (0)