Skip to content

Commit 8a1b450

Browse files
authored
Merge pull request github#17602 from hvitved/rust/cfg-prune-bool-literal
Rust: Prune CFG for obviously impossible `true/false` edges
2 parents b0ed47c + 90a8bef commit 8a1b450

23 files changed

+167
-136
lines changed

rust/ql/.generated.list

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/.gitattributes

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,21 @@ abstract class ConditionalCompletion extends NormalCompletion {
6767
abstract ConditionalCompletion getDual();
6868
}
6969

70+
/** Holds if node `n` has the Boolean constant value `value`. */
71+
private predicate isBooleanConstant(AstNode n, Boolean value) {
72+
n.(LiteralExpr).getTextValue() = value.toString()
73+
or
74+
isBooleanConstant(n.(ParenExpr).getExpr(), value)
75+
}
76+
7077
/**
7178
* A completion that represents evaluation of an expression
7279
* with a Boolean value.
7380
*/
7481
class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion {
7582
BooleanCompletion() { this = TBooleanCompletion(value) }
7683

77-
override predicate isValidForSpecific(AstNode e) {
84+
private predicate isValidForSpecific0(AstNode e) {
7885
e = any(IfExpr c).getCondition()
7986
or
8087
any(MatchArm arm).getGuard() = e
@@ -84,7 +91,7 @@ class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion {
8491
e = expr.getLhs()
8592
)
8693
or
87-
exists(Expr parent | this.isValidForSpecific(parent) |
94+
exists(Expr parent | this.isValidForSpecific0(parent) |
8895
parent =
8996
any(PrefixExpr expr |
9097
expr.getOperatorName() = "!" and
@@ -103,6 +110,15 @@ class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion {
103110
)
104111
}
105112

113+
override predicate isValidForSpecific(AstNode e) {
114+
this.isValidForSpecific0(e) and
115+
(
116+
isBooleanConstant(e, value)
117+
or
118+
not isBooleanConstant(e, _)
119+
)
120+
}
121+
106122
/** Gets the dual Boolean completion. */
107123
override BooleanCompletion getDual() { result = TBooleanCompletion(value.booleanNot()) }
108124

rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// generated by codegen, remove this comment if you wish to edit this file
21
/**
32
* This module provides a hand-modifiable wrapper around the generated class `LiteralExpr`.
43
*
@@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LiteralExpr
1211
* be referenced directly.
1312
*/
1413
module Impl {
14+
// the following QLdoc is generated: if you need to edit it, do it in the schema file
1515
/**
1616
* A literal expression. For example:
1717
* ```rust
@@ -25,5 +25,7 @@ module Impl {
2525
* true;
2626
* ```
2727
*/
28-
class LiteralExpr extends Generated::LiteralExpr { }
28+
class LiteralExpr extends Generated::LiteralExpr {
29+
override string toString() { result = this.getTextValue() }
30+
}
2931
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 0 | gen_array_expr.rs:5:6:5:6 | LiteralExpr |
2-
| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 1 | gen_array_expr.rs:5:9:5:9 | LiteralExpr |
3-
| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 2 | gen_array_expr.rs:5:12:5:12 | LiteralExpr |
4-
| gen_array_expr.rs:6:5:6:11 | ArrayExpr | 0 | gen_array_expr.rs:6:6:6:6 | LiteralExpr |
5-
| gen_array_expr.rs:6:5:6:11 | ArrayExpr | 1 | gen_array_expr.rs:6:9:6:10 | LiteralExpr |
1+
| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 0 | gen_array_expr.rs:5:6:5:6 | 1 |
2+
| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 1 | gen_array_expr.rs:5:9:5:9 | 2 |
3+
| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 2 | gen_array_expr.rs:5:12:5:12 | 3 |
4+
| gen_array_expr.rs:6:5:6:11 | ArrayExpr | 0 | gen_array_expr.rs:6:6:6:6 | 1 |
5+
| gen_array_expr.rs:6:5:6:11 | ArrayExpr | 1 | gen_array_expr.rs:6:9:6:10 | 10 |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| gen_break_expr.rs:12:13:12:27 | BreakExpr | gen_break_expr.rs:12:26:12:27 | LiteralExpr |
1+
| gen_break_expr.rs:12:13:12:27 | BreakExpr | gen_break_expr.rs:12:26:12:27 | 42 |
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
| gen_index_expr.rs:5:5:5:12 | IndexExpr | gen_index_expr.rs:5:10:5:11 | LiteralExpr |
2-
| gen_index_expr.rs:6:5:6:12 | IndexExpr | gen_index_expr.rs:6:10:6:11 | LiteralExpr |
1+
| gen_index_expr.rs:5:5:5:12 | IndexExpr | gen_index_expr.rs:5:10:5:11 | 42 |
2+
| gen_index_expr.rs:6:5:6:12 | IndexExpr | gen_index_expr.rs:6:10:6:11 | 42 |
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
| gen_let_stmt.rs:5:5:5:15 | LetStmt | gen_let_stmt.rs:5:13:5:14 | LiteralExpr |
2-
| gen_let_stmt.rs:6:5:6:20 | LetStmt | gen_let_stmt.rs:6:18:6:19 | LiteralExpr |
1+
| gen_let_stmt.rs:5:5:5:15 | LetStmt | gen_let_stmt.rs:5:13:5:14 | 42 |
2+
| gen_let_stmt.rs:6:5:6:20 | LetStmt | gen_let_stmt.rs:6:18:6:19 | 42 |
33
| gen_let_stmt.rs:9:5:9:24 | LetStmt | gen_let_stmt.rs:9:18:9:23 | TupleExpr |
44
| gen_let_stmt.rs:10:5:12:6 | LetStmt | gen_let_stmt.rs:10:19:10:38 | CallExpr |
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
| gen_literal_expr.rs:5:5:5:6 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
2-
| gen_literal_expr.rs:6:5:6:8 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
3-
| gen_literal_expr.rs:7:5:7:19 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
4-
| gen_literal_expr.rs:8:5:8:20 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
5-
| gen_literal_expr.rs:9:5:9:7 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
6-
| gen_literal_expr.rs:10:5:10:8 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
7-
| gen_literal_expr.rs:11:5:11:20 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
8-
| gen_literal_expr.rs:12:5:12:8 | LiteralExpr | getNumberOfAttrs: | 0 | hasTextValue: | yes |
1+
| gen_literal_expr.rs:5:5:5:6 | 42 | getNumberOfAttrs: | 0 | hasTextValue: | yes |
2+
| gen_literal_expr.rs:6:5:6:8 | 42.0 | getNumberOfAttrs: | 0 | hasTextValue: | yes |
3+
| gen_literal_expr.rs:7:5:7:19 | "Hello, world!" | getNumberOfAttrs: | 0 | hasTextValue: | yes |
4+
| gen_literal_expr.rs:8:5:8:20 | b"Hello, world!" | getNumberOfAttrs: | 0 | hasTextValue: | yes |
5+
| gen_literal_expr.rs:9:5:9:7 | 'x' | getNumberOfAttrs: | 0 | hasTextValue: | yes |
6+
| gen_literal_expr.rs:10:5:10:8 | b'x' | getNumberOfAttrs: | 0 | hasTextValue: | yes |
7+
| gen_literal_expr.rs:11:5:11:20 | r"Hello, world!" | getNumberOfAttrs: | 0 | hasTextValue: | yes |
8+
| gen_literal_expr.rs:12:5:12:8 | true | getNumberOfAttrs: | 0 | hasTextValue: | yes |
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
| gen_literal_expr.rs:5:5:5:6 | LiteralExpr | 42 |
2-
| gen_literal_expr.rs:6:5:6:8 | LiteralExpr | 42.0 |
3-
| gen_literal_expr.rs:7:5:7:19 | LiteralExpr | "Hello, world!" |
4-
| gen_literal_expr.rs:8:5:8:20 | LiteralExpr | b"Hello, world!" |
5-
| gen_literal_expr.rs:9:5:9:7 | LiteralExpr | 'x' |
6-
| gen_literal_expr.rs:10:5:10:8 | LiteralExpr | b'x' |
7-
| gen_literal_expr.rs:11:5:11:20 | LiteralExpr | r"Hello, world!" |
8-
| gen_literal_expr.rs:12:5:12:8 | LiteralExpr | true |
1+
| gen_literal_expr.rs:5:5:5:6 | 42 | 42 |
2+
| gen_literal_expr.rs:6:5:6:8 | 42.0 | 42.0 |
3+
| gen_literal_expr.rs:7:5:7:19 | "Hello, world!" | "Hello, world!" |
4+
| gen_literal_expr.rs:8:5:8:20 | b"Hello, world!" | b"Hello, world!" |
5+
| gen_literal_expr.rs:9:5:9:7 | 'x' | 'x' |
6+
| gen_literal_expr.rs:10:5:10:8 | b'x' | b'x' |
7+
| gen_literal_expr.rs:11:5:11:20 | r"Hello, world!" | r"Hello, world!" |
8+
| gen_literal_expr.rs:12:5:12:8 | true | true |

0 commit comments

Comments
 (0)