Skip to content

Commit 795ba25

Browse files
committed
Rust: Add more consistency checks
1 parent fcdffc4 commit 795ba25

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

rust/ql/lib/codeql/rust/internal/AstConsistency.qll

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,26 @@ query predicate multiplePathResolutions(Path p, ItemNode i) {
8989
strictcount(resolvePath(p)) > 1
9090
}
9191

92+
/** Holds if `call` has multiple static call targets including `target`. */
93+
query predicate multipleStaticCallTargets(CallExprBase call, Callable target) {
94+
target = call.getStaticTarget() and
95+
strictcount(call.getStaticTarget()) > 1
96+
}
97+
98+
/** Holds if `fe` resolves to multiple record fields including `field`. */
99+
query predicate multipleRecordFields(FieldExpr fe, RecordField field) {
100+
field = fe.getRecordField() and
101+
strictcount(fe.getRecordField()) > 1
102+
}
103+
104+
/** Holds if `fe` resolves to multiple tuple fields including `field`. */
105+
query predicate multipleTupleFields(FieldExpr fe, TupleField field) {
106+
field = fe.getTupleField() and
107+
strictcount(fe.getTupleField()) > 1
108+
}
109+
110+
import codeql.rust.elements.internal.TypeInference::Consistency
111+
92112
/**
93113
* Gets counts of abstract syntax tree inconsistencies of each type.
94114
*/
@@ -117,4 +137,13 @@ int getAstInconsistencyCounts(string type) {
117137
or
118138
type = "Multiple path resolutions" and
119139
result = count(Path p | multiplePathResolutions(p, _) | p)
140+
or
141+
type = "Multiple static call targets" and
142+
result = count(CallExprBase call | multipleStaticCallTargets(call, _) | call)
143+
or
144+
type = "Multiple record fields" and
145+
result = count(FieldExpr fe | multipleRecordFields(fe, _) | fe)
146+
or
147+
type = "Multiple tuple fields" and
148+
result = count(FieldExpr fe | multipleTupleFields(fe, _) | fe)
120149
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
multiplePathResolutions
22
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
33
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
4+
multipleStaticCallTargets
5+
| main.rs:118:9:118:11 | f(...) | main.rs:104:5:106:5 | fn f |
6+
| main.rs:118:9:118:11 | f(...) | main.rs:110:5:112:5 | fn f |

rust/ql/test/query-tests/diagnostics/AstConsistencyCounts.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,8 @@
44
| Multiple path resolutions | 0 |
55
| Multiple positions | 0 |
66
| Multiple primary QL classes | 0 |
7+
| Multiple record fields | 0 |
8+
| Multiple static call targets | 0 |
79
| Multiple toStrings | 0 |
10+
| Multiple tuple fields | 0 |
811
| No location | 0 |

0 commit comments

Comments
 (0)