Skip to content

Commit 03a907e

Browse files
committed
Binary: Translate 'CilStfld' to IR.
1 parent ecf00f9 commit 03a907e

4 files changed

Lines changed: 91 additions & 4 deletions

File tree

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ newtype TInstructionTag =
5656
CilStindStoreTag() or
5757
CilNewObjInitTag() or
5858
CilNewObjCallTag() or
59-
CilNewObjExternalRefTag()
59+
CilNewObjExternalRefTag() or
60+
CilStoreFieldAddressTag() or
61+
CilStoreFieldStoreTag()
6062

6163
class InstructionTag extends TInstructionTag {
6264
final string toString() {
@@ -208,6 +210,12 @@ class InstructionTag extends TInstructionTag {
208210
or
209211
this = CilNewObjExternalRefTag() and
210212
result = "CilNewObjExternalRef"
213+
or
214+
this = CilStoreFieldAddressTag() and
215+
result = "CilStoreFieldAddress"
216+
or
217+
this = CilStoreFieldStoreTag() and
218+
result = "CilStoreFieldStore"
211219
}
212220
}
213221

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ newtype TTempVariableTag =
3232
CilLdindVarTag() or
3333
CilNewObjInitVarTag() or
3434
CilNewObjCallExternalVarTag() or
35-
CilDupVarTag()
35+
CilDupVarTag() or
36+
CilStoreFieldAddressVarTag()
3637

3738
class TempVariableTag extends TTempVariableTag {
3839
string toString() {
@@ -137,5 +138,8 @@ class TempVariableTag extends TTempVariableTag {
137138
or
138139
this = CilDupVarTag() and
139140
result = "dup"
141+
or
142+
this = CilStoreFieldAddressVarTag() and
143+
result = "stfldaddr"
140144
}
141145
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ newtype TTranslatedElement =
134134
} or
135135
TTranslatedCilType(Raw::CilType type) { shouldTranslatedCilType(type) } or
136136
TTranslatedNewObject(Raw::CilNewobj newObj) { shouldTranslateCilInstr(newObj) } or
137-
TTranslatedDup(Raw::CilDup dup) { shouldTranslateCilInstr(dup) }
137+
TTranslatedDup(Raw::CilDup dup) { shouldTranslateCilInstr(dup) } or
138+
TTranslatedCilStoreField(Raw::CilStfld store) { shouldTranslateCilInstr(store) }
138139

139140
TranslatedElement getTranslatedElement(Raw::Element raw) {
140141
result.getRawElement() = raw and
@@ -219,6 +220,13 @@ abstract class TranslatedElement extends TTranslatedElement {
219220
*/
220221
string getExternalName(InstructionTag tag) { none() }
221222

223+
/**
224+
* Gets the name of the field referenced by an instruction with the given tag. This `tag` must refer to
225+
* a `FieldAddress` instruction (that is, an instruction for which
226+
* `hasInstruction(Opcode::FieldAddress, tag, _)` holds.)
227+
*/
228+
string getFieldName(InstructionTag tag) { none() }
229+
222230
/**
223231
* Gets the raw element that this translated element is a translation of.
224232
*

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

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2548,4 +2548,71 @@ class TranslatedDup extends TranslatedCilInstruction, TTranslatedDup {
25482548
i > 0 and
25492549
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(i - 1)
25502550
}
2551-
}
2551+
}
2552+
2553+
/**
2554+
* Translate a CIL stfld instruction to the following sequence:
2555+
* x = fieldaddress[field] obj
2556+
* store x value
2557+
*/
2558+
class TranslatedCilStoreField extends TranslatedCilInstruction, TTranslatedCilStoreField {
2559+
override Raw::CilStfld instr;
2560+
2561+
TranslatedCilStoreField() { this = TTranslatedCilStoreField(instr) }
2562+
2563+
final override predicate hasInstruction(
2564+
Opcode opcode, InstructionTag tag, Option<Variable>::Option v
2565+
) {
2566+
opcode instanceof Opcode::FieldAddress and
2567+
tag = CilStoreFieldAddressTag() and
2568+
v.asSome() = this.getTempVariable(CilStoreFieldAddressVarTag())
2569+
or
2570+
opcode instanceof Opcode::Store and
2571+
tag = CilStoreFieldStoreTag() and
2572+
v.isNone()
2573+
}
2574+
2575+
override predicate hasTempVariable(TempVariableTag tag) { tag = CilStoreFieldAddressVarTag() }
2576+
2577+
override predicate producesResult() { any() }
2578+
2579+
override Variable getVariableOperand(InstructionTag tag, OperandTag operandTag) {
2580+
tag = CilStoreFieldAddressTag() and
2581+
operandTag instanceof UnaryTag and
2582+
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(1)
2583+
or
2584+
tag = CilStoreFieldStoreTag() and
2585+
(
2586+
operandTag instanceof StoreAddressTag and
2587+
result = this.getInstruction(CilStoreFieldAddressTag()).getResultVariable()
2588+
or
2589+
operandTag instanceof StoreValueTag and
2590+
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(0)
2591+
)
2592+
}
2593+
2594+
final override string getFieldName(InstructionTag tag) {
2595+
tag = CilStoreFieldAddressTag() and
2596+
result = instr.getField().getName()
2597+
}
2598+
2599+
override Instruction getChildSuccessor(TranslatedElement child, SuccessorType succType) { none() }
2600+
2601+
override Instruction getSuccessor(InstructionTag tag, SuccessorType succType) {
2602+
tag = CilStoreFieldAddressTag() and
2603+
succType instanceof DirectSuccessor and
2604+
result = this.getInstruction(CilStoreFieldStoreTag())
2605+
or
2606+
tag = CilStoreFieldStoreTag() and
2607+
succType instanceof DirectSuccessor and
2608+
result = getTranslatedInstruction(instr.getASuccessor()).getEntry()
2609+
}
2610+
2611+
override Instruction getEntry() { result = this.getInstruction(CilStoreFieldAddressTag()) }
2612+
2613+
override Variable getResultVariable() { none() }
2614+
2615+
final override Variable getStackElement(int i) {
2616+
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(i + 2)
2617+
}
2618+
}

0 commit comments

Comments
 (0)