Skip to content

Commit 95a8dcb

Browse files
committed
C++: failing test for non-conflated escaped var
1 parent 29c4c8c commit 95a8dcb

File tree

6 files changed

+227
-1
lines changed

6 files changed

+227
-1
lines changed

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,3 +1287,61 @@ ssa.cpp:
12871287
# 268| v268_16(void) = UnmodeledUse : mu*
12881288
# 268| v268_17(void) = AliasedUse : ~m270_11
12891289
# 268| v268_18(void) = ExitFunction :
1290+
1291+
# 275| void EscapedButNotConflated(bool, Point, int)
1292+
# 275| Block 0
1293+
# 275| v275_1(void) = EnterFunction :
1294+
# 275| m275_2(unknown) = AliasedDefinition :
1295+
# 275| m275_3(unknown) = InitializeNonLocal :
1296+
# 275| m275_4(unknown) = Chi : total:m275_2, partial:m275_3
1297+
# 275| mu275_5(unknown) = UnmodeledDefinition :
1298+
# 275| r275_6(glval<bool>) = VariableAddress[c] :
1299+
# 275| m275_7(bool) = InitializeParameter[c] : &:r275_6
1300+
# 275| r275_8(glval<Point>) = VariableAddress[p] :
1301+
# 275| m275_9(Point) = InitializeParameter[p] : &:r275_8
1302+
# 275| r275_10(glval<int>) = VariableAddress[x1] :
1303+
# 275| m275_11(int) = InitializeParameter[x1] : &:r275_10
1304+
# 276| r276_1(glval<Point>) = VariableAddress[a] :
1305+
# 276| m276_2(Point) = Uninitialized[a] : &:r276_1
1306+
# 276| m276_3(unknown) = Chi : total:m275_4, partial:m276_2
1307+
# 276| r276_4(glval<int>) = FieldAddress[x] : r276_1
1308+
# 276| r276_5(int) = Constant[0] :
1309+
# 276| m276_6(int) = Store : &:r276_4, r276_5
1310+
# 276| m276_7(unknown) = Chi : total:m276_3, partial:m276_6
1311+
# 276| r276_8(glval<int>) = FieldAddress[y] : r276_1
1312+
# 276| r276_9(int) = Constant[0] :
1313+
# 276| m276_10(int) = Store : &:r276_8, r276_9
1314+
# 276| m276_11(unknown) = Chi : total:m276_7, partial:m276_10
1315+
# 277| r277_1(glval<Point>) = VariableAddress[a] :
1316+
# 277| r277_2(Point *) = CopyValue : r277_1
1317+
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
1318+
# 277| m277_4(Point *) = Store : &:r277_3, r277_2
1319+
# 277| m277_5(unknown) = Chi : total:m276_11, partial:m277_4
1320+
# 278| r278_1(glval<bool>) = VariableAddress[c] :
1321+
# 278| r278_2(bool) = Load : &:r278_1, m275_7
1322+
# 278| v278_3(void) = ConditionalBranch : r278_2
1323+
#-----| False -> Block 2
1324+
#-----| True -> Block 1
1325+
1326+
# 279| Block 1
1327+
# 279| r279_1(glval<int>) = VariableAddress[x1] :
1328+
# 279| r279_2(int) = Load : &:r279_1, m275_11
1329+
# 279| r279_3(glval<Point>) = VariableAddress[a] :
1330+
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
1331+
# 279| m279_5(int) = Store : &:r279_4, r279_2
1332+
# 279| m279_6(unknown) = Chi : total:m277_5, partial:m279_5
1333+
#-----| Goto -> Block 2
1334+
1335+
# 281| Block 2
1336+
# 281| m281_1(int) = Phi : from 0:m276_6, from 1:m279_5
1337+
# 281| m281_2(unknown) = Phi : from 0:~m277_5, from 1:~m279_6
1338+
# 281| r281_3(glval<int>) = VariableAddress[x] :
1339+
# 281| r281_4(glval<Point>) = VariableAddress[a] :
1340+
# 281| r281_5(glval<int>) = FieldAddress[x] : r281_4
1341+
# 281| r281_6(int) = Load : &:r281_5, m281_1
1342+
# 281| m281_7(int) = Store : &:r281_3, r281_6
1343+
# 282| v282_1(void) = NoOp :
1344+
# 275| v275_12(void) = ReturnVoid :
1345+
# 275| v275_13(void) = UnmodeledUse : mu*
1346+
# 275| v275_14(void) = AliasedUse : ~m281_2
1347+
# 275| v275_15(void) = ExitFunction :

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,3 +1277,60 @@ ssa.cpp:
12771277
# 268| v268_15(void) = UnmodeledUse : mu*
12781278
# 268| v268_16(void) = AliasedUse : ~m269_7
12791279
# 268| v268_17(void) = ExitFunction :
1280+
1281+
# 275| void EscapedButNotConflated(bool, Point, int)
1282+
# 275| Block 0
1283+
# 275| v275_1(void) = EnterFunction :
1284+
# 275| m275_2(unknown) = AliasedDefinition :
1285+
# 275| m275_3(unknown) = InitializeNonLocal :
1286+
# 275| m275_4(unknown) = Chi : total:m275_2, partial:m275_3
1287+
# 275| mu275_5(unknown) = UnmodeledDefinition :
1288+
# 275| r275_6(glval<bool>) = VariableAddress[c] :
1289+
# 275| m275_7(bool) = InitializeParameter[c] : &:r275_6
1290+
# 275| r275_8(glval<Point>) = VariableAddress[p] :
1291+
# 275| m275_9(Point) = InitializeParameter[p] : &:r275_8
1292+
# 275| r275_10(glval<int>) = VariableAddress[x1] :
1293+
# 275| m275_11(int) = InitializeParameter[x1] : &:r275_10
1294+
# 276| r276_1(glval<Point>) = VariableAddress[a] :
1295+
# 276| m276_2(Point) = Uninitialized[a] : &:r276_1
1296+
# 276| r276_3(glval<int>) = FieldAddress[x] : r276_1
1297+
# 276| r276_4(int) = Constant[0] :
1298+
# 276| m276_5(int) = Store : &:r276_3, r276_4
1299+
# 276| m276_6(Point) = Chi : total:m276_2, partial:m276_5
1300+
# 276| r276_7(glval<int>) = FieldAddress[y] : r276_1
1301+
# 276| r276_8(int) = Constant[0] :
1302+
# 276| m276_9(int) = Store : &:r276_7, r276_8
1303+
# 276| m276_10(Point) = Chi : total:m276_6, partial:m276_9
1304+
# 277| r277_1(glval<Point>) = VariableAddress[a] :
1305+
# 277| r277_2(Point *) = CopyValue : r277_1
1306+
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
1307+
# 277| m277_4(Point *) = Store : &:r277_3, r277_2
1308+
# 277| m277_5(unknown) = Chi : total:m275_4, partial:m277_4
1309+
# 278| r278_1(glval<bool>) = VariableAddress[c] :
1310+
# 278| r278_2(bool) = Load : &:r278_1, m275_7
1311+
# 278| v278_3(void) = ConditionalBranch : r278_2
1312+
#-----| False -> Block 2
1313+
#-----| True -> Block 1
1314+
1315+
# 279| Block 1
1316+
# 279| r279_1(glval<int>) = VariableAddress[x1] :
1317+
# 279| r279_2(int) = Load : &:r279_1, m275_11
1318+
# 279| r279_3(glval<Point>) = VariableAddress[a] :
1319+
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
1320+
# 279| m279_5(int) = Store : &:r279_4, r279_2
1321+
# 279| m279_6(Point) = Chi : total:m276_10, partial:m279_5
1322+
#-----| Goto -> Block 2
1323+
1324+
# 281| Block 2
1325+
# 281| m281_1(int) = Phi : from 0:m276_5, from 1:m279_5
1326+
# 281| m281_2(Point) = Phi : from 0:m276_10, from 1:m279_6
1327+
# 281| r281_3(glval<int>) = VariableAddress[x] :
1328+
# 281| r281_4(glval<Point>) = VariableAddress[a] :
1329+
# 281| r281_5(glval<int>) = FieldAddress[x] : r281_4
1330+
# 281| r281_6(int) = Load : &:r281_5, m281_1
1331+
# 281| m281_7(int) = Store : &:r281_3, r281_6
1332+
# 282| v282_1(void) = NoOp :
1333+
# 275| v275_12(void) = ReturnVoid :
1334+
# 275| v275_13(void) = UnmodeledUse : mu*
1335+
# 275| v275_14(void) = AliasedUse : ~m277_5
1336+
# 275| v275_15(void) = ExitFunction :

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_sanity.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ useNotDominatedByDefinition
1818
switchInstructionWithoutDefaultEdge
1919
notMarkedAsConflated
2020
wronglyMarkedAsConflated
21+
| ssa.cpp:281:7:281:7 | Phi: definition of x |
2122
missingCanonicalLanguageType
2223
multipleCanonicalLanguageTypes
2324
missingIRType

cpp/ql/test/library-tests/ir/ssa/ssa.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,4 +269,14 @@ void *MallocAliasing(void *s, int size) {
269269
void *buf = malloc(size);
270270
memcpy(buf, s, size);
271271
return buf;
272-
}
272+
}
273+
274+
Point *pp;
275+
void EscapedButNotConflated(bool c, Point p, int x1) {
276+
Point a = {};
277+
pp = &a; // `a` escapes here and therefore belongs to the aliased vvar
278+
if (c) {
279+
a.x = x1;
280+
}
281+
int x = a.x; // The phi node here is not conflated
282+
}

cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,3 +1188,53 @@ ssa.cpp:
11881188
# 268| v268_14(void) = UnmodeledUse : mu*
11891189
# 268| v268_15(void) = AliasedUse : ~mu268_4
11901190
# 268| v268_16(void) = ExitFunction :
1191+
1192+
# 275| void EscapedButNotConflated(bool, Point, int)
1193+
# 275| Block 0
1194+
# 275| v275_1(void) = EnterFunction :
1195+
# 275| mu275_2(unknown) = AliasedDefinition :
1196+
# 275| mu275_3(unknown) = InitializeNonLocal :
1197+
# 275| mu275_4(unknown) = UnmodeledDefinition :
1198+
# 275| r275_5(glval<bool>) = VariableAddress[c] :
1199+
# 275| m275_6(bool) = InitializeParameter[c] : &:r275_5
1200+
# 275| r275_7(glval<Point>) = VariableAddress[p] :
1201+
# 275| m275_8(Point) = InitializeParameter[p] : &:r275_7
1202+
# 275| r275_9(glval<int>) = VariableAddress[x1] :
1203+
# 275| m275_10(int) = InitializeParameter[x1] : &:r275_9
1204+
# 276| r276_1(glval<Point>) = VariableAddress[a] :
1205+
# 276| mu276_2(Point) = Uninitialized[a] : &:r276_1
1206+
# 276| r276_3(glval<int>) = FieldAddress[x] : r276_1
1207+
# 276| r276_4(int) = Constant[0] :
1208+
# 276| mu276_5(int) = Store : &:r276_3, r276_4
1209+
# 276| r276_6(glval<int>) = FieldAddress[y] : r276_1
1210+
# 276| r276_7(int) = Constant[0] :
1211+
# 276| mu276_8(int) = Store : &:r276_6, r276_7
1212+
# 277| r277_1(glval<Point>) = VariableAddress[a] :
1213+
# 277| r277_2(Point *) = CopyValue : r277_1
1214+
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
1215+
# 277| mu277_4(Point *) = Store : &:r277_3, r277_2
1216+
# 278| r278_1(glval<bool>) = VariableAddress[c] :
1217+
# 278| r278_2(bool) = Load : &:r278_1, m275_6
1218+
# 278| v278_3(void) = ConditionalBranch : r278_2
1219+
#-----| False -> Block 2
1220+
#-----| True -> Block 1
1221+
1222+
# 279| Block 1
1223+
# 279| r279_1(glval<int>) = VariableAddress[x1] :
1224+
# 279| r279_2(int) = Load : &:r279_1, m275_10
1225+
# 279| r279_3(glval<Point>) = VariableAddress[a] :
1226+
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
1227+
# 279| mu279_5(int) = Store : &:r279_4, r279_2
1228+
#-----| Goto -> Block 2
1229+
1230+
# 281| Block 2
1231+
# 281| r281_1(glval<int>) = VariableAddress[x] :
1232+
# 281| r281_2(glval<Point>) = VariableAddress[a] :
1233+
# 281| r281_3(glval<int>) = FieldAddress[x] : r281_2
1234+
# 281| r281_4(int) = Load : &:r281_3, ~mu275_4
1235+
# 281| m281_5(int) = Store : &:r281_1, r281_4
1236+
# 282| v282_1(void) = NoOp :
1237+
# 275| v275_11(void) = ReturnVoid :
1238+
# 275| v275_12(void) = UnmodeledUse : mu*
1239+
# 275| v275_13(void) = AliasedUse : ~mu275_4
1240+
# 275| v275_14(void) = ExitFunction :

cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,3 +1188,53 @@ ssa.cpp:
11881188
# 268| v268_14(void) = UnmodeledUse : mu*
11891189
# 268| v268_15(void) = AliasedUse : ~mu268_4
11901190
# 268| v268_16(void) = ExitFunction :
1191+
1192+
# 275| void EscapedButNotConflated(bool, Point, int)
1193+
# 275| Block 0
1194+
# 275| v275_1(void) = EnterFunction :
1195+
# 275| mu275_2(unknown) = AliasedDefinition :
1196+
# 275| mu275_3(unknown) = InitializeNonLocal :
1197+
# 275| mu275_4(unknown) = UnmodeledDefinition :
1198+
# 275| r275_5(glval<bool>) = VariableAddress[c] :
1199+
# 275| m275_6(bool) = InitializeParameter[c] : &:r275_5
1200+
# 275| r275_7(glval<Point>) = VariableAddress[p] :
1201+
# 275| m275_8(Point) = InitializeParameter[p] : &:r275_7
1202+
# 275| r275_9(glval<int>) = VariableAddress[x1] :
1203+
# 275| m275_10(int) = InitializeParameter[x1] : &:r275_9
1204+
# 276| r276_1(glval<Point>) = VariableAddress[a] :
1205+
# 276| mu276_2(Point) = Uninitialized[a] : &:r276_1
1206+
# 276| r276_3(glval<int>) = FieldAddress[x] : r276_1
1207+
# 276| r276_4(int) = Constant[0] :
1208+
# 276| mu276_5(int) = Store : &:r276_3, r276_4
1209+
# 276| r276_6(glval<int>) = FieldAddress[y] : r276_1
1210+
# 276| r276_7(int) = Constant[0] :
1211+
# 276| mu276_8(int) = Store : &:r276_6, r276_7
1212+
# 277| r277_1(glval<Point>) = VariableAddress[a] :
1213+
# 277| r277_2(Point *) = CopyValue : r277_1
1214+
# 277| r277_3(glval<Point *>) = VariableAddress[pp] :
1215+
# 277| mu277_4(Point *) = Store : &:r277_3, r277_2
1216+
# 278| r278_1(glval<bool>) = VariableAddress[c] :
1217+
# 278| r278_2(bool) = Load : &:r278_1, m275_6
1218+
# 278| v278_3(void) = ConditionalBranch : r278_2
1219+
#-----| False -> Block 2
1220+
#-----| True -> Block 1
1221+
1222+
# 279| Block 1
1223+
# 279| r279_1(glval<int>) = VariableAddress[x1] :
1224+
# 279| r279_2(int) = Load : &:r279_1, m275_10
1225+
# 279| r279_3(glval<Point>) = VariableAddress[a] :
1226+
# 279| r279_4(glval<int>) = FieldAddress[x] : r279_3
1227+
# 279| mu279_5(int) = Store : &:r279_4, r279_2
1228+
#-----| Goto -> Block 2
1229+
1230+
# 281| Block 2
1231+
# 281| r281_1(glval<int>) = VariableAddress[x] :
1232+
# 281| r281_2(glval<Point>) = VariableAddress[a] :
1233+
# 281| r281_3(glval<int>) = FieldAddress[x] : r281_2
1234+
# 281| r281_4(int) = Load : &:r281_3, ~mu275_4
1235+
# 281| m281_5(int) = Store : &:r281_1, r281_4
1236+
# 282| v282_1(void) = NoOp :
1237+
# 275| v275_11(void) = ReturnVoid :
1238+
# 275| v275_12(void) = UnmodeledUse : mu*
1239+
# 275| v275_13(void) = AliasedUse : ~mu275_4
1240+
# 275| v275_14(void) = ExitFunction :

0 commit comments

Comments
 (0)