mirror of
https://github.com/github/codeql.git
synced 2026-05-02 12:15:17 +02:00
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.
This commit is contained in:
@@ -226,6 +226,29 @@ class ImplicitThisFieldAccess extends FieldAccess {
|
||||
ImplicitThisFieldAccess() { not exists(this.getQualifier()) }
|
||||
}
|
||||
|
||||
/**
|
||||
* A C++ _pointer to non-static data member_ literal. For example, `&C::x` is
|
||||
* an expression that refers to field `x` of class `C`. If the type of that
|
||||
* field is `int`, then `&C::x` ought to have type `int C::*`. It is currently
|
||||
* modeled in QL as having type `int`.
|
||||
*
|
||||
* See [dcl.mptr] in the C++17 standard or see
|
||||
* https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members.
|
||||
*/
|
||||
class PointerToFieldLiteral extends ImplicitThisFieldAccess {
|
||||
PointerToFieldLiteral() {
|
||||
// The extractor currently emits a pointer-to-field literal as a field
|
||||
// access without a qualifier. The only other unqualified field accesses it
|
||||
// emits are for compiler-generated constructors and destructors. When we
|
||||
// filter those out, there are only pointer-to-field literals left.
|
||||
not this.isCompilerGenerated()
|
||||
}
|
||||
|
||||
override predicate isConstant() { any() }
|
||||
|
||||
override string getCanonicalQLClass() { result = "PointerToFieldLiteral" }
|
||||
}
|
||||
|
||||
/**
|
||||
* A C/C++ function access expression.
|
||||
*/
|
||||
|
||||
@@ -1,26 +1,3 @@
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15698 | 15698 | pmIsConst |
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15724 | 15724 | declaration |
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15726 | 15726 | return ... |
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15728 | 15728 | { ... } |
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15731 | 15731 | {...} |
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15734 | 15734 | x1 |
|
||||
| pointer_to_member__pmIsConst_extractor | false | 15735 | 15735 | initializer for pms |
|
||||
| pointer_to_member__pmIsConst_extractor | true | 15724 | 15726 | |
|
||||
| pointer_to_member__pmIsConst_extractor | true | 15726 | 15698 | |
|
||||
| pointer_to_member__pmIsConst_extractor | true | 15728 | 15724 | |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15698 | 15698 | pmIsConst |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15724 | 15724 | declaration |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15726 | 15726 | return ... |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15728 | 15728 | { ... } |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15731 | 15731 | {...} |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15734 | 15734 | x1 |
|
||||
| pointer_to_member__pmIsConst_ql | false | 15735 | 15735 | initializer for pms |
|
||||
| pointer_to_member__pmIsConst_ql | true | 15724 | 15735 | |
|
||||
| pointer_to_member__pmIsConst_ql | true | 15726 | 15698 | |
|
||||
| pointer_to_member__pmIsConst_ql | true | 15728 | 15724 | |
|
||||
| pointer_to_member__pmIsConst_ql | true | 15731 | 15726 | |
|
||||
| pointer_to_member__pmIsConst_ql | true | 15734 | 15731 | |
|
||||
| pointer_to_member__pmIsConst_ql | true | 15735 | 15734 | |
|
||||
| staticlocals__staticlocals_f2_extractor | false | 22465 | 22465 | f2 |
|
||||
| staticlocals__staticlocals_f2_extractor | false | 22470 | 22470 | declaration |
|
||||
| staticlocals__staticlocals_f2_extractor | false | 22472 | 22472 | declaration |
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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 |
|
||||
| staticlocals__staticlocals_f2 | file://:0:0:0:0 | call to C | staticlocals.cpp:30:1:30:1 | return ... | Standard edge, only from QL |
|
||||
| staticlocals__staticlocals_f2 | file://:0:0:0:0 | initializer for c | file://:0:0:0:0 | call to C | Standard edge, only from QL |
|
||||
| staticlocals__staticlocals_f2 | staticlocals.cpp:29:5:29:17 | declaration | file://:0:0:0:0 | initializer for c | Standard edge, only from QL |
|
||||
|
||||
Reference in New Issue
Block a user