Skip to content

Commit 24667c0

Browse files
committed
CIL: Support strings.
1 parent 7ff2c54 commit 24667c0

7 files changed

Lines changed: 74 additions & 7 deletions

File tree

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,7 @@ abstract class CilCall extends CilInstruction {
275275

276276
final predicate hasReturnValue() { il_call_has_return_value(this) }
277277

278-
string getExternalName() {
279-
il_call_target_unresolved(this, result)
280-
}
278+
string getExternalName() { il_call_target_unresolved(this, result) }
281279
}
282280

283281
class CilIl_jmp extends @il_il_jmp, CilCall { }
@@ -487,7 +485,9 @@ class CilCpobj extends @il_cpobj, CilInstruction { }
487485

488486
class CilLdobj extends @il_ldobj, CilInstruction { }
489487

490-
class CilLdstr extends @il_ldstr, CilInstruction { }
488+
class CilLdstr extends @il_ldstr, CilInstruction {
489+
string getValue() { il_operand_string(this, result) }
490+
}
491491

492492
class CilNewobj extends @il_newobj, CilInstruction { }
493493

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,13 @@ class ConstInstruction extends Instruction {
100100

101101
int getValue() { result = te.getConstantValue(tag) }
102102

103-
override string getImmediateValue() { result = this.getValue().toString() }
103+
string getStringValue() { result = te.getStringConstant(tag) }
104+
105+
override string getImmediateValue() {
106+
result = this.getValue().toString()
107+
or
108+
result = this.getStringValue()
109+
}
104110
}
105111

106112
class CJumpInstruction extends Instruction {

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
@@ -30,7 +30,8 @@ newtype TTempVariableTag =
3030
CilBoolBranchRefVarTag() or
3131
CilUnconditionalBranchRefVarTag() or
3232
CallReturnValueTag() or
33-
CilCallTargetVarTag()
33+
CilCallTargetVarTag() or
34+
CilLoadStringVarTag()
3435

3536
class TempVariableTag extends TTempVariableTag {
3637
string toString() {
@@ -129,5 +130,8 @@ class TempVariableTag extends TTempVariableTag {
129130
or
130131
this = CilCallTargetVarTag() and
131132
result = "call_target"
133+
or
134+
this = CilLoadStringVarTag() and
135+
result = "ldstr"
132136
}
133137
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ newtype TTranslatedElement =
9090
shouldTranslateCilInstr(cbr)
9191
} or
9292
TTranslatedCilRet(Raw::CilIl_ret ret) { shouldTranslateCilInstr(ret) } or
93-
TTranslatedCilCall(Raw::CilCall call) { shouldTranslateCilInstr(call) }
93+
TTranslatedCilCall(Raw::CilCall call) { shouldTranslateCilInstr(call) } or
94+
TTranslatedCilLoadString(Raw::CilLdstr ldstr) { shouldTranslateCilInstr(ldstr) }
9495

9596
TranslatedElement getTranslatedElement(Raw::Element raw) {
9697
result.getRawElement() = raw and
@@ -126,6 +127,8 @@ abstract class TranslatedElement extends TTranslatedElement {
126127

127128
int getConstantValue(InstructionTag tag) { none() }
128129

130+
string getStringConstant(InstructionTag tag) { none() }
131+
129132
string getExternalName(InstructionTag tag) { none() }
130133

131134
Instruction getReferencedInstruction(InstructionTag tag) { none() }

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2283,3 +2283,48 @@ class TranslatedCilCall extends TranslatedCilInstruction, TTranslatedCilCall {
22832283
.getStackElement(i + instr.getNumberOfArguments())
22842284
}
22852285
}
2286+
2287+
class TranslatedCilLoadString extends TranslatedCilInstruction, TTranslatedCilLoadString {
2288+
override Raw::CilLdstr instr;
2289+
2290+
TranslatedCilLoadString() { this = TTranslatedCilLoadString(instr) }
2291+
2292+
final override predicate hasInstruction(
2293+
Opcode opcode, InstructionTag tag, Option<Variable>::Option v
2294+
) {
2295+
opcode instanceof Opcode::Const and
2296+
tag = SingleTag() and
2297+
v.asSome() = this.getVariable(CilLoadStringVarTag())
2298+
}
2299+
2300+
override predicate hasTempVariable(TempVariableTag tag) { tag = CilLoadStringVarTag() }
2301+
2302+
override predicate producesResult() { any() }
2303+
2304+
override Variable getVariableOperand(InstructionTag tag, OperandTag operandTag) { none() }
2305+
2306+
override string getStringConstant(InstructionTag tag) {
2307+
tag = SingleTag() and
2308+
result = instr.getValue()
2309+
}
2310+
2311+
override Instruction getChildSuccessor(TranslatedElement child, SuccessorType succType) { none() }
2312+
2313+
override Instruction getSuccessor(InstructionTag tag, SuccessorType succType) {
2314+
tag = SingleTag() and
2315+
succType instanceof DirectSuccessor and
2316+
result = getTranslatedInstruction(instr.getASuccessor()).getEntry()
2317+
}
2318+
2319+
override Instruction getEntry() { result = this.getInstruction(SingleTag()) }
2320+
2321+
override Variable getResultVariable() { result = this.getVariable(CilLoadStringVarTag()) }
2322+
2323+
final override Variable getStackElement(int i) {
2324+
i = 0 and
2325+
result = this.getInstruction(SingleTag()).getResultVariable()
2326+
or
2327+
i > 0 and
2328+
result = getTranslatedCilInstruction(instr.getABackwardPredecessor()).getStackElement(i - 1)
2329+
}
2330+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ signature module InstructionSig {
236236

237237
class ConstInstruction extends Instruction {
238238
int getValue();
239+
240+
string getStringValue();
239241
}
240242

241243
class ControlFlowNode {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,13 @@ module Transform<InstructionSig Input> {
691691
)
692692
}
693693

694+
string getStringValue() {
695+
exists(Input::ConstInstruction const |
696+
this = TOldInstruction(const) and
697+
result = const.getStringValue()
698+
)
699+
}
700+
694701
override string getImmediateValue() { result = this.getValue().toString() }
695702
}
696703

0 commit comments

Comments
 (0)