Skip to content

Commit 4fb20e1

Browse files
committed
C++: Add an 'EdgeKind' column to 'getChildTrueSuccessor' and 'getChildFalseSuccessor'.
1 parent 10ae793 commit 4fb20e1

File tree

3 files changed

+50
-40
lines changed

3 files changed

+50
-40
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,17 @@ private import TranslatedElement
77
private import TranslatedExpr
88

99
abstract class ConditionContext extends TranslatedElement {
10-
abstract Instruction getChildTrueSuccessor(TranslatedCondition child);
11-
12-
abstract Instruction getChildFalseSuccessor(TranslatedCondition child);
10+
/**
11+
* Gets the instruction to be executed when `child` evaluates to `true`. The
12+
* successor edge kind is specified by `kind`.
13+
*/
14+
abstract Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind);
15+
16+
/**
17+
* Gets the instruction to be executed when `child` evaluates to `false`. The
18+
* successor edge kind is specified by `kind`.
19+
*/
20+
abstract Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind);
1321
}
1422

1523
TranslatedCondition getTranslatedCondition(Expr expr) { result.getExpr() = expr }
@@ -62,14 +70,14 @@ abstract class TranslatedFlexibleCondition extends TranslatedCondition, Conditio
6270
class TranslatedParenthesisCondition extends TranslatedFlexibleCondition {
6371
override ParenthesisExpr expr;
6472

65-
final override Instruction getChildTrueSuccessor(TranslatedCondition child) {
73+
final override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
6674
child = this.getOperand() and
67-
result = this.getConditionContext().getChildTrueSuccessor(this)
75+
result = this.getConditionContext().getChildTrueSuccessor(this, kind)
6876
}
6977

70-
final override Instruction getChildFalseSuccessor(TranslatedCondition child) {
78+
final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
7179
child = this.getOperand() and
72-
result = this.getConditionContext().getChildFalseSuccessor(this)
80+
result = this.getConditionContext().getChildFalseSuccessor(this, kind)
7381
}
7482

7583
final override TranslatedCondition getOperand() {
@@ -114,34 +122,34 @@ abstract class TranslatedBinaryLogicalOperation extends TranslatedNativeConditio
114122
class TranslatedLogicalAndExpr extends TranslatedBinaryLogicalOperation {
115123
TranslatedLogicalAndExpr() { expr instanceof LogicalAndExpr }
116124

117-
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
125+
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
118126
child = this.getLeftOperand() and
119-
result = this.getRightOperand().getFirstInstruction(any(GotoEdge edge))
127+
result = this.getRightOperand().getFirstInstruction(kind)
120128
or
121129
child = this.getRightOperand() and
122-
result = this.getConditionContext().getChildTrueSuccessor(this)
130+
result = this.getConditionContext().getChildTrueSuccessor(this, kind)
123131
}
124132

125-
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
133+
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
126134
(child = this.getLeftOperand() or child = this.getRightOperand()) and
127-
result = this.getConditionContext().getChildFalseSuccessor(this)
135+
result = this.getConditionContext().getChildFalseSuccessor(this, kind)
128136
}
129137
}
130138

131139
class TranslatedLogicalOrExpr extends TranslatedBinaryLogicalOperation {
132140
override LogicalOrExpr expr;
133141

134-
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
142+
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
135143
(child = this.getLeftOperand() or child = this.getRightOperand()) and
136-
result = this.getConditionContext().getChildTrueSuccessor(this)
144+
result = this.getConditionContext().getChildTrueSuccessor(this, kind)
137145
}
138146

139-
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
147+
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
140148
child = this.getLeftOperand() and
141-
result = this.getRightOperand().getFirstInstruction(any(GotoEdge edge))
149+
result = this.getRightOperand().getFirstInstruction(kind)
142150
or
143151
child = this.getRightOperand() and
144-
result = this.getConditionContext().getChildFalseSuccessor(this)
152+
result = this.getConditionContext().getChildFalseSuccessor(this, kind)
145153
}
146154
}
147155

@@ -170,10 +178,10 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond
170178
tag = ValueConditionConditionalBranchTag() and
171179
(
172180
kind instanceof TrueEdge and
173-
result = this.getConditionContext().getChildTrueSuccessor(this)
181+
result = this.getConditionContext().getChildTrueSuccessor(this, any(GotoEdge edge))
174182
or
175183
kind instanceof FalseEdge and
176-
result = this.getConditionContext().getChildFalseSuccessor(this)
184+
result = this.getConditionContext().getChildFalseSuccessor(this, any(GotoEdge edge))
177185
)
178186
}
179187

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -291,14 +291,16 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext,
291291

292292
override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { none() }
293293

294-
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
294+
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
295295
child = this.getCondition() and
296-
result = this.getInstruction(ConditionValueTrueTempAddressTag())
296+
result = this.getInstruction(ConditionValueTrueTempAddressTag()) and
297+
kind instanceof GotoEdge
297298
}
298299

299-
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
300+
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
300301
child = this.getCondition() and
301-
result = this.getInstruction(ConditionValueFalseTempAddressTag())
302+
result = this.getInstruction(ConditionValueFalseTempAddressTag()) and
303+
kind instanceof GotoEdge
302304
}
303305

304306
private TranslatedCondition getCondition() { result = getTranslatedCondition(expr) }
@@ -2421,14 +2423,14 @@ class TranslatedTernaryConditionalExpr extends TranslatedConditionalExpr, Condit
24212423
)
24222424
}
24232425

2424-
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
2426+
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
24252427
child = this.getCondition() and
2426-
result = this.getThen().getFirstInstruction(any(GotoEdge edge))
2428+
result = this.getThen().getFirstInstruction(kind)
24272429
}
24282430

2429-
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
2431+
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
24302432
child = this.getCondition() and
2431-
result = this.getElse().getFirstInstruction(any(GotoEdge edge))
2433+
result = this.getElse().getFirstInstruction(kind)
24322434
}
24332435

24342436
private TranslatedCondition getCondition() {

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -750,16 +750,16 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
750750

751751
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
752752

753-
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
753+
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
754754
child = this.getCondition() and
755-
result = this.getThen().getFirstInstruction(any(GotoEdge edge))
755+
result = this.getThen().getFirstInstruction(kind)
756756
}
757757

758-
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
758+
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
759759
child = this.getCondition() and
760760
if this.hasElse()
761-
then result = this.getElse().getFirstInstruction(any(GotoEdge edge))
762-
else result = this.getParent().getChildSuccessor(this, any(GotoEdge edge))
761+
then result = this.getElse().getFirstInstruction(kind)
762+
else result = this.getParent().getChildSuccessor(this, kind)
763763
}
764764

765765
override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) {
@@ -804,13 +804,13 @@ abstract class TranslatedLoop extends TranslatedStmt, ConditionContext {
804804

805805
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
806806

807-
final override Instruction getChildTrueSuccessor(TranslatedCondition child) {
808-
child = this.getCondition() and result = this.getBody().getFirstInstruction(any(GotoEdge edge))
807+
final override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
808+
child = this.getCondition() and result = this.getBody().getFirstInstruction(kind)
809809
}
810810

811-
final override Instruction getChildFalseSuccessor(TranslatedCondition child) {
811+
final override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
812812
child = this.getCondition() and
813-
result = this.getParent().getChildSuccessor(this, any(GotoEdge edge))
813+
result = this.getParent().getChildSuccessor(this, kind)
814814
}
815815
}
816816

@@ -936,14 +936,14 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext {
936936

937937
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
938938

939-
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
939+
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
940940
child = this.getCondition() and
941-
result = this.getVariableDeclStmt().getFirstInstruction(any(GotoEdge edge))
941+
result = this.getVariableDeclStmt().getFirstInstruction(kind)
942942
}
943943

944-
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
944+
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
945945
child = this.getCondition() and
946-
result = this.getParent().getChildSuccessor(this, any(GotoEdge edge))
946+
result = this.getParent().getChildSuccessor(this, kind)
947947
}
948948

949949
private TranslatedDeclStmt getRangeVariableDeclStmt() {

0 commit comments

Comments
 (0)