Skip to content

Commit 9aebc58

Browse files
authored
Merge pull request #20147 from paldepind/rust/type-limit-metric
Rust: Add metric for DCA and debug predicates for type that reach the length limit
2 parents 1fab97b + abc58ac commit 9aebc58

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql
1919
ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql
2020
ql/rust/ql/src/queries/summary/LinesOfCode.ql
2121
ql/rust/ql/src/queries/summary/LinesOfUserCode.ql
22+
ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql
2223
ql/rust/ql/src/queries/summary/NumberOfFilesExtractedWithErrors.ql
2324
ql/rust/ql/src/queries/summary/NumberOfSuccessfullyExtractedFiles.ql
2425
ql/rust/ql/src/queries/summary/QuerySinkCounts.ql

rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql
2121
ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql
2222
ql/rust/ql/src/queries/summary/LinesOfCode.ql
2323
ql/rust/ql/src/queries/summary/LinesOfUserCode.ql
24+
ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql
2425
ql/rust/ql/src/queries/summary/NumberOfFilesExtractedWithErrors.ql
2526
ql/rust/ql/src/queries/summary/NumberOfSuccessfullyExtractedFiles.ql
2627
ql/rust/ql/src/queries/summary/QuerySinkCounts.ql

rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql
2020
ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql
2121
ql/rust/ql/src/queries/summary/LinesOfCode.ql
2222
ql/rust/ql/src/queries/summary/LinesOfUserCode.ql
23+
ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql
2324
ql/rust/ql/src/queries/summary/NumberOfFilesExtractedWithErrors.ql
2425
ql/rust/ql/src/queries/summary/NumberOfSuccessfullyExtractedFiles.ql
2526
ql/rust/ql/src/queries/summary/QuerySinkCounts.ql

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ private module Input1 implements InputSig1<Location> {
127127
tp0 order by kind, id1, id2
128128
)
129129
}
130+
131+
int getTypePathLimit() { result = 10 }
130132
}
131133

132134
private import Input1
@@ -135,6 +137,8 @@ private module M1 = Make1<Location, Input1>;
135137

136138
private import M1
137139

140+
predicate getTypePathLimit = Input1::getTypePathLimit/0;
141+
138142
class TypePath = M1::TypePath;
139143

140144
module TypePath = M1::TypePath;
@@ -2265,6 +2269,16 @@ private module Debug {
22652269
result = strictcount(Type t0 | t0 = inferType(n, path))
22662270
}
22672271

2272+
Type debugInferTypeForNodeAtLimit(AstNode n, TypePath path) {
2273+
result = inferType(n, path) and
2274+
exists(TypePath path0 | exists(inferType(n, path0)) and path0.length() >= getTypePathLimit())
2275+
}
2276+
2277+
predicate countTypesForNodeAtLimit(AstNode n, int c) {
2278+
n = getRelevantLocatable() and
2279+
c = strictcount(Type t, TypePath path | t = debugInferTypeForNodeAtLimit(n, path))
2280+
}
2281+
22682282
predicate maxTypes(AstNode n, TypePath path, Type t, int c) {
22692283
c = countTypesAtPath(n, path, t) and
22702284
c = max(countTypesAtPath(_, _, _))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @name Nodes With Type At Length Limit
3+
* @description Counts the number of AST nodes with a type at the type path length limit.
4+
* @kind metric
5+
* @id rust/summary/nodes-at-type-path-length-limit
6+
* @tags summary
7+
*/
8+
9+
import rust
10+
import codeql.rust.internal.TypeInference
11+
12+
from int atLimit
13+
where
14+
atLimit =
15+
count(AstNode n, TypePath path |
16+
exists(inferType(n, path)) and path.length() = getTypePathLimit()
17+
|
18+
n
19+
)
20+
select atLimit

0 commit comments

Comments
 (0)