Skip to content

Commit a42c0f6

Browse files
authored
Merge pull request #18605 from geoffw0/expect
Rust: Improve models for environment sources, expect and unwrap
2 parents f8694a3 + 919e797 commit a42c0f6

File tree

11 files changed

+791
-644
lines changed

11 files changed

+791
-644
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,12 @@ final class DataFlowCallable extends TDataFlowCallable {
4949
}
5050

5151
final class DataFlowCall extends TDataFlowCall {
52-
private CallExprBaseCfgNode call;
53-
54-
DataFlowCall() { this = TCall(call) }
55-
5652
/** Gets the underlying call in the CFG, if any. */
57-
CallExprCfgNode asCallExprCfgNode() { result = call }
53+
CallExprCfgNode asCallExprCfgNode() { result = this.asCallBaseExprCfgNode() }
5854

59-
MethodCallExprCfgNode asMethodCallExprCfgNode() { result = call }
55+
MethodCallExprCfgNode asMethodCallExprCfgNode() { result = this.asCallBaseExprCfgNode() }
6056

61-
CallExprBaseCfgNode asCallBaseExprCfgNode() { result = call }
57+
CallExprBaseCfgNode asCallBaseExprCfgNode() { this = TCall(result) }
6258

6359
predicate isSummaryCall(
6460
FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver
@@ -67,7 +63,7 @@ final class DataFlowCall extends TDataFlowCall {
6763
}
6864

6965
DataFlowCallable getEnclosingCallable() {
70-
result = TCfgScope(call.getExpr().getEnclosingCfgScope())
66+
result = TCfgScope(this.asCallBaseExprCfgNode().getExpr().getEnclosingCfgScope())
7167
or
7268
exists(FlowSummaryImpl::Public::SummarizedCallable c |
7369
this.isSummaryCall(c, _) and
@@ -1298,10 +1294,14 @@ module RustDataFlow implements InputSig<Location> {
12981294
* invoked expression.
12991295
*/
13001296
predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) {
1301-
receiver.asExpr() = call.asCallExprCfgNode().getFunction() and
1302-
// All calls to complex expressions and local variable accesses are lambda call.
1303-
exists(Expr f | f = receiver.asExpr().getExpr() |
1304-
f instanceof PathExpr implies f = any(Variable v).getAnAccess()
1297+
(
1298+
receiver.asExpr() = call.asCallExprCfgNode().getFunction() and
1299+
// All calls to complex expressions and local variable accesses are lambda call.
1300+
exists(Expr f | f = receiver.asExpr().getExpr() |
1301+
f instanceof PathExpr implies f = any(Variable v).getAnAccess()
1302+
)
1303+
or
1304+
call.isSummaryCall(_, receiver.(Node::FlowSummaryNode).getSummaryNode())
13051305
) and
13061306
exists(kind)
13071307
}

rust/ql/lib/codeql/rust/frameworks/stdlib/env.model.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ extensions:
55
data:
66
- ["lang:std", "crate::env::args", "ReturnValue", "command-line-source", "manual"]
77
- ["lang:std", "crate::env::args_os", "ReturnValue", "command-line-source", "manual"]
8-
- ["lang:std", "crate::env::current_dir", "ReturnValue", "command-line-source", "manual"]
9-
- ["lang:std", "crate::env::current_exe", "ReturnValue", "command-line-source", "manual"]
10-
- ["lang:std", "crate::env::home_dir", "ReturnValue", "command-line-source", "manual"]
11-
- ["lang:std", "crate::env::var", "ReturnValue", "environment-source", "manual"]
12-
- ["lang:std", "crate::env::var_os", "ReturnValue", "environment-source", "manual"]
8+
- ["lang:std", "crate::env::current_dir", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "command-line-source", "manual"]
9+
- ["lang:std", "crate::env::current_exe", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "command-line-source", "manual"]
10+
- ["lang:std", "crate::env::home_dir", "ReturnValue.Variant[crate::option::Option::Some(0)]", "command-line-source", "manual"]
11+
- ["lang:std", "crate::env::var", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "environment-source", "manual"]
12+
- ["lang:std", "crate::env::var_os", "ReturnValue.Variant[crate::option::Option::Some(0)]", "environment-source", "manual"]
1313
- ["lang:std", "crate::env::vars", "ReturnValue", "environment-source", "manual"]
1414
- ["lang:std", "crate::env::vars_os", "ReturnValue", "environment-source", "manual"]

rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,31 @@ extensions:
33
pack: codeql/rust-all
44
extensible: summaryModel
55
data:
6+
# Fmt
7+
- ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"]
8+
# Hint
9+
- ["lang:core", "crate::hint::must_use", "Argument[0]", "ReturnValue", "value", "manual"]
610
# Option
711
- ["lang:core", "<crate::option::Option>::unwrap", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"]
812
- ["lang:core", "<crate::option::Option>::unwrap_or", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"]
913
- ["lang:core", "<crate::option::Option>::unwrap_or", "Argument[0]", "ReturnValue", "value", "manual"]
14+
- ["lang:core", "<crate::option::Option>::unwrap_or_default", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"]
15+
- ["lang:core", "<crate::option::Option>::unwrap_or_else", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"]
16+
- ["lang:core", "<crate::option::Option>::unwrap_or_else", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"]
17+
- ["lang:core", "<crate::option::Option>::unwrap_unchecked", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"]
18+
- ["lang:core", "<crate::option::Option>::expect", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"]
1019
# Result
1120
- ["lang:core", "<crate::result::Result>::unwrap", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"]
1221
- ["lang:core", "<crate::result::Result>::unwrap_or", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"]
1322
- ["lang:core", "<crate::result::Result>::unwrap_or", "Argument[0]", "ReturnValue", "value", "manual"]
23+
- ["lang:core", "<crate::result::Result>::unwrap_or_default", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"]
24+
- ["lang:core", "<crate::result::Result>::unwrap_or_else", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"]
25+
- ["lang:core", "<crate::result::Result>::unwrap_or_else", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"]
26+
- ["lang:core", "<crate::result::Result>::unwrap_unchecked", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"]
27+
- ["lang:core", "<crate::result::Result>::unwrap_err", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"]
28+
- ["lang:core", "<crate::result::Result>::unwrap_err_unchecked", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"]
29+
- ["lang:core", "<crate::result::Result>::expect", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"]
30+
- ["lang:core", "<crate::result::Result>::expect_err", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"]
1431
# String
1532
- ["lang:alloc", "<crate::string::String>::as_str", "Argument[self]", "ReturnValue", "taint", "manual"]
1633
- ["lang:alloc", "<crate::string::String>::as_bytes", "Argument[self]", "ReturnValue", "taint", "manual"]
17-
# Hint
18-
- ["lang:core", "crate::hint::must_use", "Argument[0]", "ReturnValue", "value", "manual"]
19-
# Fmt
20-
- ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
identityLocalStep
2-
| main.rs:394:7:394:18 | phi(default_name) | Node steps to itself |
2+
| main.rs:412:9:412:20 | phi(default_name) | Node steps to itself |

0 commit comments

Comments
 (0)