Skip to content

Commit d2bb73b

Browse files
committed
C++: Use the index to to get the 'most converted' and 'least converted' instruction in a bunch of places.
1 parent 4dfaf92 commit d2bb73b

File tree

12 files changed

+187
-136
lines changed

12 files changed

+187
-136
lines changed

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll

Lines changed: 105 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,23 @@ class Node extends TIRDataFlowNode {
193193
* a `Conversion`, then the result is the underlying non-`Conversion` base
194194
* expression.
195195
*/
196-
Expr asExpr() { result = this.(ExprNode).getExpr() }
196+
Expr asExpr() { result = this.asExpr(_) }
197+
198+
/**
199+
* INTERNAL: Do not use.
200+
*/
201+
Expr asExpr(int n) { result = this.(ExprNode).getExpr(n) }
202+
203+
/**
204+
* INTERNAL: Do not use.
205+
*/
206+
Expr asIndirectExpr(int n, int index) { result = this.(IndirectExprNode).getExpr(n, index) }
197207

198208
/**
199209
* Gets the non-conversion expression that's indirectly tracked by this node
200210
* under `index` number of indirections.
201211
*/
202-
Expr asIndirectExpr(int index) { result = this.(IndirectExprNode).getExpr(index) }
212+
Expr asIndirectExpr(int index) { result = this.asIndirectExpr(_, index) }
203213

204214
/**
205215
* Gets the non-conversion expression that's indirectly tracked by this node
@@ -211,15 +221,26 @@ class Node extends TIRDataFlowNode {
211221
* Gets the expression corresponding to this node, if any. The returned
212222
* expression may be a `Conversion`.
213223
*/
214-
Expr asConvertedExpr() { result = this.(ExprNode).getConvertedExpr() }
224+
Expr asConvertedExpr() { result = this.asConvertedExpr(_) }
225+
226+
/**
227+
* Gets the expression corresponding to this node, if any. The returned
228+
* expression may be a `Conversion`.
229+
*/
230+
Expr asConvertedExpr(int n) { result = this.(ExprNode).getConvertedExpr(n) }
231+
232+
/**
233+
* INTERNAL: Do not use.
234+
*/
235+
Expr asIndirectConvertedExpr(int n, int index) {
236+
result = this.(IndirectExprNode).getConvertedExpr(n, index)
237+
}
215238

216239
/**
217240
* Gets the expression that's indirectly tracked by this node
218241
* behind `index` number of indirections.
219242
*/
220-
Expr asIndirectConvertedExpr(int index) {
221-
result = this.(IndirectExprNode).getConvertedExpr(index)
222-
}
243+
Expr asIndirectConvertedExpr(int index) { result = this.asIndirectConvertedExpr(_, index) }
223244

224245
/**
225246
* Gets the expression that's indirectly tracked by this node behind a
@@ -1090,46 +1111,46 @@ private module GetConvertedResultExpression {
10901111
private import GetConvertedResultExpression
10911112

10921113
/** Holds if `node` is an `OperandNode` that should map `node.asExpr()` to `e`. */
1093-
predicate exprNodeShouldBeOperand(OperandNode node, Expr e) {
1114+
predicate exprNodeShouldBeOperand(OperandNode node, Expr e, int n) {
10941115
exists(Instruction def |
10951116
unique( | | getAUse(def)) = node.getOperand() and
1096-
e = getConvertedResultExpression(def)
1117+
e = getConvertedResultExpression(def, n)
10971118
)
10981119
}
10991120

11001121
/** Holds if `node` should be an `IndirectOperand` that maps `node.asIndirectExpr()` to `e`. */
11011122
private predicate indirectExprNodeShouldBeIndirectOperand(
1102-
IndirectOperand node, Expr e, int indirectionIndex
1123+
IndirectOperand node, Expr e, int n, int indirectionIndex
11031124
) {
11041125
exists(Instruction def |
11051126
node.hasOperandAndIndirectionIndex(unique( | | getAUse(def)), indirectionIndex) and
1106-
e = getConvertedResultExpression(def)
1127+
e = getConvertedResultExpression(def, n)
11071128
)
11081129
}
11091130

1110-
private predicate exprNodeShouldBeIndirectOutNode(IndirectArgumentOutNode node, Expr e) {
1131+
private predicate exprNodeShouldBeIndirectOutNode(IndirectArgumentOutNode node, Expr e, int n) {
11111132
exists(CallInstruction call |
11121133
call.getStaticCallTarget() instanceof Constructor and
1113-
e = getConvertedResultExpression(call) and
1134+
e = getConvertedResultExpression(call, n) and
11141135
call.getThisArgumentOperand() = node.getAddressOperand()
11151136
)
11161137
}
11171138

11181139
/** Holds if `node` should be an instruction node that maps `node.asExpr()` to `e`. */
1119-
predicate exprNodeShouldBeInstruction(Node node, Expr e) {
1120-
not exprNodeShouldBeOperand(_, e) and
1121-
not exprNodeShouldBeIndirectOutNode(_, e) and
1122-
e = getConvertedResultExpression(node.asInstruction())
1140+
predicate exprNodeShouldBeInstruction(Node node, Expr e, int n) {
1141+
not exprNodeShouldBeOperand(_, e, n) and
1142+
not exprNodeShouldBeIndirectOutNode(_, e, n) and
1143+
e = getConvertedResultExpression(node.asInstruction(), n)
11231144
}
11241145

11251146
/** Holds if `node` should be an `IndirectInstruction` that maps `node.asIndirectExpr()` to `e`. */
11261147
predicate indirectExprNodeShouldBeIndirectInstruction(
1127-
IndirectInstruction node, Expr e, int indirectionIndex
1148+
IndirectInstruction node, Expr e, int n, int indirectionIndex
11281149
) {
1129-
not indirectExprNodeShouldBeIndirectOperand(_, e, indirectionIndex) and
1150+
not indirectExprNodeShouldBeIndirectOperand(_, e, n, indirectionIndex) and
11301151
exists(Instruction instr |
11311152
node.hasInstructionAndIndirectionIndex(instr, indirectionIndex) and
1132-
e = getConvertedResultExpression(instr)
1153+
e = getConvertedResultExpression(instr, n)
11331154
)
11341155
}
11351156

@@ -1138,78 +1159,108 @@ abstract private class ExprNodeBase extends Node {
11381159
* Gets the expression corresponding to this node, if any. The returned
11391160
* expression may be a `Conversion`.
11401161
*/
1141-
abstract Expr getConvertedExpr();
1162+
abstract Expr getConvertedExpr(int n);
11421163

11431164
/** Gets the non-conversion expression corresponding to this node, if any. */
1144-
final Expr getExpr() { result = this.getConvertedExpr().getUnconverted() }
1165+
final Expr getExpr(int n) { result = this.getConvertedExpr(n).getUnconverted() }
11451166
}
11461167

11471168
private class InstructionExprNode extends ExprNodeBase, InstructionNode {
1148-
InstructionExprNode() { exprNodeShouldBeInstruction(this, _) }
1169+
InstructionExprNode() {
1170+
exists(Expr e, int n |
1171+
exprNodeShouldBeInstruction(this, e, n) and
1172+
not exprNodeShouldBeInstruction(_, e, n + 1)
1173+
)
1174+
}
11491175

1150-
final override Expr getConvertedExpr() { exprNodeShouldBeInstruction(this, result) }
1176+
final override Expr getConvertedExpr(int n) { exprNodeShouldBeInstruction(this, result, n) }
11511177
}
11521178

11531179
private class OperandExprNode extends ExprNodeBase, OperandNode {
1154-
OperandExprNode() { exprNodeShouldBeOperand(this, _) }
1180+
OperandExprNode() {
1181+
exists(Expr e, int n |
1182+
exprNodeShouldBeOperand(this, e, n) and
1183+
not exprNodeShouldBeOperand(_, e, n + 1)
1184+
)
1185+
}
11551186

1156-
final override Expr getConvertedExpr() { exprNodeShouldBeOperand(this, result) }
1187+
final override Expr getConvertedExpr(int n) { exprNodeShouldBeOperand(this, result, n) }
11571188
}
11581189

11591190
abstract private class IndirectExprNodeBase extends Node {
11601191
/**
11611192
* Gets the expression corresponding to this node, if any. The returned
11621193
* expression may be a `Conversion`.
11631194
*/
1164-
abstract Expr getConvertedExpr(int indirectionIndex);
1195+
abstract Expr getConvertedExpr(int n, int indirectionIndex);
11651196

11661197
/** Gets the non-conversion expression corresponding to this node, if any. */
1167-
final Expr getExpr(int indirectionIndex) {
1168-
result = this.getConvertedExpr(indirectionIndex).getUnconverted()
1198+
final Expr getExpr(int n, int indirectionIndex) {
1199+
result = this.getConvertedExpr(n, indirectionIndex).getUnconverted()
11691200
}
11701201
}
11711202

11721203
private class IndirectOperandIndirectExprNode extends IndirectExprNodeBase instanceof IndirectOperand
11731204
{
1174-
IndirectOperandIndirectExprNode() { indirectExprNodeShouldBeIndirectOperand(this, _, _) }
1205+
IndirectOperandIndirectExprNode() {
1206+
exists(Expr e, int n, int indirectionIndex |
1207+
indirectExprNodeShouldBeIndirectOperand(this, e, n, indirectionIndex) and
1208+
not indirectExprNodeShouldBeIndirectOperand(_, e, n + 1, indirectionIndex)
1209+
)
1210+
}
11751211

1176-
final override Expr getConvertedExpr(int index) {
1177-
indirectExprNodeShouldBeIndirectOperand(this, result, index)
1212+
final override Expr getConvertedExpr(int n, int index) {
1213+
indirectExprNodeShouldBeIndirectOperand(this, result, n, index)
11781214
}
11791215
}
11801216

11811217
private class IndirectInstructionIndirectExprNode extends IndirectExprNodeBase instanceof IndirectInstruction
11821218
{
1183-
IndirectInstructionIndirectExprNode() { indirectExprNodeShouldBeIndirectInstruction(this, _, _) }
1219+
IndirectInstructionIndirectExprNode() {
1220+
exists(Expr e, int n, int indirectionIndex |
1221+
indirectExprNodeShouldBeIndirectInstruction(this, e, n, indirectionIndex) and
1222+
not indirectExprNodeShouldBeIndirectInstruction(_, e, n + 1, indirectionIndex)
1223+
)
1224+
}
11841225

1185-
final override Expr getConvertedExpr(int index) {
1186-
indirectExprNodeShouldBeIndirectInstruction(this, result, index)
1226+
final override Expr getConvertedExpr(int n, int index) {
1227+
indirectExprNodeShouldBeIndirectInstruction(this, result, n, index)
11871228
}
11881229
}
11891230

11901231
private class IndirectArgumentOutExprNode extends ExprNodeBase, IndirectArgumentOutNode {
1191-
IndirectArgumentOutExprNode() { exprNodeShouldBeIndirectOutNode(this, _) }
1232+
IndirectArgumentOutExprNode() { exprNodeShouldBeIndirectOutNode(this, _, _) }
11921233

1193-
final override Expr getConvertedExpr() { exprNodeShouldBeIndirectOutNode(this, result) }
1234+
final override Expr getConvertedExpr(int n) { exprNodeShouldBeIndirectOutNode(this, result, n) }
11941235
}
11951236

11961237
/**
11971238
* An expression, viewed as a node in a data flow graph.
11981239
*/
11991240
class ExprNode extends Node instanceof ExprNodeBase {
1241+
/**
1242+
* INTERNAL: Do not use.
1243+
*/
1244+
Expr getExpr(int n) { result = super.getExpr(n) }
1245+
12001246
/**
12011247
* Gets the non-conversion expression corresponding to this node, if any. If
12021248
* this node strictly (in the sense of `getConvertedExpr`) corresponds to a
12031249
* `Conversion`, then the result is that `Conversion`'s non-`Conversion` base
12041250
* expression.
12051251
*/
1206-
Expr getExpr() { result = super.getExpr() }
1252+
final Expr getExpr() { result = this.getExpr(_) }
1253+
1254+
/**
1255+
* INTERNAL: Do not use.
1256+
*/
1257+
Expr getConvertedExpr(int n) { result = super.getConvertedExpr(n) }
12071258

12081259
/**
12091260
* Gets the expression corresponding to this node, if any. The returned
12101261
* expression may be a `Conversion`.
12111262
*/
1212-
Expr getConvertedExpr() { result = super.getConvertedExpr() }
1263+
final Expr getConvertedExpr() { result = this.getConvertedExpr(_) }
12131264
}
12141265

12151266
/**
@@ -1222,13 +1273,27 @@ class IndirectExprNode extends Node instanceof IndirectExprNodeBase {
12221273
* `Conversion`, then the result is that `Conversion`'s non-`Conversion` base
12231274
* expression.
12241275
*/
1225-
Expr getExpr(int indirectionIndex) { result = super.getExpr(indirectionIndex) }
1276+
final Expr getExpr(int indirectionIndex) { result = this.getExpr(_, indirectionIndex) }
1277+
1278+
/**
1279+
* INTERNAL: Do not use.
1280+
*/
1281+
Expr getExpr(int n, int indirectionIndex) { result = super.getExpr(n, indirectionIndex) }
1282+
1283+
/**
1284+
* INTERNAL: Do not use.
1285+
*/
1286+
Expr getConvertedExpr(int n, int indirectionIndex) {
1287+
result = super.getConvertedExpr(n, indirectionIndex)
1288+
}
12261289

12271290
/**
12281291
* Gets the expression corresponding to this node, if any. The returned
12291292
* expression may be a `Conversion`.
12301293
*/
1231-
Expr getConvertedExpr(int indirectionIndex) { result = super.getConvertedExpr(indirectionIndex) }
1294+
Expr getConvertedExpr(int indirectionIndex) {
1295+
result = this.getConvertedExpr(_, indirectionIndex)
1296+
}
12321297
}
12331298

12341299
/**

cpp/ql/test/library-tests/dataflow/fields/dataflow-ir-consistency.expected

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,6 @@ uniqueNodeToString
5757
| aliasing.cpp:132:9:132:14 | & ... | Node should have one toString but has 3. |
5858
| aliasing.cpp:132:9:132:14 | * ... | Node should have one toString but has 3. |
5959
| aliasing.cpp:132:9:132:14 | xs | Node should have one toString but has 3. |
60-
| aliasing.cpp:132:10:132:14 | & ... | Node should have one toString but has 3. |
61-
| aliasing.cpp:132:10:132:14 | & ... indirection | Node should have one toString but has 3. |
62-
| aliasing.cpp:132:10:132:14 | * ... | Node should have one toString but has 3. |
63-
| aliasing.cpp:132:10:132:14 | * ... indirection | Node should have one toString but has 3. |
64-
| aliasing.cpp:132:10:132:14 | xs | Node should have one toString but has 3. |
65-
| aliasing.cpp:132:10:132:14 | xs indirection | Node should have one toString but has 3. |
66-
| aliasing.cpp:132:11:132:14 | * ... | Node should have one toString but has 2. |
67-
| aliasing.cpp:132:11:132:14 | * ... indirection | Node should have one toString but has 2. |
68-
| aliasing.cpp:132:11:132:14 | xs | Node should have one toString but has 2. |
69-
| aliasing.cpp:132:11:132:14 | xs indirection | Node should have one toString but has 2. |
7060
| aliasing.cpp:136:15:136:17 | + ... | Node should have one toString but has 2. |
7161
| aliasing.cpp:136:15:136:17 | + ... indirection | Node should have one toString but has 2. |
7262
| aliasing.cpp:136:15:136:17 | xs | Node should have one toString but has 2. |

cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ edges
1313
| A.cpp:41:5:41:6 | insert output argument | A.cpp:43:10:43:12 | & ... indirection |
1414
| A.cpp:41:5:41:6 | insert output argument | A.cpp:43:10:43:12 | ct indirection |
1515
| A.cpp:41:15:41:21 | new | A.cpp:41:5:41:6 | insert output argument |
16+
| A.cpp:41:15:41:21 | new | A.cpp:41:5:41:6 | insert output argument |
17+
| A.cpp:41:15:41:21 | new | A.cpp:41:15:41:21 | new |
1618
| A.cpp:47:12:47:18 | new | A.cpp:48:20:48:20 | c |
1719
| A.cpp:48:12:48:18 | call to make indirection [c] | A.cpp:49:10:49:10 | b indirection [c] |
1820
| A.cpp:48:20:48:20 | c | A.cpp:29:23:29:23 | c |
@@ -21,6 +23,7 @@ edges
2123
| A.cpp:55:5:55:5 | set output argument [c] | A.cpp:56:10:56:10 | b indirection [c] |
2224
| A.cpp:55:12:55:19 | new | A.cpp:27:17:27:17 | c |
2325
| A.cpp:55:12:55:19 | new | A.cpp:55:5:55:5 | set output argument [c] |
26+
| A.cpp:55:12:55:19 | new | A.cpp:55:12:55:19 | new |
2427
| A.cpp:56:10:56:10 | b indirection [c] | A.cpp:28:8:28:10 | this indirection [c] |
2528
| A.cpp:56:10:56:10 | b indirection [c] | A.cpp:56:10:56:17 | call to get |
2629
| A.cpp:57:11:57:24 | call to B [c] | A.cpp:57:11:57:24 | new indirection [c] |
@@ -31,10 +34,12 @@ edges
3134
| A.cpp:57:17:57:23 | new | A.cpp:57:17:57:23 | new |
3235
| A.cpp:64:10:64:15 | call to setOnB indirection [c] | A.cpp:66:10:66:11 | b2 indirection [c] |
3336
| A.cpp:64:21:64:28 | new | A.cpp:64:10:64:15 | call to setOnB indirection [c] |
37+
| A.cpp:64:21:64:28 | new | A.cpp:64:21:64:28 | new |
3438
| A.cpp:64:21:64:28 | new | A.cpp:85:26:85:26 | c |
3539
| A.cpp:66:10:66:11 | b2 indirection [c] | A.cpp:66:10:66:14 | c |
3640
| A.cpp:73:10:73:19 | call to setOnBWrap indirection [c] | A.cpp:75:10:75:11 | b2 indirection [c] |
3741
| A.cpp:73:25:73:32 | new | A.cpp:73:10:73:19 | call to setOnBWrap indirection [c] |
42+
| A.cpp:73:25:73:32 | new | A.cpp:73:25:73:32 | new |
3843
| A.cpp:73:25:73:32 | new | A.cpp:78:27:78:27 | c |
3944
| A.cpp:75:10:75:11 | b2 indirection [c] | A.cpp:75:10:75:14 | c |
4045
| A.cpp:78:27:78:27 | c | A.cpp:81:21:81:21 | c |
@@ -853,6 +858,7 @@ nodes
853858
| A.cpp:31:20:31:20 | c | semmle.label | c |
854859
| A.cpp:41:5:41:6 | insert output argument | semmle.label | insert output argument |
855860
| A.cpp:41:15:41:21 | new | semmle.label | new |
861+
| A.cpp:41:15:41:21 | new | semmle.label | new |
856862
| A.cpp:43:10:43:12 | & ... indirection | semmle.label | & ... indirection |
857863
| A.cpp:43:10:43:12 | & ... indirection | semmle.label | ct indirection |
858864
| A.cpp:43:10:43:12 | ct indirection | semmle.label | & ... indirection |
@@ -864,6 +870,7 @@ nodes
864870
| A.cpp:49:10:49:13 | c | semmle.label | c |
865871
| A.cpp:55:5:55:5 | set output argument [c] | semmle.label | set output argument [c] |
866872
| A.cpp:55:12:55:19 | new | semmle.label | new |
873+
| A.cpp:55:12:55:19 | new | semmle.label | new |
867874
| A.cpp:56:10:56:10 | b indirection [c] | semmle.label | b indirection [c] |
868875
| A.cpp:56:10:56:17 | call to get | semmle.label | call to get |
869876
| A.cpp:57:10:57:32 | call to get | semmle.label | call to get |
@@ -873,10 +880,12 @@ nodes
873880
| A.cpp:57:17:57:23 | new | semmle.label | new |
874881
| A.cpp:64:10:64:15 | call to setOnB indirection [c] | semmle.label | call to setOnB indirection [c] |
875882
| A.cpp:64:21:64:28 | new | semmle.label | new |
883+
| A.cpp:64:21:64:28 | new | semmle.label | new |
876884
| A.cpp:66:10:66:11 | b2 indirection [c] | semmle.label | b2 indirection [c] |
877885
| A.cpp:66:10:66:14 | c | semmle.label | c |
878886
| A.cpp:73:10:73:19 | call to setOnBWrap indirection [c] | semmle.label | call to setOnBWrap indirection [c] |
879887
| A.cpp:73:25:73:32 | new | semmle.label | new |
888+
| A.cpp:73:25:73:32 | new | semmle.label | new |
880889
| A.cpp:75:10:75:11 | b2 indirection [c] | semmle.label | b2 indirection [c] |
881890
| A.cpp:75:10:75:14 | c | semmle.label | c |
882891
| A.cpp:78:6:78:15 | setOnBWrap indirection [c] | semmle.label | setOnBWrap indirection [c] |
@@ -1788,17 +1797,28 @@ subpaths
17881797
| simple.cpp:84:14:84:20 | this indirection [f2, f1] | simple.cpp:78:9:78:15 | this indirection [f2, f1] | simple.cpp:78:9:78:15 | getf2f1 indirection | simple.cpp:84:14:84:20 | call to getf2f1 |
17891798
#select
17901799
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1800+
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17911801
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1802+
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1803+
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17921804
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17931805
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1806+
| A.cpp:43:10:43:12 | & ... indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1807+
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17941808
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17951809
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1810+
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | & ... indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1811+
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17961812
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | & ... indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17971813
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
1814+
| A.cpp:43:10:43:12 | ct indirection | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | ct indirection | ct indirection flows from $@ | A.cpp:41:15:41:21 | new | new |
17981815
| A.cpp:49:10:49:13 | c | A.cpp:47:12:47:18 | new | A.cpp:49:10:49:13 | c | c flows from $@ | A.cpp:47:12:47:18 | new | new |
17991816
| A.cpp:56:10:56:17 | call to get | A.cpp:55:12:55:19 | new | A.cpp:56:10:56:17 | call to get | call to get flows from $@ | A.cpp:55:12:55:19 | new | new |
1817+
| A.cpp:56:10:56:17 | call to get | A.cpp:55:12:55:19 | new | A.cpp:56:10:56:17 | call to get | call to get flows from $@ | A.cpp:55:12:55:19 | new | new |
18001818
| A.cpp:57:10:57:32 | call to get | A.cpp:57:17:57:23 | new | A.cpp:57:10:57:32 | call to get | call to get flows from $@ | A.cpp:57:17:57:23 | new | new |
18011819
| A.cpp:66:10:66:14 | c | A.cpp:64:21:64:28 | new | A.cpp:66:10:66:14 | c | c flows from $@ | A.cpp:64:21:64:28 | new | new |
1820+
| A.cpp:66:10:66:14 | c | A.cpp:64:21:64:28 | new | A.cpp:66:10:66:14 | c | c flows from $@ | A.cpp:64:21:64:28 | new | new |
1821+
| A.cpp:75:10:75:14 | c | A.cpp:73:25:73:32 | new | A.cpp:75:10:75:14 | c | c flows from $@ | A.cpp:73:25:73:32 | new | new |
18021822
| A.cpp:75:10:75:14 | c | A.cpp:73:25:73:32 | new | A.cpp:75:10:75:14 | c | c flows from $@ | A.cpp:73:25:73:32 | new | new |
18031823
| A.cpp:107:12:107:16 | a | A.cpp:98:12:98:18 | new | A.cpp:107:12:107:16 | a | a flows from $@ | A.cpp:98:12:98:18 | new | new |
18041824
| A.cpp:120:12:120:16 | a | A.cpp:98:12:98:18 | new | A.cpp:120:12:120:16 | a | a flows from $@ | A.cpp:98:12:98:18 | new | new |

0 commit comments

Comments
 (0)