diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index b53665e8af1d..62f6ca7470df 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -226,7 +226,6 @@ lib/codeql/rust/elements/internal/AsmRegSpecConstructor.qll bf3e0783645622691183 lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll 7ad0a5b86922e321da9f8c7ea8aefa88068b27bcea3890f981b061a204ab576d 65f13c423ef42209bd514523f21dd1e43cc4f5c191bdb85ba7128c76241f78a8 lib/codeql/rust/elements/internal/AsmSymConstructor.qll 9c7e8471081b9173f01592d4b9d22584a0d1cee6b4851050d642ddaa4017659e adc5b4b2a8cd7164da4867d83aa08c6e54c45614c1f4fc9aa1cbbedd3c20a1b3 lib/codeql/rust/elements/internal/AsmSymImpl.qll e173807c5b6cf856f5f4eaedb2be41d48db95dd8a973e1dc857a883383feec50 ab19c9f479c0272a5257ab45977c9f9dd60380fe33b4ade14f3dddf2970112de -lib/codeql/rust/elements/internal/AssocItemImpl.qll 33be2a25b94eb32c44b973351f0babf6d46d35d5a0a06f1064418c94c40b01e9 5e42adb18b5c2f9246573d7965ce91013370f16d92d8f7bda31232cef7a549c6 lib/codeql/rust/elements/internal/AssocItemListConstructor.qll 1977164a68d52707ddee2f16e4d5a3de07280864510648750016010baec61637 bb750f1a016b42a32583b423655279e967be5def66f6b68c5018ec1e022e25e1 lib/codeql/rust/elements/internal/AssocItemListImpl.qll 70e82744464827326bfc394dab417f39905db155fb631f804bf1f27e23892698 760c7b42137d010e15920f9623e461daaf16518ab44a36a15259e549ecd4fa7a lib/codeql/rust/elements/internal/AssocTypeArgConstructor.qll 58b4ac5a532e55d71f77a5af8eadaf7ba53a8715c398f48285dac1db3a6c87a3 f0d889f32d9ea7bd633b495df014e39af24454608253200c05721022948bd856 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 03d6e465cf0e..37081514e730 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -228,7 +228,6 @@ /lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmSymConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/AsmSymImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/AssocItemImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AssocItemListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/AssocItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AssocTypeArgConstructor.qll linguist-generated diff --git a/rust/ql/lib/change-notes/2025-06-26-dataflow-traits.md b/rust/ql/lib/change-notes/2025-06-26-dataflow-traits.md new file mode 100644 index 000000000000..c3513958ccd1 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-06-26-dataflow-traits.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Implemented support for data flow through trait functions. For the purpose of data flow, calls to trait functions dispatch to all possible implementations. diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index fb3a46d78663..7f86995c941c 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -404,10 +404,20 @@ module RustDataFlow implements InputSig { /** Gets a viable implementation of the target of the given `Call`. */ DataFlowCallable viableCallable(DataFlowCall call) { - exists(Callable target | target = call.asCallCfgNode().getCall().getStaticTarget() | - target = result.asCfgScope() + exists(Call c | c = call.asCallCfgNode().getCall() | + result.asCfgScope() = c.getARuntimeTarget() or - target = result.asSummarizedCallable() + exists(SummarizedCallable sc, Function staticTarget | + staticTarget = c.getStaticTarget() and + sc = result.asSummarizedCallable() + | + sc = staticTarget + or + // only apply trait models to concrete implementations when they are not + // defined in source code + staticTarget.implements(sc) and + not staticTarget.fromSource() + ) ) } diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index bc1f58824b32..112fe6de5dcd 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -32,6 +32,8 @@ * - `Field[t(i)]`: position `i` inside the variant/struct with canonical path `v`, for example * `Field[core::option::Option::Some(0)]`. * - `Field[i]`: the `i`th element of a tuple. + * - `Reference`: the referenced value. + * - `Future`: the value being computed asynchronously. * 3. The `kind` column is a tag that can be referenced from QL to determine to * which classes the interpreted elements should be added. For example, for * sources `"remote"` indicates a default remote flow source, and for summaries @@ -211,6 +213,10 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { this.getCanonicalPath() = path } + override predicate hasProvenance(Provenance provenance) { + summaryModel(path, _, _, _, provenance, _) + } + override predicate propagatesFlow( string input, string output, boolean preservesValue, string model ) { diff --git a/rust/ql/lib/codeql/rust/elements/internal/AssocItemImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AssocItemImpl.qll index 68e2945d377e..e731dd5a5219 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AssocItemImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AssocItemImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AssocItem`. * @@ -12,6 +11,10 @@ private import codeql.rust.elements.internal.generated.AssocItem * be referenced directly. */ module Impl { + private import rust + private import codeql.rust.internal.PathResolution + + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An associated item in a `Trait` or `Impl`. * @@ -21,5 +24,15 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class AssocItem extends Generated::AssocItem { } + class AssocItem extends Generated::AssocItem { + /** Holds if this item implements trait item `other`. */ + pragma[nomagic] + predicate implements(AssocItem other) { + exists(TraitItemNode t, ImplItemNode i, string name | + other = t.getAssocItem(pragma[only_bind_into](name)) and + t = i.resolveTraitTy() and + this = i.getAssocItem(pragma[only_bind_into](name)) + ) + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll index 9cd45ca76709..bfa6f9b7242f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll @@ -65,6 +65,17 @@ module Impl { not exists(TypeInference::resolveMethodCallTarget(this)) and result = this.(CallExpr).getStaticTarget() } + + /** Gets a runtime target of this call, if any. */ + pragma[nomagic] + Function getARuntimeTarget() { + result.hasImplementation() and + ( + result = this.getStaticTarget() + or + result.implements(this.getStaticTarget()) + ) + } } /** Holds if the call expression dispatches to a trait method. */ diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 2f8c051d7704..2be4d0f24b58 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -540,6 +540,13 @@ abstract class ImplOrTraitItemNode extends ItemNode { /** Gets an associated item belonging to this trait or `impl` block. */ abstract AssocItemNode getAnAssocItem(); + /** Gets the associated item named `name` belonging to this trait or `impl` block. */ + pragma[nomagic] + AssocItemNode getAssocItem(string name) { + result = this.getAnAssocItem() and + result.getName() = name + } + /** Holds if this trait or `impl` block declares an associated item named `name`. */ pragma[nomagic] predicate hasAssocItem(string name) { name = this.getAnAssocItem().getName() } diff --git a/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected index 9ba640cff8dc..85ca3c35e7cd 100644 --- a/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/global/CONSISTENCY/PathResolutionConsistency.expected @@ -1,2 +1,2 @@ multipleCallTargets -| main.rs:225:14:225:29 | ...::deref(...) | +| main.rs:272:14:272:29 | ...::deref(...) | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index 451d5996de57..da5840528f5c 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -48,85 +48,125 @@ edges | main.rs:86:13:86:27 | pass_through(...) | main.rs:86:9:86:9 | b | provenance | | | main.rs:86:26:86:26 | a | main.rs:82:21:82:26 | ...: i64 | provenance | | | main.rs:86:26:86:26 | a | main.rs:86:13:86:27 | pass_through(...) | provenance | | -| main.rs:98:22:98:27 | ...: i64 | main.rs:99:14:99:14 | n | provenance | | -| main.rs:102:30:108:5 | { ... } | main.rs:121:13:121:25 | mn.get_data() | provenance | | -| main.rs:106:13:106:21 | source(...) | main.rs:102:30:108:5 | { ... } | provenance | | -| main.rs:110:27:110:32 | ...: i64 | main.rs:110:42:116:5 | { ... } | provenance | | -| main.rs:121:9:121:9 | a | main.rs:122:10:122:10 | a | provenance | | -| main.rs:121:13:121:25 | mn.get_data() | main.rs:121:9:121:9 | a | provenance | | -| main.rs:127:9:127:9 | a | main.rs:128:16:128:16 | a | provenance | | -| main.rs:127:13:127:21 | source(...) | main.rs:127:9:127:9 | a | provenance | | -| main.rs:128:16:128:16 | a | main.rs:98:22:98:27 | ...: i64 | provenance | | -| main.rs:133:9:133:9 | a | main.rs:134:29:134:29 | a | provenance | | -| main.rs:133:13:133:21 | source(...) | main.rs:133:9:133:9 | a | provenance | | -| main.rs:134:9:134:9 | b | main.rs:135:10:135:10 | b | provenance | | -| main.rs:134:13:134:30 | mn.data_through(...) | main.rs:134:9:134:9 | b | provenance | | -| main.rs:134:29:134:29 | a | main.rs:110:27:110:32 | ...: i64 | provenance | | -| main.rs:134:29:134:29 | a | main.rs:134:13:134:30 | mn.data_through(...) | provenance | | -| main.rs:140:9:140:9 | a | main.rs:141:25:141:25 | a | provenance | | -| main.rs:140:13:140:21 | source(...) | main.rs:140:9:140:9 | a | provenance | | -| main.rs:141:25:141:25 | a | main.rs:98:22:98:27 | ...: i64 | provenance | | -| main.rs:146:9:146:9 | a | main.rs:147:38:147:38 | a | provenance | | -| main.rs:146:13:146:22 | source(...) | main.rs:146:9:146:9 | a | provenance | | -| main.rs:147:9:147:9 | b | main.rs:148:10:148:10 | b | provenance | | -| main.rs:147:13:147:39 | ...::data_through(...) | main.rs:147:9:147:9 | b | provenance | | -| main.rs:147:38:147:38 | a | main.rs:110:27:110:32 | ...: i64 | provenance | | -| main.rs:147:38:147:38 | a | main.rs:147:13:147:39 | ...::data_through(...) | provenance | | -| main.rs:159:12:159:17 | ...: i64 | main.rs:160:24:160:24 | n | provenance | | -| main.rs:160:9:160:26 | MyInt {...} [MyInt] | main.rs:159:28:161:5 | { ... } [MyInt] | provenance | | -| main.rs:160:24:160:24 | n | main.rs:160:9:160:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:165:9:165:9 | n [MyInt] | main.rs:166:9:166:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:165:13:165:34 | ...::new(...) [MyInt] | main.rs:165:9:165:9 | n [MyInt] | provenance | | -| main.rs:165:24:165:33 | source(...) | main.rs:159:12:159:17 | ...: i64 | provenance | | -| main.rs:165:24:165:33 | source(...) | main.rs:165:13:165:34 | ...::new(...) [MyInt] | provenance | | -| main.rs:166:9:166:26 | MyInt {...} [MyInt] | main.rs:166:24:166:24 | m | provenance | | -| main.rs:166:24:166:24 | m | main.rs:167:10:167:10 | m | provenance | | -| main.rs:173:12:173:15 | SelfParam [MyInt] | main.rs:175:24:175:27 | self [MyInt] | provenance | | -| main.rs:175:9:175:35 | MyInt {...} [MyInt] | main.rs:173:42:176:5 | { ... } [MyInt] | provenance | | -| main.rs:175:24:175:27 | self [MyInt] | main.rs:175:24:175:33 | self.value | provenance | | -| main.rs:175:24:175:33 | self.value | main.rs:175:9:175:35 | MyInt {...} [MyInt] | provenance | | -| main.rs:195:9:195:9 | a [MyInt] | main.rs:197:13:197:13 | a [MyInt] | provenance | | -| main.rs:195:13:195:38 | MyInt {...} [MyInt] | main.rs:195:9:195:9 | a [MyInt] | provenance | | -| main.rs:195:28:195:36 | source(...) | main.rs:195:13:195:38 | MyInt {...} [MyInt] | provenance | | -| main.rs:197:9:197:9 | c [MyInt] | main.rs:198:10:198:10 | c [MyInt] | provenance | | -| main.rs:197:13:197:13 | a [MyInt] | main.rs:173:12:173:15 | SelfParam [MyInt] | provenance | | -| main.rs:197:13:197:13 | a [MyInt] | main.rs:197:13:197:17 | ... + ... [MyInt] | provenance | | -| main.rs:197:13:197:17 | ... + ... [MyInt] | main.rs:197:9:197:9 | c [MyInt] | provenance | | -| main.rs:198:10:198:10 | c [MyInt] | main.rs:198:10:198:16 | c.value | provenance | | -| main.rs:205:9:205:9 | a [MyInt] | main.rs:173:12:173:15 | SelfParam [MyInt] | provenance | | -| main.rs:205:9:205:9 | a [MyInt] | main.rs:207:13:207:20 | a.add(...) [MyInt] | provenance | | -| main.rs:205:13:205:38 | MyInt {...} [MyInt] | main.rs:205:9:205:9 | a [MyInt] | provenance | | -| main.rs:205:28:205:36 | source(...) | main.rs:205:13:205:38 | MyInt {...} [MyInt] | provenance | | -| main.rs:207:9:207:9 | d [MyInt] | main.rs:208:10:208:10 | d [MyInt] | provenance | | -| main.rs:207:13:207:20 | a.add(...) [MyInt] | main.rs:207:9:207:9 | d [MyInt] | provenance | | -| main.rs:208:10:208:10 | d [MyInt] | main.rs:208:10:208:16 | d.value | provenance | | -| main.rs:242:18:242:21 | SelfParam [MyInt] | main.rs:242:48:244:5 | { ... } [MyInt] | provenance | | -| main.rs:246:26:246:37 | ...: MyInt [MyInt] | main.rs:246:49:248:5 | { ... } [MyInt] | provenance | | -| main.rs:252:9:252:9 | a [MyInt] | main.rs:254:49:254:49 | a [MyInt] | provenance | | +| main.rs:104:22:104:27 | ...: i64 | main.rs:105:14:105:14 | n | provenance | | +| main.rs:108:30:110:5 | { ... } | main.rs:138:13:138:25 | mn.get_data() | provenance | | +| main.rs:109:35:109:43 | source(...) | main.rs:108:30:110:5 | { ... } | provenance | | +| main.rs:112:27:112:32 | ...: i64 | main.rs:112:42:114:5 | { ... } | provenance | | +| main.rs:118:28:118:33 | ...: i64 | main.rs:119:14:119:14 | n | provenance | | +| main.rs:122:36:124:5 | { ... } | main.rs:132:13:132:30 | x.get_data_trait() | provenance | | +| main.rs:122:36:124:5 | { ... } | main.rs:142:13:142:31 | mn.get_data_trait() | provenance | | +| main.rs:123:35:123:44 | source(...) | main.rs:122:36:124:5 | { ... } | provenance | | +| main.rs:126:33:126:38 | ...: i64 | main.rs:126:48:128:5 | { ... } | provenance | | +| main.rs:132:9:132:9 | a | main.rs:133:10:133:10 | a | provenance | | +| main.rs:132:13:132:30 | x.get_data_trait() | main.rs:132:9:132:9 | a | provenance | | +| main.rs:138:9:138:9 | a | main.rs:139:10:139:10 | a | provenance | | +| main.rs:138:13:138:25 | mn.get_data() | main.rs:138:9:138:9 | a | provenance | | +| main.rs:142:9:142:9 | a | main.rs:143:10:143:10 | a | provenance | | +| main.rs:142:13:142:31 | mn.get_data_trait() | main.rs:142:9:142:9 | a | provenance | | +| main.rs:149:9:149:9 | a | main.rs:150:21:150:21 | a | provenance | | +| main.rs:149:13:149:22 | source(...) | main.rs:149:9:149:9 | a | provenance | | +| main.rs:150:21:150:21 | a | main.rs:118:28:118:33 | ...: i64 | provenance | | +| main.rs:155:9:155:9 | a | main.rs:156:16:156:16 | a | provenance | | +| main.rs:155:13:155:21 | source(...) | main.rs:155:9:155:9 | a | provenance | | +| main.rs:156:16:156:16 | a | main.rs:104:22:104:27 | ...: i64 | provenance | | +| main.rs:159:9:159:9 | a | main.rs:160:22:160:22 | a | provenance | | +| main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | a | provenance | | +| main.rs:160:22:160:22 | a | main.rs:118:28:118:33 | ...: i64 | provenance | | +| main.rs:166:9:166:9 | a | main.rs:167:34:167:34 | a | provenance | | +| main.rs:166:13:166:22 | source(...) | main.rs:166:9:166:9 | a | provenance | | +| main.rs:167:9:167:9 | b | main.rs:168:10:168:10 | b | provenance | | +| main.rs:167:13:167:35 | x.data_through_trait(...) | main.rs:167:9:167:9 | b | provenance | | +| main.rs:167:34:167:34 | a | main.rs:126:33:126:38 | ...: i64 | provenance | | +| main.rs:167:34:167:34 | a | main.rs:167:13:167:35 | x.data_through_trait(...) | provenance | | +| main.rs:173:9:173:9 | a | main.rs:174:29:174:29 | a | provenance | | +| main.rs:173:13:173:21 | source(...) | main.rs:173:9:173:9 | a | provenance | | +| main.rs:174:9:174:9 | b | main.rs:175:10:175:10 | b | provenance | | +| main.rs:174:13:174:30 | mn.data_through(...) | main.rs:174:9:174:9 | b | provenance | | +| main.rs:174:29:174:29 | a | main.rs:112:27:112:32 | ...: i64 | provenance | | +| main.rs:174:29:174:29 | a | main.rs:174:13:174:30 | mn.data_through(...) | provenance | | +| main.rs:178:9:178:9 | a | main.rs:179:35:179:35 | a | provenance | | +| main.rs:178:13:178:22 | source(...) | main.rs:178:9:178:9 | a | provenance | | +| main.rs:179:9:179:9 | b | main.rs:180:10:180:10 | b | provenance | | +| main.rs:179:13:179:36 | mn.data_through_trait(...) | main.rs:179:9:179:9 | b | provenance | | +| main.rs:179:35:179:35 | a | main.rs:126:33:126:38 | ...: i64 | provenance | | +| main.rs:179:35:179:35 | a | main.rs:179:13:179:36 | mn.data_through_trait(...) | provenance | | +| main.rs:187:9:187:9 | a | main.rs:188:25:188:25 | a | provenance | | +| main.rs:187:13:187:21 | source(...) | main.rs:187:9:187:9 | a | provenance | | +| main.rs:188:25:188:25 | a | main.rs:104:22:104:27 | ...: i64 | provenance | | +| main.rs:193:9:193:9 | a | main.rs:194:38:194:38 | a | provenance | | +| main.rs:193:13:193:22 | source(...) | main.rs:193:9:193:9 | a | provenance | | +| main.rs:194:9:194:9 | b | main.rs:195:10:195:10 | b | provenance | | +| main.rs:194:13:194:39 | ...::data_through(...) | main.rs:194:9:194:9 | b | provenance | | +| main.rs:194:38:194:38 | a | main.rs:112:27:112:32 | ...: i64 | provenance | | +| main.rs:194:38:194:38 | a | main.rs:194:13:194:39 | ...::data_through(...) | provenance | | +| main.rs:206:12:206:17 | ...: i64 | main.rs:207:24:207:24 | n | provenance | | +| main.rs:207:9:207:26 | MyInt {...} [MyInt] | main.rs:206:28:208:5 | { ... } [MyInt] | provenance | | +| main.rs:207:24:207:24 | n | main.rs:207:9:207:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:212:9:212:9 | n [MyInt] | main.rs:213:9:213:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:212:13:212:34 | ...::new(...) [MyInt] | main.rs:212:9:212:9 | n [MyInt] | provenance | | +| main.rs:212:24:212:33 | source(...) | main.rs:206:12:206:17 | ...: i64 | provenance | | +| main.rs:212:24:212:33 | source(...) | main.rs:212:13:212:34 | ...::new(...) [MyInt] | provenance | | +| main.rs:213:9:213:26 | MyInt {...} [MyInt] | main.rs:213:24:213:24 | m | provenance | | +| main.rs:213:24:213:24 | m | main.rs:214:10:214:10 | m | provenance | | +| main.rs:220:12:220:15 | SelfParam [MyInt] | main.rs:222:24:222:27 | self [MyInt] | provenance | | +| main.rs:222:9:222:35 | MyInt {...} [MyInt] | main.rs:220:42:223:5 | { ... } [MyInt] | provenance | | +| main.rs:222:24:222:27 | self [MyInt] | main.rs:222:24:222:33 | self.value | provenance | | +| main.rs:222:24:222:33 | self.value | main.rs:222:9:222:35 | MyInt {...} [MyInt] | provenance | | +| main.rs:227:30:227:39 | ...: MyInt [MyInt] | main.rs:228:25:228:27 | rhs [MyInt] | provenance | | +| main.rs:228:10:228:14 | [post] * ... [MyInt] | main.rs:228:11:228:14 | [post] self [&ref, MyInt] | provenance | | +| main.rs:228:11:228:14 | [post] self [&ref, MyInt] | main.rs:227:19:227:27 | SelfParam [Return] [&ref, MyInt] | provenance | | +| main.rs:228:25:228:27 | rhs [MyInt] | main.rs:228:25:228:33 | rhs.value | provenance | | +| main.rs:228:25:228:33 | rhs.value | main.rs:228:10:228:14 | [post] * ... [MyInt] | provenance | | +| main.rs:242:9:242:9 | a [MyInt] | main.rs:244:13:244:13 | a [MyInt] | provenance | | +| main.rs:242:13:242:38 | MyInt {...} [MyInt] | main.rs:242:9:242:9 | a [MyInt] | provenance | | +| main.rs:242:28:242:36 | source(...) | main.rs:242:13:242:38 | MyInt {...} [MyInt] | provenance | | +| main.rs:244:9:244:9 | c [MyInt] | main.rs:245:10:245:10 | c [MyInt] | provenance | | +| main.rs:244:13:244:13 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | provenance | | +| main.rs:244:13:244:13 | a [MyInt] | main.rs:244:13:244:17 | ... + ... [MyInt] | provenance | | +| main.rs:244:13:244:17 | ... + ... [MyInt] | main.rs:244:9:244:9 | c [MyInt] | provenance | | +| main.rs:245:10:245:10 | c [MyInt] | main.rs:245:10:245:16 | c.value | provenance | | +| main.rs:252:9:252:9 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | provenance | | +| main.rs:252:9:252:9 | a [MyInt] | main.rs:254:13:254:20 | a.add(...) [MyInt] | provenance | | | main.rs:252:13:252:38 | MyInt {...} [MyInt] | main.rs:252:9:252:9 | a [MyInt] | provenance | | | main.rs:252:28:252:36 | source(...) | main.rs:252:13:252:38 | MyInt {...} [MyInt] | provenance | | -| main.rs:254:9:254:26 | MyInt {...} [MyInt] | main.rs:254:24:254:24 | c | provenance | | -| main.rs:254:24:254:24 | c | main.rs:255:10:255:10 | c | provenance | | -| main.rs:254:30:254:53 | ...::take_self(...) [MyInt] | main.rs:254:9:254:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:254:49:254:49 | a [MyInt] | main.rs:242:18:242:21 | SelfParam [MyInt] | provenance | | -| main.rs:254:49:254:49 | a [MyInt] | main.rs:254:30:254:53 | ...::take_self(...) [MyInt] | provenance | | -| main.rs:258:9:258:9 | b [MyInt] | main.rs:259:54:259:54 | b [MyInt] | provenance | | -| main.rs:258:13:258:39 | MyInt {...} [MyInt] | main.rs:258:9:258:9 | b [MyInt] | provenance | | -| main.rs:258:28:258:37 | source(...) | main.rs:258:13:258:39 | MyInt {...} [MyInt] | provenance | | -| main.rs:259:9:259:26 | MyInt {...} [MyInt] | main.rs:259:24:259:24 | c | provenance | | -| main.rs:259:24:259:24 | c | main.rs:260:10:260:10 | c | provenance | | -| main.rs:259:30:259:55 | ...::take_second(...) [MyInt] | main.rs:259:9:259:26 | MyInt {...} [MyInt] | provenance | | -| main.rs:259:54:259:54 | b [MyInt] | main.rs:246:26:246:37 | ...: MyInt [MyInt] | provenance | | -| main.rs:259:54:259:54 | b [MyInt] | main.rs:259:30:259:55 | ...::take_second(...) [MyInt] | provenance | | -| main.rs:268:32:272:1 | { ... } | main.rs:287:41:287:54 | async_source(...) | provenance | | -| main.rs:269:9:269:9 | a | main.rs:268:32:272:1 | { ... } | provenance | | -| main.rs:269:9:269:9 | a | main.rs:270:10:270:10 | a | provenance | | -| main.rs:269:13:269:21 | source(...) | main.rs:269:9:269:9 | a | provenance | | -| main.rs:279:13:279:13 | c | main.rs:280:14:280:14 | c | provenance | | -| main.rs:279:17:279:25 | source(...) | main.rs:279:13:279:13 | c | provenance | | -| main.rs:287:9:287:9 | a | main.rs:288:10:288:10 | a | provenance | | -| main.rs:287:13:287:55 | ...::block_on(...) | main.rs:287:9:287:9 | a | provenance | | -| main.rs:287:41:287:54 | async_source(...) | main.rs:287:13:287:55 | ...::block_on(...) | provenance | MaD:1 | +| main.rs:254:9:254:9 | d [MyInt] | main.rs:255:10:255:10 | d [MyInt] | provenance | | +| main.rs:254:13:254:20 | a.add(...) [MyInt] | main.rs:254:9:254:9 | d [MyInt] | provenance | | +| main.rs:255:10:255:10 | d [MyInt] | main.rs:255:10:255:16 | d.value | provenance | | +| main.rs:259:9:259:9 | b [MyInt] | main.rs:261:35:261:35 | b [MyInt] | provenance | | +| main.rs:259:13:259:39 | MyInt {...} [MyInt] | main.rs:259:9:259:9 | b [MyInt] | provenance | | +| main.rs:259:28:259:37 | source(...) | main.rs:259:13:259:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | main.rs:261:32:261:32 | [post] a [MyInt] | provenance | | +| main.rs:261:32:261:32 | [post] a [MyInt] | main.rs:262:10:262:10 | a [MyInt] | provenance | | +| main.rs:261:35:261:35 | b [MyInt] | main.rs:227:30:227:39 | ...: MyInt [MyInt] | provenance | | +| main.rs:261:35:261:35 | b [MyInt] | main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | provenance | | +| main.rs:262:10:262:10 | a [MyInt] | main.rs:262:10:262:16 | a.value | provenance | | +| main.rs:289:18:289:21 | SelfParam [MyInt] | main.rs:289:48:291:5 | { ... } [MyInt] | provenance | | +| main.rs:293:26:293:37 | ...: MyInt [MyInt] | main.rs:293:49:295:5 | { ... } [MyInt] | provenance | | +| main.rs:299:9:299:9 | a [MyInt] | main.rs:301:50:301:50 | a [MyInt] | provenance | | +| main.rs:299:13:299:38 | MyInt {...} [MyInt] | main.rs:299:9:299:9 | a [MyInt] | provenance | | +| main.rs:299:28:299:36 | source(...) | main.rs:299:13:299:38 | MyInt {...} [MyInt] | provenance | | +| main.rs:301:9:301:26 | MyInt {...} [MyInt] | main.rs:301:24:301:24 | c | provenance | | +| main.rs:301:24:301:24 | c | main.rs:302:10:302:10 | c | provenance | | +| main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | main.rs:301:9:301:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:301:50:301:50 | a [MyInt] | main.rs:289:18:289:21 | SelfParam [MyInt] | provenance | | +| main.rs:301:50:301:50 | a [MyInt] | main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | provenance | | +| main.rs:305:9:305:9 | b [MyInt] | main.rs:306:55:306:55 | b [MyInt] | provenance | | +| main.rs:305:13:305:39 | MyInt {...} [MyInt] | main.rs:305:9:305:9 | b [MyInt] | provenance | | +| main.rs:305:28:305:37 | source(...) | main.rs:305:13:305:39 | MyInt {...} [MyInt] | provenance | | +| main.rs:306:9:306:26 | MyInt {...} [MyInt] | main.rs:306:24:306:24 | c | provenance | | +| main.rs:306:24:306:24 | c | main.rs:307:10:307:10 | c | provenance | | +| main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | main.rs:306:9:306:26 | MyInt {...} [MyInt] | provenance | | +| main.rs:306:55:306:55 | b [MyInt] | main.rs:293:26:293:37 | ...: MyInt [MyInt] | provenance | | +| main.rs:306:55:306:55 | b [MyInt] | main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | provenance | | +| main.rs:315:32:319:1 | { ... } | main.rs:334:41:334:54 | async_source(...) | provenance | | +| main.rs:316:9:316:9 | a | main.rs:315:32:319:1 | { ... } | provenance | | +| main.rs:316:9:316:9 | a | main.rs:317:10:317:10 | a | provenance | | +| main.rs:316:13:316:21 | source(...) | main.rs:316:9:316:9 | a | provenance | | +| main.rs:326:13:326:13 | c | main.rs:327:14:327:14 | c | provenance | | +| main.rs:326:17:326:25 | source(...) | main.rs:326:13:326:13 | c | provenance | | +| main.rs:334:9:334:9 | a | main.rs:335:10:335:10 | a | provenance | | +| main.rs:334:13:334:55 | ...::block_on(...) | main.rs:334:9:334:9 | a | provenance | | +| main.rs:334:41:334:54 | async_source(...) | main.rs:334:13:334:55 | ...::block_on(...) | provenance | MaD:1 | nodes | main.rs:12:28:14:1 | { ... } | semmle.label | { ... } | | main.rs:13:5:13:13 | source(...) | semmle.label | source(...) | @@ -179,94 +219,138 @@ nodes | main.rs:86:13:86:27 | pass_through(...) | semmle.label | pass_through(...) | | main.rs:86:26:86:26 | a | semmle.label | a | | main.rs:87:10:87:10 | b | semmle.label | b | -| main.rs:98:22:98:27 | ...: i64 | semmle.label | ...: i64 | -| main.rs:99:14:99:14 | n | semmle.label | n | -| main.rs:102:30:108:5 | { ... } | semmle.label | { ... } | -| main.rs:106:13:106:21 | source(...) | semmle.label | source(...) | -| main.rs:110:27:110:32 | ...: i64 | semmle.label | ...: i64 | -| main.rs:110:42:116:5 | { ... } | semmle.label | { ... } | -| main.rs:121:9:121:9 | a | semmle.label | a | -| main.rs:121:13:121:25 | mn.get_data() | semmle.label | mn.get_data() | -| main.rs:122:10:122:10 | a | semmle.label | a | -| main.rs:127:9:127:9 | a | semmle.label | a | -| main.rs:127:13:127:21 | source(...) | semmle.label | source(...) | -| main.rs:128:16:128:16 | a | semmle.label | a | -| main.rs:133:9:133:9 | a | semmle.label | a | -| main.rs:133:13:133:21 | source(...) | semmle.label | source(...) | -| main.rs:134:9:134:9 | b | semmle.label | b | -| main.rs:134:13:134:30 | mn.data_through(...) | semmle.label | mn.data_through(...) | -| main.rs:134:29:134:29 | a | semmle.label | a | -| main.rs:135:10:135:10 | b | semmle.label | b | -| main.rs:140:9:140:9 | a | semmle.label | a | -| main.rs:140:13:140:21 | source(...) | semmle.label | source(...) | -| main.rs:141:25:141:25 | a | semmle.label | a | -| main.rs:146:9:146:9 | a | semmle.label | a | -| main.rs:146:13:146:22 | source(...) | semmle.label | source(...) | -| main.rs:147:9:147:9 | b | semmle.label | b | -| main.rs:147:13:147:39 | ...::data_through(...) | semmle.label | ...::data_through(...) | -| main.rs:147:38:147:38 | a | semmle.label | a | -| main.rs:148:10:148:10 | b | semmle.label | b | -| main.rs:159:12:159:17 | ...: i64 | semmle.label | ...: i64 | -| main.rs:159:28:161:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:160:9:160:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:160:24:160:24 | n | semmle.label | n | -| main.rs:165:9:165:9 | n [MyInt] | semmle.label | n [MyInt] | -| main.rs:165:13:165:34 | ...::new(...) [MyInt] | semmle.label | ...::new(...) [MyInt] | -| main.rs:165:24:165:33 | source(...) | semmle.label | source(...) | -| main.rs:166:9:166:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:166:24:166:24 | m | semmle.label | m | -| main.rs:167:10:167:10 | m | semmle.label | m | -| main.rs:173:12:173:15 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | -| main.rs:173:42:176:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:175:9:175:35 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:175:24:175:27 | self [MyInt] | semmle.label | self [MyInt] | -| main.rs:175:24:175:33 | self.value | semmle.label | self.value | -| main.rs:195:9:195:9 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:195:13:195:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:195:28:195:36 | source(...) | semmle.label | source(...) | -| main.rs:197:9:197:9 | c [MyInt] | semmle.label | c [MyInt] | -| main.rs:197:13:197:13 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:197:13:197:17 | ... + ... [MyInt] | semmle.label | ... + ... [MyInt] | -| main.rs:198:10:198:10 | c [MyInt] | semmle.label | c [MyInt] | -| main.rs:198:10:198:16 | c.value | semmle.label | c.value | -| main.rs:205:9:205:9 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:205:13:205:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:205:28:205:36 | source(...) | semmle.label | source(...) | -| main.rs:207:9:207:9 | d [MyInt] | semmle.label | d [MyInt] | -| main.rs:207:13:207:20 | a.add(...) [MyInt] | semmle.label | a.add(...) [MyInt] | -| main.rs:208:10:208:10 | d [MyInt] | semmle.label | d [MyInt] | -| main.rs:208:10:208:16 | d.value | semmle.label | d.value | -| main.rs:242:18:242:21 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | -| main.rs:242:48:244:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | -| main.rs:246:26:246:37 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | -| main.rs:246:49:248:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:104:22:104:27 | ...: i64 | semmle.label | ...: i64 | +| main.rs:105:14:105:14 | n | semmle.label | n | +| main.rs:108:30:110:5 | { ... } | semmle.label | { ... } | +| main.rs:109:35:109:43 | source(...) | semmle.label | source(...) | +| main.rs:112:27:112:32 | ...: i64 | semmle.label | ...: i64 | +| main.rs:112:42:114:5 | { ... } | semmle.label | { ... } | +| main.rs:118:28:118:33 | ...: i64 | semmle.label | ...: i64 | +| main.rs:119:14:119:14 | n | semmle.label | n | +| main.rs:122:36:124:5 | { ... } | semmle.label | { ... } | +| main.rs:123:35:123:44 | source(...) | semmle.label | source(...) | +| main.rs:126:33:126:38 | ...: i64 | semmle.label | ...: i64 | +| main.rs:126:48:128:5 | { ... } | semmle.label | { ... } | +| main.rs:132:9:132:9 | a | semmle.label | a | +| main.rs:132:13:132:30 | x.get_data_trait() | semmle.label | x.get_data_trait() | +| main.rs:133:10:133:10 | a | semmle.label | a | +| main.rs:138:9:138:9 | a | semmle.label | a | +| main.rs:138:13:138:25 | mn.get_data() | semmle.label | mn.get_data() | +| main.rs:139:10:139:10 | a | semmle.label | a | +| main.rs:142:9:142:9 | a | semmle.label | a | +| main.rs:142:13:142:31 | mn.get_data_trait() | semmle.label | mn.get_data_trait() | +| main.rs:143:10:143:10 | a | semmle.label | a | +| main.rs:149:9:149:9 | a | semmle.label | a | +| main.rs:149:13:149:22 | source(...) | semmle.label | source(...) | +| main.rs:150:21:150:21 | a | semmle.label | a | +| main.rs:155:9:155:9 | a | semmle.label | a | +| main.rs:155:13:155:21 | source(...) | semmle.label | source(...) | +| main.rs:156:16:156:16 | a | semmle.label | a | +| main.rs:159:9:159:9 | a | semmle.label | a | +| main.rs:159:13:159:22 | source(...) | semmle.label | source(...) | +| main.rs:160:22:160:22 | a | semmle.label | a | +| main.rs:166:9:166:9 | a | semmle.label | a | +| main.rs:166:13:166:22 | source(...) | semmle.label | source(...) | +| main.rs:167:9:167:9 | b | semmle.label | b | +| main.rs:167:13:167:35 | x.data_through_trait(...) | semmle.label | x.data_through_trait(...) | +| main.rs:167:34:167:34 | a | semmle.label | a | +| main.rs:168:10:168:10 | b | semmle.label | b | +| main.rs:173:9:173:9 | a | semmle.label | a | +| main.rs:173:13:173:21 | source(...) | semmle.label | source(...) | +| main.rs:174:9:174:9 | b | semmle.label | b | +| main.rs:174:13:174:30 | mn.data_through(...) | semmle.label | mn.data_through(...) | +| main.rs:174:29:174:29 | a | semmle.label | a | +| main.rs:175:10:175:10 | b | semmle.label | b | +| main.rs:178:9:178:9 | a | semmle.label | a | +| main.rs:178:13:178:22 | source(...) | semmle.label | source(...) | +| main.rs:179:9:179:9 | b | semmle.label | b | +| main.rs:179:13:179:36 | mn.data_through_trait(...) | semmle.label | mn.data_through_trait(...) | +| main.rs:179:35:179:35 | a | semmle.label | a | +| main.rs:180:10:180:10 | b | semmle.label | b | +| main.rs:187:9:187:9 | a | semmle.label | a | +| main.rs:187:13:187:21 | source(...) | semmle.label | source(...) | +| main.rs:188:25:188:25 | a | semmle.label | a | +| main.rs:193:9:193:9 | a | semmle.label | a | +| main.rs:193:13:193:22 | source(...) | semmle.label | source(...) | +| main.rs:194:9:194:9 | b | semmle.label | b | +| main.rs:194:13:194:39 | ...::data_through(...) | semmle.label | ...::data_through(...) | +| main.rs:194:38:194:38 | a | semmle.label | a | +| main.rs:195:10:195:10 | b | semmle.label | b | +| main.rs:206:12:206:17 | ...: i64 | semmle.label | ...: i64 | +| main.rs:206:28:208:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:207:9:207:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:207:24:207:24 | n | semmle.label | n | +| main.rs:212:9:212:9 | n [MyInt] | semmle.label | n [MyInt] | +| main.rs:212:13:212:34 | ...::new(...) [MyInt] | semmle.label | ...::new(...) [MyInt] | +| main.rs:212:24:212:33 | source(...) | semmle.label | source(...) | +| main.rs:213:9:213:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:213:24:213:24 | m | semmle.label | m | +| main.rs:214:10:214:10 | m | semmle.label | m | +| main.rs:220:12:220:15 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | +| main.rs:220:42:223:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:222:9:222:35 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:222:24:222:27 | self [MyInt] | semmle.label | self [MyInt] | +| main.rs:222:24:222:33 | self.value | semmle.label | self.value | +| main.rs:227:19:227:27 | SelfParam [Return] [&ref, MyInt] | semmle.label | SelfParam [Return] [&ref, MyInt] | +| main.rs:227:30:227:39 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | +| main.rs:228:10:228:14 | [post] * ... [MyInt] | semmle.label | [post] * ... [MyInt] | +| main.rs:228:11:228:14 | [post] self [&ref, MyInt] | semmle.label | [post] self [&ref, MyInt] | +| main.rs:228:25:228:27 | rhs [MyInt] | semmle.label | rhs [MyInt] | +| main.rs:228:25:228:33 | rhs.value | semmle.label | rhs.value | +| main.rs:242:9:242:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:242:13:242:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:242:28:242:36 | source(...) | semmle.label | source(...) | +| main.rs:244:9:244:9 | c [MyInt] | semmle.label | c [MyInt] | +| main.rs:244:13:244:13 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:244:13:244:17 | ... + ... [MyInt] | semmle.label | ... + ... [MyInt] | +| main.rs:245:10:245:10 | c [MyInt] | semmle.label | c [MyInt] | +| main.rs:245:10:245:16 | c.value | semmle.label | c.value | | main.rs:252:9:252:9 | a [MyInt] | semmle.label | a [MyInt] | | main.rs:252:13:252:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | | main.rs:252:28:252:36 | source(...) | semmle.label | source(...) | -| main.rs:254:9:254:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:254:24:254:24 | c | semmle.label | c | -| main.rs:254:30:254:53 | ...::take_self(...) [MyInt] | semmle.label | ...::take_self(...) [MyInt] | -| main.rs:254:49:254:49 | a [MyInt] | semmle.label | a [MyInt] | -| main.rs:255:10:255:10 | c | semmle.label | c | -| main.rs:258:9:258:9 | b [MyInt] | semmle.label | b [MyInt] | -| main.rs:258:13:258:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:258:28:258:37 | source(...) | semmle.label | source(...) | -| main.rs:259:9:259:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | -| main.rs:259:24:259:24 | c | semmle.label | c | -| main.rs:259:30:259:55 | ...::take_second(...) [MyInt] | semmle.label | ...::take_second(...) [MyInt] | -| main.rs:259:54:259:54 | b [MyInt] | semmle.label | b [MyInt] | -| main.rs:260:10:260:10 | c | semmle.label | c | -| main.rs:268:32:272:1 | { ... } | semmle.label | { ... } | -| main.rs:269:9:269:9 | a | semmle.label | a | -| main.rs:269:13:269:21 | source(...) | semmle.label | source(...) | -| main.rs:270:10:270:10 | a | semmle.label | a | -| main.rs:279:13:279:13 | c | semmle.label | c | -| main.rs:279:17:279:25 | source(...) | semmle.label | source(...) | -| main.rs:280:14:280:14 | c | semmle.label | c | -| main.rs:287:9:287:9 | a | semmle.label | a | -| main.rs:287:13:287:55 | ...::block_on(...) | semmle.label | ...::block_on(...) | -| main.rs:287:41:287:54 | async_source(...) | semmle.label | async_source(...) | -| main.rs:288:10:288:10 | a | semmle.label | a | +| main.rs:254:9:254:9 | d [MyInt] | semmle.label | d [MyInt] | +| main.rs:254:13:254:20 | a.add(...) [MyInt] | semmle.label | a.add(...) [MyInt] | +| main.rs:255:10:255:10 | d [MyInt] | semmle.label | d [MyInt] | +| main.rs:255:10:255:16 | d.value | semmle.label | d.value | +| main.rs:259:9:259:9 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:259:13:259:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:259:28:259:37 | source(...) | semmle.label | source(...) | +| main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | semmle.label | [post] &mut a [&ref, MyInt] | +| main.rs:261:32:261:32 | [post] a [MyInt] | semmle.label | [post] a [MyInt] | +| main.rs:261:35:261:35 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:262:10:262:10 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:262:10:262:16 | a.value | semmle.label | a.value | +| main.rs:289:18:289:21 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] | +| main.rs:289:48:291:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:293:26:293:37 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] | +| main.rs:293:49:295:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | +| main.rs:299:9:299:9 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:299:13:299:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:299:28:299:36 | source(...) | semmle.label | source(...) | +| main.rs:301:9:301:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:301:24:301:24 | c | semmle.label | c | +| main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | semmle.label | ...::take_self(...) [MyInt] | +| main.rs:301:50:301:50 | a [MyInt] | semmle.label | a [MyInt] | +| main.rs:302:10:302:10 | c | semmle.label | c | +| main.rs:305:9:305:9 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:305:13:305:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:305:28:305:37 | source(...) | semmle.label | source(...) | +| main.rs:306:9:306:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] | +| main.rs:306:24:306:24 | c | semmle.label | c | +| main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | semmle.label | ...::take_second(...) [MyInt] | +| main.rs:306:55:306:55 | b [MyInt] | semmle.label | b [MyInt] | +| main.rs:307:10:307:10 | c | semmle.label | c | +| main.rs:315:32:319:1 | { ... } | semmle.label | { ... } | +| main.rs:316:9:316:9 | a | semmle.label | a | +| main.rs:316:13:316:21 | source(...) | semmle.label | source(...) | +| main.rs:317:10:317:10 | a | semmle.label | a | +| main.rs:326:13:326:13 | c | semmle.label | c | +| main.rs:326:17:326:25 | source(...) | semmle.label | source(...) | +| main.rs:327:14:327:14 | c | semmle.label | c | +| main.rs:334:9:334:9 | a | semmle.label | a | +| main.rs:334:13:334:55 | ...::block_on(...) | semmle.label | ...::block_on(...) | +| main.rs:334:41:334:54 | async_source(...) | semmle.label | async_source(...) | +| main.rs:335:10:335:10 | a | semmle.label | a | subpaths | main.rs:38:23:38:31 | source(...) | main.rs:26:28:26:33 | ...: i64 | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | main.rs:38:6:38:11 | [post] &mut a [&ref, MyStruct] | | main.rs:39:10:39:10 | a [MyStruct] | main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | main.rs:30:31:32:5 | { ... } | main.rs:39:10:39:21 | a.get_data() | @@ -275,13 +359,16 @@ subpaths | main.rs:67:26:67:26 | a | main.rs:61:17:61:22 | ...: i64 | main.rs:61:32:63:1 | { ... } | main.rs:67:13:67:27 | pass_through(...) | | main.rs:72:26:75:5 | { ... } | main.rs:61:17:61:22 | ...: i64 | main.rs:61:32:63:1 | { ... } | main.rs:72:13:75:6 | pass_through(...) | | main.rs:86:26:86:26 | a | main.rs:82:21:82:26 | ...: i64 | main.rs:82:36:84:5 | { ... } | main.rs:86:13:86:27 | pass_through(...) | -| main.rs:134:29:134:29 | a | main.rs:110:27:110:32 | ...: i64 | main.rs:110:42:116:5 | { ... } | main.rs:134:13:134:30 | mn.data_through(...) | -| main.rs:147:38:147:38 | a | main.rs:110:27:110:32 | ...: i64 | main.rs:110:42:116:5 | { ... } | main.rs:147:13:147:39 | ...::data_through(...) | -| main.rs:165:24:165:33 | source(...) | main.rs:159:12:159:17 | ...: i64 | main.rs:159:28:161:5 | { ... } [MyInt] | main.rs:165:13:165:34 | ...::new(...) [MyInt] | -| main.rs:197:13:197:13 | a [MyInt] | main.rs:173:12:173:15 | SelfParam [MyInt] | main.rs:173:42:176:5 | { ... } [MyInt] | main.rs:197:13:197:17 | ... + ... [MyInt] | -| main.rs:205:9:205:9 | a [MyInt] | main.rs:173:12:173:15 | SelfParam [MyInt] | main.rs:173:42:176:5 | { ... } [MyInt] | main.rs:207:13:207:20 | a.add(...) [MyInt] | -| main.rs:254:49:254:49 | a [MyInt] | main.rs:242:18:242:21 | SelfParam [MyInt] | main.rs:242:48:244:5 | { ... } [MyInt] | main.rs:254:30:254:53 | ...::take_self(...) [MyInt] | -| main.rs:259:54:259:54 | b [MyInt] | main.rs:246:26:246:37 | ...: MyInt [MyInt] | main.rs:246:49:248:5 | { ... } [MyInt] | main.rs:259:30:259:55 | ...::take_second(...) [MyInt] | +| main.rs:167:34:167:34 | a | main.rs:126:33:126:38 | ...: i64 | main.rs:126:48:128:5 | { ... } | main.rs:167:13:167:35 | x.data_through_trait(...) | +| main.rs:174:29:174:29 | a | main.rs:112:27:112:32 | ...: i64 | main.rs:112:42:114:5 | { ... } | main.rs:174:13:174:30 | mn.data_through(...) | +| main.rs:179:35:179:35 | a | main.rs:126:33:126:38 | ...: i64 | main.rs:126:48:128:5 | { ... } | main.rs:179:13:179:36 | mn.data_through_trait(...) | +| main.rs:194:38:194:38 | a | main.rs:112:27:112:32 | ...: i64 | main.rs:112:42:114:5 | { ... } | main.rs:194:13:194:39 | ...::data_through(...) | +| main.rs:212:24:212:33 | source(...) | main.rs:206:12:206:17 | ...: i64 | main.rs:206:28:208:5 | { ... } [MyInt] | main.rs:212:13:212:34 | ...::new(...) [MyInt] | +| main.rs:244:13:244:13 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | main.rs:220:42:223:5 | { ... } [MyInt] | main.rs:244:13:244:17 | ... + ... [MyInt] | +| main.rs:252:9:252:9 | a [MyInt] | main.rs:220:12:220:15 | SelfParam [MyInt] | main.rs:220:42:223:5 | { ... } [MyInt] | main.rs:254:13:254:20 | a.add(...) [MyInt] | +| main.rs:261:35:261:35 | b [MyInt] | main.rs:227:30:227:39 | ...: MyInt [MyInt] | main.rs:227:19:227:27 | SelfParam [Return] [&ref, MyInt] | main.rs:261:27:261:32 | [post] &mut a [&ref, MyInt] | +| main.rs:301:50:301:50 | a [MyInt] | main.rs:289:18:289:21 | SelfParam [MyInt] | main.rs:289:48:291:5 | { ... } [MyInt] | main.rs:301:30:301:54 | ...::take_self(...) [MyInt] | +| main.rs:306:55:306:55 | b [MyInt] | main.rs:293:26:293:37 | ...: MyInt [MyInt] | main.rs:293:49:295:5 | { ... } [MyInt] | main.rs:306:30:306:56 | ...::take_second(...) [MyInt] | testFailures #select | main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) | @@ -291,16 +378,23 @@ testFailures | main.rs:68:10:68:10 | b | main.rs:66:13:66:21 | source(...) | main.rs:68:10:68:10 | b | $@ | main.rs:66:13:66:21 | source(...) | source(...) | | main.rs:76:10:76:10 | a | main.rs:74:9:74:18 | source(...) | main.rs:76:10:76:10 | a | $@ | main.rs:74:9:74:18 | source(...) | source(...) | | main.rs:87:10:87:10 | b | main.rs:80:13:80:22 | source(...) | main.rs:87:10:87:10 | b | $@ | main.rs:80:13:80:22 | source(...) | source(...) | -| main.rs:99:14:99:14 | n | main.rs:127:13:127:21 | source(...) | main.rs:99:14:99:14 | n | $@ | main.rs:127:13:127:21 | source(...) | source(...) | -| main.rs:99:14:99:14 | n | main.rs:140:13:140:21 | source(...) | main.rs:99:14:99:14 | n | $@ | main.rs:140:13:140:21 | source(...) | source(...) | -| main.rs:122:10:122:10 | a | main.rs:106:13:106:21 | source(...) | main.rs:122:10:122:10 | a | $@ | main.rs:106:13:106:21 | source(...) | source(...) | -| main.rs:135:10:135:10 | b | main.rs:133:13:133:21 | source(...) | main.rs:135:10:135:10 | b | $@ | main.rs:133:13:133:21 | source(...) | source(...) | -| main.rs:148:10:148:10 | b | main.rs:146:13:146:22 | source(...) | main.rs:148:10:148:10 | b | $@ | main.rs:146:13:146:22 | source(...) | source(...) | -| main.rs:167:10:167:10 | m | main.rs:165:24:165:33 | source(...) | main.rs:167:10:167:10 | m | $@ | main.rs:165:24:165:33 | source(...) | source(...) | -| main.rs:198:10:198:16 | c.value | main.rs:195:28:195:36 | source(...) | main.rs:198:10:198:16 | c.value | $@ | main.rs:195:28:195:36 | source(...) | source(...) | -| main.rs:208:10:208:16 | d.value | main.rs:205:28:205:36 | source(...) | main.rs:208:10:208:16 | d.value | $@ | main.rs:205:28:205:36 | source(...) | source(...) | -| main.rs:255:10:255:10 | c | main.rs:252:28:252:36 | source(...) | main.rs:255:10:255:10 | c | $@ | main.rs:252:28:252:36 | source(...) | source(...) | -| main.rs:260:10:260:10 | c | main.rs:258:28:258:37 | source(...) | main.rs:260:10:260:10 | c | $@ | main.rs:258:28:258:37 | source(...) | source(...) | -| main.rs:270:10:270:10 | a | main.rs:269:13:269:21 | source(...) | main.rs:270:10:270:10 | a | $@ | main.rs:269:13:269:21 | source(...) | source(...) | -| main.rs:280:14:280:14 | c | main.rs:279:17:279:25 | source(...) | main.rs:280:14:280:14 | c | $@ | main.rs:279:17:279:25 | source(...) | source(...) | -| main.rs:288:10:288:10 | a | main.rs:269:13:269:21 | source(...) | main.rs:288:10:288:10 | a | $@ | main.rs:269:13:269:21 | source(...) | source(...) | +| main.rs:105:14:105:14 | n | main.rs:155:13:155:21 | source(...) | main.rs:105:14:105:14 | n | $@ | main.rs:155:13:155:21 | source(...) | source(...) | +| main.rs:105:14:105:14 | n | main.rs:187:13:187:21 | source(...) | main.rs:105:14:105:14 | n | $@ | main.rs:187:13:187:21 | source(...) | source(...) | +| main.rs:119:14:119:14 | n | main.rs:149:13:149:22 | source(...) | main.rs:119:14:119:14 | n | $@ | main.rs:149:13:149:22 | source(...) | source(...) | +| main.rs:119:14:119:14 | n | main.rs:159:13:159:22 | source(...) | main.rs:119:14:119:14 | n | $@ | main.rs:159:13:159:22 | source(...) | source(...) | +| main.rs:133:10:133:10 | a | main.rs:123:35:123:44 | source(...) | main.rs:133:10:133:10 | a | $@ | main.rs:123:35:123:44 | source(...) | source(...) | +| main.rs:139:10:139:10 | a | main.rs:109:35:109:43 | source(...) | main.rs:139:10:139:10 | a | $@ | main.rs:109:35:109:43 | source(...) | source(...) | +| main.rs:143:10:143:10 | a | main.rs:123:35:123:44 | source(...) | main.rs:143:10:143:10 | a | $@ | main.rs:123:35:123:44 | source(...) | source(...) | +| main.rs:168:10:168:10 | b | main.rs:166:13:166:22 | source(...) | main.rs:168:10:168:10 | b | $@ | main.rs:166:13:166:22 | source(...) | source(...) | +| main.rs:175:10:175:10 | b | main.rs:173:13:173:21 | source(...) | main.rs:175:10:175:10 | b | $@ | main.rs:173:13:173:21 | source(...) | source(...) | +| main.rs:180:10:180:10 | b | main.rs:178:13:178:22 | source(...) | main.rs:180:10:180:10 | b | $@ | main.rs:178:13:178:22 | source(...) | source(...) | +| main.rs:195:10:195:10 | b | main.rs:193:13:193:22 | source(...) | main.rs:195:10:195:10 | b | $@ | main.rs:193:13:193:22 | source(...) | source(...) | +| main.rs:214:10:214:10 | m | main.rs:212:24:212:33 | source(...) | main.rs:214:10:214:10 | m | $@ | main.rs:212:24:212:33 | source(...) | source(...) | +| main.rs:245:10:245:16 | c.value | main.rs:242:28:242:36 | source(...) | main.rs:245:10:245:16 | c.value | $@ | main.rs:242:28:242:36 | source(...) | source(...) | +| main.rs:255:10:255:16 | d.value | main.rs:252:28:252:36 | source(...) | main.rs:255:10:255:16 | d.value | $@ | main.rs:252:28:252:36 | source(...) | source(...) | +| main.rs:262:10:262:16 | a.value | main.rs:259:28:259:37 | source(...) | main.rs:262:10:262:16 | a.value | $@ | main.rs:259:28:259:37 | source(...) | source(...) | +| main.rs:302:10:302:10 | c | main.rs:299:28:299:36 | source(...) | main.rs:302:10:302:10 | c | $@ | main.rs:299:28:299:36 | source(...) | source(...) | +| main.rs:307:10:307:10 | c | main.rs:305:28:305:37 | source(...) | main.rs:307:10:307:10 | c | $@ | main.rs:305:28:305:37 | source(...) | source(...) | +| main.rs:317:10:317:10 | a | main.rs:316:13:316:21 | source(...) | main.rs:317:10:317:10 | a | $@ | main.rs:316:13:316:21 | source(...) | source(...) | +| main.rs:327:14:327:14 | c | main.rs:326:17:326:25 | source(...) | main.rs:327:14:327:14 | c | $@ | main.rs:326:17:326:25 | source(...) | source(...) | +| main.rs:335:10:335:10 | a | main.rs:316:13:316:21 | source(...) | main.rs:335:10:335:10 | a | $@ | main.rs:316:13:316:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/global/main.rs b/rust/ql/test/library-tests/dataflow/global/main.rs index fb5acfb7c606..b66ef27726bb 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -94,38 +94,78 @@ struct MyFlag { flag: bool, } +trait MyTrait { + fn data_in_trait(self, n: i64); + fn get_data_trait(self) -> i64; + fn data_through_trait(self, n: i64) -> i64; +} + impl MyFlag { fn data_in(self, n: i64) { sink(n); // $ hasValueFlow=1 hasValueFlow=8 } fn get_data(self) -> i64 { - if self.flag { - 0 - } else { - source(2) - } + if self.flag { 0 } else { source(2) } } fn data_through(self, n: i64) -> i64 { - if self.flag { - 0 - } else { - n - } + if self.flag { 0 } else { n } } } +impl MyTrait for MyFlag { + fn data_in_trait(self, n: i64) { + sink(n); // $ hasValueFlow=22 $ hasValueFlow=31 + } + + fn get_data_trait(self) -> i64 { + if self.flag { 0 } else { source(21) } + } + + fn data_through_trait(self, n: i64) -> i64 { + if self.flag { 0 } else { n } + } +} + +fn data_out_of_method_trait_dispatch(x: T) { + let a = x.get_data_trait(); + sink(a); // $ hasValueFlow=21 +} + fn data_out_of_method() { let mn = MyFlag { flag: true }; let a = mn.get_data(); sink(a); // $ hasValueFlow=2 + + let mn = MyFlag { flag: true }; + let a = mn.get_data_trait(); + sink(a); // $ hasValueFlow=21 + + data_out_of_method_trait_dispatch(MyFlag { flag: true }); +} + +fn data_in_to_method_call_trait_dispatch(x: T) { + let a = source(31); + x.data_in_trait(a); } fn data_in_to_method_call() { let mn = MyFlag { flag: true }; let a = source(1); - mn.data_in(a) + mn.data_in(a); + + let mn = MyFlag { flag: true }; + let a = source(22); + mn.data_in_trait(a); + + data_in_to_method_call_trait_dispatch(MyFlag { flag: true }); +} + +fn data_through_method_trait_dispatch(x: T) { + let a = source(34); + let b = x.data_through_trait(a); + sink(b); // $ hasValueFlow=34 } fn data_through_method() { @@ -133,6 +173,13 @@ fn data_through_method() { let a = source(4); let b = mn.data_through(a); sink(b); // $ hasValueFlow=4 + + let mn = MyFlag { flag: true }; + let a = source(24); + let b = mn.data_through_trait(a); + sink(b); // $ hasValueFlow=24 + + data_through_method_trait_dispatch(MyFlag { flag: true }); } fn data_in_to_method_called_as_function() { @@ -212,7 +259,7 @@ fn test_operator_overloading() { let b = MyInt { value: source(34) }; // The line below is what `*=` desugars to. MulAssign::mul_assign(&mut a, b); - sink(a.value); // $ MISSING: hasValueFlow=34 + sink(a.value); // $ hasValueFlow=34 let mut a = MyInt { value: 0 }; let b = MyInt { value: source(35) }; @@ -230,13 +277,13 @@ fn test_operator_overloading() { sink(c); // $ hasTaintFlow=28 MISSING: hasValueFlow=28 } -trait MyTrait { +trait MyTrait2 { type Output; fn take_self(self, _other: Self::Output) -> Self::Output; fn take_second(self, other: Self::Output) -> Self::Output; } -impl MyTrait for MyInt { +impl MyTrait2 for MyInt { type Output = MyInt; fn take_self(self, _other: MyInt) -> MyInt { @@ -251,17 +298,17 @@ impl MyTrait for MyInt { fn data_through_trait_method_called_as_function() { let a = MyInt { value: source(8) }; let b = MyInt { value: 2 }; - let MyInt { value: c } = MyTrait::take_self(a, b); + let MyInt { value: c } = MyTrait2::take_self(a, b); sink(c); // $ hasValueFlow=8 let a = MyInt { value: 0 }; let b = MyInt { value: source(37) }; - let MyInt { value: c } = MyTrait::take_second(a, b); + let MyInt { value: c } = MyTrait2::take_second(a, b); sink(c); // $ hasValueFlow=37 let a = MyInt { value: 0 }; let b = MyInt { value: source(38) }; - let MyInt { value: c } = MyTrait::take_self(a, b); + let MyInt { value: c } = MyTrait2::take_self(a, b); sink(c); } diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index 6fdac9700b6c..9c7a9e191416 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -23,73 +23,93 @@ | main.rs:80:13:80:22 | source(...) | main.rs:1:1:3:1 | fn source | | main.rs:86:13:86:27 | pass_through(...) | main.rs:82:5:84:5 | fn pass_through | | main.rs:87:5:87:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:99:9:99:15 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:106:13:106:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:121:13:121:25 | mn.get_data() | main.rs:102:5:108:5 | fn get_data | -| main.rs:122:5:122:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:127:13:127:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:128:5:128:17 | mn.data_in(...) | main.rs:98:5:100:5 | fn data_in | -| main.rs:133:13:133:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:134:13:134:30 | mn.data_through(...) | main.rs:110:5:116:5 | fn data_through | -| main.rs:135:5:135:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:140:13:140:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:141:5:141:26 | ...::data_in(...) | main.rs:98:5:100:5 | fn data_in | -| main.rs:146:13:146:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:147:13:147:39 | ...::data_through(...) | main.rs:110:5:116:5 | fn data_through | -| main.rs:148:5:148:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:165:13:165:34 | ...::new(...) | main.rs:158:5:161:5 | fn new | -| main.rs:165:24:165:33 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:167:5:167:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:181:10:181:14 | * ... | main.rs:188:5:190:5 | fn deref | -| main.rs:189:11:189:15 | * ... | main.rs:188:5:190:5 | fn deref | -| main.rs:195:28:195:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:197:13:197:17 | ... + ... | main.rs:173:5:176:5 | fn add | -| main.rs:198:5:198:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:201:28:201:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:202:13:202:17 | ... + ... | main.rs:173:5:176:5 | fn add | -| main.rs:203:5:203:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:205:28:205:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:207:13:207:20 | a.add(...) | main.rs:173:5:176:5 | fn add | -| main.rs:208:5:208:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:212:28:212:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:215:5:215:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:218:28:218:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:219:5:219:10 | ... *= ... | main.rs:180:5:182:5 | fn mul_assign | -| main.rs:220:5:220:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:223:28:223:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:226:5:226:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:228:28:228:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:229:13:229:14 | * ... | main.rs:188:5:190:5 | fn deref | -| main.rs:230:5:230:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:105:9:105:15 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:109:35:109:43 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:119:9:119:15 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:123:35:123:44 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:132:13:132:30 | x.get_data_trait() | main.rs:122:5:124:5 | fn get_data_trait | +| main.rs:133:5:133:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:138:13:138:25 | mn.get_data() | main.rs:108:5:110:5 | fn get_data | +| main.rs:139:5:139:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:142:13:142:31 | mn.get_data_trait() | main.rs:122:5:124:5 | fn get_data_trait | +| main.rs:143:5:143:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:145:5:145:60 | data_out_of_method_trait_dispatch(...) | main.rs:131:1:134:1 | fn data_out_of_method_trait_dispatch | +| main.rs:149:13:149:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:150:5:150:22 | x.data_in_trait(...) | main.rs:118:5:120:5 | fn data_in_trait | +| main.rs:155:13:155:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:156:5:156:17 | mn.data_in(...) | main.rs:104:5:106:5 | fn data_in | +| main.rs:159:13:159:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:160:5:160:23 | mn.data_in_trait(...) | main.rs:118:5:120:5 | fn data_in_trait | +| main.rs:162:5:162:64 | data_in_to_method_call_trait_dispatch(...) | main.rs:148:1:151:1 | fn data_in_to_method_call_trait_dispatch | +| main.rs:166:13:166:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:167:13:167:35 | x.data_through_trait(...) | main.rs:126:5:128:5 | fn data_through_trait | +| main.rs:168:5:168:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:173:13:173:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:174:13:174:30 | mn.data_through(...) | main.rs:112:5:114:5 | fn data_through | +| main.rs:175:5:175:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:178:13:178:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:179:13:179:36 | mn.data_through_trait(...) | main.rs:126:5:128:5 | fn data_through_trait | +| main.rs:180:5:180:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:182:5:182:61 | data_through_method_trait_dispatch(...) | main.rs:165:1:169:1 | fn data_through_method_trait_dispatch | +| main.rs:187:13:187:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:188:5:188:26 | ...::data_in(...) | main.rs:104:5:106:5 | fn data_in | +| main.rs:193:13:193:22 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:194:13:194:39 | ...::data_through(...) | main.rs:112:5:114:5 | fn data_through | +| main.rs:195:5:195:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:212:13:212:34 | ...::new(...) | main.rs:205:5:208:5 | fn new | +| main.rs:212:24:212:33 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:214:5:214:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:228:10:228:14 | * ... | main.rs:235:5:237:5 | fn deref | +| main.rs:236:11:236:15 | * ... | main.rs:235:5:237:5 | fn deref | +| main.rs:242:28:242:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:244:13:244:17 | ... + ... | main.rs:220:5:223:5 | fn add | +| main.rs:245:5:245:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:248:28:248:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:249:13:249:17 | ... + ... | main.rs:220:5:223:5 | fn add | +| main.rs:250:5:250:17 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:252:28:252:36 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:254:30:254:53 | ...::take_self(...) | main.rs:242:5:244:5 | fn take_self | -| main.rs:255:5:255:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:258:28:258:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:259:30:259:55 | ...::take_second(...) | main.rs:246:5:248:5 | fn take_second | -| main.rs:260:5:260:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:263:28:263:37 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:264:30:264:53 | ...::take_self(...) | main.rs:242:5:244:5 | fn take_self | -| main.rs:265:5:265:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:269:13:269:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:270:5:270:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:275:13:275:26 | async_source(...) | main.rs:268:1:272:1 | fn async_source | -| main.rs:276:5:276:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:279:17:279:25 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:280:9:280:15 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:283:5:283:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:287:13:287:55 | ...::block_on(...) | file://:0:0:0:0 | fn block_on | -| main.rs:287:41:287:54 | async_source(...) | main.rs:268:1:272:1 | fn async_source | -| main.rs:288:5:288:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:290:5:290:62 | ...::block_on(...) | file://:0:0:0:0 | fn block_on | -| main.rs:290:33:290:61 | test_async_await_async_part(...) | main.rs:274:1:284:1 | fn test_async_await_async_part | -| main.rs:294:5:294:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | -| main.rs:295:5:295:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | -| main.rs:296:5:296:35 | data_out_of_call_side_effect2(...) | main.rs:42:1:50:1 | fn data_out_of_call_side_effect2 | -| main.rs:297:5:297:21 | data_in_to_call(...) | main.rs:56:1:59:1 | fn data_in_to_call | -| main.rs:298:5:298:23 | data_through_call(...) | main.rs:65:1:69:1 | fn data_through_call | -| main.rs:299:5:299:34 | data_through_nested_function(...) | main.rs:79:1:88:1 | fn data_through_nested_function | -| main.rs:301:5:301:24 | data_out_of_method(...) | main.rs:119:1:123:1 | fn data_out_of_method | -| main.rs:302:5:302:28 | data_in_to_method_call(...) | main.rs:125:1:129:1 | fn data_in_to_method_call | -| main.rs:303:5:303:25 | data_through_method(...) | main.rs:131:1:136:1 | fn data_through_method | -| main.rs:305:5:305:31 | test_operator_overloading(...) | main.rs:193:1:231:1 | fn test_operator_overloading | -| main.rs:306:5:306:22 | test_async_await(...) | main.rs:286:1:291:1 | fn test_async_await | +| main.rs:254:13:254:20 | a.add(...) | main.rs:220:5:223:5 | fn add | +| main.rs:255:5:255:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:259:28:259:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:261:5:261:36 | ...::mul_assign(...) | main.rs:227:5:229:5 | fn mul_assign | +| main.rs:262:5:262:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:265:28:265:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:266:5:266:10 | ... *= ... | main.rs:227:5:229:5 | fn mul_assign | +| main.rs:267:5:267:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:270:28:270:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:273:5:273:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:275:28:275:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:276:13:276:14 | * ... | main.rs:235:5:237:5 | fn deref | +| main.rs:277:5:277:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:299:28:299:36 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:301:30:301:54 | ...::take_self(...) | main.rs:289:5:291:5 | fn take_self | +| main.rs:302:5:302:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:305:28:305:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:306:30:306:56 | ...::take_second(...) | main.rs:293:5:295:5 | fn take_second | +| main.rs:307:5:307:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:310:28:310:37 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:311:30:311:54 | ...::take_self(...) | main.rs:289:5:291:5 | fn take_self | +| main.rs:312:5:312:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:316:13:316:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:317:5:317:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:322:13:322:26 | async_source(...) | main.rs:315:1:319:1 | fn async_source | +| main.rs:323:5:323:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:326:17:326:25 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:327:9:327:15 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:330:5:330:17 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:334:13:334:55 | ...::block_on(...) | file://:0:0:0:0 | fn block_on | +| main.rs:334:41:334:54 | async_source(...) | main.rs:315:1:319:1 | fn async_source | +| main.rs:335:5:335:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:337:5:337:62 | ...::block_on(...) | file://:0:0:0:0 | fn block_on | +| main.rs:337:33:337:61 | test_async_await_async_part(...) | main.rs:321:1:331:1 | fn test_async_await_async_part | +| main.rs:341:5:341:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | +| main.rs:342:5:342:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | +| main.rs:343:5:343:35 | data_out_of_call_side_effect2(...) | main.rs:42:1:50:1 | fn data_out_of_call_side_effect2 | +| main.rs:344:5:344:21 | data_in_to_call(...) | main.rs:56:1:59:1 | fn data_in_to_call | +| main.rs:345:5:345:23 | data_through_call(...) | main.rs:65:1:69:1 | fn data_through_call | +| main.rs:346:5:346:34 | data_through_nested_function(...) | main.rs:79:1:88:1 | fn data_through_nested_function | +| main.rs:348:5:348:24 | data_out_of_method(...) | main.rs:136:1:146:1 | fn data_out_of_method | +| main.rs:349:5:349:28 | data_in_to_method_call(...) | main.rs:153:1:163:1 | fn data_in_to_method_call | +| main.rs:350:5:350:25 | data_through_method(...) | main.rs:171:1:183:1 | fn data_through_method | +| main.rs:352:5:352:31 | test_operator_overloading(...) | main.rs:240:1:278:1 | fn test_operator_overloading | +| main.rs:353:5:353:22 | test_async_await(...) | main.rs:333:1:338:1 | fn test_async_await | diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index 54337a1f0214..0430b6f8dff1 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -2,8 +2,8 @@ fn source(i: i64) -> i64 { 1000 + i } -fn sink(s: i64) { - println!("{}", s); +fn sink(s: T) { + println!("{:?}", s); } // has a flow model @@ -176,7 +176,10 @@ fn test_set_tuple_element() { } // has a flow model -pub fn apply(n: i64, f: F) -> i64 where F : FnOnce(i64) -> i64 { +pub fn apply(n: i64, f: F) -> i64 +where + F: FnOnce(i64) -> i64, +{ 0 } @@ -288,6 +291,81 @@ fn test_arg_source() { sink(i) // $ hasValueFlow=i } +struct MyStruct2(i64); + +impl PartialEq for MyStruct { + fn eq(&self, other: &Self) -> bool { + true + } +} + +impl PartialEq for MyStruct2 { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } +} + +impl Eq for MyStruct {} + +impl Eq for MyStruct2 {} + +use std::cmp::Ordering; + +impl PartialOrd for MyStruct { + fn partial_cmp(&self, other: &Self) -> Option { + Some(Ordering::Equal) + } +} + +impl PartialOrd for MyStruct2 { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.0.cmp(&other.0)) + } +} + +impl Ord for MyStruct { + fn cmp(&self, other: &Self) -> Ordering { + Ordering::Equal + } +} + +impl Ord for MyStruct2 { + fn cmp(&self, other: &Self) -> Ordering { + self.0.cmp(&other.0) + } + + fn max(self, other: Self) -> Self { + other + } +} + +fn test_trait_model(x: T) { + let x1 = source(20).max(0); + sink(x1); // $ hasValueFlow=20 + + let x2 = (MyStruct { + field1: source(23), + field2: 0, + }) + .max(MyStruct { + field1: 0, + field2: 0, + }); + sink(x2.field1); // $ hasValueFlow=23 + + let x3 = MyStruct2(source(24)).max(MyStruct2(0)); + sink(x3.0); // no flow, because the model does not apply when the target is in source code + + let x4 = source(25).max(1); + sink(x4); // $ hasValueFlow=25 + + let x5 = source(26).lt(&1); + sink(x5); // $ hasTaintFlow=26 + + let x6 = source(27) < 1; + sink(x6); // $ hasTaintFlow=27 +} + #[tokio::main] async fn main() { test_identify(); diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 9016ebae47e9..db7489809b85 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -6,20 +6,22 @@ models | 5 | Source: main::arg_source; Argument[0]; test-source | | 6 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | | 7 | Source: main::simple_source; ReturnValue; test-source | -| 8 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 9 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 10 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 11 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 12 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 13 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 14 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 15 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 16 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 17 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 18 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 19 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 20 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 21 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 8 | Summary: <_ as core::cmp::Ord>::max; Argument[self]; ReturnValue; value | +| 9 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | +| 10 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 11 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 12 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 13 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 14 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 15 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 16 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 17 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 18 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 19 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 20 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 21 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 22 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 23 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -29,7 +31,7 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:10 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:12 | | main.rs:40:9:40:9 | s | main.rs:41:27:41:27 | s | provenance | | | main.rs:40:9:40:9 | s | main.rs:41:27:41:27 | s | provenance | | | main.rs:40:13:40:21 | source(...) | main.rs:40:9:40:9 | s | provenance | | @@ -40,8 +42,8 @@ edges | main.rs:41:14:41:28 | ...::A(...) [A] | main.rs:41:9:41:10 | e1 [A] | provenance | | | main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | | | main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | | -| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:16 | -| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:16 | +| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:18 | +| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:18 | | main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | | | main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | | | main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | | @@ -50,8 +52,8 @@ edges | main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | | | main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | | | main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | | -| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:21 | -| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:21 | +| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:23 | +| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:23 | | main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | | | main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | | | main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | | @@ -68,8 +70,8 @@ edges | main.rs:73:14:73:42 | ...::C {...} [C] | main.rs:73:9:73:10 | e1 [C] | provenance | | | main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | | | main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | | -| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:15 | -| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:15 | +| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:17 | +| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:17 | | main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | | | main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | | | main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | | @@ -78,8 +80,8 @@ edges | main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | | | main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | | | main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | | -| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:20 | -| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:20 | +| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:22 | +| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:22 | | main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | | | main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | | | main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | | @@ -96,8 +98,8 @@ edges | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | main.rs:105:9:105:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:13 | -| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:13 | +| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:15 | +| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:15 | | main.rs:126:9:126:9 | s | main.rs:127:38:127:38 | s | provenance | | | main.rs:126:9:126:9 | s | main.rs:127:38:127:38 | s | provenance | | | main.rs:126:13:126:21 | source(...) | main.rs:126:9:126:9 | s | provenance | | @@ -106,16 +108,16 @@ edges | main.rs:127:9:127:17 | my_struct [MyStruct.field2] | main.rs:129:10:129:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | main.rs:127:9:127:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | main.rs:127:9:127:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:127:38:127:38 | s | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:18 | -| main.rs:127:38:127:38 | s | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:18 | +| main.rs:127:38:127:38 | s | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:20 | +| main.rs:127:38:127:38 | s | main.rs:127:21:127:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:20 | | main.rs:129:10:129:18 | my_struct [MyStruct.field2] | main.rs:129:10:129:25 | my_struct.field2 | provenance | | | main.rs:129:10:129:18 | my_struct [MyStruct.field2] | main.rs:129:10:129:25 | my_struct.field2 | provenance | | | main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | | | main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | | | main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | s | provenance | | | main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | s | provenance | | -| main.rs:139:28:139:30 | [...] [element] | main.rs:139:10:139:31 | get_array_element(...) | provenance | MaD:11 | -| main.rs:139:28:139:30 | [...] [element] | main.rs:139:10:139:31 | get_array_element(...) | provenance | MaD:11 | +| main.rs:139:28:139:30 | [...] [element] | main.rs:139:10:139:31 | get_array_element(...) | provenance | MaD:13 | +| main.rs:139:28:139:30 | [...] [element] | main.rs:139:10:139:31 | get_array_element(...) | provenance | MaD:13 | | main.rs:139:29:139:29 | s | main.rs:139:28:139:30 | [...] [element] | provenance | | | main.rs:139:29:139:29 | s | main.rs:139:28:139:30 | [...] [element] | provenance | | | main.rs:148:9:148:9 | s | main.rs:149:33:149:33 | s | provenance | | @@ -126,8 +128,8 @@ edges | main.rs:149:9:149:11 | arr [element] | main.rs:150:10:150:12 | arr [element] | provenance | | | main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | | | main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | | -| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:17 | -| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:17 | +| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:19 | +| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:19 | | main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | | | main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | | | main.rs:159:9:159:9 | s | main.rs:160:14:160:14 | s | provenance | | @@ -140,8 +142,8 @@ edges | main.rs:160:13:160:18 | TupleExpr [tuple.0] | main.rs:160:9:160:9 | t [tuple.0] | provenance | | | main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | | | main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:14 | -| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:14 | +| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:16 | +| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:16 | | main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | | | main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | | | main.rs:172:13:172:22 | source(...) | main.rs:172:9:172:9 | s | provenance | | @@ -150,120 +152,148 @@ edges | main.rs:173:9:173:9 | t [tuple.1] | main.rs:175:10:175:10 | t [tuple.1] | provenance | | | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | | | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | | -| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:19 | -| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:19 | +| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:21 | +| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:21 | | main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | | | main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | | -| main.rs:184:9:184:9 | s | main.rs:189:11:189:11 | s | provenance | | -| main.rs:184:9:184:9 | s | main.rs:189:11:189:11 | s | provenance | | -| main.rs:184:13:184:22 | source(...) | main.rs:184:9:184:9 | s | provenance | | -| main.rs:184:13:184:22 | source(...) | main.rs:184:9:184:9 | s | provenance | | -| main.rs:185:14:185:14 | ... | main.rs:186:14:186:14 | n | provenance | | -| main.rs:185:14:185:14 | ... | main.rs:186:14:186:14 | n | provenance | | -| main.rs:189:11:189:11 | s | main.rs:185:14:185:14 | ... | provenance | MaD:8 | -| main.rs:189:11:189:11 | s | main.rs:185:14:185:14 | ... | provenance | MaD:8 | -| main.rs:193:13:193:22 | source(...) | main.rs:195:23:195:23 | f [captured s] | provenance | | -| main.rs:193:13:193:22 | source(...) | main.rs:195:23:195:23 | f [captured s] | provenance | | -| main.rs:194:40:194:40 | s | main.rs:194:17:194:42 | if ... {...} else {...} | provenance | | -| main.rs:194:40:194:40 | s | main.rs:194:17:194:42 | if ... {...} else {...} | provenance | | -| main.rs:195:9:195:9 | t | main.rs:196:10:196:10 | t | provenance | | -| main.rs:195:9:195:9 | t | main.rs:196:10:196:10 | t | provenance | | -| main.rs:195:13:195:24 | apply(...) | main.rs:195:9:195:9 | t | provenance | | -| main.rs:195:13:195:24 | apply(...) | main.rs:195:9:195:9 | t | provenance | | -| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | provenance | MaD:8 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | provenance | MaD:8 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | provenance | MaD:9 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | provenance | MaD:9 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:195:13:195:24 | apply(...) | provenance | MaD:8 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:195:13:195:24 | apply(...) | provenance | MaD:8 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:195:13:195:24 | apply(...) | provenance | MaD:9 | -| main.rs:195:23:195:23 | f [captured s] | main.rs:195:13:195:24 | apply(...) | provenance | MaD:9 | -| main.rs:200:9:200:9 | s | main.rs:202:19:202:19 | s | provenance | | -| main.rs:200:9:200:9 | s | main.rs:202:19:202:19 | s | provenance | | -| main.rs:200:13:200:22 | source(...) | main.rs:200:9:200:9 | s | provenance | | -| main.rs:200:13:200:22 | source(...) | main.rs:200:9:200:9 | s | provenance | | -| main.rs:201:14:201:14 | ... | main.rs:201:17:201:42 | if ... {...} else {...} | provenance | | -| main.rs:201:14:201:14 | ... | main.rs:201:17:201:42 | if ... {...} else {...} | provenance | | -| main.rs:202:9:202:9 | t | main.rs:203:10:203:10 | t | provenance | | -| main.rs:202:9:202:9 | t | main.rs:203:10:203:10 | t | provenance | | -| main.rs:202:13:202:23 | apply(...) | main.rs:202:9:202:9 | t | provenance | | -| main.rs:202:13:202:23 | apply(...) | main.rs:202:9:202:9 | t | provenance | | -| main.rs:202:19:202:19 | s | main.rs:201:14:201:14 | ... | provenance | MaD:8 | -| main.rs:202:19:202:19 | s | main.rs:201:14:201:14 | ... | provenance | MaD:8 | -| main.rs:202:19:202:19 | s | main.rs:202:13:202:23 | apply(...) | provenance | MaD:8 | -| main.rs:202:19:202:19 | s | main.rs:202:13:202:23 | apply(...) | provenance | MaD:8 | -| main.rs:212:9:212:9 | s | main.rs:213:30:213:30 | s | provenance | | -| main.rs:212:9:212:9 | s | main.rs:213:30:213:30 | s | provenance | | -| main.rs:212:13:212:22 | source(...) | main.rs:212:9:212:9 | s | provenance | | -| main.rs:212:13:212:22 | source(...) | main.rs:212:9:212:9 | s | provenance | | -| main.rs:213:9:213:9 | t | main.rs:214:10:214:10 | t | provenance | | -| main.rs:213:9:213:9 | t | main.rs:214:10:214:10 | t | provenance | | -| main.rs:213:13:213:31 | get_async_number(...) [future] | main.rs:213:13:213:37 | await ... | provenance | | -| main.rs:213:13:213:31 | get_async_number(...) [future] | main.rs:213:13:213:37 | await ... | provenance | | -| main.rs:213:13:213:37 | await ... | main.rs:213:9:213:9 | t | provenance | | -| main.rs:213:13:213:37 | await ... | main.rs:213:9:213:9 | t | provenance | | -| main.rs:213:30:213:30 | s | main.rs:213:13:213:31 | get_async_number(...) [future] | provenance | MaD:12 | -| main.rs:213:30:213:30 | s | main.rs:213:13:213:31 | get_async_number(...) [future] | provenance | MaD:12 | -| main.rs:233:9:233:9 | s [D] | main.rs:234:11:234:11 | s [D] | provenance | | -| main.rs:233:9:233:9 | s [D] | main.rs:234:11:234:11 | s [D] | provenance | | -| main.rs:233:13:233:23 | enum_source | main.rs:233:13:233:27 | enum_source(...) [D] | provenance | Src:MaD:6 | -| main.rs:233:13:233:23 | enum_source | main.rs:233:13:233:27 | enum_source(...) [D] | provenance | Src:MaD:6 | -| main.rs:233:13:233:27 | enum_source(...) [D] | main.rs:233:9:233:9 | s [D] | provenance | | -| main.rs:233:13:233:27 | enum_source(...) [D] | main.rs:233:9:233:9 | s [D] | provenance | | -| main.rs:234:11:234:11 | s [D] | main.rs:236:9:236:37 | ...::D {...} [D] | provenance | | -| main.rs:234:11:234:11 | s [D] | main.rs:236:9:236:37 | ...::D {...} [D] | provenance | | -| main.rs:236:9:236:37 | ...::D {...} [D] | main.rs:236:35:236:35 | i | provenance | | -| main.rs:236:9:236:37 | ...::D {...} [D] | main.rs:236:35:236:35 | i | provenance | | -| main.rs:236:35:236:35 | i | main.rs:236:47:236:47 | i | provenance | | -| main.rs:236:35:236:35 | i | main.rs:236:47:236:47 | i | provenance | | -| main.rs:242:9:242:9 | s [C] | main.rs:243:11:243:11 | s [C] | provenance | | -| main.rs:242:9:242:9 | s [C] | main.rs:243:11:243:11 | s [C] | provenance | | -| main.rs:242:13:242:24 | e.source(...) [C] | main.rs:242:9:242:9 | s [C] | provenance | | -| main.rs:242:13:242:24 | e.source(...) [C] | main.rs:242:9:242:9 | s [C] | provenance | | -| main.rs:242:15:242:20 | source | main.rs:242:13:242:24 | e.source(...) [C] | provenance | Src:MaD:4 | -| main.rs:242:15:242:20 | source | main.rs:242:13:242:24 | e.source(...) [C] | provenance | Src:MaD:4 | -| main.rs:243:11:243:11 | s [C] | main.rs:244:9:244:37 | ...::C {...} [C] | provenance | | -| main.rs:243:11:243:11 | s [C] | main.rs:244:9:244:37 | ...::C {...} [C] | provenance | | -| main.rs:244:9:244:37 | ...::C {...} [C] | main.rs:244:35:244:35 | i | provenance | | -| main.rs:244:9:244:37 | ...::C {...} [C] | main.rs:244:35:244:35 | i | provenance | | -| main.rs:244:35:244:35 | i | main.rs:244:47:244:47 | i | provenance | | -| main.rs:244:35:244:35 | i | main.rs:244:47:244:47 | i | provenance | | -| main.rs:253:9:253:9 | s | main.rs:254:41:254:41 | s | provenance | | -| main.rs:253:9:253:9 | s | main.rs:254:41:254:41 | s | provenance | | -| main.rs:253:13:253:22 | source(...) | main.rs:253:9:253:9 | s | provenance | | -| main.rs:253:13:253:22 | source(...) | main.rs:253:9:253:9 | s | provenance | | -| main.rs:254:15:254:43 | ...::C {...} [C] | main.rs:254:5:254:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:254:15:254:43 | ...::C {...} [C] | main.rs:254:5:254:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:254:41:254:41 | s | main.rs:254:15:254:43 | ...::C {...} [C] | provenance | | -| main.rs:254:41:254:41 | s | main.rs:254:15:254:43 | ...::C {...} [C] | provenance | | -| main.rs:259:9:259:9 | s | main.rs:260:39:260:39 | s | provenance | | -| main.rs:259:9:259:9 | s | main.rs:260:39:260:39 | s | provenance | | -| main.rs:259:13:259:22 | source(...) | main.rs:259:9:259:9 | s | provenance | | -| main.rs:259:13:259:22 | source(...) | main.rs:259:9:259:9 | s | provenance | | -| main.rs:260:9:260:9 | e [D] | main.rs:261:5:261:5 | e [D] | provenance | | -| main.rs:260:9:260:9 | e [D] | main.rs:261:5:261:5 | e [D] | provenance | | -| main.rs:260:13:260:41 | ...::D {...} [D] | main.rs:260:9:260:9 | e [D] | provenance | | -| main.rs:260:13:260:41 | ...::D {...} [D] | main.rs:260:9:260:9 | e [D] | provenance | | -| main.rs:260:39:260:39 | s | main.rs:260:13:260:41 | ...::D {...} [D] | provenance | | -| main.rs:260:39:260:39 | s | main.rs:260:13:260:41 | ...::D {...} [D] | provenance | | -| main.rs:261:5:261:5 | e [D] | main.rs:261:7:261:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:261:5:261:5 | e [D] | main.rs:261:7:261:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:270:9:270:9 | s | main.rs:271:10:271:10 | s | provenance | | -| main.rs:270:9:270:9 | s | main.rs:271:10:271:10 | s | provenance | | -| main.rs:270:13:270:25 | simple_source | main.rs:270:13:270:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | -| main.rs:270:13:270:25 | simple_source | main.rs:270:13:270:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | -| main.rs:270:13:270:29 | simple_source(...) | main.rs:270:9:270:9 | s | provenance | | -| main.rs:270:13:270:29 | simple_source(...) | main.rs:270:9:270:9 | s | provenance | | -| main.rs:278:9:278:9 | s | main.rs:279:17:279:17 | s | provenance | | -| main.rs:278:9:278:9 | s | main.rs:279:17:279:17 | s | provenance | | -| main.rs:278:13:278:22 | source(...) | main.rs:278:9:278:9 | s | provenance | | -| main.rs:278:13:278:22 | source(...) | main.rs:278:9:278:9 | s | provenance | | -| main.rs:279:17:279:17 | s | main.rs:279:5:279:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:279:17:279:17 | s | main.rs:279:5:279:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:287:5:287:14 | arg_source | main.rs:287:16:287:16 | [post] i | provenance | Src:MaD:5 MaD:5 | -| main.rs:287:5:287:14 | arg_source | main.rs:287:16:287:16 | [post] i | provenance | Src:MaD:5 MaD:5 | -| main.rs:287:16:287:16 | [post] i | main.rs:288:10:288:10 | i | provenance | | -| main.rs:287:16:287:16 | [post] i | main.rs:288:10:288:10 | i | provenance | | +| main.rs:187:9:187:9 | s | main.rs:192:11:192:11 | s | provenance | | +| main.rs:187:9:187:9 | s | main.rs:192:11:192:11 | s | provenance | | +| main.rs:187:13:187:22 | source(...) | main.rs:187:9:187:9 | s | provenance | | +| main.rs:187:13:187:22 | source(...) | main.rs:187:9:187:9 | s | provenance | | +| main.rs:188:14:188:14 | ... | main.rs:189:14:189:14 | n | provenance | | +| main.rs:188:14:188:14 | ... | main.rs:189:14:189:14 | n | provenance | | +| main.rs:192:11:192:11 | s | main.rs:188:14:188:14 | ... | provenance | MaD:10 | +| main.rs:192:11:192:11 | s | main.rs:188:14:188:14 | ... | provenance | MaD:10 | +| main.rs:196:13:196:22 | source(...) | main.rs:198:23:198:23 | f [captured s] | provenance | | +| main.rs:196:13:196:22 | source(...) | main.rs:198:23:198:23 | f [captured s] | provenance | | +| main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | provenance | | +| main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | provenance | | +| main.rs:198:9:198:9 | t | main.rs:199:10:199:10 | t | provenance | | +| main.rs:198:9:198:9 | t | main.rs:199:10:199:10 | t | provenance | | +| main.rs:198:13:198:24 | apply(...) | main.rs:198:9:198:9 | t | provenance | | +| main.rs:198:13:198:24 | apply(...) | main.rs:198:9:198:9 | t | provenance | | +| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:10 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:10 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:11 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | provenance | MaD:11 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:10 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:10 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:11 | +| main.rs:198:23:198:23 | f [captured s] | main.rs:198:13:198:24 | apply(...) | provenance | MaD:11 | +| main.rs:203:9:203:9 | s | main.rs:205:19:205:19 | s | provenance | | +| main.rs:203:9:203:9 | s | main.rs:205:19:205:19 | s | provenance | | +| main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | +| main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | +| main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | provenance | | +| main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | provenance | | +| main.rs:205:9:205:9 | t | main.rs:206:10:206:10 | t | provenance | | +| main.rs:205:9:205:9 | t | main.rs:206:10:206:10 | t | provenance | | +| main.rs:205:13:205:23 | apply(...) | main.rs:205:9:205:9 | t | provenance | | +| main.rs:205:13:205:23 | apply(...) | main.rs:205:9:205:9 | t | provenance | | +| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | provenance | MaD:10 | +| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | provenance | MaD:10 | +| main.rs:205:19:205:19 | s | main.rs:205:13:205:23 | apply(...) | provenance | MaD:10 | +| main.rs:205:19:205:19 | s | main.rs:205:13:205:23 | apply(...) | provenance | MaD:10 | +| main.rs:215:9:215:9 | s | main.rs:216:30:216:30 | s | provenance | | +| main.rs:215:9:215:9 | s | main.rs:216:30:216:30 | s | provenance | | +| main.rs:215:13:215:22 | source(...) | main.rs:215:9:215:9 | s | provenance | | +| main.rs:215:13:215:22 | source(...) | main.rs:215:9:215:9 | s | provenance | | +| main.rs:216:9:216:9 | t | main.rs:217:10:217:10 | t | provenance | | +| main.rs:216:9:216:9 | t | main.rs:217:10:217:10 | t | provenance | | +| main.rs:216:13:216:31 | get_async_number(...) [future] | main.rs:216:13:216:37 | await ... | provenance | | +| main.rs:216:13:216:31 | get_async_number(...) [future] | main.rs:216:13:216:37 | await ... | provenance | | +| main.rs:216:13:216:37 | await ... | main.rs:216:9:216:9 | t | provenance | | +| main.rs:216:13:216:37 | await ... | main.rs:216:9:216:9 | t | provenance | | +| main.rs:216:30:216:30 | s | main.rs:216:13:216:31 | get_async_number(...) [future] | provenance | MaD:14 | +| main.rs:216:30:216:30 | s | main.rs:216:13:216:31 | get_async_number(...) [future] | provenance | MaD:14 | +| main.rs:236:9:236:9 | s [D] | main.rs:237:11:237:11 | s [D] | provenance | | +| main.rs:236:9:236:9 | s [D] | main.rs:237:11:237:11 | s [D] | provenance | | +| main.rs:236:13:236:23 | enum_source | main.rs:236:13:236:27 | enum_source(...) [D] | provenance | Src:MaD:6 | +| main.rs:236:13:236:23 | enum_source | main.rs:236:13:236:27 | enum_source(...) [D] | provenance | Src:MaD:6 | +| main.rs:236:13:236:27 | enum_source(...) [D] | main.rs:236:9:236:9 | s [D] | provenance | | +| main.rs:236:13:236:27 | enum_source(...) [D] | main.rs:236:9:236:9 | s [D] | provenance | | +| main.rs:237:11:237:11 | s [D] | main.rs:239:9:239:37 | ...::D {...} [D] | provenance | | +| main.rs:237:11:237:11 | s [D] | main.rs:239:9:239:37 | ...::D {...} [D] | provenance | | +| main.rs:239:9:239:37 | ...::D {...} [D] | main.rs:239:35:239:35 | i | provenance | | +| main.rs:239:9:239:37 | ...::D {...} [D] | main.rs:239:35:239:35 | i | provenance | | +| main.rs:239:35:239:35 | i | main.rs:239:47:239:47 | i | provenance | | +| main.rs:239:35:239:35 | i | main.rs:239:47:239:47 | i | provenance | | +| main.rs:245:9:245:9 | s [C] | main.rs:246:11:246:11 | s [C] | provenance | | +| main.rs:245:9:245:9 | s [C] | main.rs:246:11:246:11 | s [C] | provenance | | +| main.rs:245:13:245:24 | e.source(...) [C] | main.rs:245:9:245:9 | s [C] | provenance | | +| main.rs:245:13:245:24 | e.source(...) [C] | main.rs:245:9:245:9 | s [C] | provenance | | +| main.rs:245:15:245:20 | source | main.rs:245:13:245:24 | e.source(...) [C] | provenance | Src:MaD:4 | +| main.rs:245:15:245:20 | source | main.rs:245:13:245:24 | e.source(...) [C] | provenance | Src:MaD:4 | +| main.rs:246:11:246:11 | s [C] | main.rs:247:9:247:37 | ...::C {...} [C] | provenance | | +| main.rs:246:11:246:11 | s [C] | main.rs:247:9:247:37 | ...::C {...} [C] | provenance | | +| main.rs:247:9:247:37 | ...::C {...} [C] | main.rs:247:35:247:35 | i | provenance | | +| main.rs:247:9:247:37 | ...::C {...} [C] | main.rs:247:35:247:35 | i | provenance | | +| main.rs:247:35:247:35 | i | main.rs:247:47:247:47 | i | provenance | | +| main.rs:247:35:247:35 | i | main.rs:247:47:247:47 | i | provenance | | +| main.rs:256:9:256:9 | s | main.rs:257:41:257:41 | s | provenance | | +| main.rs:256:9:256:9 | s | main.rs:257:41:257:41 | s | provenance | | +| main.rs:256:13:256:22 | source(...) | main.rs:256:9:256:9 | s | provenance | | +| main.rs:256:13:256:22 | source(...) | main.rs:256:9:256:9 | s | provenance | | +| main.rs:257:15:257:43 | ...::C {...} [C] | main.rs:257:5:257:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:257:15:257:43 | ...::C {...} [C] | main.rs:257:5:257:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:257:41:257:41 | s | main.rs:257:15:257:43 | ...::C {...} [C] | provenance | | +| main.rs:257:41:257:41 | s | main.rs:257:15:257:43 | ...::C {...} [C] | provenance | | +| main.rs:262:9:262:9 | s | main.rs:263:39:263:39 | s | provenance | | +| main.rs:262:9:262:9 | s | main.rs:263:39:263:39 | s | provenance | | +| main.rs:262:13:262:22 | source(...) | main.rs:262:9:262:9 | s | provenance | | +| main.rs:262:13:262:22 | source(...) | main.rs:262:9:262:9 | s | provenance | | +| main.rs:263:9:263:9 | e [D] | main.rs:264:5:264:5 | e [D] | provenance | | +| main.rs:263:9:263:9 | e [D] | main.rs:264:5:264:5 | e [D] | provenance | | +| main.rs:263:13:263:41 | ...::D {...} [D] | main.rs:263:9:263:9 | e [D] | provenance | | +| main.rs:263:13:263:41 | ...::D {...} [D] | main.rs:263:9:263:9 | e [D] | provenance | | +| main.rs:263:39:263:39 | s | main.rs:263:13:263:41 | ...::D {...} [D] | provenance | | +| main.rs:263:39:263:39 | s | main.rs:263:13:263:41 | ...::D {...} [D] | provenance | | +| main.rs:264:5:264:5 | e [D] | main.rs:264:7:264:10 | sink | provenance | MaD:1 Sink:MaD:1 | +| main.rs:264:5:264:5 | e [D] | main.rs:264:7:264:10 | sink | provenance | MaD:1 Sink:MaD:1 | +| main.rs:273:9:273:9 | s | main.rs:274:10:274:10 | s | provenance | | +| main.rs:273:9:273:9 | s | main.rs:274:10:274:10 | s | provenance | | +| main.rs:273:13:273:25 | simple_source | main.rs:273:13:273:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | +| main.rs:273:13:273:25 | simple_source | main.rs:273:13:273:29 | simple_source(...) | provenance | Src:MaD:7 MaD:7 | +| main.rs:273:13:273:29 | simple_source(...) | main.rs:273:9:273:9 | s | provenance | | +| main.rs:273:13:273:29 | simple_source(...) | main.rs:273:9:273:9 | s | provenance | | +| main.rs:281:9:281:9 | s | main.rs:282:17:282:17 | s | provenance | | +| main.rs:281:9:281:9 | s | main.rs:282:17:282:17 | s | provenance | | +| main.rs:281:13:281:22 | source(...) | main.rs:281:9:281:9 | s | provenance | | +| main.rs:281:13:281:22 | source(...) | main.rs:281:9:281:9 | s | provenance | | +| main.rs:282:17:282:17 | s | main.rs:282:5:282:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | +| main.rs:282:17:282:17 | s | main.rs:282:5:282:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 | +| main.rs:290:5:290:14 | arg_source | main.rs:290:16:290:16 | [post] i | provenance | Src:MaD:5 MaD:5 | +| main.rs:290:5:290:14 | arg_source | main.rs:290:16:290:16 | [post] i | provenance | Src:MaD:5 MaD:5 | +| main.rs:290:16:290:16 | [post] i | main.rs:291:10:291:10 | i | provenance | | +| main.rs:290:16:290:16 | [post] i | main.rs:291:10:291:10 | i | provenance | | +| main.rs:343:9:343:10 | x1 | main.rs:344:10:344:11 | x1 | provenance | | +| main.rs:343:9:343:10 | x1 | main.rs:344:10:344:11 | x1 | provenance | | +| main.rs:343:14:343:23 | source(...) | main.rs:343:14:343:30 | ... .max(...) | provenance | MaD:8 | +| main.rs:343:14:343:23 | source(...) | main.rs:343:14:343:30 | ... .max(...) | provenance | MaD:8 | +| main.rs:343:14:343:30 | ... .max(...) | main.rs:343:9:343:10 | x1 | provenance | | +| main.rs:343:14:343:30 | ... .max(...) | main.rs:343:9:343:10 | x1 | provenance | | +| main.rs:346:9:346:10 | x2 [MyStruct.field1] | main.rs:354:10:354:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:346:9:346:10 | x2 [MyStruct.field1] | main.rs:354:10:354:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:346:14:353:6 | ... .max(...) [MyStruct.field1] | main.rs:346:9:346:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:346:14:353:6 | ... .max(...) [MyStruct.field1] | main.rs:346:9:346:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:346:15:349:5 | MyStruct {...} [MyStruct.field1] | main.rs:346:14:353:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:8 | +| main.rs:346:15:349:5 | MyStruct {...} [MyStruct.field1] | main.rs:346:14:353:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:8 | +| main.rs:347:17:347:26 | source(...) | main.rs:346:15:349:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:347:17:347:26 | source(...) | main.rs:346:15:349:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:354:10:354:11 | x2 [MyStruct.field1] | main.rs:354:10:354:18 | x2.field1 | provenance | | +| main.rs:354:10:354:11 | x2 [MyStruct.field1] | main.rs:354:10:354:18 | x2.field1 | provenance | | +| main.rs:359:9:359:10 | x4 | main.rs:360:10:360:11 | x4 | provenance | | +| main.rs:359:9:359:10 | x4 | main.rs:360:10:360:11 | x4 | provenance | | +| main.rs:359:14:359:23 | source(...) | main.rs:359:14:359:30 | ... .max(...) | provenance | MaD:8 | +| main.rs:359:14:359:23 | source(...) | main.rs:359:14:359:30 | ... .max(...) | provenance | MaD:8 | +| main.rs:359:14:359:30 | ... .max(...) | main.rs:359:9:359:10 | x4 | provenance | | +| main.rs:359:14:359:30 | ... .max(...) | main.rs:359:9:359:10 | x4 | provenance | | +| main.rs:362:9:362:10 | x5 | main.rs:363:10:363:11 | x5 | provenance | | +| main.rs:362:14:362:23 | source(...) | main.rs:362:14:362:30 | ... .lt(...) | provenance | MaD:9 | +| main.rs:362:14:362:30 | ... .lt(...) | main.rs:362:9:362:10 | x5 | provenance | | +| main.rs:365:9:365:10 | x6 | main.rs:366:10:366:11 | x6 | provenance | | +| main.rs:365:14:365:23 | source(...) | main.rs:365:14:365:27 | ... < ... | provenance | MaD:9 | +| main.rs:365:14:365:27 | ... < ... | main.rs:365:9:365:10 | x6 | provenance | | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -421,139 +451,175 @@ nodes | main.rs:175:10:175:10 | t [tuple.1] | semmle.label | t [tuple.1] | | main.rs:175:10:175:12 | t.1 | semmle.label | t.1 | | main.rs:175:10:175:12 | t.1 | semmle.label | t.1 | -| main.rs:184:9:184:9 | s | semmle.label | s | -| main.rs:184:9:184:9 | s | semmle.label | s | -| main.rs:184:13:184:22 | source(...) | semmle.label | source(...) | -| main.rs:184:13:184:22 | source(...) | semmle.label | source(...) | -| main.rs:185:14:185:14 | ... | semmle.label | ... | -| main.rs:185:14:185:14 | ... | semmle.label | ... | -| main.rs:186:14:186:14 | n | semmle.label | n | -| main.rs:186:14:186:14 | n | semmle.label | n | -| main.rs:189:11:189:11 | s | semmle.label | s | -| main.rs:189:11:189:11 | s | semmle.label | s | -| main.rs:193:13:193:22 | source(...) | semmle.label | source(...) | -| main.rs:193:13:193:22 | source(...) | semmle.label | source(...) | -| main.rs:194:17:194:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:194:17:194:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:194:40:194:40 | s | semmle.label | s | -| main.rs:194:40:194:40 | s | semmle.label | s | -| main.rs:195:9:195:9 | t | semmle.label | t | -| main.rs:195:9:195:9 | t | semmle.label | t | -| main.rs:195:13:195:24 | apply(...) | semmle.label | apply(...) | -| main.rs:195:13:195:24 | apply(...) | semmle.label | apply(...) | -| main.rs:195:23:195:23 | f [captured s] | semmle.label | f [captured s] | -| main.rs:195:23:195:23 | f [captured s] | semmle.label | f [captured s] | -| main.rs:196:10:196:10 | t | semmle.label | t | -| main.rs:196:10:196:10 | t | semmle.label | t | -| main.rs:200:9:200:9 | s | semmle.label | s | -| main.rs:200:9:200:9 | s | semmle.label | s | -| main.rs:200:13:200:22 | source(...) | semmle.label | source(...) | -| main.rs:200:13:200:22 | source(...) | semmle.label | source(...) | -| main.rs:201:14:201:14 | ... | semmle.label | ... | -| main.rs:201:14:201:14 | ... | semmle.label | ... | -| main.rs:201:17:201:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:201:17:201:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:202:9:202:9 | t | semmle.label | t | -| main.rs:202:9:202:9 | t | semmle.label | t | -| main.rs:202:13:202:23 | apply(...) | semmle.label | apply(...) | -| main.rs:202:13:202:23 | apply(...) | semmle.label | apply(...) | -| main.rs:202:19:202:19 | s | semmle.label | s | -| main.rs:202:19:202:19 | s | semmle.label | s | -| main.rs:203:10:203:10 | t | semmle.label | t | -| main.rs:203:10:203:10 | t | semmle.label | t | -| main.rs:212:9:212:9 | s | semmle.label | s | -| main.rs:212:9:212:9 | s | semmle.label | s | -| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) | -| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) | -| main.rs:213:9:213:9 | t | semmle.label | t | -| main.rs:213:9:213:9 | t | semmle.label | t | -| main.rs:213:13:213:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | -| main.rs:213:13:213:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | -| main.rs:213:13:213:37 | await ... | semmle.label | await ... | -| main.rs:213:13:213:37 | await ... | semmle.label | await ... | -| main.rs:213:30:213:30 | s | semmle.label | s | -| main.rs:213:30:213:30 | s | semmle.label | s | -| main.rs:214:10:214:10 | t | semmle.label | t | -| main.rs:214:10:214:10 | t | semmle.label | t | -| main.rs:233:9:233:9 | s [D] | semmle.label | s [D] | -| main.rs:233:9:233:9 | s [D] | semmle.label | s [D] | -| main.rs:233:13:233:23 | enum_source | semmle.label | enum_source | -| main.rs:233:13:233:23 | enum_source | semmle.label | enum_source | -| main.rs:233:13:233:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:233:13:233:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:234:11:234:11 | s [D] | semmle.label | s [D] | -| main.rs:234:11:234:11 | s [D] | semmle.label | s [D] | -| main.rs:236:9:236:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:236:9:236:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:236:35:236:35 | i | semmle.label | i | -| main.rs:236:35:236:35 | i | semmle.label | i | -| main.rs:236:47:236:47 | i | semmle.label | i | -| main.rs:236:47:236:47 | i | semmle.label | i | -| main.rs:242:9:242:9 | s [C] | semmle.label | s [C] | -| main.rs:242:9:242:9 | s [C] | semmle.label | s [C] | -| main.rs:242:13:242:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:242:13:242:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:242:15:242:20 | source | semmle.label | source | -| main.rs:242:15:242:20 | source | semmle.label | source | -| main.rs:243:11:243:11 | s [C] | semmle.label | s [C] | -| main.rs:243:11:243:11 | s [C] | semmle.label | s [C] | -| main.rs:244:9:244:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:244:9:244:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:244:35:244:35 | i | semmle.label | i | -| main.rs:244:35:244:35 | i | semmle.label | i | -| main.rs:244:47:244:47 | i | semmle.label | i | -| main.rs:244:47:244:47 | i | semmle.label | i | -| main.rs:253:9:253:9 | s | semmle.label | s | -| main.rs:253:9:253:9 | s | semmle.label | s | -| main.rs:253:13:253:22 | source(...) | semmle.label | source(...) | -| main.rs:253:13:253:22 | source(...) | semmle.label | source(...) | -| main.rs:254:5:254:13 | enum_sink | semmle.label | enum_sink | -| main.rs:254:5:254:13 | enum_sink | semmle.label | enum_sink | -| main.rs:254:15:254:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:254:15:254:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:254:41:254:41 | s | semmle.label | s | -| main.rs:254:41:254:41 | s | semmle.label | s | -| main.rs:259:9:259:9 | s | semmle.label | s | -| main.rs:259:9:259:9 | s | semmle.label | s | -| main.rs:259:13:259:22 | source(...) | semmle.label | source(...) | -| main.rs:259:13:259:22 | source(...) | semmle.label | source(...) | -| main.rs:260:9:260:9 | e [D] | semmle.label | e [D] | -| main.rs:260:9:260:9 | e [D] | semmle.label | e [D] | -| main.rs:260:13:260:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:260:13:260:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:260:39:260:39 | s | semmle.label | s | -| main.rs:260:39:260:39 | s | semmle.label | s | -| main.rs:261:5:261:5 | e [D] | semmle.label | e [D] | -| main.rs:261:5:261:5 | e [D] | semmle.label | e [D] | -| main.rs:261:7:261:10 | sink | semmle.label | sink | -| main.rs:261:7:261:10 | sink | semmle.label | sink | -| main.rs:270:9:270:9 | s | semmle.label | s | -| main.rs:270:9:270:9 | s | semmle.label | s | -| main.rs:270:13:270:25 | simple_source | semmle.label | simple_source | -| main.rs:270:13:270:25 | simple_source | semmle.label | simple_source | -| main.rs:270:13:270:29 | simple_source(...) | semmle.label | simple_source(...) | -| main.rs:270:13:270:29 | simple_source(...) | semmle.label | simple_source(...) | -| main.rs:271:10:271:10 | s | semmle.label | s | -| main.rs:271:10:271:10 | s | semmle.label | s | -| main.rs:278:9:278:9 | s | semmle.label | s | -| main.rs:278:9:278:9 | s | semmle.label | s | -| main.rs:278:13:278:22 | source(...) | semmle.label | source(...) | -| main.rs:278:13:278:22 | source(...) | semmle.label | source(...) | -| main.rs:279:5:279:15 | simple_sink | semmle.label | simple_sink | -| main.rs:279:5:279:15 | simple_sink | semmle.label | simple_sink | -| main.rs:279:17:279:17 | s | semmle.label | s | -| main.rs:279:17:279:17 | s | semmle.label | s | -| main.rs:287:5:287:14 | arg_source | semmle.label | arg_source | -| main.rs:287:5:287:14 | arg_source | semmle.label | arg_source | -| main.rs:287:16:287:16 | [post] i | semmle.label | [post] i | -| main.rs:287:16:287:16 | [post] i | semmle.label | [post] i | -| main.rs:288:10:288:10 | i | semmle.label | i | -| main.rs:288:10:288:10 | i | semmle.label | i | +| main.rs:187:9:187:9 | s | semmle.label | s | +| main.rs:187:9:187:9 | s | semmle.label | s | +| main.rs:187:13:187:22 | source(...) | semmle.label | source(...) | +| main.rs:187:13:187:22 | source(...) | semmle.label | source(...) | +| main.rs:188:14:188:14 | ... | semmle.label | ... | +| main.rs:188:14:188:14 | ... | semmle.label | ... | +| main.rs:189:14:189:14 | n | semmle.label | n | +| main.rs:189:14:189:14 | n | semmle.label | n | +| main.rs:192:11:192:11 | s | semmle.label | s | +| main.rs:192:11:192:11 | s | semmle.label | s | +| main.rs:196:13:196:22 | source(...) | semmle.label | source(...) | +| main.rs:196:13:196:22 | source(...) | semmle.label | source(...) | +| main.rs:197:17:197:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:197:17:197:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:197:40:197:40 | s | semmle.label | s | +| main.rs:197:40:197:40 | s | semmle.label | s | +| main.rs:198:9:198:9 | t | semmle.label | t | +| main.rs:198:9:198:9 | t | semmle.label | t | +| main.rs:198:13:198:24 | apply(...) | semmle.label | apply(...) | +| main.rs:198:13:198:24 | apply(...) | semmle.label | apply(...) | +| main.rs:198:23:198:23 | f [captured s] | semmle.label | f [captured s] | +| main.rs:198:23:198:23 | f [captured s] | semmle.label | f [captured s] | +| main.rs:199:10:199:10 | t | semmle.label | t | +| main.rs:199:10:199:10 | t | semmle.label | t | +| main.rs:203:9:203:9 | s | semmle.label | s | +| main.rs:203:9:203:9 | s | semmle.label | s | +| main.rs:203:13:203:22 | source(...) | semmle.label | source(...) | +| main.rs:203:13:203:22 | source(...) | semmle.label | source(...) | +| main.rs:204:14:204:14 | ... | semmle.label | ... | +| main.rs:204:14:204:14 | ... | semmle.label | ... | +| main.rs:204:17:204:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:204:17:204:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:205:9:205:9 | t | semmle.label | t | +| main.rs:205:9:205:9 | t | semmle.label | t | +| main.rs:205:13:205:23 | apply(...) | semmle.label | apply(...) | +| main.rs:205:13:205:23 | apply(...) | semmle.label | apply(...) | +| main.rs:205:19:205:19 | s | semmle.label | s | +| main.rs:205:19:205:19 | s | semmle.label | s | +| main.rs:206:10:206:10 | t | semmle.label | t | +| main.rs:206:10:206:10 | t | semmle.label | t | +| main.rs:215:9:215:9 | s | semmle.label | s | +| main.rs:215:9:215:9 | s | semmle.label | s | +| main.rs:215:13:215:22 | source(...) | semmle.label | source(...) | +| main.rs:215:13:215:22 | source(...) | semmle.label | source(...) | +| main.rs:216:9:216:9 | t | semmle.label | t | +| main.rs:216:9:216:9 | t | semmle.label | t | +| main.rs:216:13:216:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | +| main.rs:216:13:216:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | +| main.rs:216:13:216:37 | await ... | semmle.label | await ... | +| main.rs:216:13:216:37 | await ... | semmle.label | await ... | +| main.rs:216:30:216:30 | s | semmle.label | s | +| main.rs:216:30:216:30 | s | semmle.label | s | +| main.rs:217:10:217:10 | t | semmle.label | t | +| main.rs:217:10:217:10 | t | semmle.label | t | +| main.rs:236:9:236:9 | s [D] | semmle.label | s [D] | +| main.rs:236:9:236:9 | s [D] | semmle.label | s [D] | +| main.rs:236:13:236:23 | enum_source | semmle.label | enum_source | +| main.rs:236:13:236:23 | enum_source | semmle.label | enum_source | +| main.rs:236:13:236:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:236:13:236:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:237:11:237:11 | s [D] | semmle.label | s [D] | +| main.rs:237:11:237:11 | s [D] | semmle.label | s [D] | +| main.rs:239:9:239:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:239:9:239:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:239:35:239:35 | i | semmle.label | i | +| main.rs:239:35:239:35 | i | semmle.label | i | +| main.rs:239:47:239:47 | i | semmle.label | i | +| main.rs:239:47:239:47 | i | semmle.label | i | +| main.rs:245:9:245:9 | s [C] | semmle.label | s [C] | +| main.rs:245:9:245:9 | s [C] | semmle.label | s [C] | +| main.rs:245:13:245:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | +| main.rs:245:13:245:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | +| main.rs:245:15:245:20 | source | semmle.label | source | +| main.rs:245:15:245:20 | source | semmle.label | source | +| main.rs:246:11:246:11 | s [C] | semmle.label | s [C] | +| main.rs:246:11:246:11 | s [C] | semmle.label | s [C] | +| main.rs:247:9:247:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:247:9:247:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:247:35:247:35 | i | semmle.label | i | +| main.rs:247:35:247:35 | i | semmle.label | i | +| main.rs:247:47:247:47 | i | semmle.label | i | +| main.rs:247:47:247:47 | i | semmle.label | i | +| main.rs:256:9:256:9 | s | semmle.label | s | +| main.rs:256:9:256:9 | s | semmle.label | s | +| main.rs:256:13:256:22 | source(...) | semmle.label | source(...) | +| main.rs:256:13:256:22 | source(...) | semmle.label | source(...) | +| main.rs:257:5:257:13 | enum_sink | semmle.label | enum_sink | +| main.rs:257:5:257:13 | enum_sink | semmle.label | enum_sink | +| main.rs:257:15:257:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:257:15:257:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:257:41:257:41 | s | semmle.label | s | +| main.rs:257:41:257:41 | s | semmle.label | s | +| main.rs:262:9:262:9 | s | semmle.label | s | +| main.rs:262:9:262:9 | s | semmle.label | s | +| main.rs:262:13:262:22 | source(...) | semmle.label | source(...) | +| main.rs:262:13:262:22 | source(...) | semmle.label | source(...) | +| main.rs:263:9:263:9 | e [D] | semmle.label | e [D] | +| main.rs:263:9:263:9 | e [D] | semmle.label | e [D] | +| main.rs:263:13:263:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:263:13:263:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:263:39:263:39 | s | semmle.label | s | +| main.rs:263:39:263:39 | s | semmle.label | s | +| main.rs:264:5:264:5 | e [D] | semmle.label | e [D] | +| main.rs:264:5:264:5 | e [D] | semmle.label | e [D] | +| main.rs:264:7:264:10 | sink | semmle.label | sink | +| main.rs:264:7:264:10 | sink | semmle.label | sink | +| main.rs:273:9:273:9 | s | semmle.label | s | +| main.rs:273:9:273:9 | s | semmle.label | s | +| main.rs:273:13:273:25 | simple_source | semmle.label | simple_source | +| main.rs:273:13:273:25 | simple_source | semmle.label | simple_source | +| main.rs:273:13:273:29 | simple_source(...) | semmle.label | simple_source(...) | +| main.rs:273:13:273:29 | simple_source(...) | semmle.label | simple_source(...) | +| main.rs:274:10:274:10 | s | semmle.label | s | +| main.rs:274:10:274:10 | s | semmle.label | s | +| main.rs:281:9:281:9 | s | semmle.label | s | +| main.rs:281:9:281:9 | s | semmle.label | s | +| main.rs:281:13:281:22 | source(...) | semmle.label | source(...) | +| main.rs:281:13:281:22 | source(...) | semmle.label | source(...) | +| main.rs:282:5:282:15 | simple_sink | semmle.label | simple_sink | +| main.rs:282:5:282:15 | simple_sink | semmle.label | simple_sink | +| main.rs:282:17:282:17 | s | semmle.label | s | +| main.rs:282:17:282:17 | s | semmle.label | s | +| main.rs:290:5:290:14 | arg_source | semmle.label | arg_source | +| main.rs:290:5:290:14 | arg_source | semmle.label | arg_source | +| main.rs:290:16:290:16 | [post] i | semmle.label | [post] i | +| main.rs:290:16:290:16 | [post] i | semmle.label | [post] i | +| main.rs:291:10:291:10 | i | semmle.label | i | +| main.rs:291:10:291:10 | i | semmle.label | i | +| main.rs:343:9:343:10 | x1 | semmle.label | x1 | +| main.rs:343:9:343:10 | x1 | semmle.label | x1 | +| main.rs:343:14:343:23 | source(...) | semmle.label | source(...) | +| main.rs:343:14:343:23 | source(...) | semmle.label | source(...) | +| main.rs:343:14:343:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:343:14:343:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:344:10:344:11 | x1 | semmle.label | x1 | +| main.rs:344:10:344:11 | x1 | semmle.label | x1 | +| main.rs:346:9:346:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:346:9:346:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:346:14:353:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:346:14:353:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:346:15:349:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:346:15:349:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:347:17:347:26 | source(...) | semmle.label | source(...) | +| main.rs:347:17:347:26 | source(...) | semmle.label | source(...) | +| main.rs:354:10:354:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:354:10:354:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:354:10:354:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:354:10:354:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:359:9:359:10 | x4 | semmle.label | x4 | +| main.rs:359:9:359:10 | x4 | semmle.label | x4 | +| main.rs:359:14:359:23 | source(...) | semmle.label | source(...) | +| main.rs:359:14:359:23 | source(...) | semmle.label | source(...) | +| main.rs:359:14:359:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:359:14:359:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:360:10:360:11 | x4 | semmle.label | x4 | +| main.rs:360:10:360:11 | x4 | semmle.label | x4 | +| main.rs:362:9:362:10 | x5 | semmle.label | x5 | +| main.rs:362:14:362:23 | source(...) | semmle.label | source(...) | +| main.rs:362:14:362:30 | ... .lt(...) | semmle.label | ... .lt(...) | +| main.rs:363:10:363:11 | x5 | semmle.label | x5 | +| main.rs:365:9:365:10 | x6 | semmle.label | x6 | +| main.rs:365:14:365:23 | source(...) | semmle.label | source(...) | +| main.rs:365:14:365:27 | ... < ... | semmle.label | ... < ... | +| main.rs:366:10:366:11 | x6 | semmle.label | x6 | subpaths -| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | main.rs:194:17:194:42 | if ... {...} else {...} | main.rs:195:13:195:24 | apply(...) | -| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | main.rs:194:17:194:42 | if ... {...} else {...} | main.rs:195:13:195:24 | apply(...) | -| main.rs:202:19:202:19 | s | main.rs:201:14:201:14 | ... | main.rs:201:17:201:42 | if ... {...} else {...} | main.rs:202:13:202:23 | apply(...) | -| main.rs:202:19:202:19 | s | main.rs:201:14:201:14 | ... | main.rs:201:17:201:42 | if ... {...} else {...} | main.rs:202:13:202:23 | apply(...) | +| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | main.rs:198:13:198:24 | apply(...) | +| main.rs:198:23:198:23 | f [captured s] | main.rs:197:40:197:40 | s | main.rs:197:17:197:42 | if ... {...} else {...} | main.rs:198:13:198:24 | apply(...) | +| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | main.rs:205:13:205:23 | apply(...) | +| main.rs:205:19:205:19 | s | main.rs:204:14:204:14 | ... | main.rs:204:17:204:42 | if ... {...} else {...} | main.rs:205:13:205:23 | apply(...) | testFailures invalidSpecComponent #select @@ -580,25 +646,33 @@ invalidSpecComponent | main.rs:161:10:161:29 | get_tuple_element(...) | main.rs:159:13:159:22 | source(...) | main.rs:161:10:161:29 | get_tuple_element(...) | $@ | main.rs:159:13:159:22 | source(...) | source(...) | | main.rs:175:10:175:12 | t.1 | main.rs:172:13:172:22 | source(...) | main.rs:175:10:175:12 | t.1 | $@ | main.rs:172:13:172:22 | source(...) | source(...) | | main.rs:175:10:175:12 | t.1 | main.rs:172:13:172:22 | source(...) | main.rs:175:10:175:12 | t.1 | $@ | main.rs:172:13:172:22 | source(...) | source(...) | -| main.rs:186:14:186:14 | n | main.rs:184:13:184:22 | source(...) | main.rs:186:14:186:14 | n | $@ | main.rs:184:13:184:22 | source(...) | source(...) | -| main.rs:186:14:186:14 | n | main.rs:184:13:184:22 | source(...) | main.rs:186:14:186:14 | n | $@ | main.rs:184:13:184:22 | source(...) | source(...) | -| main.rs:196:10:196:10 | t | main.rs:193:13:193:22 | source(...) | main.rs:196:10:196:10 | t | $@ | main.rs:193:13:193:22 | source(...) | source(...) | -| main.rs:196:10:196:10 | t | main.rs:193:13:193:22 | source(...) | main.rs:196:10:196:10 | t | $@ | main.rs:193:13:193:22 | source(...) | source(...) | -| main.rs:203:10:203:10 | t | main.rs:200:13:200:22 | source(...) | main.rs:203:10:203:10 | t | $@ | main.rs:200:13:200:22 | source(...) | source(...) | -| main.rs:203:10:203:10 | t | main.rs:200:13:200:22 | source(...) | main.rs:203:10:203:10 | t | $@ | main.rs:200:13:200:22 | source(...) | source(...) | -| main.rs:214:10:214:10 | t | main.rs:212:13:212:22 | source(...) | main.rs:214:10:214:10 | t | $@ | main.rs:212:13:212:22 | source(...) | source(...) | -| main.rs:214:10:214:10 | t | main.rs:212:13:212:22 | source(...) | main.rs:214:10:214:10 | t | $@ | main.rs:212:13:212:22 | source(...) | source(...) | -| main.rs:236:47:236:47 | i | main.rs:233:13:233:23 | enum_source | main.rs:236:47:236:47 | i | $@ | main.rs:233:13:233:23 | enum_source | enum_source | -| main.rs:236:47:236:47 | i | main.rs:233:13:233:23 | enum_source | main.rs:236:47:236:47 | i | $@ | main.rs:233:13:233:23 | enum_source | enum_source | -| main.rs:244:47:244:47 | i | main.rs:242:15:242:20 | source | main.rs:244:47:244:47 | i | $@ | main.rs:242:15:242:20 | source | source | -| main.rs:244:47:244:47 | i | main.rs:242:15:242:20 | source | main.rs:244:47:244:47 | i | $@ | main.rs:242:15:242:20 | source | source | -| main.rs:254:5:254:13 | enum_sink | main.rs:253:13:253:22 | source(...) | main.rs:254:5:254:13 | enum_sink | $@ | main.rs:253:13:253:22 | source(...) | source(...) | -| main.rs:254:5:254:13 | enum_sink | main.rs:253:13:253:22 | source(...) | main.rs:254:5:254:13 | enum_sink | $@ | main.rs:253:13:253:22 | source(...) | source(...) | -| main.rs:261:7:261:10 | sink | main.rs:259:13:259:22 | source(...) | main.rs:261:7:261:10 | sink | $@ | main.rs:259:13:259:22 | source(...) | source(...) | -| main.rs:261:7:261:10 | sink | main.rs:259:13:259:22 | source(...) | main.rs:261:7:261:10 | sink | $@ | main.rs:259:13:259:22 | source(...) | source(...) | -| main.rs:271:10:271:10 | s | main.rs:270:13:270:25 | simple_source | main.rs:271:10:271:10 | s | $@ | main.rs:270:13:270:25 | simple_source | simple_source | -| main.rs:271:10:271:10 | s | main.rs:270:13:270:25 | simple_source | main.rs:271:10:271:10 | s | $@ | main.rs:270:13:270:25 | simple_source | simple_source | -| main.rs:279:5:279:15 | simple_sink | main.rs:278:13:278:22 | source(...) | main.rs:279:5:279:15 | simple_sink | $@ | main.rs:278:13:278:22 | source(...) | source(...) | -| main.rs:279:5:279:15 | simple_sink | main.rs:278:13:278:22 | source(...) | main.rs:279:5:279:15 | simple_sink | $@ | main.rs:278:13:278:22 | source(...) | source(...) | -| main.rs:288:10:288:10 | i | main.rs:287:5:287:14 | arg_source | main.rs:288:10:288:10 | i | $@ | main.rs:287:5:287:14 | arg_source | arg_source | -| main.rs:288:10:288:10 | i | main.rs:287:5:287:14 | arg_source | main.rs:288:10:288:10 | i | $@ | main.rs:287:5:287:14 | arg_source | arg_source | +| main.rs:189:14:189:14 | n | main.rs:187:13:187:22 | source(...) | main.rs:189:14:189:14 | n | $@ | main.rs:187:13:187:22 | source(...) | source(...) | +| main.rs:189:14:189:14 | n | main.rs:187:13:187:22 | source(...) | main.rs:189:14:189:14 | n | $@ | main.rs:187:13:187:22 | source(...) | source(...) | +| main.rs:199:10:199:10 | t | main.rs:196:13:196:22 | source(...) | main.rs:199:10:199:10 | t | $@ | main.rs:196:13:196:22 | source(...) | source(...) | +| main.rs:199:10:199:10 | t | main.rs:196:13:196:22 | source(...) | main.rs:199:10:199:10 | t | $@ | main.rs:196:13:196:22 | source(...) | source(...) | +| main.rs:206:10:206:10 | t | main.rs:203:13:203:22 | source(...) | main.rs:206:10:206:10 | t | $@ | main.rs:203:13:203:22 | source(...) | source(...) | +| main.rs:206:10:206:10 | t | main.rs:203:13:203:22 | source(...) | main.rs:206:10:206:10 | t | $@ | main.rs:203:13:203:22 | source(...) | source(...) | +| main.rs:217:10:217:10 | t | main.rs:215:13:215:22 | source(...) | main.rs:217:10:217:10 | t | $@ | main.rs:215:13:215:22 | source(...) | source(...) | +| main.rs:217:10:217:10 | t | main.rs:215:13:215:22 | source(...) | main.rs:217:10:217:10 | t | $@ | main.rs:215:13:215:22 | source(...) | source(...) | +| main.rs:239:47:239:47 | i | main.rs:236:13:236:23 | enum_source | main.rs:239:47:239:47 | i | $@ | main.rs:236:13:236:23 | enum_source | enum_source | +| main.rs:239:47:239:47 | i | main.rs:236:13:236:23 | enum_source | main.rs:239:47:239:47 | i | $@ | main.rs:236:13:236:23 | enum_source | enum_source | +| main.rs:247:47:247:47 | i | main.rs:245:15:245:20 | source | main.rs:247:47:247:47 | i | $@ | main.rs:245:15:245:20 | source | source | +| main.rs:247:47:247:47 | i | main.rs:245:15:245:20 | source | main.rs:247:47:247:47 | i | $@ | main.rs:245:15:245:20 | source | source | +| main.rs:257:5:257:13 | enum_sink | main.rs:256:13:256:22 | source(...) | main.rs:257:5:257:13 | enum_sink | $@ | main.rs:256:13:256:22 | source(...) | source(...) | +| main.rs:257:5:257:13 | enum_sink | main.rs:256:13:256:22 | source(...) | main.rs:257:5:257:13 | enum_sink | $@ | main.rs:256:13:256:22 | source(...) | source(...) | +| main.rs:264:7:264:10 | sink | main.rs:262:13:262:22 | source(...) | main.rs:264:7:264:10 | sink | $@ | main.rs:262:13:262:22 | source(...) | source(...) | +| main.rs:264:7:264:10 | sink | main.rs:262:13:262:22 | source(...) | main.rs:264:7:264:10 | sink | $@ | main.rs:262:13:262:22 | source(...) | source(...) | +| main.rs:274:10:274:10 | s | main.rs:273:13:273:25 | simple_source | main.rs:274:10:274:10 | s | $@ | main.rs:273:13:273:25 | simple_source | simple_source | +| main.rs:274:10:274:10 | s | main.rs:273:13:273:25 | simple_source | main.rs:274:10:274:10 | s | $@ | main.rs:273:13:273:25 | simple_source | simple_source | +| main.rs:282:5:282:15 | simple_sink | main.rs:281:13:281:22 | source(...) | main.rs:282:5:282:15 | simple_sink | $@ | main.rs:281:13:281:22 | source(...) | source(...) | +| main.rs:282:5:282:15 | simple_sink | main.rs:281:13:281:22 | source(...) | main.rs:282:5:282:15 | simple_sink | $@ | main.rs:281:13:281:22 | source(...) | source(...) | +| main.rs:291:10:291:10 | i | main.rs:290:5:290:14 | arg_source | main.rs:291:10:291:10 | i | $@ | main.rs:290:5:290:14 | arg_source | arg_source | +| main.rs:291:10:291:10 | i | main.rs:290:5:290:14 | arg_source | main.rs:291:10:291:10 | i | $@ | main.rs:290:5:290:14 | arg_source | arg_source | +| main.rs:344:10:344:11 | x1 | main.rs:343:14:343:23 | source(...) | main.rs:344:10:344:11 | x1 | $@ | main.rs:343:14:343:23 | source(...) | source(...) | +| main.rs:344:10:344:11 | x1 | main.rs:343:14:343:23 | source(...) | main.rs:344:10:344:11 | x1 | $@ | main.rs:343:14:343:23 | source(...) | source(...) | +| main.rs:354:10:354:18 | x2.field1 | main.rs:347:17:347:26 | source(...) | main.rs:354:10:354:18 | x2.field1 | $@ | main.rs:347:17:347:26 | source(...) | source(...) | +| main.rs:354:10:354:18 | x2.field1 | main.rs:347:17:347:26 | source(...) | main.rs:354:10:354:18 | x2.field1 | $@ | main.rs:347:17:347:26 | source(...) | source(...) | +| main.rs:360:10:360:11 | x4 | main.rs:359:14:359:23 | source(...) | main.rs:360:10:360:11 | x4 | $@ | main.rs:359:14:359:23 | source(...) | source(...) | +| main.rs:360:10:360:11 | x4 | main.rs:359:14:359:23 | source(...) | main.rs:360:10:360:11 | x4 | $@ | main.rs:359:14:359:23 | source(...) | source(...) | +| main.rs:363:10:363:11 | x5 | main.rs:362:14:362:23 | source(...) | main.rs:363:10:363:11 | x5 | $@ | main.rs:362:14:362:23 | source(...) | source(...) | +| main.rs:366:10:366:11 | x6 | main.rs:365:14:365:23 | source(...) | main.rs:366:10:366:11 | x6 | $@ | main.rs:365:14:365:23 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index ba5fc48cf247..eb51ac64f50f 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -32,3 +32,5 @@ extensions: - ["main::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"] - ["main::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] - ["main::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"] + - ["<_ as core::cmp::Ord>::max", "Argument[self]", "ReturnValue", "value", "manual"] + - ["<_ as core::cmp::PartialOrd>::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"]