Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ee16b23

Browse files
committed
C++: Add PointerToFieldLiteral class
Marking these expressions as constants fixes the CFG discrepancies that can be observed on the affected test and on snapshots of MySQL.
1 parent bd59029 commit ee16b23

3 files changed

Lines changed: 23 additions & 28 deletions

File tree

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,29 @@ class ImplicitThisFieldAccess extends FieldAccess {
226226
ImplicitThisFieldAccess() { not exists(this.getQualifier()) }
227227
}
228228

229+
/**
230+
* A C++ _pointer to non-static data member_ literal. For example, `&C::x` is
231+
* an expression that refers to field `x` of class `C`. If the type of that
232+
* field is `int`, then `&C::x` ought to have type `int C::*`. It is currently
233+
* modeled in QL as having type `int`.
234+
*
235+
* See [dcl.mptr] in the C++17 standard or see
236+
* https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members.
237+
*/
238+
class PointerToFieldLiteral extends ImplicitThisFieldAccess {
239+
PointerToFieldLiteral() {
240+
// The extractor currently emits a pointer-to-field literal as a field
241+
// access without a qualifier. The only other unqualified field accesses it
242+
// emits are for compiler-generated constructors and destructors. When we
243+
// filter those out, there are only pointer-to-field literals left.
244+
not this.isCompilerGenerated()
245+
}
246+
247+
override predicate isConstant() { any() }
248+
249+
override string getCanonicalQLClass() { result = "PointerToFieldLiteral" }
250+
}
251+
229252
/**
230253
* A C/C++ function access expression.
231254
*/

cpp/ql/test/library-tests/syntax-zoo/drawDifferent.expected

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,3 @@
1-
| pointer_to_member__pmIsConst_extractor | false | 15698 | 15698 | pmIsConst |
2-
| pointer_to_member__pmIsConst_extractor | false | 15724 | 15724 | declaration |
3-
| pointer_to_member__pmIsConst_extractor | false | 15726 | 15726 | return ... |
4-
| pointer_to_member__pmIsConst_extractor | false | 15728 | 15728 | { ... } |
5-
| pointer_to_member__pmIsConst_extractor | false | 15731 | 15731 | {...} |
6-
| pointer_to_member__pmIsConst_extractor | false | 15734 | 15734 | x1 |
7-
| pointer_to_member__pmIsConst_extractor | false | 15735 | 15735 | initializer for pms |
8-
| pointer_to_member__pmIsConst_extractor | true | 15724 | 15726 | |
9-
| pointer_to_member__pmIsConst_extractor | true | 15726 | 15698 | |
10-
| pointer_to_member__pmIsConst_extractor | true | 15728 | 15724 | |
11-
| pointer_to_member__pmIsConst_ql | false | 15698 | 15698 | pmIsConst |
12-
| pointer_to_member__pmIsConst_ql | false | 15724 | 15724 | declaration |
13-
| pointer_to_member__pmIsConst_ql | false | 15726 | 15726 | return ... |
14-
| pointer_to_member__pmIsConst_ql | false | 15728 | 15728 | { ... } |
15-
| pointer_to_member__pmIsConst_ql | false | 15731 | 15731 | {...} |
16-
| pointer_to_member__pmIsConst_ql | false | 15734 | 15734 | x1 |
17-
| pointer_to_member__pmIsConst_ql | false | 15735 | 15735 | initializer for pms |
18-
| pointer_to_member__pmIsConst_ql | true | 15724 | 15735 | |
19-
| pointer_to_member__pmIsConst_ql | true | 15726 | 15698 | |
20-
| pointer_to_member__pmIsConst_ql | true | 15728 | 15724 | |
21-
| pointer_to_member__pmIsConst_ql | true | 15731 | 15726 | |
22-
| pointer_to_member__pmIsConst_ql | true | 15734 | 15731 | |
23-
| pointer_to_member__pmIsConst_ql | true | 15735 | 15734 | |
241
| staticlocals__staticlocals_f2_extractor | false | 22465 | 22465 | f2 |
252
| staticlocals__staticlocals_f2_extractor | false | 22470 | 22470 | declaration |
263
| staticlocals__staticlocals_f2_extractor | false | 22472 | 22472 | declaration |
Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
| pointer_to_member__pmIsConst | pointer_to_member.cpp:33:3:35:22 | declaration | pointer_to_member.cpp:35:11:35:21 | initializer for pms | Standard edge, only from QL |
2-
| pointer_to_member__pmIsConst | pointer_to_member.cpp:33:3:35:22 | declaration | pointer_to_member.cpp:36:1:36:1 | return ... | Standard edge, only from extractor |
3-
| pointer_to_member__pmIsConst | pointer_to_member.cpp:35:11:35:21 | initializer for pms | pointer_to_member.cpp:35:13:35:19 | x1 | Standard edge, only from QL |
4-
| pointer_to_member__pmIsConst | pointer_to_member.cpp:35:11:35:21 | {...} | pointer_to_member.cpp:36:1:36:1 | return ... | Standard edge, only from QL |
5-
| pointer_to_member__pmIsConst | pointer_to_member.cpp:35:13:35:19 | x1 | pointer_to_member.cpp:35:11:35:21 | {...} | Standard edge, only from QL |
61
| staticlocals__staticlocals_f2 | file://:0:0:0:0 | call to C | staticlocals.cpp:30:1:30:1 | return ... | Standard edge, only from QL |
72
| staticlocals__staticlocals_f2 | file://:0:0:0:0 | initializer for c | file://:0:0:0:0 | call to C | Standard edge, only from QL |
83
| staticlocals__staticlocals_f2 | staticlocals.cpp:29:5:29:17 | declaration | file://:0:0:0:0 | initializer for c | Standard edge, only from QL |

0 commit comments

Comments
 (0)