From a1980d4d08079e8e1eb44574c97260251b2996c9 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 17 Jan 2025 10:54:10 +0000 Subject: [PATCH 1/8] Rust: Make sources more accurate (Option / Result contents). --- .../ql/lib/codeql/rust/frameworks/stdlib/env.model.yml | 10 +++++----- rust/ql/test/library-tests/dataflow/sources/test.rs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/env.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/env.model.yml index ceb5a88f0c12..3f433bd98f99 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/env.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/env.model.yml @@ -5,10 +5,10 @@ extensions: data: - ["lang:std", "crate::env::args", "ReturnValue", "command-line-source", "manual"] - ["lang:std", "crate::env::args_os", "ReturnValue", "command-line-source", "manual"] - - ["lang:std", "crate::env::current_dir", "ReturnValue", "command-line-source", "manual"] - - ["lang:std", "crate::env::current_exe", "ReturnValue", "command-line-source", "manual"] - - ["lang:std", "crate::env::home_dir", "ReturnValue", "command-line-source", "manual"] - - ["lang:std", "crate::env::var", "ReturnValue", "environment-source", "manual"] - - ["lang:std", "crate::env::var_os", "ReturnValue", "environment-source", "manual"] + - ["lang:std", "crate::env::current_dir", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "command-line-source", "manual"] + - ["lang:std", "crate::env::current_exe", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "command-line-source", "manual"] + - ["lang:std", "crate::env::home_dir", "ReturnValue.Variant[crate::option::Option::Some(0)]", "command-line-source", "manual"] + - ["lang:std", "crate::env::var", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "environment-source", "manual"] + - ["lang:std", "crate::env::var_os", "ReturnValue.Variant[crate::option::Option::Some(0)]", "environment-source", "manual"] - ["lang:std", "crate::env::vars", "ReturnValue", "environment-source", "manual"] - ["lang:std", "crate::env::vars_os", "ReturnValue", "environment-source", "manual"] diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 0143ccac36c2..9b92bb41b218 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -5,14 +5,14 @@ fn sink(_: T) { } // --- tests --- fn test_env_vars() { - sink(std::env::var("HOME")); // $ Alert[rust/summary/taint-sources] hasTaintFlow="HOME" - sink(std::env::var_os("PATH")); // $ Alert[rust/summary/taint-sources] hasTaintFlow="PATH" + sink(std::env::var("HOME")); // $ Alert[rust/summary/taint-sources] MISSING: hasTaintFlow + sink(std::env::var_os("PATH")); // $ Alert[rust/summary/taint-sources] MISSING: hasTaintFlow let var1 = std::env::var("HOME").expect("HOME not set"); // $ Alert[rust/summary/taint-sources] let var2 = std::env::var_os("PATH").unwrap(); // $ Alert[rust/summary/taint-sources] sink(var1); // $ MISSING: hasTaintFlow - sink(var2); // $ MISSING: hasTaintFlow + sink(var2); // $ hasTaintFlow="PATH" for (key, value) in std::env::vars() { // $ Alert[rust/summary/taint-sources] sink(key); // $ MISSING: hasTaintFlow From 185a23b3c65dc6d5d1bf84d5631faee4e457d8a3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:53:57 +0000 Subject: [PATCH 2/8] Rust: Allow implicit flow out of content at the test sinks, so that we see our results. --- rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql | 6 ++++++ rust/ql/test/library-tests/dataflow/sources/test.rs | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql index 92a41dc46811..7d5f4fb926f5 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql @@ -14,6 +14,12 @@ module MyFlowConfig implements DataFlow::ConfigSig { .getArgList() .getAnArg() = sink.asExpr().getExpr() } + + predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { + // flow out from any content at the sink. + isSink(node) and + exists(c) + } } module MyFlowTest = TaintFlowTest; diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 9b92bb41b218..449828cb995b 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -5,8 +5,8 @@ fn sink(_: T) { } // --- tests --- fn test_env_vars() { - sink(std::env::var("HOME")); // $ Alert[rust/summary/taint-sources] MISSING: hasTaintFlow - sink(std::env::var_os("PATH")); // $ Alert[rust/summary/taint-sources] MISSING: hasTaintFlow + sink(std::env::var("HOME")); // $ Alert[rust/summary/taint-sources] hasTaintFlow="HOME" + sink(std::env::var_os("PATH")); // $ Alert[rust/summary/taint-sources] hasTaintFlow="PATH" let var1 = std::env::var("HOME").expect("HOME not set"); // $ Alert[rust/summary/taint-sources] let var2 = std::env::var_os("PATH").unwrap(); // $ Alert[rust/summary/taint-sources] From c04d619a3c21b8d3563bfe27e6ff6a97ccad2a1f Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 17 Jan 2025 18:23:42 +0000 Subject: [PATCH 3/8] Rust: Add a couple of extra data flow test cases. --- .../dataflow/local/DataFlowStep.expected | 677 +++++++++--------- .../dataflow/local/inline-flow.expected | 404 +++++------ .../test/library-tests/dataflow/local/main.rs | 18 + 3 files changed, 568 insertions(+), 531 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 3633e6fd6154..28edc1e940e3 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -219,255 +219,271 @@ localStep | main.rs:232:9:232:10 | [SSA] s2 | main.rs:233:10:233:11 | s2 | | | main.rs:232:9:232:10 | s2 | main.rs:232:9:232:10 | [SSA] s2 | | | main.rs:232:14:232:20 | Some(...) | main.rs:232:9:232:10 | s2 | | -| main.rs:237:9:237:10 | [SSA] s1 | main.rs:239:14:239:15 | s1 | | +| main.rs:237:9:237:10 | [SSA] s1 | main.rs:238:10:238:11 | s1 | | | main.rs:237:9:237:10 | s1 | main.rs:237:9:237:10 | [SSA] s1 | | | main.rs:237:14:237:29 | Some(...) | main.rs:237:9:237:10 | s1 | | -| main.rs:238:9:238:10 | [SSA] s2 | main.rs:241:10:241:11 | s2 | | -| main.rs:238:9:238:10 | s2 | main.rs:238:9:238:10 | [SSA] s2 | | -| main.rs:238:14:238:20 | Some(...) | main.rs:238:9:238:10 | s2 | | -| main.rs:239:9:239:10 | [SSA] i1 | main.rs:240:10:240:11 | i1 | | -| main.rs:239:9:239:10 | i1 | main.rs:239:9:239:10 | [SSA] i1 | | -| main.rs:239:14:239:16 | TryExpr | main.rs:239:9:239:10 | i1 | | -| main.rs:242:5:242:11 | Some(...) | main.rs:236:41:243:1 | { ... } | | -| main.rs:246:9:246:10 | [SSA] s1 | main.rs:249:14:249:15 | s1 | | -| main.rs:246:9:246:10 | s1 | main.rs:246:9:246:10 | [SSA] s1 | | -| main.rs:246:32:246:45 | Ok(...) | main.rs:246:9:246:10 | s1 | | -| main.rs:247:9:247:10 | [SSA] s2 | main.rs:250:14:250:15 | s2 | | -| main.rs:247:9:247:10 | s2 | main.rs:247:9:247:10 | [SSA] s2 | | -| main.rs:247:32:247:36 | Ok(...) | main.rs:247:9:247:10 | s2 | | -| main.rs:248:9:248:10 | [SSA] s3 | main.rs:253:14:253:15 | s3 | | -| main.rs:248:9:248:10 | s3 | main.rs:248:9:248:10 | [SSA] s3 | | -| main.rs:248:32:248:46 | Err(...) | main.rs:248:9:248:10 | s3 | | -| main.rs:249:9:249:10 | [SSA] i1 | main.rs:251:10:251:11 | i1 | | -| main.rs:249:9:249:10 | i1 | main.rs:249:9:249:10 | [SSA] i1 | | -| main.rs:249:14:249:16 | TryExpr | main.rs:249:9:249:10 | i1 | | -| main.rs:250:9:250:10 | [SSA] i2 | main.rs:252:10:252:11 | i2 | | -| main.rs:250:9:250:10 | i2 | main.rs:250:9:250:10 | [SSA] i2 | | -| main.rs:250:14:250:16 | TryExpr | main.rs:250:9:250:10 | i2 | | -| main.rs:253:9:253:10 | [SSA] i3 | main.rs:254:10:254:11 | i3 | | -| main.rs:253:9:253:10 | i3 | main.rs:253:9:253:10 | [SSA] i3 | | -| main.rs:253:14:253:16 | TryExpr | main.rs:253:9:253:10 | i3 | | -| main.rs:255:5:255:9 | Ok(...) | main.rs:245:46:256:1 | { ... } | | -| main.rs:264:9:264:10 | [SSA] s1 | main.rs:266:11:266:12 | s1 | | -| main.rs:264:9:264:10 | s1 | main.rs:264:9:264:10 | [SSA] s1 | | -| main.rs:264:14:264:39 | ...::A(...) | main.rs:264:9:264:10 | s1 | | -| main.rs:265:9:265:10 | [SSA] s2 | main.rs:273:11:273:12 | s2 | | -| main.rs:265:9:265:10 | s2 | main.rs:265:9:265:10 | [SSA] s2 | | -| main.rs:265:14:265:30 | ...::B(...) | main.rs:265:9:265:10 | s2 | | -| main.rs:266:11:266:12 | s1 | main.rs:267:9:267:25 | ...::A(...) | | -| main.rs:266:11:266:12 | s1 | main.rs:268:9:268:25 | ...::B(...) | | -| main.rs:266:11:266:12 | s1 | main.rs:270:11:270:12 | s1 | | -| main.rs:267:24:267:24 | [SSA] n | main.rs:267:35:267:35 | n | | -| main.rs:267:24:267:24 | n | main.rs:267:24:267:24 | [SSA] n | | -| main.rs:267:30:267:36 | sink(...) | main.rs:266:5:269:5 | match s1 { ... } | | -| main.rs:268:24:268:24 | [SSA] n | main.rs:268:35:268:35 | n | | -| main.rs:268:24:268:24 | n | main.rs:268:24:268:24 | [SSA] n | | -| main.rs:268:30:268:36 | sink(...) | main.rs:266:5:269:5 | match s1 { ... } | | -| main.rs:270:11:270:12 | s1 | main.rs:271:9:271:45 | ... \| ... | | -| main.rs:271:9:271:45 | ... \| ... | main.rs:271:9:271:25 | ...::A(...) | | -| main.rs:271:9:271:45 | ... \| ... | main.rs:271:29:271:45 | ...::B(...) | | -| main.rs:271:9:271:45 | [SSA] [match(true)] phi | main.rs:271:55:271:55 | n | | -| main.rs:271:24:271:24 | [SSA] [input] [match(true)] phi | main.rs:271:9:271:45 | [SSA] [match(true)] phi | | -| main.rs:271:24:271:24 | [SSA] n | main.rs:271:24:271:24 | [SSA] [input] [match(true)] phi | | -| main.rs:271:24:271:24 | n | main.rs:271:24:271:24 | [SSA] n | | -| main.rs:271:44:271:44 | [SSA] [input] [match(true)] phi | main.rs:271:9:271:45 | [SSA] [match(true)] phi | | -| main.rs:271:44:271:44 | [SSA] n | main.rs:271:44:271:44 | [SSA] [input] [match(true)] phi | | -| main.rs:271:44:271:44 | n | main.rs:271:44:271:44 | [SSA] n | | -| main.rs:271:50:271:56 | sink(...) | main.rs:270:5:272:5 | match s1 { ... } | | -| main.rs:273:5:276:5 | match s2 { ... } | main.rs:263:48:277:1 | { ... } | | -| main.rs:273:11:273:12 | s2 | main.rs:274:9:274:25 | ...::A(...) | | -| main.rs:273:11:273:12 | s2 | main.rs:275:9:275:25 | ...::B(...) | | -| main.rs:274:24:274:24 | [SSA] n | main.rs:274:35:274:35 | n | | -| main.rs:274:24:274:24 | n | main.rs:274:24:274:24 | [SSA] n | | -| main.rs:274:30:274:36 | sink(...) | main.rs:273:5:276:5 | match s2 { ... } | | -| main.rs:275:24:275:24 | [SSA] n | main.rs:275:35:275:35 | n | | -| main.rs:275:24:275:24 | n | main.rs:275:24:275:24 | [SSA] n | | -| main.rs:275:30:275:36 | sink(...) | main.rs:273:5:276:5 | match s2 { ... } | | +| main.rs:240:9:240:10 | [SSA] s2 | main.rs:241:10:241:11 | s2 | | +| main.rs:240:9:240:10 | s2 | main.rs:240:9:240:10 | [SSA] s2 | | +| main.rs:240:14:240:17 | None | main.rs:240:9:240:10 | s2 | | +| main.rs:245:9:245:10 | [SSA] s1 | main.rs:247:14:247:15 | s1 | | +| main.rs:245:9:245:10 | s1 | main.rs:245:9:245:10 | [SSA] s1 | | +| main.rs:245:14:245:29 | Some(...) | main.rs:245:9:245:10 | s1 | | +| main.rs:246:9:246:10 | [SSA] s2 | main.rs:249:10:249:11 | s2 | | +| main.rs:246:9:246:10 | s2 | main.rs:246:9:246:10 | [SSA] s2 | | +| main.rs:246:14:246:20 | Some(...) | main.rs:246:9:246:10 | s2 | | +| main.rs:247:9:247:10 | [SSA] i1 | main.rs:248:10:248:11 | i1 | | +| main.rs:247:9:247:10 | i1 | main.rs:247:9:247:10 | [SSA] i1 | | +| main.rs:247:14:247:16 | TryExpr | main.rs:247:9:247:10 | i1 | | +| main.rs:250:5:250:11 | Some(...) | main.rs:244:41:251:1 | { ... } | | +| main.rs:254:9:254:10 | [SSA] s1 | main.rs:257:14:257:15 | s1 | | +| main.rs:254:9:254:10 | s1 | main.rs:254:9:254:10 | [SSA] s1 | | +| main.rs:254:32:254:45 | Ok(...) | main.rs:254:9:254:10 | s1 | | +| main.rs:255:9:255:10 | [SSA] s2 | main.rs:258:14:258:15 | s2 | | +| main.rs:255:9:255:10 | s2 | main.rs:255:9:255:10 | [SSA] s2 | | +| main.rs:255:32:255:36 | Ok(...) | main.rs:255:9:255:10 | s2 | | +| main.rs:256:9:256:10 | [SSA] s3 | main.rs:261:14:261:15 | s3 | | +| main.rs:256:9:256:10 | s3 | main.rs:256:9:256:10 | [SSA] s3 | | +| main.rs:256:32:256:46 | Err(...) | main.rs:256:9:256:10 | s3 | | +| main.rs:257:9:257:10 | [SSA] i1 | main.rs:259:10:259:11 | i1 | | +| main.rs:257:9:257:10 | i1 | main.rs:257:9:257:10 | [SSA] i1 | | +| main.rs:257:14:257:16 | TryExpr | main.rs:257:9:257:10 | i1 | | +| main.rs:258:9:258:10 | [SSA] i2 | main.rs:260:10:260:11 | i2 | | +| main.rs:258:9:258:10 | i2 | main.rs:258:9:258:10 | [SSA] i2 | | +| main.rs:258:14:258:16 | TryExpr | main.rs:258:9:258:10 | i2 | | +| main.rs:261:9:261:10 | [SSA] i3 | main.rs:262:10:262:11 | i3 | | +| main.rs:261:9:261:10 | i3 | main.rs:261:9:261:10 | [SSA] i3 | | +| main.rs:261:14:261:16 | TryExpr | main.rs:261:9:261:10 | i3 | | +| main.rs:263:5:263:9 | Ok(...) | main.rs:253:46:264:1 | { ... } | | +| main.rs:267:9:267:10 | [SSA] s1 | main.rs:268:10:268:11 | s1 | | +| main.rs:267:9:267:10 | s1 | main.rs:267:9:267:10 | [SSA] s1 | | +| main.rs:267:32:267:45 | Ok(...) | main.rs:267:9:267:10 | s1 | | +| main.rs:268:10:268:11 | [post] s1 | main.rs:269:10:269:11 | s1 | | +| main.rs:268:10:268:11 | s1 | main.rs:269:10:269:11 | s1 | | +| main.rs:271:9:271:10 | [SSA] s2 | main.rs:272:10:272:11 | s2 | | +| main.rs:271:9:271:10 | s2 | main.rs:271:9:271:10 | [SSA] s2 | | +| main.rs:271:32:271:46 | Err(...) | main.rs:271:9:271:10 | s2 | | +| main.rs:272:10:272:11 | [post] s2 | main.rs:273:10:273:11 | s2 | | +| main.rs:272:10:272:11 | s2 | main.rs:273:10:273:11 | s2 | | | main.rs:282:9:282:10 | [SSA] s1 | main.rs:284:11:284:12 | s1 | | | main.rs:282:9:282:10 | s1 | main.rs:282:9:282:10 | [SSA] s1 | | -| main.rs:282:14:282:26 | A(...) | main.rs:282:9:282:10 | s1 | | +| main.rs:282:14:282:39 | ...::A(...) | main.rs:282:9:282:10 | s1 | | | main.rs:283:9:283:10 | [SSA] s2 | main.rs:291:11:291:12 | s2 | | | main.rs:283:9:283:10 | s2 | main.rs:283:9:283:10 | [SSA] s2 | | -| main.rs:283:14:283:17 | B(...) | main.rs:283:9:283:10 | s2 | | -| main.rs:284:11:284:12 | s1 | main.rs:285:9:285:12 | A(...) | | -| main.rs:284:11:284:12 | s1 | main.rs:286:9:286:12 | B(...) | | +| main.rs:283:14:283:30 | ...::B(...) | main.rs:283:9:283:10 | s2 | | +| main.rs:284:11:284:12 | s1 | main.rs:285:9:285:25 | ...::A(...) | | +| main.rs:284:11:284:12 | s1 | main.rs:286:9:286:25 | ...::B(...) | | | main.rs:284:11:284:12 | s1 | main.rs:288:11:288:12 | s1 | | -| main.rs:285:11:285:11 | [SSA] n | main.rs:285:22:285:22 | n | | -| main.rs:285:11:285:11 | n | main.rs:285:11:285:11 | [SSA] n | | -| main.rs:285:17:285:23 | sink(...) | main.rs:284:5:287:5 | match s1 { ... } | | -| main.rs:286:11:286:11 | [SSA] n | main.rs:286:22:286:22 | n | | -| main.rs:286:11:286:11 | n | main.rs:286:11:286:11 | [SSA] n | | -| main.rs:286:17:286:23 | sink(...) | main.rs:284:5:287:5 | match s1 { ... } | | -| main.rs:288:11:288:12 | s1 | main.rs:289:9:289:19 | ... \| ... | | -| main.rs:289:9:289:19 | ... \| ... | main.rs:289:9:289:12 | A(...) | | -| main.rs:289:9:289:19 | ... \| ... | main.rs:289:16:289:19 | B(...) | | -| main.rs:289:9:289:19 | [SSA] [match(true)] phi | main.rs:289:29:289:29 | n | | -| main.rs:289:11:289:11 | [SSA] [input] [match(true)] phi | main.rs:289:9:289:19 | [SSA] [match(true)] phi | | -| main.rs:289:11:289:11 | [SSA] n | main.rs:289:11:289:11 | [SSA] [input] [match(true)] phi | | -| main.rs:289:11:289:11 | n | main.rs:289:11:289:11 | [SSA] n | | -| main.rs:289:18:289:18 | [SSA] [input] [match(true)] phi | main.rs:289:9:289:19 | [SSA] [match(true)] phi | | -| main.rs:289:18:289:18 | [SSA] n | main.rs:289:18:289:18 | [SSA] [input] [match(true)] phi | | -| main.rs:289:18:289:18 | n | main.rs:289:18:289:18 | [SSA] n | | -| main.rs:289:24:289:30 | sink(...) | main.rs:288:5:290:5 | match s1 { ... } | | -| main.rs:291:5:294:5 | match s2 { ... } | main.rs:281:50:295:1 | { ... } | | -| main.rs:291:11:291:12 | s2 | main.rs:292:9:292:12 | A(...) | | -| main.rs:291:11:291:12 | s2 | main.rs:293:9:293:12 | B(...) | | -| main.rs:292:11:292:11 | [SSA] n | main.rs:292:22:292:22 | n | | -| main.rs:292:11:292:11 | n | main.rs:292:11:292:11 | [SSA] n | | -| main.rs:292:17:292:23 | sink(...) | main.rs:291:5:294:5 | match s2 { ... } | | -| main.rs:293:11:293:11 | [SSA] n | main.rs:293:22:293:22 | n | | -| main.rs:293:11:293:11 | n | main.rs:293:11:293:11 | [SSA] n | | -| main.rs:293:17:293:23 | sink(...) | main.rs:291:5:294:5 | match s2 { ... } | | -| main.rs:303:9:303:10 | [SSA] s1 | main.rs:307:11:307:12 | s1 | | -| main.rs:303:9:303:10 | s1 | main.rs:303:9:303:10 | [SSA] s1 | | -| main.rs:303:14:305:5 | ...::C {...} | main.rs:303:9:303:10 | s1 | | -| main.rs:306:9:306:10 | [SSA] s2 | main.rs:314:11:314:12 | s2 | | -| main.rs:306:9:306:10 | s2 | main.rs:306:9:306:10 | [SSA] s2 | | -| main.rs:306:14:306:43 | ...::D {...} | main.rs:306:9:306:10 | s2 | | -| main.rs:307:11:307:12 | s1 | main.rs:308:9:308:38 | ...::C {...} | | -| main.rs:307:11:307:12 | s1 | main.rs:309:9:309:38 | ...::D {...} | | -| main.rs:307:11:307:12 | s1 | main.rs:311:11:311:12 | s1 | | -| main.rs:308:36:308:36 | [SSA] n | main.rs:308:48:308:48 | n | | -| main.rs:308:36:308:36 | n | main.rs:308:36:308:36 | [SSA] n | | -| main.rs:308:43:308:49 | sink(...) | main.rs:307:5:310:5 | match s1 { ... } | | -| main.rs:309:36:309:36 | [SSA] n | main.rs:309:48:309:48 | n | | -| main.rs:309:36:309:36 | n | main.rs:309:36:309:36 | [SSA] n | | -| main.rs:309:43:309:49 | sink(...) | main.rs:307:5:310:5 | match s1 { ... } | | -| main.rs:311:11:311:12 | s1 | main.rs:312:9:312:71 | ... \| ... | | -| main.rs:312:9:312:71 | ... \| ... | main.rs:312:9:312:38 | ...::C {...} | | -| main.rs:312:9:312:71 | ... \| ... | main.rs:312:42:312:71 | ...::D {...} | | -| main.rs:312:9:312:71 | [SSA] [match(true)] phi | main.rs:312:81:312:81 | n | | -| main.rs:312:36:312:36 | [SSA] [input] [match(true)] phi | main.rs:312:9:312:71 | [SSA] [match(true)] phi | | -| main.rs:312:36:312:36 | [SSA] n | main.rs:312:36:312:36 | [SSA] [input] [match(true)] phi | | -| main.rs:312:36:312:36 | n | main.rs:312:36:312:36 | [SSA] n | | -| main.rs:312:69:312:69 | [SSA] [input] [match(true)] phi | main.rs:312:9:312:71 | [SSA] [match(true)] phi | | -| main.rs:312:69:312:69 | [SSA] n | main.rs:312:69:312:69 | [SSA] [input] [match(true)] phi | | -| main.rs:312:69:312:69 | n | main.rs:312:69:312:69 | [SSA] n | | -| main.rs:312:76:312:82 | sink(...) | main.rs:311:5:313:5 | match s1 { ... } | | -| main.rs:314:5:317:5 | match s2 { ... } | main.rs:302:49:318:1 | { ... } | | -| main.rs:314:11:314:12 | s2 | main.rs:315:9:315:38 | ...::C {...} | | -| main.rs:314:11:314:12 | s2 | main.rs:316:9:316:38 | ...::D {...} | | -| main.rs:315:36:315:36 | [SSA] n | main.rs:315:48:315:48 | n | | -| main.rs:315:36:315:36 | n | main.rs:315:36:315:36 | [SSA] n | | -| main.rs:315:43:315:49 | sink(...) | main.rs:314:5:317:5 | match s2 { ... } | | -| main.rs:316:36:316:36 | [SSA] n | main.rs:316:48:316:48 | n | | -| main.rs:316:36:316:36 | n | main.rs:316:36:316:36 | [SSA] n | | -| main.rs:316:43:316:49 | sink(...) | main.rs:314:5:317:5 | match s2 { ... } | | -| main.rs:323:9:323:10 | [SSA] s1 | main.rs:327:11:327:12 | s1 | | -| main.rs:323:9:323:10 | s1 | main.rs:323:9:323:10 | [SSA] s1 | | -| main.rs:323:14:325:5 | C {...} | main.rs:323:9:323:10 | s1 | | -| main.rs:326:9:326:10 | [SSA] s2 | main.rs:334:11:334:12 | s2 | | -| main.rs:326:9:326:10 | s2 | main.rs:326:9:326:10 | [SSA] s2 | | -| main.rs:326:14:326:29 | D {...} | main.rs:326:9:326:10 | s2 | | -| main.rs:327:11:327:12 | s1 | main.rs:328:9:328:24 | C {...} | | -| main.rs:327:11:327:12 | s1 | main.rs:329:9:329:24 | D {...} | | -| main.rs:327:11:327:12 | s1 | main.rs:331:11:331:12 | s1 | | -| main.rs:328:22:328:22 | [SSA] n | main.rs:328:34:328:34 | n | | -| main.rs:328:22:328:22 | n | main.rs:328:22:328:22 | [SSA] n | | -| main.rs:328:29:328:35 | sink(...) | main.rs:327:5:330:5 | match s1 { ... } | | -| main.rs:329:22:329:22 | [SSA] n | main.rs:329:34:329:34 | n | | -| main.rs:329:22:329:22 | n | main.rs:329:22:329:22 | [SSA] n | | -| main.rs:329:29:329:35 | sink(...) | main.rs:327:5:330:5 | match s1 { ... } | | -| main.rs:331:11:331:12 | s1 | main.rs:332:9:332:43 | ... \| ... | | -| main.rs:332:9:332:43 | ... \| ... | main.rs:332:9:332:24 | C {...} | | -| main.rs:332:9:332:43 | ... \| ... | main.rs:332:28:332:43 | D {...} | | -| main.rs:332:9:332:43 | [SSA] [match(true)] phi | main.rs:332:53:332:53 | n | | -| main.rs:332:22:332:22 | [SSA] [input] [match(true)] phi | main.rs:332:9:332:43 | [SSA] [match(true)] phi | | -| main.rs:332:22:332:22 | [SSA] n | main.rs:332:22:332:22 | [SSA] [input] [match(true)] phi | | -| main.rs:332:22:332:22 | n | main.rs:332:22:332:22 | [SSA] n | | -| main.rs:332:41:332:41 | [SSA] [input] [match(true)] phi | main.rs:332:9:332:43 | [SSA] [match(true)] phi | | -| main.rs:332:41:332:41 | [SSA] n | main.rs:332:41:332:41 | [SSA] [input] [match(true)] phi | | -| main.rs:332:41:332:41 | n | main.rs:332:41:332:41 | [SSA] n | | -| main.rs:332:48:332:54 | sink(...) | main.rs:331:5:333:5 | match s1 { ... } | | -| main.rs:334:5:337:5 | match s2 { ... } | main.rs:322:51:338:1 | { ... } | | -| main.rs:334:11:334:12 | s2 | main.rs:335:9:335:24 | C {...} | | -| main.rs:334:11:334:12 | s2 | main.rs:336:9:336:24 | D {...} | | -| main.rs:335:22:335:22 | [SSA] n | main.rs:335:34:335:34 | n | | -| main.rs:335:22:335:22 | n | main.rs:335:22:335:22 | [SSA] n | | -| main.rs:335:29:335:35 | sink(...) | main.rs:334:5:337:5 | match s2 { ... } | | -| main.rs:336:22:336:22 | [SSA] n | main.rs:336:34:336:34 | n | | -| main.rs:336:22:336:22 | n | main.rs:336:22:336:22 | [SSA] n | | -| main.rs:336:29:336:35 | sink(...) | main.rs:334:5:337:5 | match s2 { ... } | | -| main.rs:344:9:344:12 | [SSA] arr1 | main.rs:345:14:345:17 | arr1 | | -| main.rs:344:9:344:12 | arr1 | main.rs:344:9:344:12 | [SSA] arr1 | | -| main.rs:344:16:344:33 | [...] | main.rs:344:9:344:12 | arr1 | | -| main.rs:345:9:345:10 | [SSA] n1 | main.rs:346:10:346:11 | n1 | | -| main.rs:345:9:345:10 | n1 | main.rs:345:9:345:10 | [SSA] n1 | | -| main.rs:345:14:345:20 | arr1[2] | main.rs:345:9:345:10 | n1 | | -| main.rs:348:9:348:12 | [SSA] arr2 | main.rs:349:14:349:17 | arr2 | | -| main.rs:348:9:348:12 | arr2 | main.rs:348:9:348:12 | [SSA] arr2 | | -| main.rs:348:16:348:31 | [...; 10] | main.rs:348:9:348:12 | arr2 | | -| main.rs:349:9:349:10 | [SSA] n2 | main.rs:350:10:350:11 | n2 | | -| main.rs:349:9:349:10 | n2 | main.rs:349:9:349:10 | [SSA] n2 | | -| main.rs:349:14:349:20 | arr2[4] | main.rs:349:9:349:10 | n2 | | -| main.rs:352:9:352:12 | [SSA] arr3 | main.rs:353:14:353:17 | arr3 | | -| main.rs:352:9:352:12 | arr3 | main.rs:352:9:352:12 | [SSA] arr3 | | -| main.rs:352:16:352:24 | [...] | main.rs:352:9:352:12 | arr3 | | -| main.rs:353:9:353:10 | [SSA] n3 | main.rs:354:10:354:11 | n3 | | -| main.rs:353:9:353:10 | n3 | main.rs:353:9:353:10 | [SSA] n3 | | -| main.rs:353:14:353:20 | arr3[2] | main.rs:353:9:353:10 | n3 | | -| main.rs:358:9:358:12 | [SSA] arr1 | main.rs:359:15:359:18 | arr1 | | -| main.rs:358:9:358:12 | arr1 | main.rs:358:9:358:12 | [SSA] arr1 | | -| main.rs:358:16:358:33 | [...] | main.rs:358:9:358:12 | arr1 | | -| main.rs:359:9:359:10 | [SSA] n1 | main.rs:360:14:360:15 | n1 | | -| main.rs:359:9:359:10 | n1 | main.rs:359:9:359:10 | [SSA] n1 | | -| main.rs:363:9:363:12 | [SSA] arr2 | main.rs:364:15:364:18 | arr2 | | -| main.rs:363:9:363:12 | arr2 | main.rs:363:9:363:12 | [SSA] arr2 | | -| main.rs:363:16:363:24 | [...] | main.rs:363:9:363:12 | arr2 | | -| main.rs:364:5:366:5 | for ... in ... { ... } | main.rs:357:21:367:1 | { ... } | | -| main.rs:364:9:364:10 | [SSA] n2 | main.rs:365:14:365:15 | n2 | | -| main.rs:364:9:364:10 | n2 | main.rs:364:9:364:10 | [SSA] n2 | | -| main.rs:370:9:370:12 | [SSA] arr1 | main.rs:371:11:371:14 | arr1 | | -| main.rs:370:9:370:12 | arr1 | main.rs:370:9:370:12 | [SSA] arr1 | | -| main.rs:370:16:370:33 | [...] | main.rs:370:9:370:12 | arr1 | | -| main.rs:371:5:377:5 | match arr1 { ... } | main.rs:369:26:378:1 | { ... } | | -| main.rs:371:11:371:14 | arr1 | main.rs:372:9:372:17 | SlicePat | | -| main.rs:372:10:372:10 | [SSA] a | main.rs:373:18:373:18 | a | | -| main.rs:372:10:372:10 | a | main.rs:372:10:372:10 | [SSA] a | | -| main.rs:372:13:372:13 | [SSA] b | main.rs:374:18:374:18 | b | | -| main.rs:372:13:372:13 | b | main.rs:372:13:372:13 | [SSA] b | | -| main.rs:372:16:372:16 | [SSA] c | main.rs:375:18:375:18 | c | | -| main.rs:372:16:372:16 | c | main.rs:372:16:372:16 | [SSA] c | | -| main.rs:372:22:376:9 | { ... } | main.rs:371:5:377:5 | match arr1 { ... } | | -| main.rs:381:9:381:19 | [SSA] mut_arr | main.rs:382:10:382:16 | mut_arr | | -| main.rs:381:9:381:19 | mut_arr | main.rs:381:9:381:19 | [SSA] mut_arr | | -| main.rs:381:23:381:31 | [...] | main.rs:381:9:381:19 | mut_arr | | -| main.rs:382:10:382:16 | [post] mut_arr | main.rs:384:5:384:11 | mut_arr | | -| main.rs:382:10:382:16 | mut_arr | main.rs:384:5:384:11 | mut_arr | | -| main.rs:384:5:384:11 | [post] mut_arr | main.rs:385:13:385:19 | mut_arr | | -| main.rs:384:5:384:11 | mut_arr | main.rs:385:13:385:19 | mut_arr | | -| main.rs:384:18:384:27 | source(...) | main.rs:384:5:384:14 | mut_arr[1] | | -| main.rs:385:9:385:9 | [SSA] d | main.rs:386:10:386:10 | d | | -| main.rs:385:9:385:9 | d | main.rs:385:9:385:9 | [SSA] d | | -| main.rs:385:13:385:19 | [post] mut_arr | main.rs:387:10:387:16 | mut_arr | | -| main.rs:385:13:385:19 | mut_arr | main.rs:387:10:387:16 | mut_arr | | -| main.rs:385:13:385:22 | mut_arr[1] | main.rs:385:9:385:9 | d | | -| main.rs:392:39:392:43 | [SSA] names | main.rs:394:23:394:27 | names | | -| main.rs:392:39:392:43 | names | main.rs:392:39:392:43 | [SSA] names | | -| main.rs:392:39:392:72 | ...: Vec::<...> | main.rs:392:39:392:43 | names | | -| main.rs:393:7:393:18 | default_name | main.rs:393:7:393:18 | [SSA] default_name | | -| main.rs:393:22:393:43 | ... .to_string(...) | main.rs:393:7:393:18 | default_name | | -| main.rs:393:22:393:43 | ... .to_string(...) | main.rs:394:7:394:18 | phi(default_name) | | -| main.rs:394:3:400:3 | for ... in ... { ... } | main.rs:392:75:401:1 | { ... } | | -| main.rs:394:7:394:18 | phi(default_name) | main.rs:394:7:394:18 | phi(default_name) | | -| main.rs:394:7:394:18 | phi(default_name) | main.rs:396:35:396:61 | default_name | | -| main.rs:394:8:394:11 | [SSA] cond | main.rs:395:8:395:11 | cond | | -| main.rs:394:8:394:11 | cond | main.rs:394:8:394:11 | [SSA] cond | | -| main.rs:394:14:394:17 | [SSA] name | main.rs:396:15:396:18 | name | | -| main.rs:394:14:394:17 | name | main.rs:394:14:394:17 | [SSA] name | | -| main.rs:395:5:399:5 | if cond {...} | main.rs:394:29:400:3 | { ... } | | -| main.rs:396:11:396:11 | [SSA] n | main.rs:397:12:397:12 | n | | -| main.rs:396:11:396:11 | n | main.rs:396:11:396:11 | [SSA] n | | -| main.rs:396:15:396:62 | name.unwrap_or_else(...) | main.rs:396:11:396:11 | n | | -| main.rs:396:35:396:61 | [post] default_name | main.rs:394:7:394:18 | phi(default_name) | | -| main.rs:396:35:396:61 | closure self in \|...\| ... | main.rs:396:38:396:49 | this | | -| main.rs:396:35:396:61 | default_name | main.rs:394:7:394:18 | phi(default_name) | | -| main.rs:410:9:410:9 | [SSA] s | main.rs:411:10:411:10 | s | | -| main.rs:410:9:410:9 | s | main.rs:410:9:410:9 | [SSA] s | | -| main.rs:410:13:410:27 | MacroExpr | main.rs:410:9:410:9 | s | | -| main.rs:410:25:410:26 | source(...) | main.rs:410:13:410:27 | MacroExpr | | -| main.rs:436:13:436:33 | result_questionmark(...) | main.rs:436:9:436:9 | _ | | -| main.rs:448:36:448:41 | ...::new(...) | main.rs:448:36:448:41 | MacroExpr | | +| main.rs:285:24:285:24 | [SSA] n | main.rs:285:35:285:35 | n | | +| main.rs:285:24:285:24 | n | main.rs:285:24:285:24 | [SSA] n | | +| main.rs:285:30:285:36 | sink(...) | main.rs:284:5:287:5 | match s1 { ... } | | +| main.rs:286:24:286:24 | [SSA] n | main.rs:286:35:286:35 | n | | +| main.rs:286:24:286:24 | n | main.rs:286:24:286:24 | [SSA] n | | +| main.rs:286:30:286:36 | sink(...) | main.rs:284:5:287:5 | match s1 { ... } | | +| main.rs:288:11:288:12 | s1 | main.rs:289:9:289:45 | ... \| ... | | +| main.rs:289:9:289:45 | ... \| ... | main.rs:289:9:289:25 | ...::A(...) | | +| main.rs:289:9:289:45 | ... \| ... | main.rs:289:29:289:45 | ...::B(...) | | +| main.rs:289:9:289:45 | [SSA] [match(true)] phi | main.rs:289:55:289:55 | n | | +| main.rs:289:24:289:24 | [SSA] [input] [match(true)] phi | main.rs:289:9:289:45 | [SSA] [match(true)] phi | | +| main.rs:289:24:289:24 | [SSA] n | main.rs:289:24:289:24 | [SSA] [input] [match(true)] phi | | +| main.rs:289:24:289:24 | n | main.rs:289:24:289:24 | [SSA] n | | +| main.rs:289:44:289:44 | [SSA] [input] [match(true)] phi | main.rs:289:9:289:45 | [SSA] [match(true)] phi | | +| main.rs:289:44:289:44 | [SSA] n | main.rs:289:44:289:44 | [SSA] [input] [match(true)] phi | | +| main.rs:289:44:289:44 | n | main.rs:289:44:289:44 | [SSA] n | | +| main.rs:289:50:289:56 | sink(...) | main.rs:288:5:290:5 | match s1 { ... } | | +| main.rs:291:5:294:5 | match s2 { ... } | main.rs:281:48:295:1 | { ... } | | +| main.rs:291:11:291:12 | s2 | main.rs:292:9:292:25 | ...::A(...) | | +| main.rs:291:11:291:12 | s2 | main.rs:293:9:293:25 | ...::B(...) | | +| main.rs:292:24:292:24 | [SSA] n | main.rs:292:35:292:35 | n | | +| main.rs:292:24:292:24 | n | main.rs:292:24:292:24 | [SSA] n | | +| main.rs:292:30:292:36 | sink(...) | main.rs:291:5:294:5 | match s2 { ... } | | +| main.rs:293:24:293:24 | [SSA] n | main.rs:293:35:293:35 | n | | +| main.rs:293:24:293:24 | n | main.rs:293:24:293:24 | [SSA] n | | +| main.rs:293:30:293:36 | sink(...) | main.rs:291:5:294:5 | match s2 { ... } | | +| main.rs:300:9:300:10 | [SSA] s1 | main.rs:302:11:302:12 | s1 | | +| main.rs:300:9:300:10 | s1 | main.rs:300:9:300:10 | [SSA] s1 | | +| main.rs:300:14:300:26 | A(...) | main.rs:300:9:300:10 | s1 | | +| main.rs:301:9:301:10 | [SSA] s2 | main.rs:309:11:309:12 | s2 | | +| main.rs:301:9:301:10 | s2 | main.rs:301:9:301:10 | [SSA] s2 | | +| main.rs:301:14:301:17 | B(...) | main.rs:301:9:301:10 | s2 | | +| main.rs:302:11:302:12 | s1 | main.rs:303:9:303:12 | A(...) | | +| main.rs:302:11:302:12 | s1 | main.rs:304:9:304:12 | B(...) | | +| main.rs:302:11:302:12 | s1 | main.rs:306:11:306:12 | s1 | | +| main.rs:303:11:303:11 | [SSA] n | main.rs:303:22:303:22 | n | | +| main.rs:303:11:303:11 | n | main.rs:303:11:303:11 | [SSA] n | | +| main.rs:303:17:303:23 | sink(...) | main.rs:302:5:305:5 | match s1 { ... } | | +| main.rs:304:11:304:11 | [SSA] n | main.rs:304:22:304:22 | n | | +| main.rs:304:11:304:11 | n | main.rs:304:11:304:11 | [SSA] n | | +| main.rs:304:17:304:23 | sink(...) | main.rs:302:5:305:5 | match s1 { ... } | | +| main.rs:306:11:306:12 | s1 | main.rs:307:9:307:19 | ... \| ... | | +| main.rs:307:9:307:19 | ... \| ... | main.rs:307:9:307:12 | A(...) | | +| main.rs:307:9:307:19 | ... \| ... | main.rs:307:16:307:19 | B(...) | | +| main.rs:307:9:307:19 | [SSA] [match(true)] phi | main.rs:307:29:307:29 | n | | +| main.rs:307:11:307:11 | [SSA] [input] [match(true)] phi | main.rs:307:9:307:19 | [SSA] [match(true)] phi | | +| main.rs:307:11:307:11 | [SSA] n | main.rs:307:11:307:11 | [SSA] [input] [match(true)] phi | | +| main.rs:307:11:307:11 | n | main.rs:307:11:307:11 | [SSA] n | | +| main.rs:307:18:307:18 | [SSA] [input] [match(true)] phi | main.rs:307:9:307:19 | [SSA] [match(true)] phi | | +| main.rs:307:18:307:18 | [SSA] n | main.rs:307:18:307:18 | [SSA] [input] [match(true)] phi | | +| main.rs:307:18:307:18 | n | main.rs:307:18:307:18 | [SSA] n | | +| main.rs:307:24:307:30 | sink(...) | main.rs:306:5:308:5 | match s1 { ... } | | +| main.rs:309:5:312:5 | match s2 { ... } | main.rs:299:50:313:1 | { ... } | | +| main.rs:309:11:309:12 | s2 | main.rs:310:9:310:12 | A(...) | | +| main.rs:309:11:309:12 | s2 | main.rs:311:9:311:12 | B(...) | | +| main.rs:310:11:310:11 | [SSA] n | main.rs:310:22:310:22 | n | | +| main.rs:310:11:310:11 | n | main.rs:310:11:310:11 | [SSA] n | | +| main.rs:310:17:310:23 | sink(...) | main.rs:309:5:312:5 | match s2 { ... } | | +| main.rs:311:11:311:11 | [SSA] n | main.rs:311:22:311:22 | n | | +| main.rs:311:11:311:11 | n | main.rs:311:11:311:11 | [SSA] n | | +| main.rs:311:17:311:23 | sink(...) | main.rs:309:5:312:5 | match s2 { ... } | | +| main.rs:321:9:321:10 | [SSA] s1 | main.rs:325:11:325:12 | s1 | | +| main.rs:321:9:321:10 | s1 | main.rs:321:9:321:10 | [SSA] s1 | | +| main.rs:321:14:323:5 | ...::C {...} | main.rs:321:9:321:10 | s1 | | +| main.rs:324:9:324:10 | [SSA] s2 | main.rs:332:11:332:12 | s2 | | +| main.rs:324:9:324:10 | s2 | main.rs:324:9:324:10 | [SSA] s2 | | +| main.rs:324:14:324:43 | ...::D {...} | main.rs:324:9:324:10 | s2 | | +| main.rs:325:11:325:12 | s1 | main.rs:326:9:326:38 | ...::C {...} | | +| main.rs:325:11:325:12 | s1 | main.rs:327:9:327:38 | ...::D {...} | | +| main.rs:325:11:325:12 | s1 | main.rs:329:11:329:12 | s1 | | +| main.rs:326:36:326:36 | [SSA] n | main.rs:326:48:326:48 | n | | +| main.rs:326:36:326:36 | n | main.rs:326:36:326:36 | [SSA] n | | +| main.rs:326:43:326:49 | sink(...) | main.rs:325:5:328:5 | match s1 { ... } | | +| main.rs:327:36:327:36 | [SSA] n | main.rs:327:48:327:48 | n | | +| main.rs:327:36:327:36 | n | main.rs:327:36:327:36 | [SSA] n | | +| main.rs:327:43:327:49 | sink(...) | main.rs:325:5:328:5 | match s1 { ... } | | +| main.rs:329:11:329:12 | s1 | main.rs:330:9:330:71 | ... \| ... | | +| main.rs:330:9:330:71 | ... \| ... | main.rs:330:9:330:38 | ...::C {...} | | +| main.rs:330:9:330:71 | ... \| ... | main.rs:330:42:330:71 | ...::D {...} | | +| main.rs:330:9:330:71 | [SSA] [match(true)] phi | main.rs:330:81:330:81 | n | | +| main.rs:330:36:330:36 | [SSA] [input] [match(true)] phi | main.rs:330:9:330:71 | [SSA] [match(true)] phi | | +| main.rs:330:36:330:36 | [SSA] n | main.rs:330:36:330:36 | [SSA] [input] [match(true)] phi | | +| main.rs:330:36:330:36 | n | main.rs:330:36:330:36 | [SSA] n | | +| main.rs:330:69:330:69 | [SSA] [input] [match(true)] phi | main.rs:330:9:330:71 | [SSA] [match(true)] phi | | +| main.rs:330:69:330:69 | [SSA] n | main.rs:330:69:330:69 | [SSA] [input] [match(true)] phi | | +| main.rs:330:69:330:69 | n | main.rs:330:69:330:69 | [SSA] n | | +| main.rs:330:76:330:82 | sink(...) | main.rs:329:5:331:5 | match s1 { ... } | | +| main.rs:332:5:335:5 | match s2 { ... } | main.rs:320:49:336:1 | { ... } | | +| main.rs:332:11:332:12 | s2 | main.rs:333:9:333:38 | ...::C {...} | | +| main.rs:332:11:332:12 | s2 | main.rs:334:9:334:38 | ...::D {...} | | +| main.rs:333:36:333:36 | [SSA] n | main.rs:333:48:333:48 | n | | +| main.rs:333:36:333:36 | n | main.rs:333:36:333:36 | [SSA] n | | +| main.rs:333:43:333:49 | sink(...) | main.rs:332:5:335:5 | match s2 { ... } | | +| main.rs:334:36:334:36 | [SSA] n | main.rs:334:48:334:48 | n | | +| main.rs:334:36:334:36 | n | main.rs:334:36:334:36 | [SSA] n | | +| main.rs:334:43:334:49 | sink(...) | main.rs:332:5:335:5 | match s2 { ... } | | +| main.rs:341:9:341:10 | [SSA] s1 | main.rs:345:11:345:12 | s1 | | +| main.rs:341:9:341:10 | s1 | main.rs:341:9:341:10 | [SSA] s1 | | +| main.rs:341:14:343:5 | C {...} | main.rs:341:9:341:10 | s1 | | +| main.rs:344:9:344:10 | [SSA] s2 | main.rs:352:11:352:12 | s2 | | +| main.rs:344:9:344:10 | s2 | main.rs:344:9:344:10 | [SSA] s2 | | +| main.rs:344:14:344:29 | D {...} | main.rs:344:9:344:10 | s2 | | +| main.rs:345:11:345:12 | s1 | main.rs:346:9:346:24 | C {...} | | +| main.rs:345:11:345:12 | s1 | main.rs:347:9:347:24 | D {...} | | +| main.rs:345:11:345:12 | s1 | main.rs:349:11:349:12 | s1 | | +| main.rs:346:22:346:22 | [SSA] n | main.rs:346:34:346:34 | n | | +| main.rs:346:22:346:22 | n | main.rs:346:22:346:22 | [SSA] n | | +| main.rs:346:29:346:35 | sink(...) | main.rs:345:5:348:5 | match s1 { ... } | | +| main.rs:347:22:347:22 | [SSA] n | main.rs:347:34:347:34 | n | | +| main.rs:347:22:347:22 | n | main.rs:347:22:347:22 | [SSA] n | | +| main.rs:347:29:347:35 | sink(...) | main.rs:345:5:348:5 | match s1 { ... } | | +| main.rs:349:11:349:12 | s1 | main.rs:350:9:350:43 | ... \| ... | | +| main.rs:350:9:350:43 | ... \| ... | main.rs:350:9:350:24 | C {...} | | +| main.rs:350:9:350:43 | ... \| ... | main.rs:350:28:350:43 | D {...} | | +| main.rs:350:9:350:43 | [SSA] [match(true)] phi | main.rs:350:53:350:53 | n | | +| main.rs:350:22:350:22 | [SSA] [input] [match(true)] phi | main.rs:350:9:350:43 | [SSA] [match(true)] phi | | +| main.rs:350:22:350:22 | [SSA] n | main.rs:350:22:350:22 | [SSA] [input] [match(true)] phi | | +| main.rs:350:22:350:22 | n | main.rs:350:22:350:22 | [SSA] n | | +| main.rs:350:41:350:41 | [SSA] [input] [match(true)] phi | main.rs:350:9:350:43 | [SSA] [match(true)] phi | | +| main.rs:350:41:350:41 | [SSA] n | main.rs:350:41:350:41 | [SSA] [input] [match(true)] phi | | +| main.rs:350:41:350:41 | n | main.rs:350:41:350:41 | [SSA] n | | +| main.rs:350:48:350:54 | sink(...) | main.rs:349:5:351:5 | match s1 { ... } | | +| main.rs:352:5:355:5 | match s2 { ... } | main.rs:340:51:356:1 | { ... } | | +| main.rs:352:11:352:12 | s2 | main.rs:353:9:353:24 | C {...} | | +| main.rs:352:11:352:12 | s2 | main.rs:354:9:354:24 | D {...} | | +| main.rs:353:22:353:22 | [SSA] n | main.rs:353:34:353:34 | n | | +| main.rs:353:22:353:22 | n | main.rs:353:22:353:22 | [SSA] n | | +| main.rs:353:29:353:35 | sink(...) | main.rs:352:5:355:5 | match s2 { ... } | | +| main.rs:354:22:354:22 | [SSA] n | main.rs:354:34:354:34 | n | | +| main.rs:354:22:354:22 | n | main.rs:354:22:354:22 | [SSA] n | | +| main.rs:354:29:354:35 | sink(...) | main.rs:352:5:355:5 | match s2 { ... } | | +| main.rs:362:9:362:12 | [SSA] arr1 | main.rs:363:14:363:17 | arr1 | | +| main.rs:362:9:362:12 | arr1 | main.rs:362:9:362:12 | [SSA] arr1 | | +| main.rs:362:16:362:33 | [...] | main.rs:362:9:362:12 | arr1 | | +| main.rs:363:9:363:10 | [SSA] n1 | main.rs:364:10:364:11 | n1 | | +| main.rs:363:9:363:10 | n1 | main.rs:363:9:363:10 | [SSA] n1 | | +| main.rs:363:14:363:20 | arr1[2] | main.rs:363:9:363:10 | n1 | | +| main.rs:366:9:366:12 | [SSA] arr2 | main.rs:367:14:367:17 | arr2 | | +| main.rs:366:9:366:12 | arr2 | main.rs:366:9:366:12 | [SSA] arr2 | | +| main.rs:366:16:366:31 | [...; 10] | main.rs:366:9:366:12 | arr2 | | +| main.rs:367:9:367:10 | [SSA] n2 | main.rs:368:10:368:11 | n2 | | +| main.rs:367:9:367:10 | n2 | main.rs:367:9:367:10 | [SSA] n2 | | +| main.rs:367:14:367:20 | arr2[4] | main.rs:367:9:367:10 | n2 | | +| main.rs:370:9:370:12 | [SSA] arr3 | main.rs:371:14:371:17 | arr3 | | +| main.rs:370:9:370:12 | arr3 | main.rs:370:9:370:12 | [SSA] arr3 | | +| main.rs:370:16:370:24 | [...] | main.rs:370:9:370:12 | arr3 | | +| main.rs:371:9:371:10 | [SSA] n3 | main.rs:372:10:372:11 | n3 | | +| main.rs:371:9:371:10 | n3 | main.rs:371:9:371:10 | [SSA] n3 | | +| main.rs:371:14:371:20 | arr3[2] | main.rs:371:9:371:10 | n3 | | +| main.rs:376:9:376:12 | [SSA] arr1 | main.rs:377:15:377:18 | arr1 | | +| main.rs:376:9:376:12 | arr1 | main.rs:376:9:376:12 | [SSA] arr1 | | +| main.rs:376:16:376:33 | [...] | main.rs:376:9:376:12 | arr1 | | +| main.rs:377:9:377:10 | [SSA] n1 | main.rs:378:14:378:15 | n1 | | +| main.rs:377:9:377:10 | n1 | main.rs:377:9:377:10 | [SSA] n1 | | +| main.rs:381:9:381:12 | [SSA] arr2 | main.rs:382:15:382:18 | arr2 | | +| main.rs:381:9:381:12 | arr2 | main.rs:381:9:381:12 | [SSA] arr2 | | +| main.rs:381:16:381:24 | [...] | main.rs:381:9:381:12 | arr2 | | +| main.rs:382:5:384:5 | for ... in ... { ... } | main.rs:375:21:385:1 | { ... } | | +| main.rs:382:9:382:10 | [SSA] n2 | main.rs:383:14:383:15 | n2 | | +| main.rs:382:9:382:10 | n2 | main.rs:382:9:382:10 | [SSA] n2 | | +| main.rs:388:9:388:12 | [SSA] arr1 | main.rs:389:11:389:14 | arr1 | | +| main.rs:388:9:388:12 | arr1 | main.rs:388:9:388:12 | [SSA] arr1 | | +| main.rs:388:16:388:33 | [...] | main.rs:388:9:388:12 | arr1 | | +| main.rs:389:5:395:5 | match arr1 { ... } | main.rs:387:26:396:1 | { ... } | | +| main.rs:389:11:389:14 | arr1 | main.rs:390:9:390:17 | SlicePat | | +| main.rs:390:10:390:10 | [SSA] a | main.rs:391:18:391:18 | a | | +| main.rs:390:10:390:10 | a | main.rs:390:10:390:10 | [SSA] a | | +| main.rs:390:13:390:13 | [SSA] b | main.rs:392:18:392:18 | b | | +| main.rs:390:13:390:13 | b | main.rs:390:13:390:13 | [SSA] b | | +| main.rs:390:16:390:16 | [SSA] c | main.rs:393:18:393:18 | c | | +| main.rs:390:16:390:16 | c | main.rs:390:16:390:16 | [SSA] c | | +| main.rs:390:22:394:9 | { ... } | main.rs:389:5:395:5 | match arr1 { ... } | | +| main.rs:399:9:399:19 | [SSA] mut_arr | main.rs:400:10:400:16 | mut_arr | | +| main.rs:399:9:399:19 | mut_arr | main.rs:399:9:399:19 | [SSA] mut_arr | | +| main.rs:399:23:399:31 | [...] | main.rs:399:9:399:19 | mut_arr | | +| main.rs:400:10:400:16 | [post] mut_arr | main.rs:402:5:402:11 | mut_arr | | +| main.rs:400:10:400:16 | mut_arr | main.rs:402:5:402:11 | mut_arr | | +| main.rs:402:5:402:11 | [post] mut_arr | main.rs:403:13:403:19 | mut_arr | | +| main.rs:402:5:402:11 | mut_arr | main.rs:403:13:403:19 | mut_arr | | +| main.rs:402:18:402:27 | source(...) | main.rs:402:5:402:14 | mut_arr[1] | | +| main.rs:403:9:403:9 | [SSA] d | main.rs:404:10:404:10 | d | | +| main.rs:403:9:403:9 | d | main.rs:403:9:403:9 | [SSA] d | | +| main.rs:403:13:403:19 | [post] mut_arr | main.rs:405:10:405:16 | mut_arr | | +| main.rs:403:13:403:19 | mut_arr | main.rs:405:10:405:16 | mut_arr | | +| main.rs:403:13:403:22 | mut_arr[1] | main.rs:403:9:403:9 | d | | +| main.rs:410:39:410:43 | [SSA] names | main.rs:412:23:412:27 | names | | +| main.rs:410:39:410:43 | names | main.rs:410:39:410:43 | [SSA] names | | +| main.rs:410:39:410:72 | ...: Vec::<...> | main.rs:410:39:410:43 | names | | +| main.rs:411:7:411:18 | default_name | main.rs:411:7:411:18 | [SSA] default_name | | +| main.rs:411:22:411:43 | ... .to_string(...) | main.rs:411:7:411:18 | default_name | | +| main.rs:411:22:411:43 | ... .to_string(...) | main.rs:412:7:412:18 | phi(default_name) | | +| main.rs:412:3:418:3 | for ... in ... { ... } | main.rs:410:75:419:1 | { ... } | | +| main.rs:412:7:412:18 | phi(default_name) | main.rs:412:7:412:18 | phi(default_name) | | +| main.rs:412:7:412:18 | phi(default_name) | main.rs:414:35:414:61 | default_name | | +| main.rs:412:8:412:11 | [SSA] cond | main.rs:413:8:413:11 | cond | | +| main.rs:412:8:412:11 | cond | main.rs:412:8:412:11 | [SSA] cond | | +| main.rs:412:14:412:17 | [SSA] name | main.rs:414:15:414:18 | name | | +| main.rs:412:14:412:17 | name | main.rs:412:14:412:17 | [SSA] name | | +| main.rs:413:5:417:5 | if cond {...} | main.rs:412:29:418:3 | { ... } | | +| main.rs:414:11:414:11 | [SSA] n | main.rs:415:12:415:12 | n | | +| main.rs:414:11:414:11 | n | main.rs:414:11:414:11 | [SSA] n | | +| main.rs:414:15:414:62 | name.unwrap_or_else(...) | main.rs:414:11:414:11 | n | | +| main.rs:414:35:414:61 | [post] default_name | main.rs:412:7:412:18 | phi(default_name) | | +| main.rs:414:35:414:61 | closure self in \|...\| ... | main.rs:414:38:414:49 | this | | +| main.rs:414:35:414:61 | default_name | main.rs:412:7:412:18 | phi(default_name) | | +| main.rs:428:9:428:9 | [SSA] s | main.rs:429:10:429:10 | s | | +| main.rs:428:9:428:9 | s | main.rs:428:9:428:9 | [SSA] s | | +| main.rs:428:13:428:27 | MacroExpr | main.rs:428:9:428:9 | s | | +| main.rs:428:25:428:26 | source(...) | main.rs:428:13:428:27 | MacroExpr | | +| main.rs:454:13:454:33 | result_questionmark(...) | main.rs:454:9:454:9 | _ | | +| main.rs:466:36:466:41 | ...::new(...) | main.rs:466:36:466:41 | MacroExpr | | models | 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] | | 2 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | @@ -521,42 +537,45 @@ storeStep | main.rs:229:19:229:28 | source(...) | Some | main.rs:229:14:229:29 | Some(...) | | main.rs:232:19:232:19 | 0 | Some | main.rs:232:14:232:20 | Some(...) | | main.rs:237:19:237:28 | source(...) | Some | main.rs:237:14:237:29 | Some(...) | -| main.rs:238:19:238:19 | 2 | Some | main.rs:238:14:238:20 | Some(...) | -| main.rs:242:10:242:10 | 0 | Some | main.rs:242:5:242:11 | Some(...) | -| main.rs:246:35:246:44 | source(...) | Ok | main.rs:246:32:246:45 | Ok(...) | -| main.rs:247:35:247:35 | 2 | Ok | main.rs:247:32:247:36 | Ok(...) | -| main.rs:248:36:248:45 | source(...) | Err | main.rs:248:32:248:46 | Err(...) | -| main.rs:255:8:255:8 | 0 | Ok | main.rs:255:5:255:9 | Ok(...) | -| main.rs:264:29:264:38 | source(...) | A | main.rs:264:14:264:39 | ...::A(...) | -| main.rs:265:29:265:29 | 2 | B | main.rs:265:14:265:30 | ...::B(...) | -| main.rs:282:16:282:25 | source(...) | A | main.rs:282:14:282:26 | A(...) | -| main.rs:283:16:283:16 | 2 | B | main.rs:283:14:283:17 | B(...) | -| main.rs:304:18:304:27 | source(...) | C | main.rs:303:14:305:5 | ...::C {...} | -| main.rs:306:41:306:41 | 2 | D | main.rs:306:14:306:43 | ...::D {...} | -| main.rs:324:18:324:27 | source(...) | C | main.rs:323:14:325:5 | C {...} | -| main.rs:326:27:326:27 | 2 | D | main.rs:326:14:326:29 | D {...} | -| main.rs:344:17:344:17 | 1 | element | main.rs:344:16:344:33 | [...] | -| main.rs:344:20:344:20 | 2 | element | main.rs:344:16:344:33 | [...] | -| main.rs:344:23:344:32 | source(...) | element | main.rs:344:16:344:33 | [...] | -| main.rs:348:17:348:26 | source(...) | element | main.rs:348:16:348:31 | [...; 10] | -| main.rs:352:17:352:17 | 1 | element | main.rs:352:16:352:24 | [...] | -| main.rs:352:20:352:20 | 2 | element | main.rs:352:16:352:24 | [...] | -| main.rs:352:23:352:23 | 3 | element | main.rs:352:16:352:24 | [...] | -| main.rs:358:17:358:17 | 1 | element | main.rs:358:16:358:33 | [...] | -| main.rs:358:20:358:20 | 2 | element | main.rs:358:16:358:33 | [...] | -| main.rs:358:23:358:32 | source(...) | element | main.rs:358:16:358:33 | [...] | -| main.rs:363:17:363:17 | 1 | element | main.rs:363:16:363:24 | [...] | -| main.rs:363:20:363:20 | 2 | element | main.rs:363:16:363:24 | [...] | -| main.rs:363:23:363:23 | 3 | element | main.rs:363:16:363:24 | [...] | -| main.rs:370:17:370:17 | 1 | element | main.rs:370:16:370:33 | [...] | -| main.rs:370:20:370:20 | 2 | element | main.rs:370:16:370:33 | [...] | -| main.rs:370:23:370:32 | source(...) | element | main.rs:370:16:370:33 | [...] | -| main.rs:381:24:381:24 | 1 | element | main.rs:381:23:381:31 | [...] | -| main.rs:381:27:381:27 | 2 | element | main.rs:381:23:381:31 | [...] | -| main.rs:381:30:381:30 | 3 | element | main.rs:381:23:381:31 | [...] | -| main.rs:384:18:384:27 | source(...) | element | main.rs:384:5:384:11 | [post] mut_arr | -| main.rs:396:35:396:61 | default_name | captured default_name | main.rs:396:35:396:61 | \|...\| ... | -| main.rs:418:27:418:27 | 0 | Some | main.rs:418:22:418:28 | Some(...) | +| main.rs:245:19:245:28 | source(...) | Some | main.rs:245:14:245:29 | Some(...) | +| main.rs:246:19:246:19 | 2 | Some | main.rs:246:14:246:20 | Some(...) | +| main.rs:250:10:250:10 | 0 | Some | main.rs:250:5:250:11 | Some(...) | +| main.rs:254:35:254:44 | source(...) | Ok | main.rs:254:32:254:45 | Ok(...) | +| main.rs:255:35:255:35 | 2 | Ok | main.rs:255:32:255:36 | Ok(...) | +| main.rs:256:36:256:45 | source(...) | Err | main.rs:256:32:256:46 | Err(...) | +| main.rs:263:8:263:8 | 0 | Ok | main.rs:263:5:263:9 | Ok(...) | +| main.rs:267:35:267:44 | source(...) | Ok | main.rs:267:32:267:45 | Ok(...) | +| main.rs:271:36:271:45 | source(...) | Err | main.rs:271:32:271:46 | Err(...) | +| main.rs:282:29:282:38 | source(...) | A | main.rs:282:14:282:39 | ...::A(...) | +| main.rs:283:29:283:29 | 2 | B | main.rs:283:14:283:30 | ...::B(...) | +| main.rs:300:16:300:25 | source(...) | A | main.rs:300:14:300:26 | A(...) | +| main.rs:301:16:301:16 | 2 | B | main.rs:301:14:301:17 | B(...) | +| main.rs:322:18:322:27 | source(...) | C | main.rs:321:14:323:5 | ...::C {...} | +| main.rs:324:41:324:41 | 2 | D | main.rs:324:14:324:43 | ...::D {...} | +| main.rs:342:18:342:27 | source(...) | C | main.rs:341:14:343:5 | C {...} | +| main.rs:344:27:344:27 | 2 | D | main.rs:344:14:344:29 | D {...} | +| main.rs:362:17:362:17 | 1 | element | main.rs:362:16:362:33 | [...] | +| main.rs:362:20:362:20 | 2 | element | main.rs:362:16:362:33 | [...] | +| main.rs:362:23:362:32 | source(...) | element | main.rs:362:16:362:33 | [...] | +| main.rs:366:17:366:26 | source(...) | element | main.rs:366:16:366:31 | [...; 10] | +| main.rs:370:17:370:17 | 1 | element | main.rs:370:16:370:24 | [...] | +| main.rs:370:20:370:20 | 2 | element | main.rs:370:16:370:24 | [...] | +| main.rs:370:23:370:23 | 3 | element | main.rs:370:16:370:24 | [...] | +| main.rs:376:17:376:17 | 1 | element | main.rs:376:16:376:33 | [...] | +| main.rs:376:20:376:20 | 2 | element | main.rs:376:16:376:33 | [...] | +| main.rs:376:23:376:32 | source(...) | element | main.rs:376:16:376:33 | [...] | +| main.rs:381:17:381:17 | 1 | element | main.rs:381:16:381:24 | [...] | +| main.rs:381:20:381:20 | 2 | element | main.rs:381:16:381:24 | [...] | +| main.rs:381:23:381:23 | 3 | element | main.rs:381:16:381:24 | [...] | +| main.rs:388:17:388:17 | 1 | element | main.rs:388:16:388:33 | [...] | +| main.rs:388:20:388:20 | 2 | element | main.rs:388:16:388:33 | [...] | +| main.rs:388:23:388:32 | source(...) | element | main.rs:388:16:388:33 | [...] | +| main.rs:399:24:399:24 | 1 | element | main.rs:399:23:399:31 | [...] | +| main.rs:399:27:399:27 | 2 | element | main.rs:399:23:399:31 | [...] | +| main.rs:399:30:399:30 | 3 | element | main.rs:399:23:399:31 | [...] | +| main.rs:402:18:402:27 | source(...) | element | main.rs:402:5:402:11 | [post] mut_arr | +| main.rs:414:35:414:61 | default_name | captured default_name | main.rs:414:35:414:61 | \|...\| ... | +| main.rs:436:27:436:27 | 0 | Some | main.rs:436:22:436:28 | Some(...) | readStep | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | @@ -587,54 +606,54 @@ readStep | main.rs:205:9:205:23 | ...::Some(...) | Some | main.rs:205:22:205:22 | n | | main.rs:214:9:214:15 | Some(...) | Some | main.rs:214:14:214:14 | n | | main.rs:218:9:218:15 | Some(...) | Some | main.rs:218:14:218:14 | n | -| main.rs:239:14:239:15 | s1 | Ok | main.rs:239:14:239:16 | TryExpr | -| main.rs:239:14:239:15 | s1 | Some | main.rs:239:14:239:16 | TryExpr | -| main.rs:241:10:241:11 | s2 | Ok | main.rs:241:10:241:12 | TryExpr | -| main.rs:241:10:241:11 | s2 | Some | main.rs:241:10:241:12 | TryExpr | -| main.rs:249:14:249:15 | s1 | Ok | main.rs:249:14:249:16 | TryExpr | -| main.rs:249:14:249:15 | s1 | Some | main.rs:249:14:249:16 | TryExpr | -| main.rs:250:14:250:15 | s2 | Ok | main.rs:250:14:250:16 | TryExpr | -| main.rs:250:14:250:15 | s2 | Some | main.rs:250:14:250:16 | TryExpr | -| main.rs:253:14:253:15 | s3 | Ok | main.rs:253:14:253:16 | TryExpr | -| main.rs:253:14:253:15 | s3 | Some | main.rs:253:14:253:16 | TryExpr | -| main.rs:267:9:267:25 | ...::A(...) | A | main.rs:267:24:267:24 | n | -| main.rs:268:9:268:25 | ...::B(...) | B | main.rs:268:24:268:24 | n | -| main.rs:271:9:271:25 | ...::A(...) | A | main.rs:271:24:271:24 | n | -| main.rs:271:29:271:45 | ...::B(...) | B | main.rs:271:44:271:44 | n | -| main.rs:274:9:274:25 | ...::A(...) | A | main.rs:274:24:274:24 | n | -| main.rs:275:9:275:25 | ...::B(...) | B | main.rs:275:24:275:24 | n | -| main.rs:285:9:285:12 | A(...) | A | main.rs:285:11:285:11 | n | -| main.rs:286:9:286:12 | B(...) | B | main.rs:286:11:286:11 | n | -| main.rs:289:9:289:12 | A(...) | A | main.rs:289:11:289:11 | n | -| main.rs:289:16:289:19 | B(...) | B | main.rs:289:18:289:18 | n | -| main.rs:292:9:292:12 | A(...) | A | main.rs:292:11:292:11 | n | -| main.rs:293:9:293:12 | B(...) | B | main.rs:293:11:293:11 | n | -| main.rs:308:9:308:38 | ...::C {...} | C | main.rs:308:36:308:36 | n | -| main.rs:309:9:309:38 | ...::D {...} | D | main.rs:309:36:309:36 | n | -| main.rs:312:9:312:38 | ...::C {...} | C | main.rs:312:36:312:36 | n | -| main.rs:312:42:312:71 | ...::D {...} | D | main.rs:312:69:312:69 | n | -| main.rs:315:9:315:38 | ...::C {...} | C | main.rs:315:36:315:36 | n | -| main.rs:316:9:316:38 | ...::D {...} | D | main.rs:316:36:316:36 | n | -| main.rs:328:9:328:24 | C {...} | C | main.rs:328:22:328:22 | n | -| main.rs:329:9:329:24 | D {...} | D | main.rs:329:22:329:22 | n | -| main.rs:332:9:332:24 | C {...} | C | main.rs:332:22:332:22 | n | -| main.rs:332:28:332:43 | D {...} | D | main.rs:332:41:332:41 | n | -| main.rs:335:9:335:24 | C {...} | C | main.rs:335:22:335:22 | n | -| main.rs:336:9:336:24 | D {...} | D | main.rs:336:22:336:22 | n | -| main.rs:345:14:345:17 | arr1 | element | main.rs:345:14:345:20 | arr1[2] | -| main.rs:349:14:349:17 | arr2 | element | main.rs:349:14:349:20 | arr2[4] | -| main.rs:353:14:353:17 | arr3 | element | main.rs:353:14:353:20 | arr3[2] | -| main.rs:359:15:359:18 | arr1 | element | main.rs:359:9:359:10 | n1 | -| main.rs:364:15:364:18 | arr2 | element | main.rs:364:9:364:10 | n2 | -| main.rs:372:9:372:17 | SlicePat | element | main.rs:372:10:372:10 | a | -| main.rs:372:9:372:17 | SlicePat | element | main.rs:372:13:372:13 | b | -| main.rs:372:9:372:17 | SlicePat | element | main.rs:372:16:372:16 | c | -| main.rs:382:10:382:16 | mut_arr | element | main.rs:382:10:382:19 | mut_arr[1] | -| main.rs:384:5:384:11 | mut_arr | element | main.rs:384:5:384:14 | mut_arr[1] | -| main.rs:385:13:385:19 | mut_arr | element | main.rs:385:13:385:22 | mut_arr[1] | -| main.rs:387:10:387:16 | mut_arr | element | main.rs:387:10:387:19 | mut_arr[0] | -| main.rs:394:7:394:18 | TuplePat | tuple.0 | main.rs:394:8:394:11 | cond | -| main.rs:394:7:394:18 | TuplePat | tuple.1 | main.rs:394:14:394:17 | name | -| main.rs:394:23:394:27 | names | element | main.rs:394:7:394:18 | TuplePat | -| main.rs:396:35:396:61 | [post] \|...\| ... | captured default_name | main.rs:396:35:396:61 | [post] default_name | -| main.rs:396:38:396:49 | this | captured default_name | main.rs:396:38:396:49 | default_name | +| main.rs:247:14:247:15 | s1 | Ok | main.rs:247:14:247:16 | TryExpr | +| main.rs:247:14:247:15 | s1 | Some | main.rs:247:14:247:16 | TryExpr | +| main.rs:249:10:249:11 | s2 | Ok | main.rs:249:10:249:12 | TryExpr | +| main.rs:249:10:249:11 | s2 | Some | main.rs:249:10:249:12 | TryExpr | +| main.rs:257:14:257:15 | s1 | Ok | main.rs:257:14:257:16 | TryExpr | +| main.rs:257:14:257:15 | s1 | Some | main.rs:257:14:257:16 | TryExpr | +| main.rs:258:14:258:15 | s2 | Ok | main.rs:258:14:258:16 | TryExpr | +| main.rs:258:14:258:15 | s2 | Some | main.rs:258:14:258:16 | TryExpr | +| main.rs:261:14:261:15 | s3 | Ok | main.rs:261:14:261:16 | TryExpr | +| main.rs:261:14:261:15 | s3 | Some | main.rs:261:14:261:16 | TryExpr | +| main.rs:285:9:285:25 | ...::A(...) | A | main.rs:285:24:285:24 | n | +| main.rs:286:9:286:25 | ...::B(...) | B | main.rs:286:24:286:24 | n | +| main.rs:289:9:289:25 | ...::A(...) | A | main.rs:289:24:289:24 | n | +| main.rs:289:29:289:45 | ...::B(...) | B | main.rs:289:44:289:44 | n | +| main.rs:292:9:292:25 | ...::A(...) | A | main.rs:292:24:292:24 | n | +| main.rs:293:9:293:25 | ...::B(...) | B | main.rs:293:24:293:24 | n | +| main.rs:303:9:303:12 | A(...) | A | main.rs:303:11:303:11 | n | +| main.rs:304:9:304:12 | B(...) | B | main.rs:304:11:304:11 | n | +| main.rs:307:9:307:12 | A(...) | A | main.rs:307:11:307:11 | n | +| main.rs:307:16:307:19 | B(...) | B | main.rs:307:18:307:18 | n | +| main.rs:310:9:310:12 | A(...) | A | main.rs:310:11:310:11 | n | +| main.rs:311:9:311:12 | B(...) | B | main.rs:311:11:311:11 | n | +| main.rs:326:9:326:38 | ...::C {...} | C | main.rs:326:36:326:36 | n | +| main.rs:327:9:327:38 | ...::D {...} | D | main.rs:327:36:327:36 | n | +| main.rs:330:9:330:38 | ...::C {...} | C | main.rs:330:36:330:36 | n | +| main.rs:330:42:330:71 | ...::D {...} | D | main.rs:330:69:330:69 | n | +| main.rs:333:9:333:38 | ...::C {...} | C | main.rs:333:36:333:36 | n | +| main.rs:334:9:334:38 | ...::D {...} | D | main.rs:334:36:334:36 | n | +| main.rs:346:9:346:24 | C {...} | C | main.rs:346:22:346:22 | n | +| main.rs:347:9:347:24 | D {...} | D | main.rs:347:22:347:22 | n | +| main.rs:350:9:350:24 | C {...} | C | main.rs:350:22:350:22 | n | +| main.rs:350:28:350:43 | D {...} | D | main.rs:350:41:350:41 | n | +| main.rs:353:9:353:24 | C {...} | C | main.rs:353:22:353:22 | n | +| main.rs:354:9:354:24 | D {...} | D | main.rs:354:22:354:22 | n | +| main.rs:363:14:363:17 | arr1 | element | main.rs:363:14:363:20 | arr1[2] | +| main.rs:367:14:367:17 | arr2 | element | main.rs:367:14:367:20 | arr2[4] | +| main.rs:371:14:371:17 | arr3 | element | main.rs:371:14:371:20 | arr3[2] | +| main.rs:377:15:377:18 | arr1 | element | main.rs:377:9:377:10 | n1 | +| main.rs:382:15:382:18 | arr2 | element | main.rs:382:9:382:10 | n2 | +| main.rs:390:9:390:17 | SlicePat | element | main.rs:390:10:390:10 | a | +| main.rs:390:9:390:17 | SlicePat | element | main.rs:390:13:390:13 | b | +| main.rs:390:9:390:17 | SlicePat | element | main.rs:390:16:390:16 | c | +| main.rs:400:10:400:16 | mut_arr | element | main.rs:400:10:400:19 | mut_arr[1] | +| main.rs:402:5:402:11 | mut_arr | element | main.rs:402:5:402:14 | mut_arr[1] | +| main.rs:403:13:403:19 | mut_arr | element | main.rs:403:13:403:22 | mut_arr[1] | +| main.rs:405:10:405:16 | mut_arr | element | main.rs:405:10:405:19 | mut_arr[0] | +| main.rs:412:7:412:18 | TuplePat | tuple.0 | main.rs:412:8:412:11 | cond | +| main.rs:412:7:412:18 | TuplePat | tuple.1 | main.rs:412:14:412:17 | name | +| main.rs:412:23:412:27 | names | element | main.rs:412:7:412:18 | TuplePat | +| main.rs:414:35:414:61 | [post] \|...\| ... | captured default_name | main.rs:414:35:414:61 | [post] default_name | +| main.rs:414:38:414:49 | this | captured default_name | main.rs:414:38:414:49 | default_name | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index f4b7ae7a0e8b..cde62441663c 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -66,94 +66,94 @@ edges | main.rs:229:19:229:28 | source(...) | main.rs:229:14:229:29 | Some(...) [Some] | provenance | | | main.rs:230:10:230:11 | s1 [Some] | main.rs:230:10:230:24 | s1.unwrap_or(...) | provenance | MaD:3 | | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | provenance | MaD:2 | -| main.rs:237:9:237:10 | s1 [Some] | main.rs:239:14:239:15 | s1 [Some] | provenance | | -| main.rs:237:14:237:29 | Some(...) [Some] | main.rs:237:9:237:10 | s1 [Some] | provenance | | -| main.rs:237:19:237:28 | source(...) | main.rs:237:14:237:29 | Some(...) [Some] | provenance | | -| main.rs:239:9:239:10 | i1 | main.rs:240:10:240:11 | i1 | provenance | | -| main.rs:239:14:239:15 | s1 [Some] | main.rs:239:14:239:16 | TryExpr | provenance | | -| main.rs:239:14:239:16 | TryExpr | main.rs:239:9:239:10 | i1 | provenance | | -| main.rs:246:9:246:10 | s1 [Ok] | main.rs:249:14:249:15 | s1 [Ok] | provenance | | -| main.rs:246:32:246:45 | Ok(...) [Ok] | main.rs:246:9:246:10 | s1 [Ok] | provenance | | -| main.rs:246:35:246:44 | source(...) | main.rs:246:32:246:45 | Ok(...) [Ok] | provenance | | -| main.rs:249:9:249:10 | i1 | main.rs:251:10:251:11 | i1 | provenance | | -| main.rs:249:14:249:15 | s1 [Ok] | main.rs:249:14:249:16 | TryExpr | provenance | | -| main.rs:249:14:249:16 | TryExpr | main.rs:249:9:249:10 | i1 | provenance | | -| main.rs:264:9:264:10 | s1 [A] | main.rs:266:11:266:12 | s1 [A] | provenance | | -| main.rs:264:14:264:39 | ...::A(...) [A] | main.rs:264:9:264:10 | s1 [A] | provenance | | -| main.rs:264:29:264:38 | source(...) | main.rs:264:14:264:39 | ...::A(...) [A] | provenance | | -| main.rs:266:11:266:12 | s1 [A] | main.rs:267:9:267:25 | ...::A(...) [A] | provenance | | -| main.rs:266:11:266:12 | s1 [A] | main.rs:270:11:270:12 | s1 [A] | provenance | | -| main.rs:267:9:267:25 | ...::A(...) [A] | main.rs:267:24:267:24 | n | provenance | | -| main.rs:267:24:267:24 | n | main.rs:267:35:267:35 | n | provenance | | -| main.rs:270:11:270:12 | s1 [A] | main.rs:271:9:271:25 | ...::A(...) [A] | provenance | | -| main.rs:271:9:271:25 | ...::A(...) [A] | main.rs:271:24:271:24 | n | provenance | | -| main.rs:271:24:271:24 | n | main.rs:271:55:271:55 | n | provenance | | +| main.rs:245:9:245:10 | s1 [Some] | main.rs:247:14:247:15 | s1 [Some] | provenance | | +| main.rs:245:14:245:29 | Some(...) [Some] | main.rs:245:9:245:10 | s1 [Some] | provenance | | +| main.rs:245:19:245:28 | source(...) | main.rs:245:14:245:29 | Some(...) [Some] | provenance | | +| main.rs:247:9:247:10 | i1 | main.rs:248:10:248:11 | i1 | provenance | | +| main.rs:247:14:247:15 | s1 [Some] | main.rs:247:14:247:16 | TryExpr | provenance | | +| main.rs:247:14:247:16 | TryExpr | main.rs:247:9:247:10 | i1 | provenance | | +| main.rs:254:9:254:10 | s1 [Ok] | main.rs:257:14:257:15 | s1 [Ok] | provenance | | +| main.rs:254:32:254:45 | Ok(...) [Ok] | main.rs:254:9:254:10 | s1 [Ok] | provenance | | +| main.rs:254:35:254:44 | source(...) | main.rs:254:32:254:45 | Ok(...) [Ok] | provenance | | +| main.rs:257:9:257:10 | i1 | main.rs:259:10:259:11 | i1 | provenance | | +| main.rs:257:14:257:15 | s1 [Ok] | main.rs:257:14:257:16 | TryExpr | provenance | | +| main.rs:257:14:257:16 | TryExpr | main.rs:257:9:257:10 | i1 | provenance | | | main.rs:282:9:282:10 | s1 [A] | main.rs:284:11:284:12 | s1 [A] | provenance | | -| main.rs:282:14:282:26 | A(...) [A] | main.rs:282:9:282:10 | s1 [A] | provenance | | -| main.rs:282:16:282:25 | source(...) | main.rs:282:14:282:26 | A(...) [A] | provenance | | -| main.rs:284:11:284:12 | s1 [A] | main.rs:285:9:285:12 | A(...) [A] | provenance | | +| main.rs:282:14:282:39 | ...::A(...) [A] | main.rs:282:9:282:10 | s1 [A] | provenance | | +| main.rs:282:29:282:38 | source(...) | main.rs:282:14:282:39 | ...::A(...) [A] | provenance | | +| main.rs:284:11:284:12 | s1 [A] | main.rs:285:9:285:25 | ...::A(...) [A] | provenance | | | main.rs:284:11:284:12 | s1 [A] | main.rs:288:11:288:12 | s1 [A] | provenance | | -| main.rs:285:9:285:12 | A(...) [A] | main.rs:285:11:285:11 | n | provenance | | -| main.rs:285:11:285:11 | n | main.rs:285:22:285:22 | n | provenance | | -| main.rs:288:11:288:12 | s1 [A] | main.rs:289:9:289:12 | A(...) [A] | provenance | | -| main.rs:289:9:289:12 | A(...) [A] | main.rs:289:11:289:11 | n | provenance | | -| main.rs:289:11:289:11 | n | main.rs:289:29:289:29 | n | provenance | | -| main.rs:303:9:303:10 | s1 [C] | main.rs:307:11:307:12 | s1 [C] | provenance | | -| main.rs:303:14:305:5 | ...::C {...} [C] | main.rs:303:9:303:10 | s1 [C] | provenance | | -| main.rs:304:18:304:27 | source(...) | main.rs:303:14:305:5 | ...::C {...} [C] | provenance | | -| main.rs:307:11:307:12 | s1 [C] | main.rs:308:9:308:38 | ...::C {...} [C] | provenance | | -| main.rs:307:11:307:12 | s1 [C] | main.rs:311:11:311:12 | s1 [C] | provenance | | -| main.rs:308:9:308:38 | ...::C {...} [C] | main.rs:308:36:308:36 | n | provenance | | -| main.rs:308:36:308:36 | n | main.rs:308:48:308:48 | n | provenance | | -| main.rs:311:11:311:12 | s1 [C] | main.rs:312:9:312:38 | ...::C {...} [C] | provenance | | -| main.rs:312:9:312:38 | ...::C {...} [C] | main.rs:312:36:312:36 | n | provenance | | -| main.rs:312:36:312:36 | n | main.rs:312:81:312:81 | n | provenance | | -| main.rs:323:9:323:10 | s1 [C] | main.rs:327:11:327:12 | s1 [C] | provenance | | -| main.rs:323:14:325:5 | C {...} [C] | main.rs:323:9:323:10 | s1 [C] | provenance | | -| main.rs:324:18:324:27 | source(...) | main.rs:323:14:325:5 | C {...} [C] | provenance | | -| main.rs:327:11:327:12 | s1 [C] | main.rs:328:9:328:24 | C {...} [C] | provenance | | -| main.rs:327:11:327:12 | s1 [C] | main.rs:331:11:331:12 | s1 [C] | provenance | | -| main.rs:328:9:328:24 | C {...} [C] | main.rs:328:22:328:22 | n | provenance | | -| main.rs:328:22:328:22 | n | main.rs:328:34:328:34 | n | provenance | | -| main.rs:331:11:331:12 | s1 [C] | main.rs:332:9:332:24 | C {...} [C] | provenance | | -| main.rs:332:9:332:24 | C {...} [C] | main.rs:332:22:332:22 | n | provenance | | -| main.rs:332:22:332:22 | n | main.rs:332:53:332:53 | n | provenance | | -| main.rs:344:9:344:12 | arr1 [element] | main.rs:345:14:345:17 | arr1 [element] | provenance | | -| main.rs:344:16:344:33 | [...] [element] | main.rs:344:9:344:12 | arr1 [element] | provenance | | -| main.rs:344:23:344:32 | source(...) | main.rs:344:16:344:33 | [...] [element] | provenance | | -| main.rs:345:9:345:10 | n1 | main.rs:346:10:346:11 | n1 | provenance | | -| main.rs:345:14:345:17 | arr1 [element] | main.rs:345:14:345:20 | arr1[2] | provenance | | -| main.rs:345:14:345:20 | arr1[2] | main.rs:345:9:345:10 | n1 | provenance | | -| main.rs:348:9:348:12 | arr2 [element] | main.rs:349:14:349:17 | arr2 [element] | provenance | | -| main.rs:348:16:348:31 | [...; 10] [element] | main.rs:348:9:348:12 | arr2 [element] | provenance | | -| main.rs:348:17:348:26 | source(...) | main.rs:348:16:348:31 | [...; 10] [element] | provenance | | -| main.rs:349:9:349:10 | n2 | main.rs:350:10:350:11 | n2 | provenance | | -| main.rs:349:14:349:17 | arr2 [element] | main.rs:349:14:349:20 | arr2[4] | provenance | | -| main.rs:349:14:349:20 | arr2[4] | main.rs:349:9:349:10 | n2 | provenance | | -| main.rs:358:9:358:12 | arr1 [element] | main.rs:359:15:359:18 | arr1 [element] | provenance | | -| main.rs:358:16:358:33 | [...] [element] | main.rs:358:9:358:12 | arr1 [element] | provenance | | -| main.rs:358:23:358:32 | source(...) | main.rs:358:16:358:33 | [...] [element] | provenance | | -| main.rs:359:9:359:10 | n1 | main.rs:360:14:360:15 | n1 | provenance | | -| main.rs:359:15:359:18 | arr1 [element] | main.rs:359:9:359:10 | n1 | provenance | | -| main.rs:370:9:370:12 | arr1 [element] | main.rs:371:11:371:14 | arr1 [element] | provenance | | -| main.rs:370:16:370:33 | [...] [element] | main.rs:370:9:370:12 | arr1 [element] | provenance | | -| main.rs:370:23:370:32 | source(...) | main.rs:370:16:370:33 | [...] [element] | provenance | | -| main.rs:371:11:371:14 | arr1 [element] | main.rs:372:9:372:17 | SlicePat [element] | provenance | | -| main.rs:372:9:372:17 | SlicePat [element] | main.rs:372:10:372:10 | a | provenance | | -| main.rs:372:9:372:17 | SlicePat [element] | main.rs:372:13:372:13 | b | provenance | | -| main.rs:372:9:372:17 | SlicePat [element] | main.rs:372:16:372:16 | c | provenance | | -| main.rs:372:10:372:10 | a | main.rs:373:18:373:18 | a | provenance | | -| main.rs:372:13:372:13 | b | main.rs:374:18:374:18 | b | provenance | | -| main.rs:372:16:372:16 | c | main.rs:375:18:375:18 | c | provenance | | -| main.rs:384:5:384:11 | [post] mut_arr [element] | main.rs:385:13:385:19 | mut_arr [element] | provenance | | -| main.rs:384:5:384:11 | [post] mut_arr [element] | main.rs:387:10:387:16 | mut_arr [element] | provenance | | -| main.rs:384:18:384:27 | source(...) | main.rs:384:5:384:11 | [post] mut_arr [element] | provenance | | -| main.rs:385:9:385:9 | d | main.rs:386:10:386:10 | d | provenance | | -| main.rs:385:13:385:19 | mut_arr [element] | main.rs:385:13:385:22 | mut_arr[1] | provenance | | -| main.rs:385:13:385:22 | mut_arr[1] | main.rs:385:9:385:9 | d | provenance | | -| main.rs:387:10:387:16 | mut_arr [element] | main.rs:387:10:387:19 | mut_arr[0] | provenance | | -| main.rs:410:9:410:9 | s | main.rs:411:10:411:10 | s | provenance | | -| main.rs:410:25:410:26 | source(...) | main.rs:410:9:410:9 | s | provenance | | +| main.rs:285:9:285:25 | ...::A(...) [A] | main.rs:285:24:285:24 | n | provenance | | +| main.rs:285:24:285:24 | n | main.rs:285:35:285:35 | n | provenance | | +| main.rs:288:11:288:12 | s1 [A] | main.rs:289:9:289:25 | ...::A(...) [A] | provenance | | +| main.rs:289:9:289:25 | ...::A(...) [A] | main.rs:289:24:289:24 | n | provenance | | +| main.rs:289:24:289:24 | n | main.rs:289:55:289:55 | n | provenance | | +| main.rs:300:9:300:10 | s1 [A] | main.rs:302:11:302:12 | s1 [A] | provenance | | +| main.rs:300:14:300:26 | A(...) [A] | main.rs:300:9:300:10 | s1 [A] | provenance | | +| main.rs:300:16:300:25 | source(...) | main.rs:300:14:300:26 | A(...) [A] | provenance | | +| main.rs:302:11:302:12 | s1 [A] | main.rs:303:9:303:12 | A(...) [A] | provenance | | +| main.rs:302:11:302:12 | s1 [A] | main.rs:306:11:306:12 | s1 [A] | provenance | | +| main.rs:303:9:303:12 | A(...) [A] | main.rs:303:11:303:11 | n | provenance | | +| main.rs:303:11:303:11 | n | main.rs:303:22:303:22 | n | provenance | | +| main.rs:306:11:306:12 | s1 [A] | main.rs:307:9:307:12 | A(...) [A] | provenance | | +| main.rs:307:9:307:12 | A(...) [A] | main.rs:307:11:307:11 | n | provenance | | +| main.rs:307:11:307:11 | n | main.rs:307:29:307:29 | n | provenance | | +| main.rs:321:9:321:10 | s1 [C] | main.rs:325:11:325:12 | s1 [C] | provenance | | +| main.rs:321:14:323:5 | ...::C {...} [C] | main.rs:321:9:321:10 | s1 [C] | provenance | | +| main.rs:322:18:322:27 | source(...) | main.rs:321:14:323:5 | ...::C {...} [C] | provenance | | +| main.rs:325:11:325:12 | s1 [C] | main.rs:326:9:326:38 | ...::C {...} [C] | provenance | | +| main.rs:325:11:325:12 | s1 [C] | main.rs:329:11:329:12 | s1 [C] | provenance | | +| main.rs:326:9:326:38 | ...::C {...} [C] | main.rs:326:36:326:36 | n | provenance | | +| main.rs:326:36:326:36 | n | main.rs:326:48:326:48 | n | provenance | | +| main.rs:329:11:329:12 | s1 [C] | main.rs:330:9:330:38 | ...::C {...} [C] | provenance | | +| main.rs:330:9:330:38 | ...::C {...} [C] | main.rs:330:36:330:36 | n | provenance | | +| main.rs:330:36:330:36 | n | main.rs:330:81:330:81 | n | provenance | | +| main.rs:341:9:341:10 | s1 [C] | main.rs:345:11:345:12 | s1 [C] | provenance | | +| main.rs:341:14:343:5 | C {...} [C] | main.rs:341:9:341:10 | s1 [C] | provenance | | +| main.rs:342:18:342:27 | source(...) | main.rs:341:14:343:5 | C {...} [C] | provenance | | +| main.rs:345:11:345:12 | s1 [C] | main.rs:346:9:346:24 | C {...} [C] | provenance | | +| main.rs:345:11:345:12 | s1 [C] | main.rs:349:11:349:12 | s1 [C] | provenance | | +| main.rs:346:9:346:24 | C {...} [C] | main.rs:346:22:346:22 | n | provenance | | +| main.rs:346:22:346:22 | n | main.rs:346:34:346:34 | n | provenance | | +| main.rs:349:11:349:12 | s1 [C] | main.rs:350:9:350:24 | C {...} [C] | provenance | | +| main.rs:350:9:350:24 | C {...} [C] | main.rs:350:22:350:22 | n | provenance | | +| main.rs:350:22:350:22 | n | main.rs:350:53:350:53 | n | provenance | | +| main.rs:362:9:362:12 | arr1 [element] | main.rs:363:14:363:17 | arr1 [element] | provenance | | +| main.rs:362:16:362:33 | [...] [element] | main.rs:362:9:362:12 | arr1 [element] | provenance | | +| main.rs:362:23:362:32 | source(...) | main.rs:362:16:362:33 | [...] [element] | provenance | | +| main.rs:363:9:363:10 | n1 | main.rs:364:10:364:11 | n1 | provenance | | +| main.rs:363:14:363:17 | arr1 [element] | main.rs:363:14:363:20 | arr1[2] | provenance | | +| main.rs:363:14:363:20 | arr1[2] | main.rs:363:9:363:10 | n1 | provenance | | +| main.rs:366:9:366:12 | arr2 [element] | main.rs:367:14:367:17 | arr2 [element] | provenance | | +| main.rs:366:16:366:31 | [...; 10] [element] | main.rs:366:9:366:12 | arr2 [element] | provenance | | +| main.rs:366:17:366:26 | source(...) | main.rs:366:16:366:31 | [...; 10] [element] | provenance | | +| main.rs:367:9:367:10 | n2 | main.rs:368:10:368:11 | n2 | provenance | | +| main.rs:367:14:367:17 | arr2 [element] | main.rs:367:14:367:20 | arr2[4] | provenance | | +| main.rs:367:14:367:20 | arr2[4] | main.rs:367:9:367:10 | n2 | provenance | | +| main.rs:376:9:376:12 | arr1 [element] | main.rs:377:15:377:18 | arr1 [element] | provenance | | +| main.rs:376:16:376:33 | [...] [element] | main.rs:376:9:376:12 | arr1 [element] | provenance | | +| main.rs:376:23:376:32 | source(...) | main.rs:376:16:376:33 | [...] [element] | provenance | | +| main.rs:377:9:377:10 | n1 | main.rs:378:14:378:15 | n1 | provenance | | +| main.rs:377:15:377:18 | arr1 [element] | main.rs:377:9:377:10 | n1 | provenance | | +| main.rs:388:9:388:12 | arr1 [element] | main.rs:389:11:389:14 | arr1 [element] | provenance | | +| main.rs:388:16:388:33 | [...] [element] | main.rs:388:9:388:12 | arr1 [element] | provenance | | +| main.rs:388:23:388:32 | source(...) | main.rs:388:16:388:33 | [...] [element] | provenance | | +| main.rs:389:11:389:14 | arr1 [element] | main.rs:390:9:390:17 | SlicePat [element] | provenance | | +| main.rs:390:9:390:17 | SlicePat [element] | main.rs:390:10:390:10 | a | provenance | | +| main.rs:390:9:390:17 | SlicePat [element] | main.rs:390:13:390:13 | b | provenance | | +| main.rs:390:9:390:17 | SlicePat [element] | main.rs:390:16:390:16 | c | provenance | | +| main.rs:390:10:390:10 | a | main.rs:391:18:391:18 | a | provenance | | +| main.rs:390:13:390:13 | b | main.rs:392:18:392:18 | b | provenance | | +| main.rs:390:16:390:16 | c | main.rs:393:18:393:18 | c | provenance | | +| main.rs:402:5:402:11 | [post] mut_arr [element] | main.rs:403:13:403:19 | mut_arr [element] | provenance | | +| main.rs:402:5:402:11 | [post] mut_arr [element] | main.rs:405:10:405:16 | mut_arr [element] | provenance | | +| main.rs:402:18:402:27 | source(...) | main.rs:402:5:402:11 | [post] mut_arr [element] | provenance | | +| main.rs:403:9:403:9 | d | main.rs:404:10:404:10 | d | provenance | | +| main.rs:403:13:403:19 | mut_arr [element] | main.rs:403:13:403:22 | mut_arr[1] | provenance | | +| main.rs:403:13:403:22 | mut_arr[1] | main.rs:403:9:403:9 | d | provenance | | +| main.rs:405:10:405:16 | mut_arr [element] | main.rs:405:10:405:19 | mut_arr[0] | provenance | | +| main.rs:428:9:428:9 | s | main.rs:429:10:429:10 | s | provenance | | +| main.rs:428:25:428:26 | source(...) | main.rs:428:9:428:9 | s | provenance | | nodes | main.rs:15:10:15:18 | source(...) | semmle.label | source(...) | | main.rs:19:9:19:9 | s | semmle.label | s | @@ -235,106 +235,106 @@ nodes | main.rs:230:10:230:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | | main.rs:233:23:233:32 | source(...) | semmle.label | source(...) | -| main.rs:237:9:237:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:237:14:237:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:237:19:237:28 | source(...) | semmle.label | source(...) | -| main.rs:239:9:239:10 | i1 | semmle.label | i1 | -| main.rs:239:14:239:15 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:239:14:239:16 | TryExpr | semmle.label | TryExpr | -| main.rs:240:10:240:11 | i1 | semmle.label | i1 | -| main.rs:246:9:246:10 | s1 [Ok] | semmle.label | s1 [Ok] | -| main.rs:246:32:246:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| main.rs:246:35:246:44 | source(...) | semmle.label | source(...) | -| main.rs:249:9:249:10 | i1 | semmle.label | i1 | -| main.rs:249:14:249:15 | s1 [Ok] | semmle.label | s1 [Ok] | -| main.rs:249:14:249:16 | TryExpr | semmle.label | TryExpr | -| main.rs:251:10:251:11 | i1 | semmle.label | i1 | -| main.rs:264:9:264:10 | s1 [A] | semmle.label | s1 [A] | -| main.rs:264:14:264:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:264:29:264:38 | source(...) | semmle.label | source(...) | -| main.rs:266:11:266:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:267:9:267:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:267:24:267:24 | n | semmle.label | n | -| main.rs:267:35:267:35 | n | semmle.label | n | -| main.rs:270:11:270:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:271:9:271:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:271:24:271:24 | n | semmle.label | n | -| main.rs:271:55:271:55 | n | semmle.label | n | +| main.rs:245:9:245:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:245:14:245:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:245:19:245:28 | source(...) | semmle.label | source(...) | +| main.rs:247:9:247:10 | i1 | semmle.label | i1 | +| main.rs:247:14:247:15 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:247:14:247:16 | TryExpr | semmle.label | TryExpr | +| main.rs:248:10:248:11 | i1 | semmle.label | i1 | +| main.rs:254:9:254:10 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:254:32:254:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| main.rs:254:35:254:44 | source(...) | semmle.label | source(...) | +| main.rs:257:9:257:10 | i1 | semmle.label | i1 | +| main.rs:257:14:257:15 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:257:14:257:16 | TryExpr | semmle.label | TryExpr | +| main.rs:259:10:259:11 | i1 | semmle.label | i1 | | main.rs:282:9:282:10 | s1 [A] | semmle.label | s1 [A] | -| main.rs:282:14:282:26 | A(...) [A] | semmle.label | A(...) [A] | -| main.rs:282:16:282:25 | source(...) | semmle.label | source(...) | +| main.rs:282:14:282:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:282:29:282:38 | source(...) | semmle.label | source(...) | | main.rs:284:11:284:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:285:9:285:12 | A(...) [A] | semmle.label | A(...) [A] | -| main.rs:285:11:285:11 | n | semmle.label | n | -| main.rs:285:22:285:22 | n | semmle.label | n | +| main.rs:285:9:285:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:285:24:285:24 | n | semmle.label | n | +| main.rs:285:35:285:35 | n | semmle.label | n | | main.rs:288:11:288:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:289:9:289:12 | A(...) [A] | semmle.label | A(...) [A] | -| main.rs:289:11:289:11 | n | semmle.label | n | -| main.rs:289:29:289:29 | n | semmle.label | n | -| main.rs:303:9:303:10 | s1 [C] | semmle.label | s1 [C] | -| main.rs:303:14:305:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:304:18:304:27 | source(...) | semmle.label | source(...) | -| main.rs:307:11:307:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:308:9:308:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:308:36:308:36 | n | semmle.label | n | -| main.rs:308:48:308:48 | n | semmle.label | n | -| main.rs:311:11:311:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:312:9:312:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:312:36:312:36 | n | semmle.label | n | -| main.rs:312:81:312:81 | n | semmle.label | n | -| main.rs:323:9:323:10 | s1 [C] | semmle.label | s1 [C] | -| main.rs:323:14:325:5 | C {...} [C] | semmle.label | C {...} [C] | -| main.rs:324:18:324:27 | source(...) | semmle.label | source(...) | -| main.rs:327:11:327:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:328:9:328:24 | C {...} [C] | semmle.label | C {...} [C] | -| main.rs:328:22:328:22 | n | semmle.label | n | -| main.rs:328:34:328:34 | n | semmle.label | n | -| main.rs:331:11:331:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:332:9:332:24 | C {...} [C] | semmle.label | C {...} [C] | -| main.rs:332:22:332:22 | n | semmle.label | n | -| main.rs:332:53:332:53 | n | semmle.label | n | -| main.rs:344:9:344:12 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:344:16:344:33 | [...] [element] | semmle.label | [...] [element] | -| main.rs:344:23:344:32 | source(...) | semmle.label | source(...) | -| main.rs:345:9:345:10 | n1 | semmle.label | n1 | -| main.rs:345:14:345:17 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:345:14:345:20 | arr1[2] | semmle.label | arr1[2] | -| main.rs:346:10:346:11 | n1 | semmle.label | n1 | -| main.rs:348:9:348:12 | arr2 [element] | semmle.label | arr2 [element] | -| main.rs:348:16:348:31 | [...; 10] [element] | semmle.label | [...; 10] [element] | -| main.rs:348:17:348:26 | source(...) | semmle.label | source(...) | -| main.rs:349:9:349:10 | n2 | semmle.label | n2 | -| main.rs:349:14:349:17 | arr2 [element] | semmle.label | arr2 [element] | -| main.rs:349:14:349:20 | arr2[4] | semmle.label | arr2[4] | -| main.rs:350:10:350:11 | n2 | semmle.label | n2 | -| main.rs:358:9:358:12 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:358:16:358:33 | [...] [element] | semmle.label | [...] [element] | -| main.rs:358:23:358:32 | source(...) | semmle.label | source(...) | -| main.rs:359:9:359:10 | n1 | semmle.label | n1 | -| main.rs:359:15:359:18 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:360:14:360:15 | n1 | semmle.label | n1 | -| main.rs:370:9:370:12 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:370:16:370:33 | [...] [element] | semmle.label | [...] [element] | -| main.rs:370:23:370:32 | source(...) | semmle.label | source(...) | -| main.rs:371:11:371:14 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:372:9:372:17 | SlicePat [element] | semmle.label | SlicePat [element] | -| main.rs:372:10:372:10 | a | semmle.label | a | -| main.rs:372:13:372:13 | b | semmle.label | b | -| main.rs:372:16:372:16 | c | semmle.label | c | -| main.rs:373:18:373:18 | a | semmle.label | a | -| main.rs:374:18:374:18 | b | semmle.label | b | -| main.rs:375:18:375:18 | c | semmle.label | c | -| main.rs:384:5:384:11 | [post] mut_arr [element] | semmle.label | [post] mut_arr [element] | -| main.rs:384:18:384:27 | source(...) | semmle.label | source(...) | -| main.rs:385:9:385:9 | d | semmle.label | d | -| main.rs:385:13:385:19 | mut_arr [element] | semmle.label | mut_arr [element] | -| main.rs:385:13:385:22 | mut_arr[1] | semmle.label | mut_arr[1] | -| main.rs:386:10:386:10 | d | semmle.label | d | -| main.rs:387:10:387:16 | mut_arr [element] | semmle.label | mut_arr [element] | -| main.rs:387:10:387:19 | mut_arr[0] | semmle.label | mut_arr[0] | -| main.rs:410:9:410:9 | s | semmle.label | s | -| main.rs:410:25:410:26 | source(...) | semmle.label | source(...) | -| main.rs:411:10:411:10 | s | semmle.label | s | +| main.rs:289:9:289:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:289:24:289:24 | n | semmle.label | n | +| main.rs:289:55:289:55 | n | semmle.label | n | +| main.rs:300:9:300:10 | s1 [A] | semmle.label | s1 [A] | +| main.rs:300:14:300:26 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:300:16:300:25 | source(...) | semmle.label | source(...) | +| main.rs:302:11:302:12 | s1 [A] | semmle.label | s1 [A] | +| main.rs:303:9:303:12 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:303:11:303:11 | n | semmle.label | n | +| main.rs:303:22:303:22 | n | semmle.label | n | +| main.rs:306:11:306:12 | s1 [A] | semmle.label | s1 [A] | +| main.rs:307:9:307:12 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:307:11:307:11 | n | semmle.label | n | +| main.rs:307:29:307:29 | n | semmle.label | n | +| main.rs:321:9:321:10 | s1 [C] | semmle.label | s1 [C] | +| main.rs:321:14:323:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:322:18:322:27 | source(...) | semmle.label | source(...) | +| main.rs:325:11:325:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:326:9:326:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:326:36:326:36 | n | semmle.label | n | +| main.rs:326:48:326:48 | n | semmle.label | n | +| main.rs:329:11:329:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:330:9:330:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:330:36:330:36 | n | semmle.label | n | +| main.rs:330:81:330:81 | n | semmle.label | n | +| main.rs:341:9:341:10 | s1 [C] | semmle.label | s1 [C] | +| main.rs:341:14:343:5 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:342:18:342:27 | source(...) | semmle.label | source(...) | +| main.rs:345:11:345:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:346:9:346:24 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:346:22:346:22 | n | semmle.label | n | +| main.rs:346:34:346:34 | n | semmle.label | n | +| main.rs:349:11:349:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:350:9:350:24 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:350:22:350:22 | n | semmle.label | n | +| main.rs:350:53:350:53 | n | semmle.label | n | +| main.rs:362:9:362:12 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:362:16:362:33 | [...] [element] | semmle.label | [...] [element] | +| main.rs:362:23:362:32 | source(...) | semmle.label | source(...) | +| main.rs:363:9:363:10 | n1 | semmle.label | n1 | +| main.rs:363:14:363:17 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:363:14:363:20 | arr1[2] | semmle.label | arr1[2] | +| main.rs:364:10:364:11 | n1 | semmle.label | n1 | +| main.rs:366:9:366:12 | arr2 [element] | semmle.label | arr2 [element] | +| main.rs:366:16:366:31 | [...; 10] [element] | semmle.label | [...; 10] [element] | +| main.rs:366:17:366:26 | source(...) | semmle.label | source(...) | +| main.rs:367:9:367:10 | n2 | semmle.label | n2 | +| main.rs:367:14:367:17 | arr2 [element] | semmle.label | arr2 [element] | +| main.rs:367:14:367:20 | arr2[4] | semmle.label | arr2[4] | +| main.rs:368:10:368:11 | n2 | semmle.label | n2 | +| main.rs:376:9:376:12 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:376:16:376:33 | [...] [element] | semmle.label | [...] [element] | +| main.rs:376:23:376:32 | source(...) | semmle.label | source(...) | +| main.rs:377:9:377:10 | n1 | semmle.label | n1 | +| main.rs:377:15:377:18 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:378:14:378:15 | n1 | semmle.label | n1 | +| main.rs:388:9:388:12 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:388:16:388:33 | [...] [element] | semmle.label | [...] [element] | +| main.rs:388:23:388:32 | source(...) | semmle.label | source(...) | +| main.rs:389:11:389:14 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:390:9:390:17 | SlicePat [element] | semmle.label | SlicePat [element] | +| main.rs:390:10:390:10 | a | semmle.label | a | +| main.rs:390:13:390:13 | b | semmle.label | b | +| main.rs:390:16:390:16 | c | semmle.label | c | +| main.rs:391:18:391:18 | a | semmle.label | a | +| main.rs:392:18:392:18 | b | semmle.label | b | +| main.rs:393:18:393:18 | c | semmle.label | c | +| main.rs:402:5:402:11 | [post] mut_arr [element] | semmle.label | [post] mut_arr [element] | +| main.rs:402:18:402:27 | source(...) | semmle.label | source(...) | +| main.rs:403:9:403:9 | d | semmle.label | d | +| main.rs:403:13:403:19 | mut_arr [element] | semmle.label | mut_arr [element] | +| main.rs:403:13:403:22 | mut_arr[1] | semmle.label | mut_arr[1] | +| main.rs:404:10:404:10 | d | semmle.label | d | +| main.rs:405:10:405:16 | mut_arr [element] | semmle.label | mut_arr [element] | +| main.rs:405:10:405:19 | mut_arr[0] | semmle.label | mut_arr[0] | +| main.rs:428:9:428:9 | s | semmle.label | s | +| main.rs:428:25:428:26 | source(...) | semmle.label | source(...) | +| main.rs:429:10:429:10 | s | semmle.label | s | subpaths testFailures #select @@ -355,22 +355,22 @@ testFailures | main.rs:225:10:225:20 | s1.unwrap(...) | main.rs:224:19:224:28 | source(...) | main.rs:225:10:225:20 | s1.unwrap(...) | $@ | main.rs:224:19:224:28 | source(...) | source(...) | | main.rs:230:10:230:24 | s1.unwrap_or(...) | main.rs:229:19:229:28 | source(...) | main.rs:230:10:230:24 | s1.unwrap_or(...) | $@ | main.rs:229:19:229:28 | source(...) | source(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | $@ | main.rs:233:23:233:32 | source(...) | source(...) | -| main.rs:240:10:240:11 | i1 | main.rs:237:19:237:28 | source(...) | main.rs:240:10:240:11 | i1 | $@ | main.rs:237:19:237:28 | source(...) | source(...) | -| main.rs:251:10:251:11 | i1 | main.rs:246:35:246:44 | source(...) | main.rs:251:10:251:11 | i1 | $@ | main.rs:246:35:246:44 | source(...) | source(...) | -| main.rs:267:35:267:35 | n | main.rs:264:29:264:38 | source(...) | main.rs:267:35:267:35 | n | $@ | main.rs:264:29:264:38 | source(...) | source(...) | -| main.rs:271:55:271:55 | n | main.rs:264:29:264:38 | source(...) | main.rs:271:55:271:55 | n | $@ | main.rs:264:29:264:38 | source(...) | source(...) | -| main.rs:285:22:285:22 | n | main.rs:282:16:282:25 | source(...) | main.rs:285:22:285:22 | n | $@ | main.rs:282:16:282:25 | source(...) | source(...) | -| main.rs:289:29:289:29 | n | main.rs:282:16:282:25 | source(...) | main.rs:289:29:289:29 | n | $@ | main.rs:282:16:282:25 | source(...) | source(...) | -| main.rs:308:48:308:48 | n | main.rs:304:18:304:27 | source(...) | main.rs:308:48:308:48 | n | $@ | main.rs:304:18:304:27 | source(...) | source(...) | -| main.rs:312:81:312:81 | n | main.rs:304:18:304:27 | source(...) | main.rs:312:81:312:81 | n | $@ | main.rs:304:18:304:27 | source(...) | source(...) | -| main.rs:328:34:328:34 | n | main.rs:324:18:324:27 | source(...) | main.rs:328:34:328:34 | n | $@ | main.rs:324:18:324:27 | source(...) | source(...) | -| main.rs:332:53:332:53 | n | main.rs:324:18:324:27 | source(...) | main.rs:332:53:332:53 | n | $@ | main.rs:324:18:324:27 | source(...) | source(...) | -| main.rs:346:10:346:11 | n1 | main.rs:344:23:344:32 | source(...) | main.rs:346:10:346:11 | n1 | $@ | main.rs:344:23:344:32 | source(...) | source(...) | -| main.rs:350:10:350:11 | n2 | main.rs:348:17:348:26 | source(...) | main.rs:350:10:350:11 | n2 | $@ | main.rs:348:17:348:26 | source(...) | source(...) | -| main.rs:360:14:360:15 | n1 | main.rs:358:23:358:32 | source(...) | main.rs:360:14:360:15 | n1 | $@ | main.rs:358:23:358:32 | source(...) | source(...) | -| main.rs:373:18:373:18 | a | main.rs:370:23:370:32 | source(...) | main.rs:373:18:373:18 | a | $@ | main.rs:370:23:370:32 | source(...) | source(...) | -| main.rs:374:18:374:18 | b | main.rs:370:23:370:32 | source(...) | main.rs:374:18:374:18 | b | $@ | main.rs:370:23:370:32 | source(...) | source(...) | -| main.rs:375:18:375:18 | c | main.rs:370:23:370:32 | source(...) | main.rs:375:18:375:18 | c | $@ | main.rs:370:23:370:32 | source(...) | source(...) | -| main.rs:386:10:386:10 | d | main.rs:384:18:384:27 | source(...) | main.rs:386:10:386:10 | d | $@ | main.rs:384:18:384:27 | source(...) | source(...) | -| main.rs:387:10:387:19 | mut_arr[0] | main.rs:384:18:384:27 | source(...) | main.rs:387:10:387:19 | mut_arr[0] | $@ | main.rs:384:18:384:27 | source(...) | source(...) | -| main.rs:411:10:411:10 | s | main.rs:410:25:410:26 | source(...) | main.rs:411:10:411:10 | s | $@ | main.rs:410:25:410:26 | source(...) | source(...) | +| main.rs:248:10:248:11 | i1 | main.rs:245:19:245:28 | source(...) | main.rs:248:10:248:11 | i1 | $@ | main.rs:245:19:245:28 | source(...) | source(...) | +| main.rs:259:10:259:11 | i1 | main.rs:254:35:254:44 | source(...) | main.rs:259:10:259:11 | i1 | $@ | main.rs:254:35:254:44 | source(...) | source(...) | +| main.rs:285:35:285:35 | n | main.rs:282:29:282:38 | source(...) | main.rs:285:35:285:35 | n | $@ | main.rs:282:29:282:38 | source(...) | source(...) | +| main.rs:289:55:289:55 | n | main.rs:282:29:282:38 | source(...) | main.rs:289:55:289:55 | n | $@ | main.rs:282:29:282:38 | source(...) | source(...) | +| main.rs:303:22:303:22 | n | main.rs:300:16:300:25 | source(...) | main.rs:303:22:303:22 | n | $@ | main.rs:300:16:300:25 | source(...) | source(...) | +| main.rs:307:29:307:29 | n | main.rs:300:16:300:25 | source(...) | main.rs:307:29:307:29 | n | $@ | main.rs:300:16:300:25 | source(...) | source(...) | +| main.rs:326:48:326:48 | n | main.rs:322:18:322:27 | source(...) | main.rs:326:48:326:48 | n | $@ | main.rs:322:18:322:27 | source(...) | source(...) | +| main.rs:330:81:330:81 | n | main.rs:322:18:322:27 | source(...) | main.rs:330:81:330:81 | n | $@ | main.rs:322:18:322:27 | source(...) | source(...) | +| main.rs:346:34:346:34 | n | main.rs:342:18:342:27 | source(...) | main.rs:346:34:346:34 | n | $@ | main.rs:342:18:342:27 | source(...) | source(...) | +| main.rs:350:53:350:53 | n | main.rs:342:18:342:27 | source(...) | main.rs:350:53:350:53 | n | $@ | main.rs:342:18:342:27 | source(...) | source(...) | +| main.rs:364:10:364:11 | n1 | main.rs:362:23:362:32 | source(...) | main.rs:364:10:364:11 | n1 | $@ | main.rs:362:23:362:32 | source(...) | source(...) | +| main.rs:368:10:368:11 | n2 | main.rs:366:17:366:26 | source(...) | main.rs:368:10:368:11 | n2 | $@ | main.rs:366:17:366:26 | source(...) | source(...) | +| main.rs:378:14:378:15 | n1 | main.rs:376:23:376:32 | source(...) | main.rs:378:14:378:15 | n1 | $@ | main.rs:376:23:376:32 | source(...) | source(...) | +| main.rs:391:18:391:18 | a | main.rs:388:23:388:32 | source(...) | main.rs:391:18:391:18 | a | $@ | main.rs:388:23:388:32 | source(...) | source(...) | +| main.rs:392:18:392:18 | b | main.rs:388:23:388:32 | source(...) | main.rs:392:18:392:18 | b | $@ | main.rs:388:23:388:32 | source(...) | source(...) | +| main.rs:393:18:393:18 | c | main.rs:388:23:388:32 | source(...) | main.rs:393:18:393:18 | c | $@ | main.rs:388:23:388:32 | source(...) | source(...) | +| main.rs:404:10:404:10 | d | main.rs:402:18:402:27 | source(...) | main.rs:404:10:404:10 | d | $@ | main.rs:402:18:402:27 | source(...) | source(...) | +| main.rs:405:10:405:19 | mut_arr[0] | main.rs:402:18:402:27 | source(...) | main.rs:405:10:405:19 | mut_arr[0] | $@ | main.rs:402:18:402:27 | source(...) | source(...) | +| main.rs:429:10:429:10 | s | main.rs:428:25:428:26 | source(...) | main.rs:429:10:429:10 | s | $@ | main.rs:428:25:428:26 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index adb0c8a9e4a5..591eecfb835f 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -233,6 +233,14 @@ fn option_unwrap_or() { sink(s2.unwrap_or(source(47))); // $ hasValueFlow=47 } +fn option_unwrap_or_else() { + let s1 = Some(source(47)); + sink(s1.unwrap_or_else(|| 0)); // $ MISSING: hasValueFlow=47 + + let s2 = None; + sink(s2.unwrap_or_else(|| source(48))); // $ MISSING: hasValueFlow=48 +} + fn option_questionmark() -> Option { let s1 = Some(source(20)); let s2 = Some(2); @@ -255,6 +263,16 @@ fn result_questionmark() -> Result { Ok(0) } +fn result_expect() { + let s1: Result = Ok(source(78)); + sink(s1.expect("")); // $ MISSING: hasValueFlow=78 + sink(s1.expect_err("")); + + let s2: Result = Err(source(79)); + sink(s2.expect("")); + sink(s2.expect_err("")); // $ MISSING: hasValueFlow=79 +} + enum MyTupleEnum { A(i64), B(i64), From 9d42be8305a21847468ef43da7c93bb5abfce31a Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 17 Jan 2025 12:27:02 +0000 Subject: [PATCH 4/8] Rust: Alphabetize lang-core.model.yml. --- .../lib/codeql/rust/frameworks/stdlib/lang-core.model.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index 4fad34e36b5e..d4712c8802f7 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -3,6 +3,10 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: + # Fmt + - ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"] + # Hint + - ["lang:core", "crate::hint::must_use", "Argument[0]", "ReturnValue", "value", "manual"] # Option - ["lang:core", "::unwrap", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] @@ -14,7 +18,3 @@ extensions: # String - ["lang:alloc", "::as_str", "Argument[self]", "ReturnValue", "taint", "manual"] - ["lang:alloc", "::as_bytes", "Argument[self]", "ReturnValue", "taint", "manual"] - # Hint - - ["lang:core", "crate::hint::must_use", "Argument[0]", "ReturnValue", "value", "manual"] - # Fmt - - ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"] From dfd1865b969cd12558e9e70fa95ccea9a816b617 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 17 Jan 2025 12:27:02 +0000 Subject: [PATCH 5/8] Rust: Add some basic flow models. --- .../frameworks/stdlib/lang-core.model.yml | 13 ++++ .../dataflow/local/DataFlowStep.expected | 65 +++++++++++++++---- .../dataflow/local/inline-flow.expected | 33 ++++++++++ .../test/library-tests/dataflow/local/main.rs | 6 +- .../library-tests/dataflow/sources/test.rs | 8 +-- 5 files changed, 104 insertions(+), 21 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index d4712c8802f7..a0639a662d19 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -11,10 +11,23 @@ extensions: - ["lang:core", "::unwrap", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[0]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_default", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_unchecked", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::expect", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] # Result - ["lang:core", "::unwrap", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[0]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_default", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_unchecked", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_err", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_err_unchecked", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::expect", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::expect_err", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"] # String - ["lang:alloc", "::as_str", "Argument[self]", "ReturnValue", "taint", "manual"] - ["lang:alloc", "::as_bytes", "Argument[self]", "ReturnValue", "taint", "manual"] diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 28edc1e940e3..79bfd4bc05b8 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,11 +1,24 @@ localStep -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:3 | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:6 | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::hint::must_use | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::hint::must_use | MaD:8 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:2 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:4 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:5 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:7 | +| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:4 | +| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:15 | +| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::hint::must_use | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::hint::must_use | MaD:21 | +| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:7 | +| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:18 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::expect | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::expect | MaD:2 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:3 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:5 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_default | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_default | MaD:6 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:8 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_unchecked | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_unchecked | MaD:9 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::expect_err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::expect_err | MaD:11 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_err | MaD:13 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err_unchecked | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_err_unchecked | MaD:14 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::expect | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::expect | MaD:10 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:12 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:16 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_default | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_default | MaD:17 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:19 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_unchecked | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_unchecked | MaD:20 | | main.rs:3:11:3:11 | [SSA] i | main.rs:4:12:4:12 | i | | | main.rs:3:11:3:11 | i | main.rs:3:11:3:11 | [SSA] i | | | main.rs:3:11:3:16 | ...: i64 | main.rs:3:11:3:11 | i | | @@ -486,13 +499,26 @@ localStep | main.rs:466:36:466:41 | ...::new(...) | main.rs:466:36:466:41 | MacroExpr | | models | 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] | -| 2 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | -| 3 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | -| 4 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | -| 5 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | -| 6 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | -| 7 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | -| 8 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | +| 2 | Summary: lang:core; ::expect; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 3 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 4 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | +| 5 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 6 | Summary: lang:core; ::unwrap_or_default; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 8 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 9 | Summary: lang:core; ::unwrap_unchecked; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 10 | Summary: lang:core; ::expect; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 11 | Summary: lang:core; ::expect_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 12 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: lang:core; ::unwrap_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 14 | Summary: lang:core; ::unwrap_err_unchecked; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 15 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | +| 16 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: lang:core; ::unwrap_or_default; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 18 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 19 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 20 | Summary: lang:core; ::unwrap_unchecked; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 21 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | storeStep | file://:0:0:0:0 | [summary] to write: ReturnValue.Variant[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | | file://:0:0:0:0 | [summary] to write: ReturnValue.Variant[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | @@ -577,10 +603,21 @@ storeStep | main.rs:414:35:414:61 | default_name | captured default_name | main.rs:414:35:414:61 | \|...\| ... | | main.rs:436:27:436:27 | 0 | Some | main.rs:436:22:436:28 | Some(...) | readStep +| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::expect | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_default | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_default | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_else | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_unchecked | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_unchecked | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::expect | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::expect_err | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_err_unchecked | Err | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err_unchecked | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_default | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_default | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_else | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_unchecked | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_unchecked | | main.rs:33:9:33:15 | Some(...) | Some | main.rs:33:14:33:14 | _ | | main.rs:87:11:87:11 | i | &ref | main.rs:87:10:87:11 | * ... | | main.rs:95:10:95:10 | a | tuple.0 | main.rs:95:10:95:12 | a.0 | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index cde62441663c..972b140623f6 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -2,6 +2,9 @@ models | 1 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | | 2 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | | 3 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 4 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 5 | Summary: lang:core; ::expect; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 6 | Summary: lang:core; ::expect_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | edges | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | | main.rs:19:13:19:21 | source(...) | main.rs:19:9:19:9 | s | provenance | | @@ -66,6 +69,10 @@ edges | main.rs:229:19:229:28 | source(...) | main.rs:229:14:229:29 | Some(...) [Some] | provenance | | | main.rs:230:10:230:11 | s1 [Some] | main.rs:230:10:230:24 | s1.unwrap_or(...) | provenance | MaD:3 | | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | provenance | MaD:2 | +| main.rs:237:9:237:10 | s1 [Some] | main.rs:238:10:238:11 | s1 [Some] | provenance | | +| main.rs:237:14:237:29 | Some(...) [Some] | main.rs:237:9:237:10 | s1 [Some] | provenance | | +| main.rs:237:19:237:28 | source(...) | main.rs:237:14:237:29 | Some(...) [Some] | provenance | | +| main.rs:238:10:238:11 | s1 [Some] | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | provenance | MaD:4 | | main.rs:245:9:245:10 | s1 [Some] | main.rs:247:14:247:15 | s1 [Some] | provenance | | | main.rs:245:14:245:29 | Some(...) [Some] | main.rs:245:9:245:10 | s1 [Some] | provenance | | | main.rs:245:19:245:28 | source(...) | main.rs:245:14:245:29 | Some(...) [Some] | provenance | | @@ -78,6 +85,14 @@ edges | main.rs:257:9:257:10 | i1 | main.rs:259:10:259:11 | i1 | provenance | | | main.rs:257:14:257:15 | s1 [Ok] | main.rs:257:14:257:16 | TryExpr | provenance | | | main.rs:257:14:257:16 | TryExpr | main.rs:257:9:257:10 | i1 | provenance | | +| main.rs:267:9:267:10 | s1 [Ok] | main.rs:268:10:268:11 | s1 [Ok] | provenance | | +| main.rs:267:32:267:45 | Ok(...) [Ok] | main.rs:267:9:267:10 | s1 [Ok] | provenance | | +| main.rs:267:35:267:44 | source(...) | main.rs:267:32:267:45 | Ok(...) [Ok] | provenance | | +| main.rs:268:10:268:11 | s1 [Ok] | main.rs:268:10:268:22 | s1.expect(...) | provenance | MaD:5 | +| main.rs:271:9:271:10 | s2 [Err] | main.rs:273:10:273:11 | s2 [Err] | provenance | | +| main.rs:271:32:271:46 | Err(...) [Err] | main.rs:271:9:271:10 | s2 [Err] | provenance | | +| main.rs:271:36:271:45 | source(...) | main.rs:271:32:271:46 | Err(...) [Err] | provenance | | +| main.rs:273:10:273:11 | s2 [Err] | main.rs:273:10:273:26 | s2.expect_err(...) | provenance | MaD:6 | | main.rs:282:9:282:10 | s1 [A] | main.rs:284:11:284:12 | s1 [A] | provenance | | | main.rs:282:14:282:39 | ...::A(...) [A] | main.rs:282:9:282:10 | s1 [A] | provenance | | | main.rs:282:29:282:38 | source(...) | main.rs:282:14:282:39 | ...::A(...) [A] | provenance | | @@ -235,6 +250,11 @@ nodes | main.rs:230:10:230:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | | main.rs:233:23:233:32 | source(...) | semmle.label | source(...) | +| main.rs:237:9:237:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:237:14:237:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:237:19:237:28 | source(...) | semmle.label | source(...) | +| main.rs:238:10:238:11 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:238:10:238:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | | main.rs:245:9:245:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:245:14:245:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:245:19:245:28 | source(...) | semmle.label | source(...) | @@ -249,6 +269,16 @@ nodes | main.rs:257:14:257:15 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:257:14:257:16 | TryExpr | semmle.label | TryExpr | | main.rs:259:10:259:11 | i1 | semmle.label | i1 | +| main.rs:267:9:267:10 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:267:32:267:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| main.rs:267:35:267:44 | source(...) | semmle.label | source(...) | +| main.rs:268:10:268:11 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:268:10:268:22 | s1.expect(...) | semmle.label | s1.expect(...) | +| main.rs:271:9:271:10 | s2 [Err] | semmle.label | s2 [Err] | +| main.rs:271:32:271:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | +| main.rs:271:36:271:45 | source(...) | semmle.label | source(...) | +| main.rs:273:10:273:11 | s2 [Err] | semmle.label | s2 [Err] | +| main.rs:273:10:273:26 | s2.expect_err(...) | semmle.label | s2.expect_err(...) | | main.rs:282:9:282:10 | s1 [A] | semmle.label | s1 [A] | | main.rs:282:14:282:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | | main.rs:282:29:282:38 | source(...) | semmle.label | source(...) | @@ -355,8 +385,11 @@ testFailures | main.rs:225:10:225:20 | s1.unwrap(...) | main.rs:224:19:224:28 | source(...) | main.rs:225:10:225:20 | s1.unwrap(...) | $@ | main.rs:224:19:224:28 | source(...) | source(...) | | main.rs:230:10:230:24 | s1.unwrap_or(...) | main.rs:229:19:229:28 | source(...) | main.rs:230:10:230:24 | s1.unwrap_or(...) | $@ | main.rs:229:19:229:28 | source(...) | source(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | $@ | main.rs:233:23:233:32 | source(...) | source(...) | +| main.rs:238:10:238:32 | s1.unwrap_or_else(...) | main.rs:237:19:237:28 | source(...) | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | $@ | main.rs:237:19:237:28 | source(...) | source(...) | | main.rs:248:10:248:11 | i1 | main.rs:245:19:245:28 | source(...) | main.rs:248:10:248:11 | i1 | $@ | main.rs:245:19:245:28 | source(...) | source(...) | | main.rs:259:10:259:11 | i1 | main.rs:254:35:254:44 | source(...) | main.rs:259:10:259:11 | i1 | $@ | main.rs:254:35:254:44 | source(...) | source(...) | +| main.rs:268:10:268:22 | s1.expect(...) | main.rs:267:35:267:44 | source(...) | main.rs:268:10:268:22 | s1.expect(...) | $@ | main.rs:267:35:267:44 | source(...) | source(...) | +| main.rs:273:10:273:26 | s2.expect_err(...) | main.rs:271:36:271:45 | source(...) | main.rs:273:10:273:26 | s2.expect_err(...) | $@ | main.rs:271:36:271:45 | source(...) | source(...) | | main.rs:285:35:285:35 | n | main.rs:282:29:282:38 | source(...) | main.rs:285:35:285:35 | n | $@ | main.rs:282:29:282:38 | source(...) | source(...) | | main.rs:289:55:289:55 | n | main.rs:282:29:282:38 | source(...) | main.rs:289:55:289:55 | n | $@ | main.rs:282:29:282:38 | source(...) | source(...) | | main.rs:303:22:303:22 | n | main.rs:300:16:300:25 | source(...) | main.rs:303:22:303:22 | n | $@ | main.rs:300:16:300:25 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index 591eecfb835f..c4d90f3d7287 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -235,7 +235,7 @@ fn option_unwrap_or() { fn option_unwrap_or_else() { let s1 = Some(source(47)); - sink(s1.unwrap_or_else(|| 0)); // $ MISSING: hasValueFlow=47 + sink(s1.unwrap_or_else(|| 0)); // $ hasValueFlow=47 let s2 = None; sink(s2.unwrap_or_else(|| source(48))); // $ MISSING: hasValueFlow=48 @@ -265,12 +265,12 @@ fn result_questionmark() -> Result { fn result_expect() { let s1: Result = Ok(source(78)); - sink(s1.expect("")); // $ MISSING: hasValueFlow=78 + sink(s1.expect("")); // $ hasValueFlow=78 sink(s1.expect_err("")); let s2: Result = Err(source(79)); sink(s2.expect("")); - sink(s2.expect_err("")); // $ MISSING: hasValueFlow=79 + sink(s2.expect_err("")); // $ hasValueFlow=79 } enum MyTupleEnum { diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 449828cb995b..e867c2961d67 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -11,7 +11,7 @@ fn test_env_vars() { let var1 = std::env::var("HOME").expect("HOME not set"); // $ Alert[rust/summary/taint-sources] let var2 = std::env::var_os("PATH").unwrap(); // $ Alert[rust/summary/taint-sources] - sink(var1); // $ MISSING: hasTaintFlow + sink(var1); // $ hasTaintFlow="HOME" sink(var2); // $ hasTaintFlow="PATH" for (key, value) in std::env::vars() { // $ Alert[rust/summary/taint-sources] @@ -51,9 +51,9 @@ fn test_env_dirs() { let exe = std::env::current_exe().expect("FAILED"); // $ Alert[rust/summary/taint-sources] let home = std::env::home_dir().expect("FAILED"); // $ Alert[rust/summary/taint-sources] - sink(dir); // $ MISSING: hasTaintFlow - sink(exe); // $ MISSING: hasTaintFlow - sink(home); // $ MISSING: hasTaintFlow + sink(dir); // $ hasTaintFlow + sink(exe); // $ hasTaintFlow + sink(home); // $ hasTaintFlow } async fn test_reqwest() -> Result<(), reqwest::Error> { From f2564c351f232ab481d30a05eb2a189943fbfd74 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 28 Jan 2025 09:09:39 +0000 Subject: [PATCH 6/8] Rust: Changes to other tests - mostly MaD IDs :(. --- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../CWE-312/CleartextLogging.expected | 34 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected index 97d13b1e5d04..1eef1f6e8abd 100644 --- a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ identityLocalStep -| main.rs:394:7:394:18 | phi(default_name) | Node steps to itself | +| main.rs:412:7:412:18 | phi(default_name) | Node steps to itself | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 0cca29f32b3f..48b9916a1d95 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -136,8 +136,8 @@ edges | test_logging.rs:99:14:99:46 | res | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:14:99:46 | res | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:54 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:53 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:45 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:46 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:19 | ...::log | provenance | MaD:0 Sink:MaD:0 | | test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:42 | ...::log | provenance | MaD:0 Sink:MaD:0 | @@ -180,45 +180,45 @@ edges | test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | test_logging.rs:167:17:167:64 | ...::assert_failed | provenance | MaD:10 Sink:MaD:10 | | test_logging.rs:167:40:167:63 | MacroExpr | test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | provenance | | | test_logging.rs:167:56:167:63 | password | test_logging.rs:167:40:167:63 | MacroExpr | provenance | | -| test_logging.rs:168:34:168:66 | MacroExpr | test_logging.rs:168:34:168:75 | ... .as_str(...) | provenance | MaD:51 | +| test_logging.rs:168:34:168:66 | MacroExpr | test_logging.rs:168:34:168:75 | ... .as_str(...) | provenance | MaD:66 | | test_logging.rs:168:34:168:66 | res | test_logging.rs:168:42:168:65 | { ... } | provenance | | | test_logging.rs:168:34:168:75 | ... .as_str(...) | test_logging.rs:168:27:168:32 | expect | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:168:42:168:65 | ...::format(...) | test_logging.rs:168:34:168:66 | res | provenance | | | test_logging.rs:168:42:168:65 | ...::must_use(...) | test_logging.rs:168:34:168:66 | MacroExpr | provenance | | -| test_logging.rs:168:42:168:65 | MacroExpr | test_logging.rs:168:42:168:65 | ...::format(...) | provenance | MaD:54 | -| test_logging.rs:168:42:168:65 | { ... } | test_logging.rs:168:42:168:65 | ...::must_use(...) | provenance | MaD:53 | +| test_logging.rs:168:42:168:65 | MacroExpr | test_logging.rs:168:42:168:65 | ...::format(...) | provenance | MaD:45 | +| test_logging.rs:168:42:168:65 | { ... } | test_logging.rs:168:42:168:65 | ...::must_use(...) | provenance | MaD:46 | | test_logging.rs:168:58:168:65 | password | test_logging.rs:168:42:168:65 | MacroExpr | provenance | | -| test_logging.rs:174:36:174:70 | MacroExpr | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | provenance | MaD:52 | +| test_logging.rs:174:36:174:70 | MacroExpr | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | provenance | MaD:67 | | test_logging.rs:174:36:174:70 | res | test_logging.rs:174:44:174:69 | { ... } | provenance | | | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | test_logging.rs:174:30:174:34 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:174:44:174:69 | ...::format(...) | test_logging.rs:174:36:174:70 | res | provenance | | | test_logging.rs:174:44:174:69 | ...::must_use(...) | test_logging.rs:174:36:174:70 | MacroExpr | provenance | | -| test_logging.rs:174:44:174:69 | MacroExpr | test_logging.rs:174:44:174:69 | ...::format(...) | provenance | MaD:54 | -| test_logging.rs:174:44:174:69 | { ... } | test_logging.rs:174:44:174:69 | ...::must_use(...) | provenance | MaD:53 | +| test_logging.rs:174:44:174:69 | MacroExpr | test_logging.rs:174:44:174:69 | ...::format(...) | provenance | MaD:45 | +| test_logging.rs:174:44:174:69 | { ... } | test_logging.rs:174:44:174:69 | ...::must_use(...) | provenance | MaD:46 | | test_logging.rs:174:62:174:69 | password | test_logging.rs:174:44:174:69 | MacroExpr | provenance | | -| test_logging.rs:175:40:175:74 | MacroExpr | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | provenance | MaD:52 | +| test_logging.rs:175:40:175:74 | MacroExpr | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | provenance | MaD:67 | | test_logging.rs:175:40:175:74 | res | test_logging.rs:175:48:175:73 | { ... } | provenance | | | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | test_logging.rs:175:30:175:38 | write_all | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:175:48:175:73 | ...::format(...) | test_logging.rs:175:40:175:74 | res | provenance | | | test_logging.rs:175:48:175:73 | ...::must_use(...) | test_logging.rs:175:40:175:74 | MacroExpr | provenance | | -| test_logging.rs:175:48:175:73 | MacroExpr | test_logging.rs:175:48:175:73 | ...::format(...) | provenance | MaD:54 | -| test_logging.rs:175:48:175:73 | { ... } | test_logging.rs:175:48:175:73 | ...::must_use(...) | provenance | MaD:53 | +| test_logging.rs:175:48:175:73 | MacroExpr | test_logging.rs:175:48:175:73 | ...::format(...) | provenance | MaD:45 | +| test_logging.rs:175:48:175:73 | { ... } | test_logging.rs:175:48:175:73 | ...::must_use(...) | provenance | MaD:46 | | test_logging.rs:175:66:175:73 | password | test_logging.rs:175:48:175:73 | MacroExpr | provenance | | -| test_logging.rs:178:15:178:49 | MacroExpr | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | provenance | MaD:52 | +| test_logging.rs:178:15:178:49 | MacroExpr | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | provenance | MaD:67 | | test_logging.rs:178:15:178:49 | res | test_logging.rs:178:23:178:48 | { ... } | provenance | | | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | test_logging.rs:178:9:178:13 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:178:23:178:48 | ...::format(...) | test_logging.rs:178:15:178:49 | res | provenance | | | test_logging.rs:178:23:178:48 | ...::must_use(...) | test_logging.rs:178:15:178:49 | MacroExpr | provenance | | -| test_logging.rs:178:23:178:48 | MacroExpr | test_logging.rs:178:23:178:48 | ...::format(...) | provenance | MaD:54 | -| test_logging.rs:178:23:178:48 | { ... } | test_logging.rs:178:23:178:48 | ...::must_use(...) | provenance | MaD:53 | +| test_logging.rs:178:23:178:48 | MacroExpr | test_logging.rs:178:23:178:48 | ...::format(...) | provenance | MaD:45 | +| test_logging.rs:178:23:178:48 | { ... } | test_logging.rs:178:23:178:48 | ...::must_use(...) | provenance | MaD:46 | | test_logging.rs:178:41:178:48 | password | test_logging.rs:178:23:178:48 | MacroExpr | provenance | | -| test_logging.rs:181:15:181:49 | MacroExpr | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | provenance | MaD:52 | +| test_logging.rs:181:15:181:49 | MacroExpr | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | provenance | MaD:67 | | test_logging.rs:181:15:181:49 | res | test_logging.rs:181:23:181:48 | { ... } | provenance | | | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | test_logging.rs:181:9:181:13 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:181:23:181:48 | ...::format(...) | test_logging.rs:181:15:181:49 | res | provenance | | | test_logging.rs:181:23:181:48 | ...::must_use(...) | test_logging.rs:181:15:181:49 | MacroExpr | provenance | | -| test_logging.rs:181:23:181:48 | MacroExpr | test_logging.rs:181:23:181:48 | ...::format(...) | provenance | MaD:54 | -| test_logging.rs:181:23:181:48 | { ... } | test_logging.rs:181:23:181:48 | ...::must_use(...) | provenance | MaD:53 | +| test_logging.rs:181:23:181:48 | MacroExpr | test_logging.rs:181:23:181:48 | ...::format(...) | provenance | MaD:45 | +| test_logging.rs:181:23:181:48 | { ... } | test_logging.rs:181:23:181:48 | ...::must_use(...) | provenance | MaD:46 | | test_logging.rs:181:41:181:48 | password | test_logging.rs:181:23:181:48 | MacroExpr | provenance | | nodes | test_logging.rs:42:5:42:36 | ...::log | semmle.label | ...::log | From 8b82eaa6335cee2aec153da156d90e5cd02bafb1 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 28 Jan 2025 13:44:27 +0100 Subject: [PATCH 7/8] Rust: Fix data flow through callbacks passed to library functions --- .../rust/dataflow/internal/DataFlowImpl.qll | 24 +++++----- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../dataflow/local/DataFlowStep.expected | 48 +++++++++---------- .../dataflow/local/inline-flow.expected | 17 ++++--- .../test/library-tests/dataflow/local/main.rs | 16 +++---- 5 files changed, 56 insertions(+), 51 deletions(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 19da3ae509a8..7f6f7b58268d 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -49,16 +49,12 @@ final class DataFlowCallable extends TDataFlowCallable { } final class DataFlowCall extends TDataFlowCall { - private CallExprBaseCfgNode call; - - DataFlowCall() { this = TCall(call) } - /** Gets the underlying call in the CFG, if any. */ - CallExprCfgNode asCallExprCfgNode() { result = call } + CallExprCfgNode asCallExprCfgNode() { result = this.asCallBaseExprCfgNode() } - MethodCallExprCfgNode asMethodCallExprCfgNode() { result = call } + MethodCallExprCfgNode asMethodCallExprCfgNode() { result = this.asCallBaseExprCfgNode() } - CallExprBaseCfgNode asCallBaseExprCfgNode() { result = call } + CallExprBaseCfgNode asCallBaseExprCfgNode() { this = TCall(result) } predicate isSummaryCall( FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver @@ -67,7 +63,7 @@ final class DataFlowCall extends TDataFlowCall { } DataFlowCallable getEnclosingCallable() { - result = TCfgScope(call.getExpr().getEnclosingCfgScope()) + result = TCfgScope(this.asCallBaseExprCfgNode().getExpr().getEnclosingCfgScope()) or exists(FlowSummaryImpl::Public::SummarizedCallable c | this.isSummaryCall(c, _) and @@ -1298,10 +1294,14 @@ module RustDataFlow implements InputSig { * invoked expression. */ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { - receiver.asExpr() = call.asCallExprCfgNode().getFunction() and - // All calls to complex expressions and local variable accesses are lambda call. - exists(Expr f | f = receiver.asExpr().getExpr() | - f instanceof PathExpr implies f = any(Variable v).getAnAccess() + ( + receiver.asExpr() = call.asCallExprCfgNode().getFunction() and + // All calls to complex expressions and local variable accesses are lambda call. + exists(Expr f | f = receiver.asExpr().getExpr() | + f instanceof PathExpr implies f = any(Variable v).getAnAccess() + ) + or + call.isSummaryCall(_, receiver.(Node::FlowSummaryNode).getSummaryNode()) ) and exists(kind) } diff --git a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected index 1eef1f6e8abd..ed95b9e1208c 100644 --- a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ identityLocalStep -| main.rs:412:7:412:18 | phi(default_name) | Node steps to itself | +| main.rs:412:9:412:20 | phi(default_name) | Node steps to itself | diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 79bfd4bc05b8..5acd1e8126ce 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -471,26 +471,26 @@ localStep | main.rs:403:13:403:19 | [post] mut_arr | main.rs:405:10:405:16 | mut_arr | | | main.rs:403:13:403:19 | mut_arr | main.rs:405:10:405:16 | mut_arr | | | main.rs:403:13:403:22 | mut_arr[1] | main.rs:403:9:403:9 | d | | -| main.rs:410:39:410:43 | [SSA] names | main.rs:412:23:412:27 | names | | +| main.rs:410:39:410:43 | [SSA] names | main.rs:412:25:412:29 | names | | | main.rs:410:39:410:43 | names | main.rs:410:39:410:43 | [SSA] names | | | main.rs:410:39:410:72 | ...: Vec::<...> | main.rs:410:39:410:43 | names | | -| main.rs:411:7:411:18 | default_name | main.rs:411:7:411:18 | [SSA] default_name | | -| main.rs:411:22:411:43 | ... .to_string(...) | main.rs:411:7:411:18 | default_name | | -| main.rs:411:22:411:43 | ... .to_string(...) | main.rs:412:7:412:18 | phi(default_name) | | -| main.rs:412:3:418:3 | for ... in ... { ... } | main.rs:410:75:419:1 | { ... } | | -| main.rs:412:7:412:18 | phi(default_name) | main.rs:412:7:412:18 | phi(default_name) | | -| main.rs:412:7:412:18 | phi(default_name) | main.rs:414:35:414:61 | default_name | | -| main.rs:412:8:412:11 | [SSA] cond | main.rs:413:8:413:11 | cond | | -| main.rs:412:8:412:11 | cond | main.rs:412:8:412:11 | [SSA] cond | | -| main.rs:412:14:412:17 | [SSA] name | main.rs:414:15:414:18 | name | | -| main.rs:412:14:412:17 | name | main.rs:412:14:412:17 | [SSA] name | | -| main.rs:413:5:417:5 | if cond {...} | main.rs:412:29:418:3 | { ... } | | -| main.rs:414:11:414:11 | [SSA] n | main.rs:415:12:415:12 | n | | -| main.rs:414:11:414:11 | n | main.rs:414:11:414:11 | [SSA] n | | -| main.rs:414:15:414:62 | name.unwrap_or_else(...) | main.rs:414:11:414:11 | n | | -| main.rs:414:35:414:61 | [post] default_name | main.rs:412:7:412:18 | phi(default_name) | | -| main.rs:414:35:414:61 | closure self in \|...\| ... | main.rs:414:38:414:49 | this | | -| main.rs:414:35:414:61 | default_name | main.rs:412:7:412:18 | phi(default_name) | | +| main.rs:411:9:411:20 | default_name | main.rs:411:9:411:20 | [SSA] default_name | | +| main.rs:411:24:411:45 | ... .to_string(...) | main.rs:411:9:411:20 | default_name | | +| main.rs:411:24:411:45 | ... .to_string(...) | main.rs:412:9:412:20 | phi(default_name) | | +| main.rs:412:5:418:5 | for ... in ... { ... } | main.rs:410:75:419:1 | { ... } | | +| main.rs:412:9:412:20 | phi(default_name) | main.rs:412:9:412:20 | phi(default_name) | | +| main.rs:412:9:412:20 | phi(default_name) | main.rs:414:41:414:67 | default_name | | +| main.rs:412:10:412:13 | [SSA] cond | main.rs:413:12:413:15 | cond | | +| main.rs:412:10:412:13 | cond | main.rs:412:10:412:13 | [SSA] cond | | +| main.rs:412:16:412:19 | [SSA] name | main.rs:414:21:414:24 | name | | +| main.rs:412:16:412:19 | name | main.rs:412:16:412:19 | [SSA] name | | +| main.rs:413:9:417:9 | if cond {...} | main.rs:412:31:418:5 | { ... } | | +| main.rs:414:17:414:17 | [SSA] n | main.rs:415:18:415:18 | n | | +| main.rs:414:17:414:17 | n | main.rs:414:17:414:17 | [SSA] n | | +| main.rs:414:21:414:68 | name.unwrap_or_else(...) | main.rs:414:17:414:17 | n | | +| main.rs:414:41:414:67 | [post] default_name | main.rs:412:9:412:20 | phi(default_name) | | +| main.rs:414:41:414:67 | closure self in \|...\| ... | main.rs:414:44:414:55 | this | | +| main.rs:414:41:414:67 | default_name | main.rs:412:9:412:20 | phi(default_name) | | | main.rs:428:9:428:9 | [SSA] s | main.rs:429:10:429:10 | s | | | main.rs:428:9:428:9 | s | main.rs:428:9:428:9 | [SSA] s | | | main.rs:428:13:428:27 | MacroExpr | main.rs:428:9:428:9 | s | | @@ -600,7 +600,7 @@ storeStep | main.rs:399:27:399:27 | 2 | element | main.rs:399:23:399:31 | [...] | | main.rs:399:30:399:30 | 3 | element | main.rs:399:23:399:31 | [...] | | main.rs:402:18:402:27 | source(...) | element | main.rs:402:5:402:11 | [post] mut_arr | -| main.rs:414:35:414:61 | default_name | captured default_name | main.rs:414:35:414:61 | \|...\| ... | +| main.rs:414:41:414:67 | default_name | captured default_name | main.rs:414:41:414:67 | \|...\| ... | | main.rs:436:27:436:27 | 0 | Some | main.rs:436:22:436:28 | Some(...) | readStep | file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::expect | @@ -689,8 +689,8 @@ readStep | main.rs:402:5:402:11 | mut_arr | element | main.rs:402:5:402:14 | mut_arr[1] | | main.rs:403:13:403:19 | mut_arr | element | main.rs:403:13:403:22 | mut_arr[1] | | main.rs:405:10:405:16 | mut_arr | element | main.rs:405:10:405:19 | mut_arr[0] | -| main.rs:412:7:412:18 | TuplePat | tuple.0 | main.rs:412:8:412:11 | cond | -| main.rs:412:7:412:18 | TuplePat | tuple.1 | main.rs:412:14:412:17 | name | -| main.rs:412:23:412:27 | names | element | main.rs:412:7:412:18 | TuplePat | -| main.rs:414:35:414:61 | [post] \|...\| ... | captured default_name | main.rs:414:35:414:61 | [post] default_name | -| main.rs:414:38:414:49 | this | captured default_name | main.rs:414:38:414:49 | default_name | +| main.rs:412:9:412:20 | TuplePat | tuple.0 | main.rs:412:10:412:13 | cond | +| main.rs:412:9:412:20 | TuplePat | tuple.1 | main.rs:412:16:412:19 | name | +| main.rs:412:25:412:29 | names | element | main.rs:412:9:412:20 | TuplePat | +| main.rs:414:41:414:67 | [post] \|...\| ... | captured default_name | main.rs:414:41:414:67 | [post] default_name | +| main.rs:414:44:414:55 | this | captured default_name | main.rs:414:44:414:55 | default_name | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index 972b140623f6..b52569042eda 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -2,9 +2,10 @@ models | 1 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | | 2 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | | 3 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | -| 4 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | -| 5 | Summary: lang:core; ::expect; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | -| 6 | Summary: lang:core; ::expect_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 4 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 5 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 6 | Summary: lang:core; ::expect; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 7 | Summary: lang:core; ::expect_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | edges | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | | main.rs:19:13:19:21 | source(...) | main.rs:19:9:19:9 | s | provenance | | @@ -72,7 +73,8 @@ edges | main.rs:237:9:237:10 | s1 [Some] | main.rs:238:10:238:11 | s1 [Some] | provenance | | | main.rs:237:14:237:29 | Some(...) [Some] | main.rs:237:9:237:10 | s1 [Some] | provenance | | | main.rs:237:19:237:28 | source(...) | main.rs:237:14:237:29 | Some(...) [Some] | provenance | | -| main.rs:238:10:238:11 | s1 [Some] | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | provenance | MaD:4 | +| main.rs:238:10:238:11 | s1 [Some] | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | provenance | MaD:5 | +| main.rs:241:31:241:40 | source(...) | main.rs:241:10:241:41 | s2.unwrap_or_else(...) | provenance | MaD:4 | | main.rs:245:9:245:10 | s1 [Some] | main.rs:247:14:247:15 | s1 [Some] | provenance | | | main.rs:245:14:245:29 | Some(...) [Some] | main.rs:245:9:245:10 | s1 [Some] | provenance | | | main.rs:245:19:245:28 | source(...) | main.rs:245:14:245:29 | Some(...) [Some] | provenance | | @@ -88,11 +90,11 @@ edges | main.rs:267:9:267:10 | s1 [Ok] | main.rs:268:10:268:11 | s1 [Ok] | provenance | | | main.rs:267:32:267:45 | Ok(...) [Ok] | main.rs:267:9:267:10 | s1 [Ok] | provenance | | | main.rs:267:35:267:44 | source(...) | main.rs:267:32:267:45 | Ok(...) [Ok] | provenance | | -| main.rs:268:10:268:11 | s1 [Ok] | main.rs:268:10:268:22 | s1.expect(...) | provenance | MaD:5 | +| main.rs:268:10:268:11 | s1 [Ok] | main.rs:268:10:268:22 | s1.expect(...) | provenance | MaD:6 | | main.rs:271:9:271:10 | s2 [Err] | main.rs:273:10:273:11 | s2 [Err] | provenance | | | main.rs:271:32:271:46 | Err(...) [Err] | main.rs:271:9:271:10 | s2 [Err] | provenance | | | main.rs:271:36:271:45 | source(...) | main.rs:271:32:271:46 | Err(...) [Err] | provenance | | -| main.rs:273:10:273:11 | s2 [Err] | main.rs:273:10:273:26 | s2.expect_err(...) | provenance | MaD:6 | +| main.rs:273:10:273:11 | s2 [Err] | main.rs:273:10:273:26 | s2.expect_err(...) | provenance | MaD:7 | | main.rs:282:9:282:10 | s1 [A] | main.rs:284:11:284:12 | s1 [A] | provenance | | | main.rs:282:14:282:39 | ...::A(...) [A] | main.rs:282:9:282:10 | s1 [A] | provenance | | | main.rs:282:29:282:38 | source(...) | main.rs:282:14:282:39 | ...::A(...) [A] | provenance | | @@ -255,6 +257,8 @@ nodes | main.rs:237:19:237:28 | source(...) | semmle.label | source(...) | | main.rs:238:10:238:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | +| main.rs:241:10:241:41 | s2.unwrap_or_else(...) | semmle.label | s2.unwrap_or_else(...) | +| main.rs:241:31:241:40 | source(...) | semmle.label | source(...) | | main.rs:245:9:245:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:245:14:245:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:245:19:245:28 | source(...) | semmle.label | source(...) | @@ -386,6 +390,7 @@ testFailures | main.rs:230:10:230:24 | s1.unwrap_or(...) | main.rs:229:19:229:28 | source(...) | main.rs:230:10:230:24 | s1.unwrap_or(...) | $@ | main.rs:229:19:229:28 | source(...) | source(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | $@ | main.rs:233:23:233:32 | source(...) | source(...) | | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | main.rs:237:19:237:28 | source(...) | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | $@ | main.rs:237:19:237:28 | source(...) | source(...) | +| main.rs:241:10:241:41 | s2.unwrap_or_else(...) | main.rs:241:31:241:40 | source(...) | main.rs:241:10:241:41 | s2.unwrap_or_else(...) | $@ | main.rs:241:31:241:40 | source(...) | source(...) | | main.rs:248:10:248:11 | i1 | main.rs:245:19:245:28 | source(...) | main.rs:248:10:248:11 | i1 | $@ | main.rs:245:19:245:28 | source(...) | source(...) | | main.rs:259:10:259:11 | i1 | main.rs:254:35:254:44 | source(...) | main.rs:259:10:259:11 | i1 | $@ | main.rs:254:35:254:44 | source(...) | source(...) | | main.rs:268:10:268:22 | s1.expect(...) | main.rs:267:35:267:44 | source(...) | main.rs:268:10:268:22 | s1.expect(...) | $@ | main.rs:267:35:267:44 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index c4d90f3d7287..e2c1a76b1427 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -238,7 +238,7 @@ fn option_unwrap_or_else() { sink(s1.unwrap_or_else(|| 0)); // $ hasValueFlow=47 let s2 = None; - sink(s2.unwrap_or_else(|| source(48))); // $ MISSING: hasValueFlow=48 + sink(s2.unwrap_or_else(|| source(48))); // $ hasValueFlow=48 } fn option_questionmark() -> Option { @@ -408,14 +408,14 @@ fn array_assignment() { // Test data flow inconsistency occuring with captured variables and `continue` // in a loop. pub fn captured_variable_and_continue(names: Vec<(bool, Option)>) { - let default_name = source(83).to_string(); - for (cond, name) in names { - if cond { - let n = name.unwrap_or_else(|| default_name.to_string()); - sink(n.len() as i64); - continue; + let default_name = source(83).to_string(); + for (cond, name) in names { + if cond { + let n = name.unwrap_or_else(|| default_name.to_string()); + sink(n.len() as i64); + continue; + } } - } } macro_rules! get_source { From 919e7978cd96bd2acc0e1b0394c7b4df3c82249d Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:23:20 +0000 Subject: [PATCH 8/8] Rust: Add PrettyPrintModels.ql to the test. I gather this stabilized the output MaD IDs. --- .../CWE-312/CleartextLogging.expected | 155 ++++++++++-------- .../security/CWE-312/CleartextLogging.qlref | 1 + 2 files changed, 86 insertions(+), 70 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 48b9916a1d95..517e420a994d 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -48,178 +48,193 @@ | test_logging.rs:178:9:178:13 | write | test_logging.rs:178:41:178:48 | password | test_logging.rs:178:9:178:13 | write | This operation writes $@ to a log file. | test_logging.rs:178:41:178:48 | password | password | | test_logging.rs:181:9:181:13 | write | test_logging.rs:181:41:181:48 | password | test_logging.rs:181:9:181:13 | write | This operation writes $@ to a log file. | test_logging.rs:181:41:181:48 | password | password | edges -| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:5:42:36 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:5:42:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:42:28:42:35 | password | test_logging.rs:42:12:42:35 | MacroExpr | provenance | | -| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:36 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | | -| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:5:44:35 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:5:44:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:44:27:44:34 | password | test_logging.rs:44:11:44:34 | MacroExpr | provenance | | -| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:5:45:36 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:5:45:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:45:28:45:35 | password | test_logging.rs:45:12:45:35 | MacroExpr | provenance | | -| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:5:46:35 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:5:46:35 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:46:27:46:34 | password | test_logging.rs:46:11:46:34 | MacroExpr | provenance | | -| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:5:47:48 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:5:47:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:47:40:47:47 | password | test_logging.rs:47:24:47:47 | MacroExpr | provenance | | -| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:5:52:36 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:5:52:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:52:28:52:35 | password | test_logging.rs:52:12:52:35 | MacroExpr | provenance | | -| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:5:54:49 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:5:54:49 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:54:41:54:48 | password | test_logging.rs:54:12:54:48 | MacroExpr | provenance | | -| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:5:56:47 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:5:56:47 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:56:39:56:46 | password | test_logging.rs:56:12:56:46 | MacroExpr | provenance | | -| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:5:57:34 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:5:57:34 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:57:24:57:31 | password | test_logging.rs:57:12:57:33 | MacroExpr | provenance | | -| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:5:58:36 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:5:58:36 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:35 | MacroExpr | provenance | | -| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:5:60:54 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:5:60:54 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:60:46:60:53 | password | test_logging.rs:60:30:60:53 | MacroExpr | provenance | | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:5:61:55 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | | test_logging.rs:61:20:61:28 | &password | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:61:20:61:28 | &password [&ref] | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password | provenance | Config | | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password [&ref] | provenance | | -| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:5:65:48 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:5:65:48 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:65:40:65:47 | password | test_logging.rs:65:24:65:47 | MacroExpr | provenance | | -| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:5:67:66 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:5:67:66 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:67:58:67:65 | password | test_logging.rs:67:42:67:65 | MacroExpr | provenance | | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:5:68:67 | ...::log | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | | test_logging.rs:68:18:68:26 | &password | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:68:18:68:26 | &password [&ref] | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password | provenance | Config | | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password [&ref] | provenance | | -| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:5:72:47 | ...::log::<...> | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:5:72:47 | ...::log::<...> | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:72:39:72:46 | password | test_logging.rs:72:23:72:46 | MacroExpr | provenance | | -| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:5:74:65 | ...::log::<...> | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:5:74:65 | ...::log::<...> | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:74:57:74:64 | password | test_logging.rs:74:41:74:64 | MacroExpr | provenance | | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:51 | ...::log::<...> | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:51 | ...::log::<...> | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:5:75:51 | ...::log::<...> | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:51 | ...::log::<...> | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:51 | ...::log::<...> | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:5:75:51 | ...::log::<...> | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | | test_logging.rs:75:20:75:28 | &password | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:75:20:75:28 | &password [&ref] | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password | provenance | Config | | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password [&ref] | provenance | | -| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:5:76:47 | ...::log::<...> | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:5:76:47 | ...::log::<...> | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:76:39:76:46 | password | test_logging.rs:76:23:76:46 | MacroExpr | provenance | | -| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:5:82:44 | ...::log::<...> | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:5:82:44 | ...::log::<...> | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:82:36:82:43 | password | test_logging.rs:82:20:82:43 | MacroExpr | provenance | | -| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:5:84:62 | ...::log::<...> | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:5:84:62 | ...::log::<...> | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:84:54:84:61 | password | test_logging.rs:84:38:84:61 | MacroExpr | provenance | | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:48 | ...::log::<...> | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:48 | ...::log::<...> | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 Sink:MaD:1 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:5:85:48 | ...::log::<...> | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:48 | ...::log::<...> | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:48 | ...::log::<...> | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 Sink:MaD:10 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:5:85:48 | ...::log::<...> | provenance | MaD:10 Sink:MaD:10 Sink:MaD:10 | | test_logging.rs:85:20:85:28 | &password | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:85:20:85:28 | &password [&ref] | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password | provenance | Config | | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password [&ref] | provenance | | -| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:5:86:44 | ...::log::<...> | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:5:86:44 | ...::log::<...> | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:86:36:86:43 | password | test_logging.rs:86:20:86:43 | MacroExpr | provenance | | | test_logging.rs:93:9:93:10 | m1 | test_logging.rs:94:11:94:28 | MacroExpr | provenance | | | test_logging.rs:93:14:93:22 | &password | test_logging.rs:93:9:93:10 | m1 | provenance | | | test_logging.rs:93:15:93:22 | password | test_logging.rs:93:14:93:22 | &password | provenance | Config | -| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:94:5:94:29 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:94:5:94:29 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | | | test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:9:96:10 | m2 | provenance | | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password | provenance | Config | -| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:97:5:97:19 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:97:5:97:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | | | test_logging.rs:99:14:99:46 | res | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:14:99:46 | res | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:45 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:46 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | -| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:19 | ...::log | provenance | MaD:0 Sink:MaD:0 | -| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:42 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:19 | ...::log | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:42 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | test_logging.rs:131:28:131:29 | t1 [tuple.1] | provenance | | | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | test_logging.rs:129:9:129:10 | t1 [tuple.1] | provenance | | | test_logging.rs:129:25:129:32 | password | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | provenance | | -| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:131:5:131:32 | ...::log | provenance | MaD:0 Sink:MaD:0 | +| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:131:5:131:32 | ...::log | provenance | MaD:9 Sink:MaD:9 | | test_logging.rs:131:28:131:29 | t1 [tuple.1] | test_logging.rs:131:28:131:31 | t1.1 | provenance | | | test_logging.rs:131:28:131:31 | t1.1 | test_logging.rs:131:12:131:31 | MacroExpr | provenance | | -| test_logging.rs:152:12:152:37 | MacroExpr | test_logging.rs:152:5:152:38 | ...::_print | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:152:12:152:37 | MacroExpr | test_logging.rs:152:5:152:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:152:30:152:37 | password | test_logging.rs:152:12:152:37 | MacroExpr | provenance | | -| test_logging.rs:153:14:153:37 | MacroExpr | test_logging.rs:153:5:153:38 | ...::_print | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:153:14:153:37 | MacroExpr | test_logging.rs:153:5:153:38 | ...::_print | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:153:30:153:37 | password | test_logging.rs:153:14:153:37 | MacroExpr | provenance | | -| test_logging.rs:154:13:154:38 | MacroExpr | test_logging.rs:154:5:154:39 | ...::_eprint | provenance | MaD:4 Sink:MaD:4 | +| test_logging.rs:154:13:154:38 | MacroExpr | test_logging.rs:154:5:154:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:154:31:154:38 | password | test_logging.rs:154:13:154:38 | MacroExpr | provenance | | -| test_logging.rs:155:15:155:38 | MacroExpr | test_logging.rs:155:5:155:39 | ...::_eprint | provenance | MaD:4 Sink:MaD:4 | +| test_logging.rs:155:15:155:38 | MacroExpr | test_logging.rs:155:5:155:39 | ...::_eprint | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:155:31:155:38 | password | test_logging.rs:155:15:155:38 | MacroExpr | provenance | | -| test_logging.rs:158:23:158:46 | MacroExpr | test_logging.rs:158:16:158:47 | ...::panic_fmt | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:158:23:158:46 | MacroExpr | test_logging.rs:158:16:158:47 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:158:39:158:46 | password | test_logging.rs:158:23:158:46 | MacroExpr | provenance | | -| test_logging.rs:159:22:159:45 | MacroExpr | test_logging.rs:159:16:159:46 | ...::panic_fmt | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:159:22:159:45 | MacroExpr | test_logging.rs:159:16:159:46 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:159:38:159:45 | password | test_logging.rs:159:22:159:45 | MacroExpr | provenance | | -| test_logging.rs:160:31:160:54 | MacroExpr | test_logging.rs:160:16:160:55 | ...::panic_fmt | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:160:31:160:54 | MacroExpr | test_logging.rs:160:16:160:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:160:47:160:54 | password | test_logging.rs:160:31:160:54 | MacroExpr | provenance | | -| test_logging.rs:161:29:161:52 | MacroExpr | test_logging.rs:161:16:161:53 | ...::panic_fmt | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:161:29:161:52 | MacroExpr | test_logging.rs:161:16:161:53 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:161:45:161:52 | password | test_logging.rs:161:29:161:52 | MacroExpr | provenance | | -| test_logging.rs:162:31:162:54 | MacroExpr | test_logging.rs:162:16:162:55 | ...::panic_fmt | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:162:31:162:54 | MacroExpr | test_logging.rs:162:16:162:55 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:162:47:162:54 | password | test_logging.rs:162:31:162:54 | MacroExpr | provenance | | -| test_logging.rs:163:33:163:56 | ...::Some(...) [Some] | test_logging.rs:163:16:163:57 | ...::assert_failed | provenance | MaD:10 Sink:MaD:10 | +| test_logging.rs:163:33:163:56 | ...::Some(...) [Some] | test_logging.rs:163:16:163:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:163:33:163:56 | MacroExpr | test_logging.rs:163:33:163:56 | ...::Some(...) [Some] | provenance | | | test_logging.rs:163:49:163:56 | password | test_logging.rs:163:33:163:56 | MacroExpr | provenance | | -| test_logging.rs:164:33:164:56 | ...::Some(...) [Some] | test_logging.rs:164:16:164:57 | ...::assert_failed | provenance | MaD:10 Sink:MaD:10 | +| test_logging.rs:164:33:164:56 | ...::Some(...) [Some] | test_logging.rs:164:16:164:57 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:164:33:164:56 | MacroExpr | test_logging.rs:164:33:164:56 | ...::Some(...) [Some] | provenance | | | test_logging.rs:164:49:164:56 | password | test_logging.rs:164:33:164:56 | MacroExpr | provenance | | -| test_logging.rs:165:37:165:60 | MacroExpr | test_logging.rs:165:16:165:61 | ...::panic_fmt | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:165:37:165:60 | MacroExpr | test_logging.rs:165:16:165:61 | ...::panic_fmt | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:165:53:165:60 | password | test_logging.rs:165:37:165:60 | MacroExpr | provenance | | -| test_logging.rs:166:39:166:62 | ...::Some(...) [Some] | test_logging.rs:166:16:166:63 | ...::assert_failed | provenance | MaD:10 Sink:MaD:10 | +| test_logging.rs:166:39:166:62 | ...::Some(...) [Some] | test_logging.rs:166:16:166:63 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:166:39:166:62 | MacroExpr | test_logging.rs:166:39:166:62 | ...::Some(...) [Some] | provenance | | | test_logging.rs:166:55:166:62 | password | test_logging.rs:166:39:166:62 | MacroExpr | provenance | | -| test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | test_logging.rs:167:17:167:64 | ...::assert_failed | provenance | MaD:10 Sink:MaD:10 | +| test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | test_logging.rs:167:17:167:64 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:167:40:167:63 | MacroExpr | test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | provenance | | | test_logging.rs:167:56:167:63 | password | test_logging.rs:167:40:167:63 | MacroExpr | provenance | | -| test_logging.rs:168:34:168:66 | MacroExpr | test_logging.rs:168:34:168:75 | ... .as_str(...) | provenance | MaD:66 | +| test_logging.rs:168:34:168:66 | MacroExpr | test_logging.rs:168:34:168:75 | ... .as_str(...) | provenance | MaD:12 | | test_logging.rs:168:34:168:66 | res | test_logging.rs:168:42:168:65 | { ... } | provenance | | -| test_logging.rs:168:34:168:75 | ... .as_str(...) | test_logging.rs:168:27:168:32 | expect | provenance | MaD:11 Sink:MaD:11 | +| test_logging.rs:168:34:168:75 | ... .as_str(...) | test_logging.rs:168:27:168:32 | expect | provenance | MaD:1 Sink:MaD:1 | | test_logging.rs:168:42:168:65 | ...::format(...) | test_logging.rs:168:34:168:66 | res | provenance | | | test_logging.rs:168:42:168:65 | ...::must_use(...) | test_logging.rs:168:34:168:66 | MacroExpr | provenance | | -| test_logging.rs:168:42:168:65 | MacroExpr | test_logging.rs:168:42:168:65 | ...::format(...) | provenance | MaD:45 | -| test_logging.rs:168:42:168:65 | { ... } | test_logging.rs:168:42:168:65 | ...::must_use(...) | provenance | MaD:46 | +| test_logging.rs:168:42:168:65 | MacroExpr | test_logging.rs:168:42:168:65 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:168:42:168:65 | { ... } | test_logging.rs:168:42:168:65 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:168:58:168:65 | password | test_logging.rs:168:42:168:65 | MacroExpr | provenance | | -| test_logging.rs:174:36:174:70 | MacroExpr | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | provenance | MaD:67 | +| test_logging.rs:174:36:174:70 | MacroExpr | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:174:36:174:70 | res | test_logging.rs:174:44:174:69 | { ... } | provenance | | | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | test_logging.rs:174:30:174:34 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:174:44:174:69 | ...::format(...) | test_logging.rs:174:36:174:70 | res | provenance | | | test_logging.rs:174:44:174:69 | ...::must_use(...) | test_logging.rs:174:36:174:70 | MacroExpr | provenance | | -| test_logging.rs:174:44:174:69 | MacroExpr | test_logging.rs:174:44:174:69 | ...::format(...) | provenance | MaD:45 | -| test_logging.rs:174:44:174:69 | { ... } | test_logging.rs:174:44:174:69 | ...::must_use(...) | provenance | MaD:46 | +| test_logging.rs:174:44:174:69 | MacroExpr | test_logging.rs:174:44:174:69 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:174:44:174:69 | { ... } | test_logging.rs:174:44:174:69 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:174:62:174:69 | password | test_logging.rs:174:44:174:69 | MacroExpr | provenance | | -| test_logging.rs:175:40:175:74 | MacroExpr | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | provenance | MaD:67 | +| test_logging.rs:175:40:175:74 | MacroExpr | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:175:40:175:74 | res | test_logging.rs:175:48:175:73 | { ... } | provenance | | | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | test_logging.rs:175:30:175:38 | write_all | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:175:48:175:73 | ...::format(...) | test_logging.rs:175:40:175:74 | res | provenance | | | test_logging.rs:175:48:175:73 | ...::must_use(...) | test_logging.rs:175:40:175:74 | MacroExpr | provenance | | -| test_logging.rs:175:48:175:73 | MacroExpr | test_logging.rs:175:48:175:73 | ...::format(...) | provenance | MaD:45 | -| test_logging.rs:175:48:175:73 | { ... } | test_logging.rs:175:48:175:73 | ...::must_use(...) | provenance | MaD:46 | +| test_logging.rs:175:48:175:73 | MacroExpr | test_logging.rs:175:48:175:73 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:175:48:175:73 | { ... } | test_logging.rs:175:48:175:73 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:175:66:175:73 | password | test_logging.rs:175:48:175:73 | MacroExpr | provenance | | -| test_logging.rs:178:15:178:49 | MacroExpr | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | provenance | MaD:67 | +| test_logging.rs:178:15:178:49 | MacroExpr | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:178:15:178:49 | res | test_logging.rs:178:23:178:48 | { ... } | provenance | | | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | test_logging.rs:178:9:178:13 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:178:23:178:48 | ...::format(...) | test_logging.rs:178:15:178:49 | res | provenance | | | test_logging.rs:178:23:178:48 | ...::must_use(...) | test_logging.rs:178:15:178:49 | MacroExpr | provenance | | -| test_logging.rs:178:23:178:48 | MacroExpr | test_logging.rs:178:23:178:48 | ...::format(...) | provenance | MaD:45 | -| test_logging.rs:178:23:178:48 | { ... } | test_logging.rs:178:23:178:48 | ...::must_use(...) | provenance | MaD:46 | +| test_logging.rs:178:23:178:48 | MacroExpr | test_logging.rs:178:23:178:48 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:178:23:178:48 | { ... } | test_logging.rs:178:23:178:48 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:178:41:178:48 | password | test_logging.rs:178:23:178:48 | MacroExpr | provenance | | -| test_logging.rs:181:15:181:49 | MacroExpr | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | provenance | MaD:67 | +| test_logging.rs:181:15:181:49 | MacroExpr | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:181:15:181:49 | res | test_logging.rs:181:23:181:48 | { ... } | provenance | | -| test_logging.rs:181:15:181:60 | ... .as_bytes(...) | test_logging.rs:181:9:181:13 | write | provenance | MaD:7 Sink:MaD:7 | +| test_logging.rs:181:15:181:60 | ... .as_bytes(...) | test_logging.rs:181:9:181:13 | write | provenance | MaD:4 Sink:MaD:4 | | test_logging.rs:181:23:181:48 | ...::format(...) | test_logging.rs:181:15:181:49 | res | provenance | | | test_logging.rs:181:23:181:48 | ...::must_use(...) | test_logging.rs:181:15:181:49 | MacroExpr | provenance | | -| test_logging.rs:181:23:181:48 | MacroExpr | test_logging.rs:181:23:181:48 | ...::format(...) | provenance | MaD:45 | -| test_logging.rs:181:23:181:48 | { ... } | test_logging.rs:181:23:181:48 | ...::must_use(...) | provenance | MaD:46 | +| test_logging.rs:181:23:181:48 | MacroExpr | test_logging.rs:181:23:181:48 | ...::format(...) | provenance | MaD:13 | +| test_logging.rs:181:23:181:48 | { ... } | test_logging.rs:181:23:181:48 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:181:41:181:48 | password | test_logging.rs:181:23:181:48 | MacroExpr | provenance | | +models +| 1 | Sink: lang:core; ::expect; log-injection; Argument[0] | +| 2 | Sink: lang:core; crate::panicking::assert_failed; log-injection; Argument[3].Variant[crate::option::Option::Some(0)] | +| 3 | Sink: lang:core; crate::panicking::panic_fmt; log-injection; Argument[0] | +| 4 | Sink: lang:std; ::write; log-injection; Argument[0] | +| 5 | Sink: lang:std; ::write; log-injection; Argument[0] | +| 6 | Sink: lang:std; ::write_all; log-injection; Argument[0] | +| 7 | Sink: lang:std; crate::io::stdio::_eprint; log-injection; Argument[0] | +| 8 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] | +| 9 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[0] | +| 10 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[2] | +| 11 | Summary: lang:alloc; ::as_bytes; Argument[self]; ReturnValue; taint | +| 12 | Summary: lang:alloc; ::as_str; Argument[self]; ReturnValue; taint | +| 13 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint | +| 14 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:5:42:36 | ...::log | semmle.label | ...::log | | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.qlref b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.qlref index 01a435da9202..a78abfdb709f 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.qlref +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.qlref @@ -1,3 +1,4 @@ query: queries/security/CWE-312/CleartextLogging.ql postprocess: - utils/test/InlineExpectationsTestQuery.ql + - utils/test/PrettyPrintModels.ql