Skip to content

Commit 9c63a86

Browse files
committed
Binary: Fix some consistency errors.
1 parent a238c01 commit 9c63a86

5 files changed

Lines changed: 52 additions & 21 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ class TranslatedX86Function extends TranslatedFunction, TTranslatedX86Function {
4343
override predicate hasInstruction(Opcode opcode, InstructionTag tag, Option<Variable>::Option v) {
4444
tag = InitStackPtrTag() and
4545
opcode instanceof Opcode::Init and
46-
v.asSome() = getStackPointer()
46+
v.asSome() = this.getLocalVariable(X86RegisterTag(any(Raw::RspRegister sp)))
4747
or
4848
tag = InitFramePtrTag() and
4949
opcode instanceof Opcode::Init and
50-
v.asSome() = getFramePointer()
50+
v.asSome() = this.getLocalVariable(X86RegisterTag(any(Raw::RbpRegister fp)))
5151
}
5252

5353
override Instruction getSuccessor(InstructionTag tag, SuccessorType succType) {
@@ -58,7 +58,7 @@ class TranslatedX86Function extends TranslatedFunction, TTranslatedX86Function {
5858
tag = InitStackPtrTag() and
5959
succType instanceof DirectSuccessor and
6060
result = getTranslatedInstruction(entry).getEntry()
61-
}
61+
}
6262

6363
override predicate hasLocalVariable(LocalVariableTag tag) {
6464
tag = X86RegisterTag(any(Raw::RspRegister sp))

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ abstract class TranslatedX86Instruction extends TranslatedInstruction {
3232
or
3333
result = getTranslatedInstruction(instr.getAPredecessor()).getEnclosingFunction()
3434
}
35+
36+
final StackPointer getStackPointer() {
37+
result = this.getLocalVariable(X86RegisterTag(any(Raw::RspRegister sp)))
38+
}
3539
}
3640

3741
abstract class TranslatedCilInstruction extends TranslatedInstruction {
@@ -600,7 +604,7 @@ class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
600604
// esp = esp - x
601605
tag = PushSubTag() and
602606
opcode instanceof Opcode::Sub and
603-
v.asSome() = getStackPointer()
607+
v.asSome() = this.getStackPointer()
604608
or
605609
// store [esp], y
606610
tag = PushStoreTag() and
@@ -619,7 +623,7 @@ class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
619623
tag = PushSubTag() and
620624
(
621625
operandTag = LeftTag() and
622-
result = getStackPointer()
626+
result = this.getStackPointer()
623627
or
624628
operandTag = RightTag() and
625629
result = this.getInstruction(PushSubConstTag()).getResultVariable()
@@ -631,7 +635,7 @@ class TranslatedX86Push extends TranslatedX86Instruction, TTranslatedX86Push {
631635
result = this.getTranslatedOperand().getResultVariable()
632636
or
633637
operandTag = StoreAddressTag() and
634-
result = getStackPointer()
638+
result = this.getStackPointer()
635639
)
636640
}
637641

@@ -1050,7 +1054,7 @@ class TranslatedX86Pop extends TranslatedX86Instruction, TTranslatedX86Pop {
10501054
// esp = esp + x
10511055
tag = PopAddTag() and
10521056
opcode instanceof Opcode::Add and
1053-
v.asSome() = getStackPointer()
1057+
v.asSome() = this.getStackPointer()
10541058
}
10551059

10561060
override int getConstantValue(InstructionTag tag) {
@@ -1062,13 +1066,13 @@ class TranslatedX86Pop extends TranslatedX86Instruction, TTranslatedX86Pop {
10621066

10631067
override Variable getVariableOperand(InstructionTag tag, OperandTag operandTag) {
10641068
tag = PopLoadTag() and
1065-
operandTag = UnaryTag() and
1066-
result = getStackPointer()
1069+
operandTag = LoadAddressTag() and
1070+
result = this.getStackPointer()
10671071
or
10681072
tag = PopAddTag() and
10691073
(
10701074
operandTag = LeftTag() and
1071-
result = getStackPointer()
1075+
result = this.getStackPointer()
10721076
or
10731077
operandTag = RightTag() and
10741078
result = this.getInstruction(PopAddConstTag()).getResultVariable()
@@ -1766,7 +1770,9 @@ class TranslatedCilUnconditionalBranch extends TranslatedCilInstruction,
17661770
result = this.getInstruction(CilUnconditionalBranchRefTag()).getResultVariable()
17671771
}
17681772

1769-
override predicate hasTempVariable(TempVariableTag tag) { tag = CilUnconditionalBranchRefVarTag() }
1773+
override predicate hasTempVariable(TempVariableTag tag) {
1774+
tag = CilUnconditionalBranchRefVarTag()
1775+
}
17701776

17711777
override Instruction getReferencedInstruction(InstructionTag tag) {
17721778
tag = CilUnconditionalBranchRefTag() and

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ class StackPointer extends LocalVariable {
3232
StackPointer() { this.getTag() = X86RegisterTag(any(Raw::RspRegister sp)) }
3333
}
3434

35-
Variable getStackPointer() { result instanceof StackPointer }
36-
3735
class FramePointer extends LocalVariable {
3836
FramePointer() { this.getTag() = X86RegisterTag(any(Raw::RbpRegister fp)) }
3937
}
4038

41-
Variable getFramePointer() { result instanceof FramePointer }
42-
4339
class LocalVariable extends Variable, TLocalVariable {
4440
TranslatedFunction tf;
4541
LocalVariableTag tag;

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

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,18 +285,38 @@ module InstructionInput implements Transform<Instruction0>::TransformInputSig {
285285
)
286286
}
287287

288-
predicate isRemovedInstruction(Instruction0::Instruction instr) {
289-
exists(TTranslatedLoad(instr))
290-
or
291-
exists(TTranslatedStore(instr))
288+
private predicate isRemovedAddress0(Instruction0::Instruction instr) {
289+
exists(Ssa::Definition def | instr = def.getInstruction() |
290+
exists(Instruction0::LoadInstruction load |
291+
exists(TTranslatedLoad(load)) and
292+
load.getOperand() = unique(| | def.getARead())
293+
)
294+
or
295+
exists(Instruction0::StoreInstruction store |
296+
exists(TTranslatedStore(store)) and
297+
store.getAddressOperand() = unique(| | def.getARead())
298+
)
299+
)
300+
}
301+
302+
private predicate isRemovedAddress(Instruction0::Instruction instr) {
303+
isRemovedAddress0(instr)
292304
or
293305
exists(Ssa::Definition def |
294306
def.getInstruction() = instr and
295307
def.getSourceVariable() instanceof Instruction0::TempVariable and
296-
forex(Instruction0::Operand op | op = def.getARead() | isRemovedInstruction(op.getUse())) // TODO: Recursion through forex is bad for performance
308+
forex(Instruction0::Operand op | op = def.getARead() | isRemovedAddress(op.getUse())) // TODO: Recursion through forex is bad for performance
297309
)
298310
}
299311

312+
predicate isRemovedInstruction(Instruction0::Instruction instr) {
313+
exists(TTranslatedLoad(instr))
314+
or
315+
exists(TTranslatedStore(instr))
316+
or
317+
isRemovedAddress(instr)
318+
}
319+
300320
abstract class TranslatedElement extends TTranslatedElement {
301321
abstract EitherInstructionTranslatedElementTagPair getSuccessor(
302322
InstructionTag tag, SuccessorType succType

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,16 @@ module Transform<InstructionSig Input> {
724724
result = getNewInstruction(oldSucc)
725725
)
726726
or
727-
result = getInstructionSuccessor(old, succType)
727+
exists(Instruction i | i = getInstructionSuccessor(old, succType) |
728+
exists(Input::Instruction iOld | i = TOldInstruction(iOld) |
729+
if TransformInput::isRemovedInstruction(iOld)
730+
then result = TOldInstruction(getNonRemovedSuccessor(iOld, _))
731+
else result = i
732+
)
733+
or
734+
not i instanceof OldInstruction and
735+
result = i
736+
)
728737
}
729738

730739
override Location getLocation() { result = old.getLocation() }

0 commit comments

Comments
 (0)