Skip to content

Commit c51efb1

Browse files
committed
C++: Tighten up definitions of field accesses
1 parent 192c16b commit c51efb1

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

cpp/ql/lib/semmle/code/cpp/exprs/Access.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ class ImplicitThisFieldAccess extends FieldAccess {
311311
override string getAPrimaryQlClass() { result = "ImplicitThisFieldAccess" }
312312

313313
ImplicitThisFieldAccess() {
314-
this.getQualifier().isCompilerGenerated() or not exists(this.getQualifier())
314+
this.getQualifier().(ThisExpr).isCompilerGenerated() or not exists(this.getQualifier())
315315
}
316316
}
317317

@@ -330,7 +330,7 @@ class PointerToFieldLiteral extends ImplicitThisFieldAccess {
330330
// access without a qualifier. The only other unqualified field accesses it
331331
// emits are for compiler-generated constructors and destructors. When we
332332
// filter those out, there are only pointer-to-field literals left.
333-
not this.isCompilerGenerated()
333+
not this.isCompilerGenerated() and not exists(this.getQualifier())
334334
}
335335

336336
override predicate isConstant() { any() }

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ bad_asts.cpp:
8383
# 10| Type = [IntType] int
8484
# 10| Value = [Literal] 6
8585
# 10| ValueCategory = prvalue
86-
# 10| getRightOperand(): [PointerFieldAccess] x
86+
# 10| getRightOperand(): [ImplicitThisFieldAccess,PointerFieldAccess] x
8787
# 10| Type = [IntType] int
8888
# 10| ValueCategory = prvalue(load)
8989
# 10| getQualifier(): [ThisExpr] this
@@ -108,7 +108,7 @@ bad_asts.cpp:
108108
# 10| Type = [IntType] int
109109
# 10| Value = [Literal] t
110110
# 10| ValueCategory = prvalue
111-
# 10| getRightOperand(): [PointerFieldAccess] x
111+
# 10| getRightOperand(): [ImplicitThisFieldAccess,PointerFieldAccess] x
112112
# 10| Type = [IntType] int
113113
# 10| ValueCategory = prvalue(load)
114114
# 10| getQualifier(): [ThisExpr] this
@@ -5718,7 +5718,7 @@ ir.cpp:
57185718
# 645| getExpr(): [AssignExpr] ... = ...
57195719
# 645| Type = [IntType] int
57205720
# 645| ValueCategory = lvalue
5721-
# 645| getLValue(): [PointerFieldAccess] m_a
5721+
# 645| getLValue(): [ImplicitThisFieldAccess,PointerFieldAccess] m_a
57225722
# 645| Type = [IntType] int
57235723
# 645| ValueCategory = lvalue
57245724
# 645| getQualifier(): [ThisExpr] this
@@ -5770,7 +5770,7 @@ ir.cpp:
57705770
# 649| getLValue(): [VariableAccess] x
57715771
# 649| Type = [IntType] int
57725772
# 649| ValueCategory = lvalue
5773-
# 649| getRValue(): [PointerFieldAccess] m_a
5773+
# 649| getRValue(): [ImplicitThisFieldAccess,PointerFieldAccess] m_a
57745774
# 649| Type = [IntType] int
57755775
# 649| ValueCategory = prvalue(load)
57765776
# 649| getQualifier(): [ThisExpr] this
@@ -9012,7 +9012,7 @@ ir.cpp:
90129012
# 1043| getArrayBase(): [FunctionCall] call to c_str
90139013
# 1043| Type = [PointerType] const char *
90149014
# 1043| ValueCategory = prvalue
9015-
# 1043| getQualifier(): [PointerFieldAccess] s
9015+
# 1043| getQualifier(): [ImplicitThisFieldAccess,PointerFieldAccess] s
90169016
# 1043| Type = [LValueReferenceType] const String &
90179017
# 1043| ValueCategory = prvalue(load)
90189018
# 1043| getQualifier(): [ThisExpr] this
@@ -9021,7 +9021,7 @@ ir.cpp:
90219021
# 1043| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
90229022
# 1043| Type = [SpecifiedType] const String
90239023
# 1043| ValueCategory = lvalue
9024-
# 1043| getArrayOffset(): [PointerFieldAccess] x
9024+
# 1043| getArrayOffset(): [ImplicitThisFieldAccess,PointerFieldAccess] x
90259025
# 1043| Type = [LValueReferenceType] int &
90269026
# 1043| ValueCategory = prvalue(load)
90279027
# 1043| getQualifier(): [ThisExpr] this
@@ -9070,13 +9070,13 @@ ir.cpp:
90709070
# 1045| getArrayBase(): [FunctionCall] call to c_str
90719071
# 1045| Type = [PointerType] const char *
90729072
# 1045| ValueCategory = prvalue
9073-
# 1045| getQualifier(): [PointerFieldAccess] s
9073+
# 1045| getQualifier(): [ImplicitThisFieldAccess,PointerFieldAccess] s
90749074
# 1045| Type = [SpecifiedType] const String
90759075
# 1045| ValueCategory = lvalue
90769076
# 1045| getQualifier(): [ThisExpr] this
90779077
# 1045| Type = [PointerType] const lambda [] type at line 1045, col. 21 *
90789078
# 1045| ValueCategory = prvalue(load)
9079-
# 1045| getArrayOffset(): [PointerFieldAccess] x
9079+
# 1045| getArrayOffset(): [ImplicitThisFieldAccess,PointerFieldAccess] x
90809080
# 1045| Type = [IntType] int
90819081
# 1045| ValueCategory = prvalue(load)
90829082
# 1045| getQualifier(): [ThisExpr] this
@@ -9108,7 +9108,7 @@ ir.cpp:
91089108
# 1047| getArrayBase(): [FunctionCall] call to c_str
91099109
# 1047| Type = [PointerType] const char *
91109110
# 1047| ValueCategory = prvalue
9111-
# 1047| getQualifier(): [PointerFieldAccess] s
9111+
# 1047| getQualifier(): [ImplicitThisFieldAccess,PointerFieldAccess] s
91129112
# 1047| Type = [LValueReferenceType] const String &
91139113
# 1047| ValueCategory = prvalue(load)
91149114
# 1047| getQualifier(): [ThisExpr] this
@@ -9161,7 +9161,7 @@ ir.cpp:
91619161
# 1049| getArrayBase(): [FunctionCall] call to c_str
91629162
# 1049| Type = [PointerType] const char *
91639163
# 1049| ValueCategory = prvalue
9164-
# 1049| getQualifier(): [PointerFieldAccess] s
9164+
# 1049| getQualifier(): [ImplicitThisFieldAccess,PointerFieldAccess] s
91659165
# 1049| Type = [SpecifiedType] const String
91669166
# 1049| ValueCategory = lvalue
91679167
# 1049| getQualifier(): [ThisExpr] this
@@ -9197,7 +9197,7 @@ ir.cpp:
91979197
# 1051| getArrayBase(): [FunctionCall] call to c_str
91989198
# 1051| Type = [PointerType] const char *
91999199
# 1051| ValueCategory = prvalue
9200-
# 1051| getQualifier(): [PointerFieldAccess] s
9200+
# 1051| getQualifier(): [ImplicitThisFieldAccess,PointerFieldAccess] s
92019201
# 1051| Type = [LValueReferenceType] const String &
92029202
# 1051| ValueCategory = prvalue(load)
92039203
# 1051| getQualifier(): [ThisExpr] this
@@ -9206,7 +9206,7 @@ ir.cpp:
92069206
# 1051| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
92079207
# 1051| Type = [SpecifiedType] const String
92089208
# 1051| ValueCategory = lvalue
9209-
# 1051| getArrayOffset(): [PointerFieldAccess] x
9209+
# 1051| getArrayOffset(): [ImplicitThisFieldAccess,PointerFieldAccess] x
92109210
# 1051| Type = [IntType] int
92119211
# 1051| ValueCategory = prvalue(load)
92129212
# 1051| getQualifier(): [ThisExpr] this
@@ -9238,7 +9238,7 @@ ir.cpp:
92389238
# 1054| getArrayBase(): [FunctionCall] call to c_str
92399239
# 1054| Type = [PointerType] const char *
92409240
# 1054| ValueCategory = prvalue
9241-
# 1054| getQualifier(): [PointerFieldAccess] s
9241+
# 1054| getQualifier(): [ImplicitThisFieldAccess,PointerFieldAccess] s
92429242
# 1054| Type = [LValueReferenceType] const String &
92439243
# 1054| ValueCategory = prvalue(load)
92449244
# 1054| getQualifier(): [ThisExpr] this
@@ -9253,7 +9253,7 @@ ir.cpp:
92539253
# 1054| getLeftOperand(): [AddExpr] ... + ...
92549254
# 1054| Type = [IntType] int
92559255
# 1054| ValueCategory = prvalue
9256-
# 1054| getLeftOperand(): [PointerFieldAccess] x
9256+
# 1054| getLeftOperand(): [ImplicitThisFieldAccess,PointerFieldAccess] x
92579257
# 1054| Type = [IntType] int
92589258
# 1054| ValueCategory = prvalue(load)
92599259
# 1054| getQualifier(): [ThisExpr] this
@@ -11484,7 +11484,7 @@ ir.cpp:
1148411484
# 1458| getExpr(): [AssignExpr] ... = ...
1148511485
# 1458| Type = [IntType] int
1148611486
# 1458| ValueCategory = lvalue
11487-
# 1458| getLValue(): [PointerFieldAccess] y
11487+
# 1458| getLValue(): [ImplicitThisFieldAccess,PointerFieldAccess] y
1148811488
# 1458| Type = [IntType] int
1148911489
# 1458| ValueCategory = lvalue
1149011490
# 1458| getQualifier(): [ThisExpr] this
@@ -12296,7 +12296,7 @@ ir.cpp:
1229612296
# 1567| <params>:
1229712297
# 1567| getEntryPoint(): [BlockStmt] { ... }
1229812298
# 1568| getStmt(0): [ReturnStmt] return ...
12299-
# 1568| getExpr(): [PointerFieldAccess] i
12299+
# 1568| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] i
1230012300
# 1568| Type = [IntType] int
1230112301
# 1568| ValueCategory = lvalue
1230212302
# 1568| getQualifier(): [ThisExpr] this
@@ -12309,7 +12309,7 @@ ir.cpp:
1230912309
# 1571| <params>:
1231012310
# 1571| getEntryPoint(): [BlockStmt] { ... }
1231112311
# 1572| getStmt(0): [ReturnStmt] return ...
12312-
# 1572| getExpr(): [PointerFieldAccess] d
12312+
# 1572| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] d
1231312313
# 1572| Type = [DoubleType] double
1231412314
# 1572| ValueCategory = lvalue
1231512315
# 1572| getQualifier(): [ThisExpr] this
@@ -12322,7 +12322,7 @@ ir.cpp:
1232212322
# 1575| <params>:
1232312323
# 1575| getEntryPoint(): [BlockStmt] { ... }
1232412324
# 1576| getStmt(0): [ReturnStmt] return ...
12325-
# 1576| getExpr(): [PointerFieldAccess] r
12325+
# 1576| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] r
1232612326
# 1576| Type = [LValueReferenceType] int &
1232712327
# 1576| ValueCategory = prvalue(load)
1232812328
# 1576| getQualifier(): [ThisExpr] this
@@ -12663,7 +12663,7 @@ ir.cpp:
1266312663
# 1633| <params>:
1266412664
# 1633| getEntryPoint(): [BlockStmt] { ... }
1266512665
# 1634| getStmt(0): [ReturnStmt] return ...
12666-
# 1634| getExpr(): [PointerFieldAccess] i
12666+
# 1634| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] i
1266712667
# 1634| Type = [IntType] int
1266812668
# 1634| ValueCategory = prvalue(load)
1266912669
# 1634| getQualifier(): [ThisExpr] this
@@ -12673,7 +12673,7 @@ ir.cpp:
1267312673
# 1637| <params>:
1267412674
# 1637| getEntryPoint(): [BlockStmt] { ... }
1267512675
# 1638| getStmt(0): [ReturnStmt] return ...
12676-
# 1638| getExpr(): [PointerFieldAccess] r
12676+
# 1638| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] r
1267712677
# 1638| Type = [LValueReferenceType] int &
1267812678
# 1638| ValueCategory = prvalue(load)
1267912679
# 1638| getQualifier(): [ThisExpr] this
@@ -13284,7 +13284,7 @@ ir.cpp:
1328413284
# 1703| getQualifier(): [AddressOfExpr] & ...
1328513285
# 1703| Type = [PointerType] const TrivialLambdaClass *
1328613286
# 1703| ValueCategory = prvalue
13287-
# 1703| getOperand(): [PointerFieldAccess] (captured this)
13287+
# 1703| getOperand(): [ImplicitThisFieldAccess,PointerFieldAccess] (captured this)
1328813288
# 1703| Type = [SpecifiedType] const TrivialLambdaClass
1328913289
# 1703| ValueCategory = lvalue
1329013290
# 1703| getQualifier(): [ThisExpr] this
@@ -13331,7 +13331,7 @@ ir.cpp:
1333113331
# 1706| getQualifier(): [AddressOfExpr] & ...
1333213332
# 1706| Type = [PointerType] const TrivialLambdaClass *
1333313333
# 1706| ValueCategory = prvalue
13334-
# 1706| getOperand(): [PointerFieldAccess] (captured this)
13334+
# 1706| getOperand(): [ImplicitThisFieldAccess,PointerFieldAccess] (captured this)
1333513335
# 1706| Type = [SpecifiedType] const TrivialLambdaClass
1333613336
# 1706| ValueCategory = lvalue
1333713337
# 1706| getQualifier(): [ThisExpr] this
@@ -13477,7 +13477,7 @@ ir.cpp:
1347713477
# 1726| getExpr(): [AssignExpr] ... = ...
1347813478
# 1726| Type = [IntType] int
1347913479
# 1726| ValueCategory = lvalue
13480-
# 1726| getLValue(): [PointerFieldAccess] x
13480+
# 1726| getLValue(): [ImplicitThisFieldAccess,PointerFieldAccess] x
1348113481
# 1726| Type = [IntType] int
1348213482
# 1726| ValueCategory = lvalue
1348313483
# 1726| getQualifier(): [ThisExpr] this

0 commit comments

Comments
 (0)