diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll index 18d19fa7bd10..0cabde4ba1fa 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll @@ -11,7 +11,13 @@ private module Input implements InputSig { not exists(n.asExpr().getLocation()) } - predicate postWithInFlowExclude(RustDataFlow::Node n) { n instanceof Node::FlowSummaryNode } + predicate postWithInFlowExclude(RustDataFlow::Node n) { + n instanceof Node::FlowSummaryNode + or + // We allow flow into post-update node for receiver expressions (from the + // synthetic post receiever node). + n.(Node::PostUpdateNode).getPreUpdateNode().asExpr() = any(Node::ReceiverNode r).getReceiver() + } predicate missingLocationExclude(RustDataFlow::Node n) { not exists(n.asExpr().getLocation()) } } diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 6d237d786beb..4024f5974cf8 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -4,6 +4,7 @@ private import codeql.util.Void private import codeql.util.Unit +private import codeql.util.Boolean private import codeql.dataflow.DataFlow private import codeql.dataflow.internal.DataFlowImpl private import rust @@ -96,6 +97,8 @@ final class ParameterPosition extends TParameterPosition { /** Gets the underlying integer position, if any. */ int getPosition() { this = TPositionalParameterPosition(result) } + predicate hasPosition() { exists(this.getPosition()) } + /** Holds if this position represents the `self` position. */ predicate isSelf() { this = TSelfParameterPosition() } @@ -130,21 +133,21 @@ private predicate callToMethod(CallExpr call) { ) } -/** Holds if `arg` is an argument of `call` at the position `pos`. */ +/** + * Holds if `arg` is an argument of `call` at the position `pos`. + * + * Note that this does not hold for the receiever expression of a method call + * as the synthetic `ReceiverNode` is the argument for the `self` parameter. + */ private predicate isArgumentForCall(ExprCfgNode arg, CallExprBaseCfgNode call, ParameterPosition pos) { if callToMethod(call.(CallExprCfgNode).getCallExpr()) - then ( + then // The first argument is for the `self` parameter arg = call.getArgument(0) and pos.isSelf() or // Succeeding arguments are shifted left arg = call.getArgument(pos.getPosition() + 1) - ) else ( - // The self argument in a method call. - arg = call.(MethodCallExprCfgNode).getReceiver() and pos.isSelf() - or - arg = call.getArgument(pos.getPosition()) - ) + else arg = call.getArgument(pos.getPosition()) } /** @@ -374,6 +377,30 @@ module Node { } } + /** + * The receiver of a method call _after_ any implicit borrow or dereferencing + * has taken place. + */ + final class ReceiverNode extends ArgumentNode, TReceiverNode { + private MethodCallExprCfgNode n; + + ReceiverNode() { this = TReceiverNode(n, false) } + + ExprCfgNode getReceiver() { result = n.getReceiver() } + + MethodCallExprCfgNode getMethodCall() { result = n } + + override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) { + call.asMethodCallExprCfgNode() = n and pos = TSelfParameterPosition() + } + + override CfgScope getCfgScope() { result = n.getAstNode().getEnclosingCfgScope() } + + override Location getLocation() { result = this.getReceiver().getLocation() } + + override string toString() { result = "receiver for " + this.getReceiver() } + } + final class SummaryArgumentNode extends FlowSummaryNode, ArgumentNode { private FlowSummaryImpl::Private::SummaryNode receiver; private RustDataFlow::ArgumentPosition pos_; @@ -519,6 +546,18 @@ module Node { override Location getLocation() { result = n.getLocation() } } + final class ReceiverPostUpdateNode extends PostUpdateNode, TReceiverNode { + private MethodCallExprCfgNode n; + + ReceiverPostUpdateNode() { this = TReceiverNode(n, true) } + + override Node getPreUpdateNode() { result = TReceiverNode(n, false) } + + override CfgScope getCfgScope() { result = n.getAstNode().getEnclosingCfgScope() } + + override Location getLocation() { result = n.getReceiver().getLocation() } + } + final class SummaryPostUpdateNode extends FlowSummaryNode, PostUpdateNode { private FlowSummaryNode pre; @@ -648,6 +687,14 @@ module LocalFlow { ) or nodeFrom.asPat().(OrPatCfgNode).getAPat() = nodeTo.asPat() + or + // Simple value step from receiver expression to receiver node, in case + // there is no implicit deref or borrow operation. + nodeFrom.asExpr() = nodeTo.(Node::ReceiverNode).getReceiver() + or + // The dual step of the above, for the post-update nodes. + nodeFrom.(Node::PostUpdateNode).getPreUpdateNode().(Node::ReceiverNode).getReceiver() = + nodeTo.(Node::PostUpdateNode).getPreUpdateNode().asExpr() } } @@ -998,6 +1045,23 @@ predicate lambdaCallExpr(CallExprCfgNode call, LambdaCallKind kind, ExprCfgNode exists(kind) } +/** Holds if `mc` implicitly borrows its receiver. */ +private predicate implicitBorrow(MethodCallExpr mc) { + // Determining whether an implicit borrow happens depends on the type of the + // receiever as well as the target. As a heuristic we simply check if the + // target takes `self` as a borrow and limit the approximation to cases where + // the receiver is a simple variable. + mc.getReceiver() instanceof VariableAccess and + mc.getStaticTarget().getParamList().getSelfParam().isRef() +} + +/** Holds if `mc` implicitly dereferences its receiver. */ +private predicate implicitDeref(MethodCallExpr mc) { + // Similarly to `implicitBorrow` this is an approximation. + mc.getReceiver() instanceof VariableAccess and + not mc.getStaticTarget().getParamList().getSelfParam().isRef() +} + // Defines a set of aliases needed for the `RustDataFlow` module private module Aliases { class DataFlowCallableAlias = DataFlowCallable; @@ -1054,13 +1118,12 @@ module RustDataFlow implements InputSig { DataFlowType getNodeType(Node node) { any() } predicate nodeIsHidden(Node node) { - node instanceof Node::SsaNode - or - node.(Node::FlowSummaryNode).getSummaryNode().isHidden() - or - node instanceof Node::CaptureNode - or - node instanceof Node::ClosureParameterNode + node instanceof Node::SsaNode or + node.(Node::FlowSummaryNode).getSummaryNode().isHidden() or + node instanceof Node::CaptureNode or + node instanceof Node::ClosureParameterNode or + node instanceof Node::ReceiverNode or + node instanceof Node::ReceiverPostUpdateNode } predicate neverSkipInPathGraph(Node node) { @@ -1169,6 +1232,28 @@ module RustDataFlow implements InputSig { node2.(Node::FlowSummaryNode).getSummaryNode()) } + pragma[nomagic] + private predicate implicitDerefToReceiver(Node node1, Node::ReceiverNode node2, ReferenceContent c) { + node1.asExpr() = node2.getReceiver() and + implicitDeref(node2.getMethodCall().getMethodCallExpr()) and + exists(c) + } + + pragma[nomagic] + private predicate implicitBorrowToReceiver( + Node node1, Node::ReceiverNode node2, ReferenceContent c + ) { + node1.asExpr() = node2.getReceiver() and + implicitBorrow(node2.getMethodCall().getMethodCallExpr()) and + exists(c) + } + + pragma[nomagic] + private predicate referenceExprToExpr(Node node1, Node node2, ReferenceContent c) { + node1.asExpr() = node2.asExpr().(RefExprCfgNode).getExpr() and + exists(c) + } + /** * Holds if data can flow from `node1` to `node2` via a read of `c`. Thus, * `node1` references an object with a content `c.getAReadContent()` whose @@ -1251,6 +1336,17 @@ module RustDataFlow implements InputSig { node2.asExpr() = await ) or + referenceExprToExpr(node2.(PostUpdateNode).getPreUpdateNode(), + node1.(PostUpdateNode).getPreUpdateNode(), c) + or + // Step from receiver expression to receiver node, in case of an implicit + // dereference. + implicitDerefToReceiver(node1, node2, c) + or + // A read step dual to the store step for implicit borrows. + implicitBorrowToReceiver(node2.(PostUpdateNode).getPreUpdateNode(), + node1.(PostUpdateNode).getPreUpdateNode(), c) + or VariableCapture::readStep(node1, c, node2) ) or @@ -1327,11 +1423,7 @@ module RustDataFlow implements InputSig { node2.(PostUpdateNode).getPreUpdateNode().asExpr() = index.getBase() ) or - exists(RefExprCfgNode ref | - c instanceof ReferenceContent and - node1.asExpr() = ref.getExpr() and - node2.asExpr() = ref - ) + referenceExprToExpr(node1, node2, c) or // Store in function argument exists(DataFlowCall call, int i | @@ -1341,6 +1433,10 @@ module RustDataFlow implements InputSig { ) or VariableCapture::storeStep(node1, c, node2) + or + // Step from receiver expression to receiver node, in case of an implicit + // borrow. + implicitBorrowToReceiver(node1, node2, c) } /** @@ -1612,17 +1708,25 @@ private module Cached { TPatNode(PatCfgNode p) or TNameNode(NameCfgNode n) { n.getName() = any(Variable v).getName() } or TExprPostUpdateNode(ExprCfgNode e) { - isArgumentForCall(e, _, _) or - lambdaCallExpr(_, _, e) or - lambdaCreationExpr(e.getExpr(), _) or + isArgumentForCall(e, _, _) + or + lambdaCallExpr(_, _, e) + or + lambdaCreationExpr(e.getExpr(), _) + or + // Whenever `&mut e` has a post-update node we also create one for `e`. + // E.g., for `e` in `f(..., &mut e, ...)` or `*(&mut e) = ...`. + e = any(RefExprCfgNode ref | ref.isMut() and exists(TExprPostUpdateNode(ref))).getExpr() + or e = [ any(IndexExprCfgNode i).getBase(), any(FieldExprCfgNode access).getExpr(), any(TryExprCfgNode try).getExpr(), any(PrefixExprCfgNode pe | pe.getOperatorName() = "*").getExpr(), - any(AwaitExprCfgNode a).getExpr() + any(AwaitExprCfgNode a).getExpr(), any(MethodCallExprCfgNode mc).getReceiver() ] } or + TReceiverNode(MethodCallExprCfgNode mc, Boolean isPost) or TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) or TClosureSelfReferenceNode(CfgScope c) { lambdaCreationExpr(c, _) } or diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll index 430049a5006d..87a8d6c0b0bd 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll @@ -47,26 +47,7 @@ module SsaInput implements SsaImplCommon::InputSig { BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() } - /** - * A variable amenable to SSA construction. - * - * All immutable variables are amenable. Mutable variables are restricted to - * those that are not borrowed (either explicitly using `& mut`, or - * (potentially) implicit as borrowed receivers in a method call). - */ - class SourceVariable extends Variable { - SourceVariable() { - this.isMutable() - implies - not exists(VariableAccess va | va = this.getAnAccess() | - va = any(RefExpr re | re.isMut()).getExpr() - or - // receivers can be borrowed implicitly, cf. - // https://doc.rust-lang.org/reference/expressions/method-call-expr.html - va = any(MethodCallExpr mce).getReceiver() - ) - } - } + class SourceVariable = Variable; predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { ( @@ -76,7 +57,12 @@ module SsaInput implements SsaImplCommon::InputSig { ) and certain = true or - capturedCallWrite(_, bb, i, v) and certain = false + ( + capturedCallWrite(_, bb, i, v) + or + mutablyBorrows(bb.getNode(i).getAstNode(), v) + ) and + certain = false } predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { @@ -229,6 +215,14 @@ predicate capturedCallWrite(Expr call, BasicBlock bb, int i, Variable v) { ) } +/** Holds if `v` may be mutably borrowed in `e`. */ +private predicate mutablyBorrows(Expr e, Variable v) { + e = any(MethodCallExpr mc).getReceiver() and + e.(VariableAccess).getVariable() = v + or + exists(RefExpr re | re = e and re.isMut() and re.getExpr().(VariableAccess).getVariable() = v) +} + /** * Holds if a pseudo read of captured variable `v` should be inserted * at index `i` in exit block `bb`. @@ -379,6 +373,17 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu none() // handled in `DataFlowImpl.qll` instead } + predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) { + exists(CfgNodes::CallExprBaseCfgNode call, Variable v, BasicBlock bb, int i | + def.definesAt(v, bb, i) and + mutablyBorrows(bb.getNode(i).getAstNode(), v) + | + call.getArgument(_) = bb.getNode(i) + or + call.(CfgNodes::MethodCallExprCfgNode).getReceiver() = bb.getNode(i) + ) + } + class Parameter = CfgNodes::ParamBaseCfgNode; /** Holds if SSA definition `def` initializes parameter `p` at function entry. */ 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 aa484de0a672..c799f45a8e7d 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -27,30 +27,30 @@ edges | main.rs:55:13:55:27 | pass_through(...) | main.rs:55:9:55:9 | b | provenance | | | main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | provenance | | | main.rs:55:26:55:26 | a | main.rs:55:13:55:27 | pass_through(...) | provenance | | -| main.rs:67:23:67:28 | ...: i64 | main.rs:68:14:68:14 | n | provenance | | -| main.rs:71:31:77:5 | { ... } | main.rs:90:13:90:25 | mn.get_data(...) | provenance | | -| main.rs:75:13:75:21 | source(...) | main.rs:71:31:77:5 | { ... } | provenance | | -| main.rs:79:28:79:33 | ...: i64 | main.rs:79:43:85:5 | { ... } | provenance | | +| main.rs:67:22:67:27 | ...: i64 | main.rs:68:14:68:14 | n | provenance | | +| main.rs:71:30:77:5 | { ... } | main.rs:90:13:90:25 | mn.get_data(...) | provenance | | +| main.rs:75:13:75:21 | source(...) | main.rs:71:30:77:5 | { ... } | provenance | | +| main.rs:79:27:79:32 | ...: i64 | main.rs:79:42:85:5 | { ... } | provenance | | | main.rs:90:9:90:9 | a | main.rs:91:10:91:10 | a | provenance | | | main.rs:90:13:90:25 | mn.get_data(...) | main.rs:90:9:90:9 | a | provenance | | | main.rs:96:9:96:9 | a | main.rs:97:16:97:16 | a | provenance | | | main.rs:96:13:96:21 | source(...) | main.rs:96:9:96:9 | a | provenance | | -| main.rs:97:16:97:16 | a | main.rs:67:23:67:28 | ...: i64 | provenance | | +| main.rs:97:16:97:16 | a | main.rs:67:22:67:27 | ...: i64 | provenance | | | main.rs:102:9:102:9 | a | main.rs:103:29:103:29 | a | provenance | | | main.rs:102:13:102:21 | source(...) | main.rs:102:9:102:9 | a | provenance | | | main.rs:103:9:103:9 | b | main.rs:104:10:104:10 | b | provenance | | | main.rs:103:13:103:30 | mn.data_through(...) | main.rs:103:9:103:9 | b | provenance | | -| main.rs:103:29:103:29 | a | main.rs:79:28:79:33 | ...: i64 | provenance | | +| main.rs:103:29:103:29 | a | main.rs:79:27:79:32 | ...: i64 | provenance | | | main.rs:103:29:103:29 | a | main.rs:103:13:103:30 | mn.data_through(...) | provenance | | -| main.rs:109:9:109:9 | a | main.rs:110:26:110:26 | a | provenance | | +| main.rs:109:9:109:9 | a | main.rs:110:25:110:25 | a | provenance | | | main.rs:109:13:109:21 | source(...) | main.rs:109:9:109:9 | a | provenance | | -| main.rs:110:26:110:26 | a | main.rs:67:23:67:28 | ...: i64 | provenance | | -| main.rs:115:9:115:9 | a | main.rs:116:39:116:39 | a | provenance | | +| main.rs:110:25:110:25 | a | main.rs:67:22:67:27 | ...: i64 | provenance | | +| main.rs:115:9:115:9 | a | main.rs:116:38:116:38 | a | provenance | | | main.rs:115:13:115:22 | source(...) | main.rs:115:9:115:9 | a | provenance | | | main.rs:116:9:116:9 | b | main.rs:117:10:117:10 | b | provenance | | -| main.rs:116:13:116:40 | ...::data_through(...) | main.rs:116:9:116:9 | b | provenance | | -| main.rs:116:39:116:39 | a | main.rs:79:28:79:33 | ...: i64 | provenance | | -| main.rs:116:39:116:39 | a | main.rs:116:13:116:40 | ...::data_through(...) | provenance | | +| main.rs:116:13:116:39 | ...::data_through(...) | main.rs:116:9:116:9 | b | provenance | | +| main.rs:116:38:116:38 | a | main.rs:79:27:79:32 | ...: i64 | provenance | | +| main.rs:116:38:116:38 | a | main.rs:116:13:116:39 | ...::data_through(...) | provenance | | | main.rs:128:12:128:17 | ...: i64 | main.rs:129:24:129:24 | n | provenance | | | main.rs:129:9:129:26 | MyInt {...} [MyInt] | main.rs:128:28:130:5 | { ... } [MyInt] | provenance | | | main.rs:129:24:129:24 | n | main.rs:129:9:129:26 | MyInt {...} [MyInt] | provenance | | @@ -82,13 +82,6 @@ edges | main.rs:202:13:202:21 | source(...) | main.rs:202:9:202:9 | a | provenance | | | main.rs:212:13:212:13 | c | main.rs:213:14:213:14 | c | provenance | | | main.rs:212:17:212:25 | source(...) | main.rs:212:13:212:13 | c | provenance | | -| main.rs:228:25:228:30 | ...: i64 | main.rs:229:10:229:10 | c | provenance | | -| main.rs:229:6:229:6 | [post] n [&ref] | main.rs:228:12:228:22 | ...: ... [Return] [&ref] | provenance | | -| main.rs:229:10:229:10 | c | main.rs:229:6:229:6 | [post] n [&ref] | provenance | | -| main.rs:237:13:237:13 | [post] m [&ref] | main.rs:238:11:238:11 | m [&ref] | provenance | | -| main.rs:237:16:237:25 | source(...) | main.rs:228:25:228:30 | ...: i64 | provenance | | -| main.rs:237:16:237:25 | source(...) | main.rs:237:13:237:13 | [post] m [&ref] | provenance | | -| main.rs:238:11:238:11 | m [&ref] | main.rs:238:10:238:11 | * ... | provenance | | nodes | main.rs:12:28:14:1 | { ... } | semmle.label | { ... } | | main.rs:13:5:13:13 | source(...) | semmle.label | source(...) | @@ -121,12 +114,12 @@ nodes | main.rs:55:13:55:27 | pass_through(...) | semmle.label | pass_through(...) | | main.rs:55:26:55:26 | a | semmle.label | a | | main.rs:56:10:56:10 | b | semmle.label | b | -| main.rs:67:23:67:28 | ...: i64 | semmle.label | ...: i64 | +| main.rs:67:22:67:27 | ...: i64 | semmle.label | ...: i64 | | main.rs:68:14:68:14 | n | semmle.label | n | -| main.rs:71:31:77:5 | { ... } | semmle.label | { ... } | +| main.rs:71:30:77:5 | { ... } | semmle.label | { ... } | | main.rs:75:13:75:21 | source(...) | semmle.label | source(...) | -| main.rs:79:28:79:33 | ...: i64 | semmle.label | ...: i64 | -| main.rs:79:43:85:5 | { ... } | semmle.label | { ... } | +| main.rs:79:27:79:32 | ...: i64 | semmle.label | ...: i64 | +| main.rs:79:42:85:5 | { ... } | semmle.label | { ... } | | main.rs:90:9:90:9 | a | semmle.label | a | | main.rs:90:13:90:25 | mn.get_data(...) | semmle.label | mn.get_data(...) | | main.rs:91:10:91:10 | a | semmle.label | a | @@ -141,12 +134,12 @@ nodes | main.rs:104:10:104:10 | b | semmle.label | b | | main.rs:109:9:109:9 | a | semmle.label | a | | main.rs:109:13:109:21 | source(...) | semmle.label | source(...) | -| main.rs:110:26:110:26 | a | semmle.label | a | +| main.rs:110:25:110:25 | a | semmle.label | a | | main.rs:115:9:115:9 | a | semmle.label | a | | main.rs:115:13:115:22 | source(...) | semmle.label | source(...) | | main.rs:116:9:116:9 | b | semmle.label | b | -| main.rs:116:13:116:40 | ...::data_through(...) | semmle.label | ...::data_through(...) | -| main.rs:116:39:116:39 | a | semmle.label | a | +| main.rs:116:13:116:39 | ...::data_through(...) | semmle.label | ...::data_through(...) | +| main.rs:116:38:116:38 | a | semmle.label | a | | main.rs:117:10:117:10 | b | semmle.label | b | | main.rs:128:12:128:17 | ...: i64 | semmle.label | ...: i64 | | main.rs:128:28:130:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] | @@ -184,24 +177,15 @@ nodes | main.rs:212:13:212:13 | c | semmle.label | c | | main.rs:212:17:212:25 | source(...) | semmle.label | source(...) | | main.rs:213:14:213:14 | c | semmle.label | c | -| main.rs:228:12:228:22 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] | -| main.rs:228:25:228:30 | ...: i64 | semmle.label | ...: i64 | -| main.rs:229:6:229:6 | [post] n [&ref] | semmle.label | [post] n [&ref] | -| main.rs:229:10:229:10 | c | semmle.label | c | -| main.rs:237:13:237:13 | [post] m [&ref] | semmle.label | [post] m [&ref] | -| main.rs:237:16:237:25 | source(...) | semmle.label | source(...) | -| main.rs:238:10:238:11 | * ... | semmle.label | * ... | -| main.rs:238:11:238:11 | m [&ref] | semmle.label | m [&ref] | subpaths | main.rs:36:26:36:26 | a | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:36:13:36:27 | pass_through(...) | | main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:41:13:44:6 | pass_through(...) | | main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | main.rs:55:13:55:27 | pass_through(...) | -| main.rs:103:29:103:29 | a | main.rs:79:28:79:33 | ...: i64 | main.rs:79:43:85:5 | { ... } | main.rs:103:13:103:30 | mn.data_through(...) | -| main.rs:116:39:116:39 | a | main.rs:79:28:79:33 | ...: i64 | main.rs:79:43:85:5 | { ... } | main.rs:116:13:116:40 | ...::data_through(...) | +| main.rs:103:29:103:29 | a | main.rs:79:27:79:32 | ...: i64 | main.rs:79:42:85:5 | { ... } | main.rs:103:13:103:30 | mn.data_through(...) | +| main.rs:116:38:116:38 | a | main.rs:79:27:79:32 | ...: i64 | main.rs:79:42:85:5 | { ... } | main.rs:116:13:116:39 | ...::data_through(...) | | main.rs:134:24:134:33 | source(...) | main.rs:128:12:128:17 | ...: i64 | main.rs:128:28:130:5 | { ... } [MyInt] | main.rs:134:13:134:34 | ...::new(...) [MyInt] | | main.rs:187:49:187:49 | a [MyInt] | main.rs:175:18:175:21 | SelfParam [MyInt] | main.rs:175:48:177:5 | { ... } [MyInt] | main.rs:187:30:187:53 | ...::take_self(...) [MyInt] | | main.rs:192:54:192:54 | b [MyInt] | main.rs:179:26:179:37 | ...: MyInt [MyInt] | main.rs:179:49:181:5 | { ... } [MyInt] | main.rs:192:30:192:55 | ...::take_second(...) [MyInt] | -| main.rs:237:16:237:25 | source(...) | main.rs:228:25:228:30 | ...: i64 | main.rs:228:12:228:22 | ...: ... [Return] [&ref] | main.rs:237:13:237:13 | [post] m [&ref] | 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(...) | @@ -219,4 +203,3 @@ testFailures | main.rs:193:10:193:10 | c | main.rs:191:28:191:37 | source(...) | main.rs:193:10:193:10 | c | $@ | main.rs:191:28:191:37 | source(...) | source(...) | | main.rs:203:10:203:10 | a | main.rs:202:13:202:21 | source(...) | main.rs:203:10:203:10 | a | $@ | main.rs:202:13:202:21 | source(...) | source(...) | | main.rs:213:14:213:14 | c | main.rs:212:17:212:25 | source(...) | main.rs:213:14:213:14 | c | $@ | main.rs:212:17:212:25 | source(...) | source(...) | -| main.rs:238:10:238:11 | * ... | main.rs:237:16:237:25 | source(...) | main.rs:238:10:238:11 | * ... | $@ | main.rs:237:16:237:25 | 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 5899733af79b..a9d26e46b073 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -64,11 +64,11 @@ struct MyFlag { } impl MyFlag { - fn data_in(&self, n: i64) { + fn data_in(self, n: i64) { sink(n); // $ hasValueFlow=1 hasValueFlow=8 } - fn get_data(&self) -> i64 { + fn get_data(self) -> i64 { if self.flag { 0 } else { @@ -76,7 +76,7 @@ impl MyFlag { } } - fn data_through(&self, n: i64) -> i64 { + fn data_through(self, n: i64) -> i64 { if self.flag { 0 } else { @@ -107,13 +107,13 @@ fn data_through_method() { fn data_in_to_method_called_as_function() { let mn = MyFlag { flag: true }; let a = source(8); - MyFlag::data_in(&mn, a); + MyFlag::data_in(mn, a); } fn data_through_method_called_as_function() { let mn = MyFlag { flag: true }; let a = source(12); - let b = MyFlag::data_through(&mn, a); + let b = MyFlag::data_through(mn, a); sink(b); // $ hasValueFlow=12 } @@ -223,29 +223,6 @@ fn test_async_await() { futures::executor::block_on(test_async_await_async_part()); } -// Flow out of mutable parameters. - -fn set_int(n: &mut i64, c: i64) { - *n = c; -} - -fn mutates_argument_1() { - // Passing an already borrowed value to a function and then reading from the same borrow. - let mut n = 0; - let m = &mut n; - sink(*m); - set_int(m, source(37)); - sink(*m); // $ hasValueFlow=37 -} - -fn mutates_argument_2() { - // Borrowing at the call and then reading from the unborrowed variable. - let mut n = 0; - sink(n); - set_int(&mut n, source(88)); - sink(n); // $ MISSING: hasValueFlow=88 -} - fn main() { data_out_of_call(); data_in_to_call(); @@ -258,6 +235,4 @@ fn main() { test_operator_overloading(); test_async_await(); - mutates_argument_1(); - mutates_argument_2(); } diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index ad83682d7d06..776300d8943e 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -23,9 +23,9 @@ | main.rs:103:13:103:30 | mn.data_through(...) | main.rs:79:5:85:5 | fn data_through | | main.rs:104:5:104:11 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:109:13:109:21 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:110:5:110:27 | ...::data_in(...) | main.rs:67:5:69:5 | fn data_in | +| main.rs:110:5:110:26 | ...::data_in(...) | main.rs:67:5:69:5 | fn data_in | | main.rs:115:13:115:22 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:116:13:116:40 | ...::data_through(...) | main.rs:79:5:85:5 | fn data_through | +| main.rs:116:13:116:39 | ...::data_through(...) | main.rs:79:5:85:5 | fn data_through | | main.rs:117:5:117:11 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:134:13:134:34 | ...::new(...) | main.rs:127:5:130:5 | fn new | | main.rs:134:24:134:33 | source(...) | main.rs:1:1:3:1 | fn source | @@ -56,22 +56,12 @@ | main.rs:220:41:220:54 | async_source(...) | main.rs:201:1:205:1 | fn async_source | | main.rs:221:5:221:11 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:223:33:223:61 | test_async_await_async_part(...) | main.rs:207:1:217:1 | fn test_async_await_async_part | -| main.rs:236:5:236:12 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:237:5:237:26 | set_int(...) | main.rs:228:1:230:1 | fn set_int | -| main.rs:237:16:237:25 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:238:5:238:12 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:244:5:244:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:245:5:245:31 | set_int(...) | main.rs:228:1:230:1 | fn set_int | -| main.rs:245:21:245:30 | source(...) | main.rs:1:1:3:1 | fn source | -| main.rs:246:5:246:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:250:5:250:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | -| main.rs:251:5:251:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call | -| main.rs:252:5:252:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call | -| main.rs:253:5:253:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function | -| main.rs:255:5:255:24 | data_out_of_method(...) | main.rs:88:1:92:1 | fn data_out_of_method | -| main.rs:256:5:256:28 | data_in_to_method_call(...) | main.rs:94:1:98:1 | fn data_in_to_method_call | -| main.rs:257:5:257:25 | data_through_method(...) | main.rs:100:1:105:1 | fn data_through_method | -| main.rs:259:5:259:31 | test_operator_overloading(...) | main.rs:148:1:164:1 | fn test_operator_overloading | -| main.rs:260:5:260:22 | test_async_await(...) | main.rs:219:1:224:1 | fn test_async_await | -| main.rs:261:5:261:24 | mutates_argument_1(...) | main.rs:232:1:239:1 | fn mutates_argument_1 | -| main.rs:262:5:262:24 | mutates_argument_2(...) | main.rs:241:1:247:1 | fn mutates_argument_2 | +| main.rs:227:5:227:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | +| main.rs:228:5:228:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call | +| main.rs:229:5:229:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call | +| main.rs:230:5:230:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function | +| main.rs:232:5:232:24 | data_out_of_method(...) | main.rs:88:1:92:1 | fn data_out_of_method | +| main.rs:233:5:233:28 | data_in_to_method_call(...) | main.rs:94:1:98:1 | fn data_in_to_method_call | +| main.rs:234:5:234:25 | data_through_method(...) | main.rs:100:1:105:1 | fn data_through_method | +| main.rs:236:5:236:31 | test_operator_overloading(...) | main.rs:148:1:164:1 | fn test_operator_overloading | +| main.rs:237:5:237:22 | test_async_await(...) | main.rs:219:1:224:1 | fn test_async_await | diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index a79710b75a76..e403311345cc 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -277,22 +277,32 @@ localStep | main.rs:240:9:240:10 | s1 | main.rs:240:9:240:10 | [SSA] s1 | | main.rs:240:9:240:10 | s1 | main.rs:240:9:240:10 | s1 | | main.rs:240:14:240:29 | Some(...) | main.rs:240:9:240:10 | s1 | +| main.rs:241:10:241:11 | [post] receiver for s1 | main.rs:241:10:241:11 | [post] s1 | +| main.rs:241:10:241:11 | s1 | main.rs:241:10:241:11 | receiver for s1 | | main.rs:245:9:245:10 | [SSA] s1 | main.rs:246:10:246:11 | s1 | | main.rs:245:9:245:10 | s1 | main.rs:245:9:245:10 | [SSA] s1 | | main.rs:245:9:245:10 | s1 | main.rs:245:9:245:10 | s1 | | main.rs:245:14:245:29 | Some(...) | main.rs:245:9:245:10 | s1 | +| main.rs:246:10:246:11 | [post] receiver for s1 | main.rs:246:10:246:11 | [post] s1 | +| main.rs:246:10:246:11 | s1 | main.rs:246:10:246:11 | receiver for s1 | | main.rs:248:9:248:10 | [SSA] s2 | main.rs:249:10:249:11 | s2 | | main.rs:248:9:248:10 | s2 | main.rs:248:9:248:10 | [SSA] s2 | | main.rs:248:9:248:10 | s2 | main.rs:248:9:248:10 | s2 | | main.rs:248:14:248:20 | Some(...) | main.rs:248:9:248:10 | s2 | +| main.rs:249:10:249:11 | [post] receiver for s2 | main.rs:249:10:249:11 | [post] s2 | +| main.rs:249:10:249:11 | s2 | main.rs:249:10:249:11 | receiver for s2 | | main.rs:253:9:253:10 | [SSA] s1 | main.rs:254:10:254:11 | s1 | | main.rs:253:9:253:10 | s1 | main.rs:253:9:253:10 | [SSA] s1 | | main.rs:253:9:253:10 | s1 | main.rs:253:9:253:10 | s1 | | main.rs:253:14:253:29 | Some(...) | main.rs:253:9:253:10 | s1 | +| main.rs:254:10:254:11 | [post] receiver for s1 | main.rs:254:10:254:11 | [post] s1 | +| main.rs:254:10:254:11 | s1 | main.rs:254:10:254:11 | receiver for s1 | | main.rs:256:9:256:10 | [SSA] s2 | main.rs:257:10:257:11 | s2 | | main.rs:256:9:256:10 | s2 | main.rs:256:9:256:10 | [SSA] s2 | | main.rs:256:9:256:10 | s2 | main.rs:256:9:256:10 | s2 | | main.rs:256:14:256:17 | None | main.rs:256:9:256:10 | s2 | +| main.rs:257:10:257:11 | [post] receiver for s2 | main.rs:257:10:257:11 | [post] s2 | +| main.rs:257:10:257:11 | s2 | main.rs:257:10:257:11 | receiver for s2 | | main.rs:261:9:261:10 | [SSA] s1 | main.rs:263:14:263:15 | s1 | | main.rs:261:9:261:10 | s1 | main.rs:261:9:261:10 | [SSA] s1 | | main.rs:261:9:261:10 | s1 | main.rs:261:9:261:10 | s1 | @@ -306,6 +316,7 @@ localStep | main.rs:263:9:263:10 | i1 | main.rs:263:9:263:10 | i1 | | main.rs:263:14:263:16 | TryExpr | main.rs:263:9:263:10 | i1 | | main.rs:266:5:266:11 | Some(...) | main.rs:260:41:267:1 | { ... } | +| main.rs:270:9:270:10 | [SSA] r1 | main.rs:271:29:271:30 | [SSA] r1 | | main.rs:270:9:270:10 | [SSA] r1 | main.rs:271:29:271:30 | r1 | | main.rs:270:9:270:10 | r1 | main.rs:270:9:270:10 | [SSA] r1 | | main.rs:270:9:270:10 | r1 | main.rs:270:9:270:10 | r1 | @@ -313,13 +324,23 @@ localStep | main.rs:271:9:271:11 | [SSA] o1a | main.rs:273:10:273:12 | o1a | | main.rs:271:9:271:11 | o1a | main.rs:271:9:271:11 | [SSA] o1a | | main.rs:271:9:271:11 | o1a | main.rs:271:9:271:11 | o1a | +| main.rs:271:29:271:30 | [SSA] r1 | main.rs:272:29:272:30 | r1 | | main.rs:271:29:271:30 | [post] r1 | main.rs:272:29:272:30 | r1 | +| main.rs:271:29:271:30 | [post] receiver for r1 | main.rs:271:29:271:30 | [post] r1 | +| main.rs:271:29:271:30 | r1 | main.rs:271:29:271:30 | receiver for r1 | | main.rs:271:29:271:30 | r1 | main.rs:272:29:272:30 | r1 | | main.rs:271:29:271:35 | r1.ok(...) | main.rs:271:9:271:11 | o1a | | main.rs:272:9:272:11 | [SSA] o1b | main.rs:274:10:274:12 | o1b | | main.rs:272:9:272:11 | o1b | main.rs:272:9:272:11 | [SSA] o1b | | main.rs:272:9:272:11 | o1b | main.rs:272:9:272:11 | o1b | +| main.rs:272:29:272:30 | [post] receiver for r1 | main.rs:272:29:272:30 | [post] r1 | +| main.rs:272:29:272:30 | r1 | main.rs:272:29:272:30 | receiver for r1 | | main.rs:272:29:272:36 | r1.err(...) | main.rs:272:9:272:11 | o1b | +| main.rs:273:10:273:12 | [post] receiver for o1a | main.rs:273:10:273:12 | [post] o1a | +| main.rs:273:10:273:12 | o1a | main.rs:273:10:273:12 | receiver for o1a | +| main.rs:274:10:274:12 | [post] receiver for o1b | main.rs:274:10:274:12 | [post] o1b | +| main.rs:274:10:274:12 | o1b | main.rs:274:10:274:12 | receiver for o1b | +| main.rs:276:9:276:10 | [SSA] r2 | main.rs:277:29:277:30 | [SSA] r2 | | main.rs:276:9:276:10 | [SSA] r2 | main.rs:277:29:277:30 | r2 | | main.rs:276:9:276:10 | r2 | main.rs:276:9:276:10 | [SSA] r2 | | main.rs:276:9:276:10 | r2 | main.rs:276:9:276:10 | r2 | @@ -327,13 +348,22 @@ localStep | main.rs:277:9:277:11 | [SSA] o2a | main.rs:279:10:279:12 | o2a | | main.rs:277:9:277:11 | o2a | main.rs:277:9:277:11 | [SSA] o2a | | main.rs:277:9:277:11 | o2a | main.rs:277:9:277:11 | o2a | +| main.rs:277:29:277:30 | [SSA] r2 | main.rs:278:29:278:30 | r2 | | main.rs:277:29:277:30 | [post] r2 | main.rs:278:29:278:30 | r2 | +| main.rs:277:29:277:30 | [post] receiver for r2 | main.rs:277:29:277:30 | [post] r2 | +| main.rs:277:29:277:30 | r2 | main.rs:277:29:277:30 | receiver for r2 | | main.rs:277:29:277:30 | r2 | main.rs:278:29:278:30 | r2 | | main.rs:277:29:277:35 | r2.ok(...) | main.rs:277:9:277:11 | o2a | | main.rs:278:9:278:11 | [SSA] o2b | main.rs:280:10:280:12 | o2b | | main.rs:278:9:278:11 | o2b | main.rs:278:9:278:11 | [SSA] o2b | | main.rs:278:9:278:11 | o2b | main.rs:278:9:278:11 | o2b | +| main.rs:278:29:278:30 | [post] receiver for r2 | main.rs:278:29:278:30 | [post] r2 | +| main.rs:278:29:278:30 | r2 | main.rs:278:29:278:30 | receiver for r2 | | main.rs:278:29:278:36 | r2.err(...) | main.rs:278:9:278:11 | o2b | +| main.rs:279:10:279:12 | [post] receiver for o2a | main.rs:279:10:279:12 | [post] o2a | +| main.rs:279:10:279:12 | o2a | main.rs:279:10:279:12 | receiver for o2a | +| main.rs:280:10:280:12 | [post] receiver for o2b | main.rs:280:10:280:12 | [post] o2b | +| main.rs:280:10:280:12 | o2b | main.rs:280:10:280:12 | receiver for o2b | | main.rs:284:9:284:10 | [SSA] s1 | main.rs:287:14:287:15 | s1 | | main.rs:284:9:284:10 | s1 | main.rs:284:9:284:10 | [SSA] s1 | | main.rs:284:9:284:10 | s1 | main.rs:284:9:284:10 | s1 | @@ -359,18 +389,30 @@ localStep | main.rs:291:9:291:10 | i3 | main.rs:291:9:291:10 | i3 | | main.rs:291:14:291:16 | TryExpr | main.rs:291:9:291:10 | i3 | | main.rs:293:5:293:9 | Ok(...) | main.rs:283:46:294:1 | { ... } | +| main.rs:297:9:297:10 | [SSA] s1 | main.rs:298:10:298:11 | [SSA] s1 | | main.rs:297:9:297:10 | [SSA] s1 | main.rs:298:10:298:11 | s1 | | main.rs:297:9:297:10 | s1 | main.rs:297:9:297:10 | [SSA] s1 | | main.rs:297:9:297:10 | s1 | main.rs:297:9:297:10 | s1 | | main.rs:297:32:297:45 | Ok(...) | main.rs:297:9:297:10 | s1 | +| main.rs:298:10:298:11 | [SSA] s1 | main.rs:299:10:299:11 | s1 | +| main.rs:298:10:298:11 | [post] receiver for s1 | main.rs:298:10:298:11 | [post] s1 | | main.rs:298:10:298:11 | [post] s1 | main.rs:299:10:299:11 | s1 | +| main.rs:298:10:298:11 | s1 | main.rs:298:10:298:11 | receiver for s1 | | main.rs:298:10:298:11 | s1 | main.rs:299:10:299:11 | s1 | +| main.rs:299:10:299:11 | [post] receiver for s1 | main.rs:299:10:299:11 | [post] s1 | +| main.rs:299:10:299:11 | s1 | main.rs:299:10:299:11 | receiver for s1 | +| main.rs:301:9:301:10 | [SSA] s2 | main.rs:302:10:302:11 | [SSA] s2 | | main.rs:301:9:301:10 | [SSA] s2 | main.rs:302:10:302:11 | s2 | | main.rs:301:9:301:10 | s2 | main.rs:301:9:301:10 | [SSA] s2 | | main.rs:301:9:301:10 | s2 | main.rs:301:9:301:10 | s2 | | main.rs:301:32:301:46 | Err(...) | main.rs:301:9:301:10 | s2 | +| main.rs:302:10:302:11 | [SSA] s2 | main.rs:303:10:303:11 | s2 | +| main.rs:302:10:302:11 | [post] receiver for s2 | main.rs:302:10:302:11 | [post] s2 | | main.rs:302:10:302:11 | [post] s2 | main.rs:303:10:303:11 | s2 | +| main.rs:302:10:302:11 | s2 | main.rs:302:10:302:11 | receiver for s2 | | main.rs:302:10:302:11 | s2 | main.rs:303:10:303:11 | s2 | +| main.rs:303:10:303:11 | [post] receiver for s2 | main.rs:303:10:303:11 | [post] s2 | +| main.rs:303:10:303:11 | s2 | main.rs:303:10:303:11 | receiver for s2 | | main.rs:312:9:312:10 | [SSA] s1 | main.rs:314:11:314:12 | s1 | | main.rs:312:9:312:10 | s1 | main.rs:312:9:312:10 | [SSA] s1 | | main.rs:312:9:312:10 | s1 | main.rs:312:9:312:10 | s1 | @@ -619,6 +661,8 @@ localStep | main.rs:440:39:440:72 | ...: Vec::<...> | main.rs:440:39:440:43 | names | | main.rs:441:9:441:20 | default_name | main.rs:441:9:441:20 | [SSA] default_name | | main.rs:441:9:441:20 | default_name | main.rs:441:9:441:20 | default_name | +| main.rs:441:24:441:33 | [post] receiver for source(...) | main.rs:441:24:441:33 | [post] source(...) | +| main.rs:441:24:441:33 | source(...) | main.rs:441:24:441:33 | receiver for source(...) | | main.rs:441:24:441:45 | ... .to_string(...) | main.rs:441:9:441:20 | default_name | | main.rs:441:24:441:45 | ... .to_string(...) | main.rs:442:9:442:20 | phi(default_name) | | main.rs:442:5:448:5 | for ... in ... { ... } | main.rs:440:75:449:1 | { ... } | @@ -634,10 +678,16 @@ localStep | main.rs:444:17:444:17 | [SSA] n | main.rs:445:18:445:18 | n | | main.rs:444:17:444:17 | n | main.rs:444:17:444:17 | [SSA] n | | main.rs:444:17:444:17 | n | main.rs:444:17:444:17 | n | +| main.rs:444:21:444:24 | [post] receiver for name | main.rs:444:21:444:24 | [post] name | +| main.rs:444:21:444:24 | name | main.rs:444:21:444:24 | receiver for name | | main.rs:444:21:444:68 | name.unwrap_or_else(...) | main.rs:444:17:444:17 | n | | main.rs:444:41:444:67 | [post] default_name | main.rs:442:9:442:20 | phi(default_name) | | main.rs:444:41:444:67 | closure self in \|...\| ... | main.rs:444:44:444:55 | this | | main.rs:444:41:444:67 | default_name | main.rs:442:9:442:20 | phi(default_name) | +| main.rs:444:44:444:55 | [post] receiver for default_name | main.rs:444:44:444:55 | [post] default_name | +| main.rs:444:44:444:55 | default_name | main.rs:444:44:444:55 | receiver for default_name | +| main.rs:445:18:445:18 | [post] receiver for n | main.rs:445:18:445:18 | [post] n | +| main.rs:445:18:445:18 | n | main.rs:445:18:445:18 | receiver for n | | main.rs:458:9:458:9 | [SSA] s | main.rs:459:10:459:10 | s | | main.rs:458:9:458:9 | s | main.rs:458:9:458:9 | [SSA] s | | main.rs:458:9:458:9 | s | main.rs:458:9:458:9 | s | @@ -648,64 +698,129 @@ localStep | main.rs:462:16:462:16 | s | main.rs:462:16:462:16 | s | | main.rs:462:16:462:24 | ...: String | main.rs:462:16:462:16 | s | | main.rs:463:14:463:20 | FormatArgsExpr | main.rs:463:14:463:20 | MacroExpr | +| main.rs:467:9:467:9 | [SSA] a | main.rs:468:13:468:13 | [SSA] a | | main.rs:467:9:467:9 | [SSA] a | main.rs:468:13:468:13 | a | | main.rs:467:9:467:9 | a | main.rs:467:9:467:9 | [SSA] a | | main.rs:467:9:467:9 | a | main.rs:467:9:467:9 | a | | main.rs:467:13:467:22 | source(...) | main.rs:467:9:467:9 | a | +| main.rs:468:9:468:9 | [SSA] b | main.rs:469:13:469:13 | [SSA] b | | main.rs:468:9:468:9 | [SSA] b | main.rs:469:13:469:13 | b | | main.rs:468:9:468:9 | b | main.rs:468:9:468:9 | [SSA] b | | main.rs:468:9:468:9 | b | main.rs:468:9:468:9 | b | +| main.rs:468:13:468:13 | [SSA] a | main.rs:472:10:472:10 | a | | main.rs:468:13:468:13 | [post] a | main.rs:472:10:472:10 | a | +| main.rs:468:13:468:13 | [post] receiver for a | main.rs:468:13:468:13 | [post] a | +| main.rs:468:13:468:13 | a | main.rs:468:13:468:13 | receiver for a | | main.rs:468:13:468:13 | a | main.rs:472:10:472:10 | a | | main.rs:468:13:468:25 | a.to_string(...) | main.rs:468:9:468:9 | b | | main.rs:469:9:469:9 | [SSA] c | main.rs:474:10:474:10 | c | | main.rs:469:9:469:9 | c | main.rs:469:9:469:9 | [SSA] c | | main.rs:469:9:469:9 | c | main.rs:469:9:469:9 | c | +| main.rs:469:13:469:13 | [SSA] b | main.rs:470:19:470:19 | [SSA] b | +| main.rs:469:13:469:13 | [SSA] b | main.rs:470:19:470:19 | b | +| main.rs:469:13:469:13 | [post] b | main.rs:470:19:470:19 | [SSA] b | | main.rs:469:13:469:13 | [post] b | main.rs:470:19:470:19 | b | +| main.rs:469:13:469:13 | [post] receiver for b | main.rs:469:13:469:13 | [post] b | +| main.rs:469:13:469:13 | b | main.rs:469:13:469:13 | receiver for b | +| main.rs:469:13:469:13 | b | main.rs:470:19:470:19 | [SSA] b | | main.rs:469:13:469:13 | b | main.rs:470:19:470:19 | b | +| main.rs:469:13:469:28 | [post] receiver for b.parse(...) | main.rs:469:13:469:28 | [post] b.parse(...) | +| main.rs:469:13:469:28 | b.parse(...) | main.rs:469:13:469:28 | receiver for b.parse(...) | | main.rs:469:13:469:37 | ... .unwrap(...) | main.rs:469:9:469:9 | c | | main.rs:470:9:470:9 | [SSA] d | main.rs:475:10:475:10 | d | | main.rs:470:9:470:9 | d | main.rs:470:9:470:9 | [SSA] d | | main.rs:470:9:470:9 | d | main.rs:470:9:470:9 | d | +| main.rs:470:19:470:19 | [SSA] b | main.rs:473:17:473:17 | b | | main.rs:470:19:470:19 | [post] b | main.rs:473:17:473:17 | b | +| main.rs:470:19:470:19 | [post] receiver for b | main.rs:470:19:470:19 | [post] b | +| main.rs:470:19:470:19 | b | main.rs:470:19:470:19 | receiver for b | | main.rs:470:19:470:19 | b | main.rs:473:17:473:17 | b | +| main.rs:470:19:470:27 | [post] receiver for b.parse(...) | main.rs:470:19:470:27 | [post] b.parse(...) | +| main.rs:470:19:470:27 | b.parse(...) | main.rs:470:19:470:27 | receiver for b.parse(...) | | main.rs:470:19:470:36 | ... .unwrap(...) | main.rs:470:9:470:9 | d | | main.rs:479:9:479:10 | [SSA] vs | main.rs:481:10:481:11 | vs | | main.rs:479:9:479:10 | vs | main.rs:479:9:479:10 | [SSA] vs | | main.rs:479:9:479:10 | vs | main.rs:479:9:479:10 | vs | | main.rs:479:14:479:34 | [...] | main.rs:479:9:479:10 | vs | +| main.rs:481:10:481:11 | [post] vs | main.rs:482:11:482:12 | [SSA] vs | | main.rs:481:10:481:11 | [post] vs | main.rs:482:11:482:12 | vs | +| main.rs:481:10:481:11 | vs | main.rs:482:11:482:12 | [SSA] vs | | main.rs:481:10:481:11 | vs | main.rs:482:11:482:12 | vs | +| main.rs:482:11:482:12 | [SSA] vs | main.rs:483:11:483:12 | [SSA] vs | +| main.rs:482:11:482:12 | [SSA] vs | main.rs:483:11:483:12 | vs | +| main.rs:482:11:482:12 | [post] receiver for vs | main.rs:482:11:482:12 | [post] vs | +| main.rs:482:11:482:12 | [post] vs | main.rs:483:11:483:12 | [SSA] vs | | main.rs:482:11:482:12 | [post] vs | main.rs:483:11:483:12 | vs | +| main.rs:482:11:482:12 | vs | main.rs:482:11:482:12 | receiver for vs | +| main.rs:482:11:482:12 | vs | main.rs:483:11:483:12 | [SSA] vs | | main.rs:482:11:482:12 | vs | main.rs:483:11:483:12 | vs | +| main.rs:482:11:482:19 | [post] receiver for vs.iter(...) | main.rs:482:11:482:19 | [post] vs.iter(...) | +| main.rs:482:11:482:19 | vs.iter(...) | main.rs:482:11:482:19 | receiver for vs.iter(...) | +| main.rs:482:11:482:26 | ... .next(...) | main.rs:482:11:482:26 | receiver for ... .next(...) | +| main.rs:482:11:482:26 | [post] receiver for ... .next(...) | main.rs:482:11:482:26 | [post] ... .next(...) | +| main.rs:483:11:483:12 | [SSA] vs | main.rs:485:14:485:15 | vs | +| main.rs:483:11:483:12 | [post] receiver for vs | main.rs:483:11:483:12 | [post] vs | | main.rs:483:11:483:12 | [post] vs | main.rs:485:14:485:15 | vs | +| main.rs:483:11:483:12 | vs | main.rs:483:11:483:12 | receiver for vs | | main.rs:483:11:483:12 | vs | main.rs:485:14:485:15 | vs | +| main.rs:483:11:483:19 | [post] receiver for vs.iter(...) | main.rs:483:11:483:19 | [post] vs.iter(...) | +| main.rs:483:11:483:19 | vs.iter(...) | main.rs:483:11:483:19 | receiver for vs.iter(...) | +| main.rs:483:11:483:26 | ... .nth(...) | main.rs:483:11:483:26 | receiver for ... .nth(...) | +| main.rs:483:11:483:26 | [post] receiver for ... .nth(...) | main.rs:483:11:483:26 | [post] ... .nth(...) | | main.rs:485:9:485:9 | [SSA] v | main.rs:486:14:486:14 | v | | main.rs:485:9:485:9 | v | main.rs:485:9:485:9 | [SSA] v | | main.rs:485:9:485:9 | v | main.rs:485:9:485:9 | v | +| main.rs:485:14:485:15 | vs | main.rs:488:15:488:16 | [SSA] vs | | main.rs:485:14:485:15 | vs | main.rs:488:15:488:16 | vs | | main.rs:488:10:488:10 | [SSA] v | main.rs:489:14:489:14 | v | | main.rs:488:10:488:10 | v | main.rs:488:10:488:10 | [SSA] v | | main.rs:488:10:488:10 | v | main.rs:488:10:488:10 | v | +| main.rs:488:15:488:16 | [SSA] vs | main.rs:492:27:492:28 | [SSA] vs | +| main.rs:488:15:488:16 | [SSA] vs | main.rs:492:27:492:28 | vs | +| main.rs:488:15:488:16 | [post] receiver for vs | main.rs:488:15:488:16 | [post] vs | +| main.rs:488:15:488:16 | [post] vs | main.rs:492:27:492:28 | [SSA] vs | | main.rs:488:15:488:16 | [post] vs | main.rs:492:27:492:28 | vs | +| main.rs:488:15:488:16 | vs | main.rs:488:15:488:16 | receiver for vs | +| main.rs:488:15:488:16 | vs | main.rs:492:27:492:28 | [SSA] vs | | main.rs:488:15:488:16 | vs | main.rs:492:27:492:28 | vs | | main.rs:492:9:492:11 | [SSA] vs2 | main.rs:493:15:493:17 | vs2 | | main.rs:492:9:492:11 | vs2 | main.rs:492:9:492:11 | [SSA] vs2 | | main.rs:492:9:492:11 | vs2 | main.rs:492:9:492:11 | vs2 | +| main.rs:492:27:492:28 | [SSA] vs | main.rs:497:5:497:6 | [SSA] vs | +| main.rs:492:27:492:28 | [SSA] vs | main.rs:497:5:497:6 | vs | +| main.rs:492:27:492:28 | [post] receiver for vs | main.rs:492:27:492:28 | [post] vs | +| main.rs:492:27:492:28 | [post] vs | main.rs:497:5:497:6 | [SSA] vs | | main.rs:492:27:492:28 | [post] vs | main.rs:497:5:497:6 | vs | +| main.rs:492:27:492:28 | vs | main.rs:492:27:492:28 | receiver for vs | +| main.rs:492:27:492:28 | vs | main.rs:497:5:497:6 | [SSA] vs | | main.rs:492:27:492:28 | vs | main.rs:497:5:497:6 | vs | +| main.rs:492:27:492:35 | [post] receiver for vs.iter(...) | main.rs:492:27:492:35 | [post] vs.iter(...) | +| main.rs:492:27:492:35 | vs.iter(...) | main.rs:492:27:492:35 | receiver for vs.iter(...) | | main.rs:492:27:492:45 | ... .collect(...) | main.rs:492:9:492:11 | vs2 | | main.rs:493:10:493:10 | [SSA] v | main.rs:494:14:494:14 | v | | main.rs:493:10:493:10 | v | main.rs:493:10:493:10 | [SSA] v | | main.rs:493:10:493:10 | v | main.rs:493:10:493:10 | v | +| main.rs:497:5:497:6 | [SSA] vs | main.rs:498:5:498:6 | [SSA] vs | +| main.rs:497:5:497:6 | [SSA] vs | main.rs:498:5:498:6 | vs | +| main.rs:497:5:497:6 | [post] receiver for vs | main.rs:497:5:497:6 | [post] vs | +| main.rs:497:5:497:6 | [post] vs | main.rs:498:5:498:6 | [SSA] vs | | main.rs:497:5:497:6 | [post] vs | main.rs:498:5:498:6 | vs | +| main.rs:497:5:497:6 | vs | main.rs:497:5:497:6 | receiver for vs | +| main.rs:497:5:497:6 | vs | main.rs:498:5:498:6 | [SSA] vs | | main.rs:497:5:497:6 | vs | main.rs:498:5:498:6 | vs | +| main.rs:497:5:497:13 | [post] receiver for vs.iter(...) | main.rs:497:5:497:13 | [post] vs.iter(...) | +| main.rs:497:5:497:13 | vs.iter(...) | main.rs:497:5:497:13 | receiver for vs.iter(...) | | main.rs:497:20:497:20 | ... | main.rs:497:20:497:20 | x | | main.rs:497:20:497:20 | [SSA] x | main.rs:497:29:497:29 | x | | main.rs:497:20:497:20 | x | main.rs:497:20:497:20 | [SSA] x | | main.rs:497:20:497:20 | x | main.rs:497:20:497:20 | x | +| main.rs:498:5:498:6 | [SSA] vs | main.rs:500:14:500:15 | vs | +| main.rs:498:5:498:6 | [post] receiver for vs | main.rs:498:5:498:6 | [post] vs | | main.rs:498:5:498:6 | [post] vs | main.rs:500:14:500:15 | vs | +| main.rs:498:5:498:6 | vs | main.rs:498:5:498:6 | receiver for vs | | main.rs:498:5:498:6 | vs | main.rs:500:14:500:15 | vs | +| main.rs:498:5:498:13 | [post] receiver for vs.iter(...) | main.rs:498:5:498:13 | [post] vs.iter(...) | +| main.rs:498:5:498:13 | vs.iter(...) | main.rs:498:5:498:13 | receiver for vs.iter(...) | | main.rs:498:25:498:25 | ... | main.rs:498:25:498:25 | x | | main.rs:498:25:498:25 | [SSA] x | main.rs:498:34:498:34 | x | | main.rs:498:25:498:25 | x | main.rs:498:25:498:25 | [SSA] x | @@ -713,12 +828,43 @@ localStep | main.rs:500:9:500:9 | [SSA] v | main.rs:501:14:501:14 | v | | main.rs:500:9:500:9 | v | main.rs:500:9:500:9 | [SSA] v | | main.rs:500:9:500:9 | v | main.rs:500:9:500:9 | v | +| main.rs:500:14:500:15 | [post] receiver for vs | main.rs:500:14:500:15 | [post] vs | +| main.rs:500:14:500:15 | vs | main.rs:500:14:500:15 | receiver for vs | | main.rs:504:9:504:18 | mut vs_mut | main.rs:504:13:504:18 | vs_mut | +| main.rs:504:13:504:18 | [SSA] vs_mut | main.rs:506:10:506:15 | vs_mut | +| main.rs:504:13:504:18 | vs_mut | main.rs:504:13:504:18 | [SSA] vs_mut | | main.rs:504:22:504:42 | [...] | main.rs:504:9:504:18 | mut vs_mut | +| main.rs:506:10:506:15 | [post] vs_mut | main.rs:507:11:507:16 | [SSA] vs_mut | +| main.rs:506:10:506:15 | [post] vs_mut | main.rs:507:11:507:16 | vs_mut | +| main.rs:506:10:506:15 | vs_mut | main.rs:507:11:507:16 | [SSA] vs_mut | +| main.rs:506:10:506:15 | vs_mut | main.rs:507:11:507:16 | vs_mut | +| main.rs:507:11:507:16 | [SSA] vs_mut | main.rs:508:11:508:16 | [SSA] vs_mut | +| main.rs:507:11:507:16 | [SSA] vs_mut | main.rs:508:11:508:16 | vs_mut | +| main.rs:507:11:507:16 | [post] receiver for vs_mut | main.rs:507:11:507:16 | [post] vs_mut | +| main.rs:507:11:507:16 | [post] vs_mut | main.rs:508:11:508:16 | [SSA] vs_mut | +| main.rs:507:11:507:16 | [post] vs_mut | main.rs:508:11:508:16 | vs_mut | +| main.rs:507:11:507:16 | vs_mut | main.rs:507:11:507:16 | receiver for vs_mut | +| main.rs:507:11:507:16 | vs_mut | main.rs:508:11:508:16 | [SSA] vs_mut | +| main.rs:507:11:507:16 | vs_mut | main.rs:508:11:508:16 | vs_mut | +| main.rs:507:11:507:23 | [post] receiver for vs_mut.iter(...) | main.rs:507:11:507:23 | [post] vs_mut.iter(...) | +| main.rs:507:11:507:23 | vs_mut.iter(...) | main.rs:507:11:507:23 | receiver for vs_mut.iter(...) | +| main.rs:507:11:507:30 | ... .next(...) | main.rs:507:11:507:30 | receiver for ... .next(...) | +| main.rs:507:11:507:30 | [post] receiver for ... .next(...) | main.rs:507:11:507:30 | [post] ... .next(...) | +| main.rs:508:11:508:16 | [SSA] vs_mut | main.rs:510:19:510:24 | vs_mut | +| main.rs:508:11:508:16 | [post] receiver for vs_mut | main.rs:508:11:508:16 | [post] vs_mut | +| main.rs:508:11:508:16 | [post] vs_mut | main.rs:510:19:510:24 | vs_mut | +| main.rs:508:11:508:16 | vs_mut | main.rs:508:11:508:16 | receiver for vs_mut | +| main.rs:508:11:508:16 | vs_mut | main.rs:510:19:510:24 | vs_mut | +| main.rs:508:11:508:23 | [post] receiver for vs_mut.iter(...) | main.rs:508:11:508:23 | [post] vs_mut.iter(...) | +| main.rs:508:11:508:23 | vs_mut.iter(...) | main.rs:508:11:508:23 | receiver for vs_mut.iter(...) | +| main.rs:508:11:508:30 | ... .nth(...) | main.rs:508:11:508:30 | receiver for ... .nth(...) | +| main.rs:508:11:508:30 | [post] receiver for ... .nth(...) | main.rs:508:11:508:30 | [post] ... .nth(...) | | main.rs:510:5:512:5 | for ... in ... { ... } | main.rs:478:16:513:1 | { ... } | | main.rs:510:14:510:14 | [SSA] v | main.rs:511:14:511:14 | v | | main.rs:510:14:510:14 | v | main.rs:510:14:510:14 | [SSA] v | | main.rs:510:14:510:14 | v | main.rs:510:14:510:14 | v | +| main.rs:510:19:510:24 | [post] receiver for vs_mut | main.rs:510:19:510:24 | [post] vs_mut | +| main.rs:510:19:510:24 | vs_mut | main.rs:510:19:510:24 | receiver for vs_mut | | main.rs:516:9:516:9 | [SSA] a | main.rs:521:10:521:10 | a | | main.rs:516:9:516:9 | a | main.rs:516:9:516:9 | [SSA] a | | main.rs:516:9:516:9 | a | main.rs:516:9:516:9 | a | @@ -2823,16 +2969,33 @@ readStep | main.rs:221:9:221:23 | ...::Some(...) | Some | main.rs:221:22:221:22 | n | | main.rs:230:9:230:15 | Some(...) | Some | main.rs:230:14:230:14 | n | | main.rs:234:9:234:15 | Some(...) | Some | main.rs:234:14:234:14 | n | +| main.rs:241:10:241:11 | s1 | &ref | main.rs:241:10:241:11 | receiver for s1 | +| main.rs:246:10:246:11 | s1 | &ref | main.rs:246:10:246:11 | receiver for s1 | +| main.rs:249:10:249:11 | s2 | &ref | main.rs:249:10:249:11 | receiver for s2 | +| main.rs:254:10:254:11 | s1 | &ref | main.rs:254:10:254:11 | receiver for s1 | +| main.rs:257:10:257:11 | s2 | &ref | main.rs:257:10:257:11 | receiver for s2 | | main.rs:263:14:263:15 | s1 | Ok | main.rs:263:14:263:16 | TryExpr | | main.rs:263:14:263:15 | s1 | Some | main.rs:263:14:263:16 | TryExpr | | main.rs:265:10:265:11 | s2 | Ok | main.rs:265:10:265:12 | TryExpr | | main.rs:265:10:265:11 | s2 | Some | main.rs:265:10:265:12 | TryExpr | +| main.rs:271:29:271:30 | r1 | &ref | main.rs:271:29:271:30 | receiver for r1 | +| main.rs:272:29:272:30 | r1 | &ref | main.rs:272:29:272:30 | receiver for r1 | +| main.rs:273:10:273:12 | o1a | &ref | main.rs:273:10:273:12 | receiver for o1a | +| main.rs:274:10:274:12 | o1b | &ref | main.rs:274:10:274:12 | receiver for o1b | +| main.rs:277:29:277:30 | r2 | &ref | main.rs:277:29:277:30 | receiver for r2 | +| main.rs:278:29:278:30 | r2 | &ref | main.rs:278:29:278:30 | receiver for r2 | +| main.rs:279:10:279:12 | o2a | &ref | main.rs:279:10:279:12 | receiver for o2a | +| main.rs:280:10:280:12 | o2b | &ref | main.rs:280:10:280:12 | receiver for o2b | | main.rs:287:14:287:15 | s1 | Ok | main.rs:287:14:287:16 | TryExpr | | main.rs:287:14:287:15 | s1 | Some | main.rs:287:14:287:16 | TryExpr | | main.rs:288:14:288:15 | s2 | Ok | main.rs:288:14:288:16 | TryExpr | | main.rs:288:14:288:15 | s2 | Some | main.rs:288:14:288:16 | TryExpr | | main.rs:291:14:291:15 | s3 | Ok | main.rs:291:14:291:16 | TryExpr | | main.rs:291:14:291:15 | s3 | Some | main.rs:291:14:291:16 | TryExpr | +| main.rs:298:10:298:11 | s1 | &ref | main.rs:298:10:298:11 | receiver for s1 | +| main.rs:299:10:299:11 | s1 | &ref | main.rs:299:10:299:11 | receiver for s1 | +| main.rs:302:10:302:11 | s2 | &ref | main.rs:302:10:302:11 | receiver for s2 | +| main.rs:303:10:303:11 | s2 | &ref | main.rs:303:10:303:11 | receiver for s2 | | main.rs:315:9:315:25 | ...::A(...) | A | main.rs:315:24:315:24 | n | | main.rs:316:9:316:25 | ...::B(...) | B | main.rs:316:24:316:24 | n | | main.rs:319:9:319:25 | ...::A(...) | A | main.rs:319:24:319:24 | n | @@ -2872,22 +3035,38 @@ readStep | main.rs:442:9:442:20 | TuplePat | tuple.0 | main.rs:442:10:442:13 | cond | | main.rs:442:9:442:20 | TuplePat | tuple.1 | main.rs:442:16:442:19 | name | | main.rs:442:25:442:29 | names | element | main.rs:442:9:442:20 | TuplePat | +| main.rs:444:21:444:24 | name | &ref | main.rs:444:21:444:24 | receiver for name | | main.rs:444:41:444:67 | [post] \|...\| ... | captured default_name | main.rs:444:41:444:67 | [post] default_name | +| main.rs:444:44:444:55 | default_name | &ref | main.rs:444:44:444:55 | receiver for default_name | | main.rs:444:44:444:55 | this | captured default_name | main.rs:444:44:444:55 | default_name | +| main.rs:445:18:445:18 | n | &ref | main.rs:445:18:445:18 | receiver for n | +| main.rs:468:13:468:13 | a | &ref | main.rs:468:13:468:13 | receiver for a | +| main.rs:469:13:469:13 | b | &ref | main.rs:469:13:469:13 | receiver for b | +| main.rs:470:19:470:19 | b | &ref | main.rs:470:19:470:19 | receiver for b | | main.rs:481:10:481:11 | vs | element | main.rs:481:10:481:14 | vs[0] | +| main.rs:482:11:482:12 | vs | &ref | main.rs:482:11:482:12 | receiver for vs | | main.rs:482:11:482:35 | ... .unwrap(...) | &ref | main.rs:482:10:482:35 | * ... | +| main.rs:483:11:483:12 | vs | &ref | main.rs:483:11:483:12 | receiver for vs | | main.rs:483:11:483:35 | ... .unwrap(...) | &ref | main.rs:483:10:483:35 | * ... | | main.rs:485:14:485:15 | vs | element | main.rs:485:9:485:9 | v | | main.rs:488:9:488:10 | &... | &ref | main.rs:488:10:488:10 | v | +| main.rs:488:15:488:16 | vs | &ref | main.rs:488:15:488:16 | receiver for vs | | main.rs:488:15:488:23 | vs.iter(...) | element | main.rs:488:9:488:10 | &... | +| main.rs:492:27:492:28 | vs | &ref | main.rs:492:27:492:28 | receiver for vs | | main.rs:493:9:493:10 | &... | &ref | main.rs:493:10:493:10 | v | | main.rs:493:15:493:17 | vs2 | element | main.rs:493:9:493:10 | &... | +| main.rs:497:5:497:6 | vs | &ref | main.rs:497:5:497:6 | receiver for vs | | main.rs:497:29:497:29 | x | &ref | main.rs:497:28:497:29 | * ... | +| main.rs:498:5:498:6 | vs | &ref | main.rs:498:5:498:6 | receiver for vs | | main.rs:498:34:498:34 | x | &ref | main.rs:498:33:498:34 | * ... | +| main.rs:500:14:500:15 | vs | &ref | main.rs:500:14:500:15 | receiver for vs | | main.rs:500:14:500:27 | vs.into_iter(...) | element | main.rs:500:9:500:9 | v | | main.rs:506:10:506:15 | vs_mut | element | main.rs:506:10:506:18 | vs_mut[0] | +| main.rs:507:11:507:16 | vs_mut | &ref | main.rs:507:11:507:16 | receiver for vs_mut | | main.rs:507:11:507:39 | ... .unwrap(...) | &ref | main.rs:507:10:507:39 | * ... | +| main.rs:508:11:508:16 | vs_mut | &ref | main.rs:508:11:508:16 | receiver for vs_mut | | main.rs:508:11:508:39 | ... .unwrap(...) | &ref | main.rs:508:10:508:39 | * ... | | main.rs:510:9:510:14 | &mut ... | &ref | main.rs:510:14:510:14 | v | +| main.rs:510:19:510:24 | vs_mut | &ref | main.rs:510:19:510:24 | receiver for vs_mut | | main.rs:510:19:510:35 | vs_mut.iter_mut(...) | element | main.rs:510:9:510:14 | &mut ... | | main.rs:524:11:524:15 | c_ref | &ref | main.rs:524:10:524:15 | * ... | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index f0febc3b71d6..47018a54719c 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -79,19 +79,16 @@ edges | main.rs:229:11:229:12 | s1 [Some] | main.rs:230:9:230:15 | Some(...) [Some] | provenance | | | main.rs:230:9:230:15 | Some(...) [Some] | main.rs:230:14:230:14 | n | provenance | | | main.rs:230:14:230:14 | n | main.rs:230:25:230:25 | n | provenance | | -| main.rs:240:9:240:10 | s1 [Some] | main.rs:241:10:241:11 | s1 [Some] | provenance | | +| main.rs:240:9:240:10 | s1 [Some] | main.rs:241:10:241:20 | s1.unwrap(...) | provenance | MaD:1 | | main.rs:240:14:240:29 | Some(...) [Some] | main.rs:240:9:240:10 | s1 [Some] | provenance | | | main.rs:240:19:240:28 | source(...) | main.rs:240:14:240:29 | Some(...) [Some] | provenance | | -| main.rs:241:10:241:11 | s1 [Some] | main.rs:241:10:241:20 | s1.unwrap(...) | provenance | MaD:1 | -| main.rs:245:9:245:10 | s1 [Some] | main.rs:246:10:246:11 | s1 [Some] | provenance | | +| main.rs:245:9:245:10 | s1 [Some] | main.rs:246:10:246:24 | s1.unwrap_or(...) | provenance | MaD:3 | | main.rs:245:14:245:29 | Some(...) [Some] | main.rs:245:9:245:10 | s1 [Some] | provenance | | | main.rs:245:19:245:28 | source(...) | main.rs:245:14:245:29 | Some(...) [Some] | provenance | | -| main.rs:246:10:246:11 | s1 [Some] | main.rs:246:10:246:24 | s1.unwrap_or(...) | provenance | MaD:3 | | main.rs:249:23:249:32 | source(...) | main.rs:249:10:249:33 | s2.unwrap_or(...) | provenance | MaD:2 | -| main.rs:253:9:253:10 | s1 [Some] | main.rs:254:10:254:11 | s1 [Some] | provenance | | +| main.rs:253:9:253:10 | s1 [Some] | main.rs:254:10:254:32 | s1.unwrap_or_else(...) | provenance | MaD:5 | | main.rs:253:14:253:29 | Some(...) [Some] | main.rs:253:9:253:10 | s1 [Some] | provenance | | | main.rs:253:19:253:28 | source(...) | main.rs:253:14:253:29 | Some(...) [Some] | provenance | | -| main.rs:254:10:254:11 | s1 [Some] | main.rs:254:10:254:32 | s1.unwrap_or_else(...) | provenance | MaD:5 | | main.rs:257:31:257:40 | source(...) | main.rs:257:10:257:41 | s2.unwrap_or_else(...) | provenance | MaD:4 | | main.rs:261:9:261:10 | s1 [Some] | main.rs:263:14:263:15 | s1 [Some] | provenance | | | main.rs:261:14:261:29 | Some(...) [Some] | main.rs:261:9:261:10 | s1 [Some] | provenance | | @@ -99,34 +96,28 @@ edges | main.rs:263:9:263:10 | i1 | main.rs:264:10:264:11 | i1 | provenance | | | main.rs:263:14:263:15 | s1 [Some] | main.rs:263:14:263:16 | TryExpr | provenance | | | main.rs:263:14:263:16 | TryExpr | main.rs:263:9:263:10 | i1 | provenance | | -| main.rs:270:9:270:10 | r1 [Ok] | main.rs:271:29:271:30 | r1 [Ok] | provenance | | +| main.rs:270:9:270:10 | r1 [Ok] | main.rs:271:29:271:35 | r1.ok(...) [Some] | provenance | MaD:9 | | main.rs:270:33:270:46 | Ok(...) [Ok] | main.rs:270:9:270:10 | r1 [Ok] | provenance | | | main.rs:270:36:270:45 | source(...) | main.rs:270:33:270:46 | Ok(...) [Ok] | provenance | | -| main.rs:271:9:271:11 | o1a [Some] | main.rs:273:10:273:12 | o1a [Some] | provenance | | -| main.rs:271:29:271:30 | r1 [Ok] | main.rs:271:29:271:35 | r1.ok(...) [Some] | provenance | MaD:9 | +| main.rs:271:9:271:11 | o1a [Some] | main.rs:273:10:273:21 | o1a.unwrap(...) | provenance | MaD:1 | | main.rs:271:29:271:35 | r1.ok(...) [Some] | main.rs:271:9:271:11 | o1a [Some] | provenance | | -| main.rs:273:10:273:12 | o1a [Some] | main.rs:273:10:273:21 | o1a.unwrap(...) | provenance | MaD:1 | -| main.rs:276:9:276:10 | r2 [Err] | main.rs:278:29:278:30 | r2 [Err] | provenance | | +| main.rs:276:9:276:10 | r2 [Err] | main.rs:278:29:278:36 | r2.err(...) [Some] | provenance | MaD:6 | | main.rs:276:33:276:47 | Err(...) [Err] | main.rs:276:9:276:10 | r2 [Err] | provenance | | | main.rs:276:37:276:46 | source(...) | main.rs:276:33:276:47 | Err(...) [Err] | provenance | | -| main.rs:278:9:278:11 | o2b [Some] | main.rs:280:10:280:12 | o2b [Some] | provenance | | -| main.rs:278:29:278:30 | r2 [Err] | main.rs:278:29:278:36 | r2.err(...) [Some] | provenance | MaD:6 | +| main.rs:278:9:278:11 | o2b [Some] | main.rs:280:10:280:21 | o2b.unwrap(...) | provenance | MaD:1 | | main.rs:278:29:278:36 | r2.err(...) [Some] | main.rs:278:9:278:11 | o2b [Some] | provenance | | -| main.rs:280:10:280:12 | o2b [Some] | main.rs:280:10:280:21 | o2b.unwrap(...) | provenance | MaD:1 | | main.rs:284:9:284:10 | s1 [Ok] | main.rs:287:14:287:15 | s1 [Ok] | provenance | | | main.rs:284:32:284:45 | Ok(...) [Ok] | main.rs:284:9:284:10 | s1 [Ok] | provenance | | | main.rs:284:35:284:44 | source(...) | main.rs:284:32:284:45 | Ok(...) [Ok] | provenance | | | main.rs:287:9:287:10 | i1 | main.rs:289:10:289:11 | i1 | provenance | | | main.rs:287:14:287:15 | s1 [Ok] | main.rs:287:14:287:16 | TryExpr | provenance | | | main.rs:287:14:287:16 | TryExpr | main.rs:287:9:287:10 | i1 | provenance | | -| main.rs:297:9:297:10 | s1 [Ok] | main.rs:298:10:298:11 | s1 [Ok] | provenance | | +| main.rs:297:9:297:10 | s1 [Ok] | main.rs:298:10:298:22 | s1.expect(...) | provenance | MaD:7 | | main.rs:297:32:297:45 | Ok(...) [Ok] | main.rs:297:9:297:10 | s1 [Ok] | provenance | | | main.rs:297:35:297:44 | source(...) | main.rs:297:32:297:45 | Ok(...) [Ok] | provenance | | -| main.rs:298:10:298:11 | s1 [Ok] | main.rs:298:10:298:22 | s1.expect(...) | provenance | MaD:7 | -| main.rs:301:9:301:10 | s2 [Err] | main.rs:303:10:303:11 | s2 [Err] | provenance | | +| main.rs:301:9:301:10 | s2 [Err] | main.rs:303:10:303:26 | s2.expect_err(...) | provenance | MaD:8 | | main.rs:301:32:301:46 | Err(...) [Err] | main.rs:301:9:301:10 | s2 [Err] | provenance | | | main.rs:301:36:301:45 | source(...) | main.rs:301:32:301:46 | Err(...) [Err] | provenance | | -| main.rs:303:10:303:11 | s2 [Err] | main.rs:303:10:303:26 | s2.expect_err(...) | provenance | MaD:8 | | main.rs:312:9:312:10 | s1 [A] | main.rs:314:11:314:12 | s1 [A] | provenance | | | main.rs:312:14:312:39 | ...::A(...) [A] | main.rs:312:9:312:10 | s1 [A] | provenance | | | main.rs:312:29:312:38 | source(...) | main.rs:312:14:312:39 | ...::A(...) [A] | provenance | | @@ -212,6 +203,10 @@ edges | main.rs:481:10:481:11 | vs [element] | main.rs:481:10:481:14 | vs[0] | provenance | | | main.rs:485:9:485:9 | v | main.rs:486:14:486:14 | v | provenance | | | main.rs:485:14:485:15 | vs [element] | main.rs:485:9:485:9 | v | provenance | | +| main.rs:504:9:504:18 | mut vs_mut [element] | main.rs:506:10:506:15 | vs_mut [element] | provenance | | +| main.rs:504:22:504:42 | [...] [element] | main.rs:504:9:504:18 | mut vs_mut [element] | provenance | | +| main.rs:504:23:504:32 | source(...) | main.rs:504:22:504:42 | [...] [element] | provenance | | +| main.rs:506:10:506:15 | vs_mut [element] | main.rs:506:10:506:18 | vs_mut[0] | provenance | | | main.rs:516:9:516:9 | a | main.rs:521:10:521:10 | a | provenance | | | main.rs:516:13:516:22 | source(...) | main.rs:516:9:516:9 | a | provenance | | | main.rs:518:9:518:9 | c | main.rs:519:18:519:18 | c | provenance | | @@ -310,19 +305,16 @@ nodes | main.rs:240:9:240:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:240:14:240:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:240:19:240:28 | source(...) | semmle.label | source(...) | -| main.rs:241:10:241:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:241:10:241:20 | s1.unwrap(...) | semmle.label | s1.unwrap(...) | | main.rs:245:9:245:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:245:14:245:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:245:19:245:28 | source(...) | semmle.label | source(...) | -| main.rs:246:10:246:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:246:10:246:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | | main.rs:249:10:249:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | | main.rs:249:23:249:32 | source(...) | semmle.label | source(...) | | main.rs:253:9:253:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:253:14:253:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:253:19:253:28 | source(...) | semmle.label | source(...) | -| main.rs:254:10:254:11 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:254:10:254:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | | main.rs:257:10:257:41 | s2.unwrap_or_else(...) | semmle.label | s2.unwrap_or_else(...) | | main.rs:257:31:257:40 | source(...) | semmle.label | source(...) | @@ -337,17 +329,13 @@ nodes | main.rs:270:33:270:46 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | | main.rs:270:36:270:45 | source(...) | semmle.label | source(...) | | main.rs:271:9:271:11 | o1a [Some] | semmle.label | o1a [Some] | -| main.rs:271:29:271:30 | r1 [Ok] | semmle.label | r1 [Ok] | | main.rs:271:29:271:35 | r1.ok(...) [Some] | semmle.label | r1.ok(...) [Some] | -| main.rs:273:10:273:12 | o1a [Some] | semmle.label | o1a [Some] | | main.rs:273:10:273:21 | o1a.unwrap(...) | semmle.label | o1a.unwrap(...) | | main.rs:276:9:276:10 | r2 [Err] | semmle.label | r2 [Err] | | main.rs:276:33:276:47 | Err(...) [Err] | semmle.label | Err(...) [Err] | | main.rs:276:37:276:46 | source(...) | semmle.label | source(...) | | main.rs:278:9:278:11 | o2b [Some] | semmle.label | o2b [Some] | -| main.rs:278:29:278:30 | r2 [Err] | semmle.label | r2 [Err] | | main.rs:278:29:278:36 | r2.err(...) [Some] | semmle.label | r2.err(...) [Some] | -| main.rs:280:10:280:12 | o2b [Some] | semmle.label | o2b [Some] | | main.rs:280:10:280:21 | o2b.unwrap(...) | semmle.label | o2b.unwrap(...) | | main.rs:284:9:284:10 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:284:32:284:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | @@ -359,12 +347,10 @@ nodes | main.rs:297:9:297:10 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:297:32:297:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | | main.rs:297:35:297:44 | source(...) | semmle.label | source(...) | -| main.rs:298:10:298:11 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:298:10:298:22 | s1.expect(...) | semmle.label | s1.expect(...) | | main.rs:301:9:301:10 | s2 [Err] | semmle.label | s2 [Err] | | main.rs:301:32:301:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | | main.rs:301:36:301:45 | source(...) | semmle.label | source(...) | -| main.rs:303:10:303:11 | s2 [Err] | semmle.label | s2 [Err] | | main.rs:303:10:303:26 | s2.expect_err(...) | semmle.label | s2.expect_err(...) | | main.rs:312:9:312:10 | s1 [A] | semmle.label | s1 [A] | | main.rs:312:14:312:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | @@ -463,6 +449,11 @@ nodes | main.rs:485:9:485:9 | v | semmle.label | v | | main.rs:485:14:485:15 | vs [element] | semmle.label | vs [element] | | main.rs:486:14:486:14 | v | semmle.label | v | +| main.rs:504:9:504:18 | mut vs_mut [element] | semmle.label | mut vs_mut [element] | +| main.rs:504:22:504:42 | [...] [element] | semmle.label | [...] [element] | +| main.rs:504:23:504:32 | source(...) | semmle.label | source(...) | +| main.rs:506:10:506:15 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:506:10:506:18 | vs_mut[0] | semmle.label | vs_mut[0] | | main.rs:516:9:516:9 | a | semmle.label | a | | main.rs:516:13:516:22 | source(...) | semmle.label | source(...) | | main.rs:518:9:518:9 | c | semmle.label | c | @@ -523,5 +514,6 @@ testFailures | main.rs:472:10:472:10 | a | main.rs:467:13:467:22 | source(...) | main.rs:472:10:472:10 | a | $@ | main.rs:467:13:467:22 | source(...) | source(...) | | main.rs:481:10:481:14 | vs[0] | main.rs:479:15:479:24 | source(...) | main.rs:481:10:481:14 | vs[0] | $@ | main.rs:479:15:479:24 | source(...) | source(...) | | main.rs:486:14:486:14 | v | main.rs:479:15:479:24 | source(...) | main.rs:486:14:486:14 | v | $@ | main.rs:479:15:479:24 | source(...) | source(...) | +| main.rs:506:10:506:18 | vs_mut[0] | main.rs:504:23:504:32 | source(...) | main.rs:506:10:506:18 | vs_mut[0] | $@ | main.rs:504:23:504:32 | source(...) | source(...) | | main.rs:521:10:521:10 | a | main.rs:516:13:516:22 | source(...) | main.rs:521:10:521:10 | a | $@ | main.rs:516:13:516:22 | source(...) | source(...) | | main.rs:524:10:524:15 | * ... | main.rs:518:13:518:22 | source(...) | main.rs:524:10:524:15 | * ... | $@ | main.rs:518:13:518:22 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index 858773d1b306..b8622173b468 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -503,7 +503,7 @@ fn iterators() { let mut vs_mut = [source(92), 2, 3, 4]; - sink(vs_mut[0]); // $ MISSING: hasValueFlow=92 + sink(vs_mut[0]); // $ hasValueFlow=92 sink(*vs_mut.iter().next().unwrap()); // $ MISSING: hasValueFlow=92 sink(*vs_mut.iter().nth(0).unwrap()); // $ MISSING: hasValueFlow=92 diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected index 171e60a21292..2bfeb4dea738 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected @@ -7,41 +7,33 @@ models | 6 | Summary: lang:core; crate::ptr::read; Argument[0].Reference; ReturnValue; value | | 7 | Summary: lang:core; crate::ptr::write; Argument[1]; Argument[0].Reference; value | edges -| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:10 | a [Some] | provenance | | -| main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | | +| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:19 | a.unwrap(...) | provenance | MaD:2 | +| main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:21 | a.clone(...) [Some] | provenance | MaD:1 | +| main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:21 | a.clone(...) [Some] | provenance | generated | | main.rs:12:13:12:28 | Some(...) [Some] | main.rs:12:9:12:9 | a [Some] | provenance | | | main.rs:12:18:12:27 | source(...) | main.rs:12:13:12:28 | Some(...) [Some] | provenance | | -| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap(...) | provenance | MaD:2 | -| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:10 | b [Some] | provenance | | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone(...) [Some] | provenance | MaD:1 | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone(...) [Some] | provenance | generated | +| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:19 | b.unwrap(...) | provenance | MaD:2 | | main.rs:14:13:14:21 | a.clone(...) [Some] | main.rs:14:9:14:9 | b [Some] | provenance | | -| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap(...) | provenance | MaD:2 | -| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:10 | a [Ok] | provenance | | -| main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | | +| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap(...) | provenance | MaD:5 | +| main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:21 | a.clone(...) [Ok] | provenance | MaD:4 | +| main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:21 | a.clone(...) [Ok] | provenance | generated | | main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | | | main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | | -| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap(...) | provenance | MaD:5 | -| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:10 | b [Ok] | provenance | | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone(...) [Ok] | provenance | MaD:4 | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone(...) [Ok] | provenance | generated | +| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap(...) | provenance | MaD:5 | | main.rs:21:13:21:21 | a.clone(...) [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | | -| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap(...) | provenance | MaD:5 | | main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | | -| main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | | +| main.rs:26:9:26:9 | a | main.rs:28:13:28:21 | a.clone(...) | provenance | generated | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone(...) | provenance | generated | | main.rs:28:13:28:21 | a.clone(...) | main.rs:28:9:28:9 | b | provenance | | | main.rs:41:13:41:13 | w [Wrapper] | main.rs:42:15:42:15 | w [Wrapper] | provenance | | | main.rs:41:17:41:41 | Wrapper {...} [Wrapper] | main.rs:41:13:41:13 | w [Wrapper] | provenance | | | main.rs:41:30:41:39 | source(...) | main.rs:41:17:41:41 | Wrapper {...} [Wrapper] | provenance | | | main.rs:42:15:42:15 | w [Wrapper] | main.rs:43:13:43:28 | Wrapper {...} [Wrapper] | provenance | | -| main.rs:42:15:42:15 | w [Wrapper] | main.rs:45:17:45:17 | w [Wrapper] | provenance | | +| main.rs:42:15:42:15 | w [Wrapper] | main.rs:45:17:45:25 | w.clone(...) [Wrapper] | provenance | generated | | main.rs:43:13:43:28 | Wrapper {...} [Wrapper] | main.rs:43:26:43:26 | n | provenance | | | main.rs:43:26:43:26 | n | main.rs:43:38:43:38 | n | provenance | | | main.rs:45:13:45:13 | u [Wrapper] | main.rs:46:15:46:15 | u [Wrapper] | provenance | | -| main.rs:45:17:45:17 | w [Wrapper] | main.rs:45:17:45:25 | w.clone(...) [Wrapper] | provenance | generated | | main.rs:45:17:45:25 | w.clone(...) [Wrapper] | main.rs:45:13:45:13 | u [Wrapper] | provenance | | | main.rs:46:15:46:15 | u [Wrapper] | main.rs:47:13:47:28 | Wrapper {...} [Wrapper] | provenance | | | main.rs:47:13:47:28 | Wrapper {...} [Wrapper] | main.rs:47:26:47:26 | n | provenance | | @@ -63,28 +55,21 @@ nodes | main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] | | main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:12:18:12:27 | source(...) | semmle.label | source(...) | -| main.rs:13:10:13:10 | a [Some] | semmle.label | a [Some] | | main.rs:13:10:13:19 | a.unwrap(...) | semmle.label | a.unwrap(...) | | main.rs:14:9:14:9 | b [Some] | semmle.label | b [Some] | -| main.rs:14:13:14:13 | a [Some] | semmle.label | a [Some] | | main.rs:14:13:14:21 | a.clone(...) [Some] | semmle.label | a.clone(...) [Some] | -| main.rs:15:10:15:10 | b [Some] | semmle.label | b [Some] | | main.rs:15:10:15:19 | b.unwrap(...) | semmle.label | b.unwrap(...) | | main.rs:19:9:19:9 | a [Ok] | semmle.label | a [Ok] | | main.rs:19:31:19:44 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | | main.rs:19:34:19:43 | source(...) | semmle.label | source(...) | -| main.rs:20:10:20:10 | a [Ok] | semmle.label | a [Ok] | | main.rs:20:10:20:19 | a.unwrap(...) | semmle.label | a.unwrap(...) | | main.rs:21:9:21:9 | b [Ok] | semmle.label | b [Ok] | -| main.rs:21:13:21:13 | a [Ok] | semmle.label | a [Ok] | | main.rs:21:13:21:21 | a.clone(...) [Ok] | semmle.label | a.clone(...) [Ok] | -| main.rs:22:10:22:10 | b [Ok] | semmle.label | b [Ok] | | main.rs:22:10:22:19 | b.unwrap(...) | semmle.label | b.unwrap(...) | | main.rs:26:9:26:9 | a | semmle.label | a | | main.rs:26:13:26:22 | source(...) | semmle.label | source(...) | | main.rs:27:10:27:10 | a | semmle.label | a | | main.rs:28:9:28:9 | b | semmle.label | b | -| main.rs:28:13:28:13 | a | semmle.label | a | | main.rs:28:13:28:21 | a.clone(...) | semmle.label | a.clone(...) | | main.rs:29:10:29:10 | b | semmle.label | b | | main.rs:41:13:41:13 | w [Wrapper] | semmle.label | w [Wrapper] | @@ -95,7 +80,6 @@ nodes | main.rs:43:26:43:26 | n | semmle.label | n | | main.rs:43:38:43:38 | n | semmle.label | n | | main.rs:45:13:45:13 | u [Wrapper] | semmle.label | u [Wrapper] | -| main.rs:45:17:45:17 | w [Wrapper] | semmle.label | w [Wrapper] | | main.rs:45:17:45:25 | w.clone(...) [Wrapper] | semmle.label | w.clone(...) [Wrapper] | | main.rs:46:15:46:15 | u [Wrapper] | semmle.label | u [Wrapper] | | main.rs:47:13:47:28 | Wrapper {...} [Wrapper] | semmle.label | Wrapper {...} [Wrapper] | diff --git a/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected b/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected index 66d5c1ad666a..450d33d39986 100644 --- a/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/pointers/inline-flow.expected @@ -1,154 +1,301 @@ models edges -| main.rs:13:9:13:9 | a | main.rs:14:14:14:14 | a | provenance | | -| main.rs:13:13:13:22 | source(...) | main.rs:13:9:13:9 | a | provenance | | -| main.rs:14:9:14:9 | b [&ref] | main.rs:15:14:15:14 | b [&ref] | provenance | | -| main.rs:14:13:14:14 | &a [&ref] | main.rs:14:9:14:9 | b [&ref] | provenance | | -| main.rs:14:14:14:14 | a | main.rs:14:13:14:14 | &a [&ref] | provenance | | -| main.rs:15:9:15:9 | c | main.rs:16:10:16:10 | c | provenance | | -| main.rs:15:13:15:14 | * ... | main.rs:15:9:15:9 | c | provenance | | -| main.rs:15:14:15:14 | b [&ref] | main.rs:15:13:15:14 | * ... | provenance | | -| main.rs:31:6:31:6 | [post] b [&ref] | main.rs:32:11:32:11 | b [&ref] | provenance | | -| main.rs:31:10:31:19 | source(...) | main.rs:31:6:31:6 | [post] b [&ref] | provenance | | -| main.rs:32:11:32:11 | b [&ref] | main.rs:32:10:32:11 | * ... | provenance | | -| main.rs:37:25:37:26 | &... [&ref] | main.rs:37:26:37:26 | n | provenance | | -| main.rs:37:25:37:32 | ...: ... [&ref] | main.rs:37:25:37:26 | &... [&ref] | provenance | | -| main.rs:37:26:37:26 | n | main.rs:38:10:38:10 | n | provenance | | -| main.rs:42:9:42:11 | val | main.rs:43:27:43:29 | val | provenance | | -| main.rs:42:15:42:24 | source(...) | main.rs:42:9:42:11 | val | provenance | | -| main.rs:43:26:43:29 | &val [&ref] | main.rs:37:25:37:32 | ...: ... [&ref] | provenance | | -| main.rs:43:27:43:29 | val | main.rs:43:26:43:29 | &val [&ref] | provenance | | -| main.rs:50:13:50:13 | a | main.rs:51:13:51:17 | ref p | provenance | | -| main.rs:50:17:50:26 | source(...) | main.rs:50:13:50:13 | a | provenance | | -| main.rs:51:13:51:17 | ref p | main.rs:51:17:51:17 | p [&ref] | provenance | | -| main.rs:51:17:51:17 | p [&ref] | main.rs:52:15:52:15 | p [&ref] | provenance | | -| main.rs:52:15:52:15 | p [&ref] | main.rs:52:14:52:15 | * ... | provenance | | -| main.rs:56:13:56:21 | ref mut a | main.rs:56:21:56:21 | a [&ref] | provenance | | -| main.rs:56:21:56:21 | a [&ref] | main.rs:57:15:57:15 | a [&ref] | provenance | | -| main.rs:56:25:56:34 | source(...) | main.rs:56:13:56:21 | ref mut a | provenance | | -| main.rs:57:15:57:15 | a [&ref] | main.rs:57:14:57:15 | * ... | provenance | | -| main.rs:63:13:63:13 | a [Some] | main.rs:64:23:64:23 | a [Some] | provenance | | -| main.rs:63:17:63:32 | Some(...) [Some] | main.rs:63:13:63:13 | a [Some] | provenance | | -| main.rs:63:22:63:31 | source(...) | main.rs:63:17:63:32 | Some(...) [Some] | provenance | | -| main.rs:64:23:64:23 | a [Some] | main.rs:65:13:65:23 | Some(...) [Some] | provenance | | -| main.rs:65:13:65:23 | Some(...) [Some] | main.rs:65:18:65:22 | ref p | provenance | | -| main.rs:65:18:65:22 | ref p | main.rs:65:22:65:22 | p [&ref] | provenance | | -| main.rs:65:22:65:22 | p [&ref] | main.rs:65:34:65:34 | p [&ref] | provenance | | -| main.rs:65:34:65:34 | p [&ref] | main.rs:65:33:65:34 | * ... | provenance | | -| main.rs:76:18:76:21 | SelfParam [MyNumber] | main.rs:77:15:77:18 | self [MyNumber] | provenance | | -| main.rs:77:15:77:18 | self [MyNumber] | main.rs:78:13:78:38 | ...::MyNumber(...) [MyNumber] | provenance | | -| main.rs:78:13:78:38 | ...::MyNumber(...) [MyNumber] | main.rs:78:32:78:37 | number | provenance | | -| main.rs:78:32:78:37 | number | main.rs:76:31:80:5 | { ... } | provenance | | -| main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | main.rs:83:15:83:18 | self [&ref, MyNumber] | provenance | | -| main.rs:83:15:83:18 | self [&ref, MyNumber] | main.rs:84:13:84:39 | &... [&ref, MyNumber] | provenance | | -| main.rs:84:13:84:39 | &... [&ref, MyNumber] | main.rs:84:14:84:39 | ...::MyNumber(...) [MyNumber] | provenance | | -| main.rs:84:14:84:39 | ...::MyNumber(...) [MyNumber] | main.rs:84:33:84:38 | number | provenance | | -| main.rs:84:33:84:38 | number | main.rs:82:33:86:5 | { ... } | provenance | | -| main.rs:90:9:90:17 | my_number [MyNumber] | main.rs:91:10:91:18 | my_number [MyNumber] | provenance | | -| main.rs:90:21:90:50 | ...::MyNumber(...) [MyNumber] | main.rs:90:9:90:17 | my_number [MyNumber] | provenance | | -| main.rs:90:40:90:49 | source(...) | main.rs:90:21:90:50 | ...::MyNumber(...) [MyNumber] | provenance | | -| main.rs:91:10:91:18 | my_number [MyNumber] | main.rs:76:18:76:21 | SelfParam [MyNumber] | provenance | | -| main.rs:91:10:91:18 | my_number [MyNumber] | main.rs:91:10:91:30 | my_number.to_number(...) | provenance | | -| main.rs:100:9:100:17 | my_number [&ref, MyNumber] | main.rs:101:10:101:18 | my_number [&ref, MyNumber] | provenance | | -| main.rs:100:21:100:51 | &... [&ref, MyNumber] | main.rs:100:9:100:17 | my_number [&ref, MyNumber] | provenance | | -| main.rs:100:22:100:51 | ...::MyNumber(...) [MyNumber] | main.rs:100:21:100:51 | &... [&ref, MyNumber] | provenance | | -| main.rs:100:41:100:50 | source(...) | main.rs:100:22:100:51 | ...::MyNumber(...) [MyNumber] | provenance | | -| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | provenance | | -| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | main.rs:101:10:101:31 | my_number.get_number(...) | provenance | | -| main.rs:105:9:105:9 | a [&ref, tuple.0] | main.rs:108:19:108:19 | a [&ref, tuple.0] | provenance | | -| main.rs:105:13:105:28 | &... [&ref, tuple.0] | main.rs:105:9:105:9 | a [&ref, tuple.0] | provenance | | -| main.rs:105:14:105:28 | TupleExpr [tuple.0] | main.rs:105:13:105:28 | &... [&ref, tuple.0] | provenance | | -| main.rs:105:15:105:24 | source(...) | main.rs:105:14:105:28 | TupleExpr [tuple.0] | provenance | | -| main.rs:108:9:108:9 | b | main.rs:111:10:111:10 | b | provenance | | -| main.rs:108:19:108:19 | a [&ref, tuple.0] | main.rs:109:9:109:15 | &... [&ref, tuple.0] | provenance | | -| main.rs:109:9:109:15 | &... [&ref, tuple.0] | main.rs:109:10:109:15 | TuplePat [tuple.0] | provenance | | -| main.rs:109:10:109:15 | TuplePat [tuple.0] | main.rs:109:11:109:11 | n | provenance | | -| main.rs:109:11:109:11 | n | main.rs:108:9:108:9 | b | provenance | | +| main.rs:17:13:17:13 | a | main.rs:18:18:18:18 | a | provenance | | +| main.rs:17:17:17:26 | source(...) | main.rs:17:13:17:13 | a | provenance | | +| main.rs:18:13:18:13 | b [&ref] | main.rs:19:18:19:18 | b [&ref] | provenance | | +| main.rs:18:17:18:18 | &a [&ref] | main.rs:18:13:18:13 | b [&ref] | provenance | | +| main.rs:18:18:18:18 | a | main.rs:18:17:18:18 | &a [&ref] | provenance | | +| main.rs:19:13:19:13 | c | main.rs:20:14:20:14 | c | provenance | | +| main.rs:19:17:19:18 | * ... | main.rs:19:13:19:13 | c | provenance | | +| main.rs:19:18:19:18 | b [&ref] | main.rs:19:17:19:18 | * ... | provenance | | +| main.rs:23:29:23:30 | &... [&ref] | main.rs:23:30:23:30 | n | provenance | | +| main.rs:23:29:23:36 | ...: ... [&ref] | main.rs:23:29:23:30 | &... [&ref] | provenance | | +| main.rs:23:30:23:30 | n | main.rs:24:14:24:14 | n | provenance | | +| main.rs:28:13:28:15 | val | main.rs:29:31:29:33 | val | provenance | | +| main.rs:28:19:28:28 | source(...) | main.rs:28:13:28:15 | val | provenance | | +| main.rs:29:30:29:33 | &val [&ref] | main.rs:23:29:23:36 | ...: ... [&ref] | provenance | | +| main.rs:29:31:29:33 | val | main.rs:29:30:29:33 | &val [&ref] | provenance | | +| main.rs:33:13:33:13 | a [&ref, tuple.0] | main.rs:36:23:36:23 | a [&ref, tuple.0] | provenance | | +| main.rs:33:17:33:32 | &... [&ref, tuple.0] | main.rs:33:13:33:13 | a [&ref, tuple.0] | provenance | | +| main.rs:33:18:33:32 | TupleExpr [tuple.0] | main.rs:33:17:33:32 | &... [&ref, tuple.0] | provenance | | +| main.rs:33:19:33:28 | source(...) | main.rs:33:18:33:32 | TupleExpr [tuple.0] | provenance | | +| main.rs:36:13:36:13 | b | main.rs:39:14:39:14 | b | provenance | | +| main.rs:36:23:36:23 | a [&ref, tuple.0] | main.rs:37:13:37:19 | &... [&ref, tuple.0] | provenance | | +| main.rs:37:13:37:19 | &... [&ref, tuple.0] | main.rs:37:14:37:19 | TuplePat [tuple.0] | provenance | | +| main.rs:37:14:37:19 | TuplePat [tuple.0] | main.rs:37:15:37:15 | n | provenance | | +| main.rs:37:15:37:15 | n | main.rs:36:13:36:13 | b | provenance | | +| main.rs:51:13:51:13 | a | main.rs:52:13:52:17 | ref p | provenance | | +| main.rs:51:17:51:26 | source(...) | main.rs:51:13:51:13 | a | provenance | | +| main.rs:52:13:52:17 | ref p | main.rs:52:17:52:17 | p [&ref] | provenance | | +| main.rs:52:17:52:17 | p [&ref] | main.rs:53:15:53:15 | p [&ref] | provenance | | +| main.rs:53:15:53:15 | p [&ref] | main.rs:53:14:53:15 | * ... | provenance | | +| main.rs:57:13:57:13 | a [Some] | main.rs:58:15:58:15 | a [Some] | provenance | | +| main.rs:57:17:57:32 | Some(...) [Some] | main.rs:57:13:57:13 | a [Some] | provenance | | +| main.rs:57:22:57:31 | source(...) | main.rs:57:17:57:32 | Some(...) [Some] | provenance | | +| main.rs:58:15:58:15 | a [Some] | main.rs:59:13:59:23 | Some(...) [Some] | provenance | | +| main.rs:59:13:59:23 | Some(...) [Some] | main.rs:59:18:59:22 | ref p | provenance | | +| main.rs:59:18:59:22 | ref p | main.rs:59:22:59:22 | p [&ref] | provenance | | +| main.rs:59:22:59:22 | p [&ref] | main.rs:59:34:59:34 | p [&ref] | provenance | | +| main.rs:59:34:59:34 | p [&ref] | main.rs:59:33:59:34 | * ... | provenance | | +| main.rs:73:10:73:10 | [post] b [&ref] | main.rs:74:15:74:15 | b [&ref] | provenance | | +| main.rs:73:14:73:23 | source(...) | main.rs:73:10:73:10 | [post] b [&ref] | provenance | | +| main.rs:74:15:74:15 | b [&ref] | main.rs:74:14:74:15 | * ... | provenance | | +| main.rs:105:10:105:10 | [post] c [&ref] | main.rs:106:15:106:15 | c [&ref] | provenance | | +| main.rs:105:14:105:23 | source(...) | main.rs:105:10:105:10 | [post] c [&ref] | provenance | | +| main.rs:106:15:106:15 | c [&ref] | main.rs:106:14:106:15 | * ... | provenance | | +| main.rs:112:13:112:21 | ref mut a | main.rs:112:21:112:21 | a [&ref] | provenance | | +| main.rs:112:21:112:21 | a [&ref] | main.rs:113:15:113:15 | a [&ref] | provenance | | +| main.rs:112:25:112:34 | source(...) | main.rs:112:13:112:21 | ref mut a | provenance | | +| main.rs:113:15:113:15 | a [&ref] | main.rs:113:14:113:15 | * ... | provenance | | +| main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | main.rs:150:11:150:11 | m [MyNumber] | provenance | | +| main.rs:150:11:150:11 | m [MyNumber] | main.rs:151:9:151:34 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:151:9:151:34 | ...::MyNumber(...) [MyNumber] | main.rs:151:28:151:33 | number | provenance | | +| main.rs:151:28:151:33 | number | main.rs:149:34:153:1 | { ... } | provenance | | +| main.rs:156:18:156:21 | SelfParam [MyNumber] | main.rs:157:15:157:18 | self [MyNumber] | provenance | | +| main.rs:157:15:157:18 | self [MyNumber] | main.rs:158:13:158:38 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:158:13:158:38 | ...::MyNumber(...) [MyNumber] | main.rs:158:32:158:37 | number | provenance | | +| main.rs:158:32:158:37 | number | main.rs:156:31:160:5 | { ... } | provenance | | +| main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:163:15:163:18 | self [&ref, MyNumber] | provenance | | +| main.rs:163:15:163:18 | self [&ref, MyNumber] | main.rs:164:13:164:39 | &... [&ref, MyNumber] | provenance | | +| main.rs:164:13:164:39 | &... [&ref, MyNumber] | main.rs:164:14:164:39 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:164:14:164:39 | ...::MyNumber(...) [MyNumber] | main.rs:164:33:164:38 | number | provenance | | +| main.rs:164:33:164:38 | number | main.rs:162:26:166:5 | { ... } | provenance | | +| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | provenance | | +| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:175:14:175:34 | my_number.to_number(...) | provenance | | +| main.rs:174:25:174:54 | ...::MyNumber(...) [MyNumber] | main.rs:174:13:174:21 | my_number [MyNumber] | provenance | | +| main.rs:174:44:174:53 | source(...) | main.rs:174:25:174:54 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:179:13:179:21 | my_number [MyNumber] | main.rs:180:16:180:24 | my_number [MyNumber] | provenance | | +| main.rs:179:25:179:54 | ...::MyNumber(...) [MyNumber] | main.rs:179:13:179:21 | my_number [MyNumber] | provenance | | +| main.rs:179:44:179:53 | source(...) | main.rs:179:25:179:54 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:180:15:180:24 | &my_number [&ref, MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | provenance | | +| main.rs:180:15:180:24 | &my_number [&ref, MyNumber] | main.rs:180:14:180:31 | ... .get(...) | provenance | | +| main.rs:180:16:180:24 | my_number [MyNumber] | main.rs:180:15:180:24 | &my_number [&ref, MyNumber] | provenance | | +| main.rs:184:13:184:21 | my_number [MyNumber] | main.rs:186:14:186:22 | my_number [MyNumber] | provenance | | +| main.rs:184:25:184:54 | ...::MyNumber(...) [MyNumber] | main.rs:184:13:184:21 | my_number [MyNumber] | provenance | | +| main.rs:184:44:184:53 | source(...) | main.rs:184:25:184:54 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:186:14:186:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | provenance | | +| main.rs:186:14:186:22 | my_number [MyNumber] | main.rs:186:14:186:28 | my_number.get(...) | provenance | | +| main.rs:190:13:190:21 | my_number [&ref, MyNumber] | main.rs:192:14:192:22 | my_number [&ref, MyNumber] | provenance | | +| main.rs:190:25:190:55 | &... [&ref, MyNumber] | main.rs:190:13:190:21 | my_number [&ref, MyNumber] | provenance | | +| main.rs:190:26:190:55 | ...::MyNumber(...) [MyNumber] | main.rs:190:25:190:55 | &... [&ref, MyNumber] | provenance | | +| main.rs:190:45:190:54 | source(...) | main.rs:190:26:190:55 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:192:14:192:22 | my_number [&ref, MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | provenance | | +| main.rs:192:14:192:22 | my_number [&ref, MyNumber] | main.rs:192:14:192:34 | my_number.to_number(...) | provenance | | +| main.rs:200:29:200:38 | ...: i64 | main.rs:201:14:201:18 | value | provenance | | +| main.rs:201:10:201:10 | [post] n [&ref] | main.rs:200:16:200:26 | ...: ... [Return] [&ref] | provenance | | +| main.rs:201:14:201:18 | value | main.rs:201:10:201:10 | [post] n [&ref] | provenance | | +| main.rs:210:17:210:17 | [post] p [&ref] | main.rs:211:15:211:15 | p [&ref] | provenance | | +| main.rs:210:20:210:29 | source(...) | main.rs:200:29:200:38 | ...: i64 | provenance | | +| main.rs:210:20:210:29 | source(...) | main.rs:210:17:210:17 | [post] p [&ref] | provenance | | +| main.rs:211:15:211:15 | p [&ref] | main.rs:211:14:211:15 | * ... | provenance | | +| main.rs:218:17:218:22 | [post] &mut n [&ref] | main.rs:218:22:218:22 | [post] n | provenance | | +| main.rs:218:22:218:22 | [post] n | main.rs:219:14:219:14 | n | provenance | | +| main.rs:218:25:218:34 | source(...) | main.rs:200:29:200:38 | ...: i64 | provenance | | +| main.rs:218:25:218:34 | source(...) | main.rs:218:17:218:22 | [post] &mut n [&ref] | provenance | | +| main.rs:223:27:223:37 | ...: i64 | main.rs:224:40:224:45 | number | provenance | | +| main.rs:224:14:224:17 | [post] self [&ref, MyNumber] | main.rs:223:16:223:24 | SelfParam [Return] [&ref, MyNumber] | provenance | | +| main.rs:224:21:224:46 | ...::MyNumber(...) [MyNumber] | main.rs:224:14:224:17 | [post] self [&ref, MyNumber] | provenance | | +| main.rs:224:40:224:45 | number | main.rs:224:21:224:46 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:228:37:228:47 | ...: i64 | main.rs:229:33:229:38 | number | provenance | | +| main.rs:229:10:229:10 | [post] n [&ref, MyNumber] | main.rs:228:19:228:34 | ...: ... [Return] [&ref, MyNumber] | provenance | | +| main.rs:229:14:229:39 | ...::MyNumber(...) [MyNumber] | main.rs:229:10:229:10 | [post] n [&ref, MyNumber] | provenance | | +| main.rs:229:33:229:38 | number | main.rs:229:14:229:39 | ...::MyNumber(...) [MyNumber] | provenance | | +| main.rs:234:20:234:33 | [post] &mut my_number [&ref, MyNumber] | main.rs:234:25:234:33 | [post] my_number [MyNumber] | provenance | | +| main.rs:234:25:234:33 | [post] my_number [MyNumber] | main.rs:235:14:235:22 | my_number [MyNumber] | provenance | | +| main.rs:234:25:234:33 | [post] my_number [MyNumber] | main.rs:237:14:237:22 | my_number [MyNumber] | provenance | | +| main.rs:234:36:234:45 | source(...) | main.rs:228:37:228:47 | ...: i64 | provenance | | +| main.rs:234:36:234:45 | source(...) | main.rs:234:20:234:33 | [post] &mut my_number [&ref, MyNumber] | provenance | | +| main.rs:235:14:235:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | provenance | | +| main.rs:235:14:235:22 | my_number [MyNumber] | main.rs:235:14:235:28 | my_number.get(...) | provenance | | +| main.rs:237:14:237:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | provenance | | +| main.rs:237:14:237:22 | my_number [MyNumber] | main.rs:237:14:237:28 | my_number.get(...) | provenance | | +| main.rs:243:9:243:17 | [post] my_number [MyNumber] | main.rs:244:24:244:32 | my_number [MyNumber] | provenance | | +| main.rs:243:9:243:17 | [post] my_number [MyNumber] | main.rs:246:24:246:32 | my_number [MyNumber] | provenance | | +| main.rs:243:23:243:32 | source(...) | main.rs:223:27:223:37 | ...: i64 | provenance | | +| main.rs:243:23:243:32 | source(...) | main.rs:243:9:243:17 | [post] my_number [MyNumber] | provenance | | +| main.rs:244:24:244:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | provenance | | +| main.rs:244:24:244:32 | my_number [MyNumber] | main.rs:244:14:244:33 | to_number(...) | provenance | | +| main.rs:246:24:246:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | provenance | | +| main.rs:246:24:246:32 | my_number [MyNumber] | main.rs:246:14:246:33 | to_number(...) | provenance | | +| main.rs:252:10:252:23 | [post] &mut my_number [&ref, MyNumber] | main.rs:252:15:252:23 | [post] my_number [MyNumber] | provenance | | +| main.rs:252:15:252:23 | [post] my_number [MyNumber] | main.rs:253:24:253:32 | my_number [MyNumber] | provenance | | +| main.rs:252:15:252:23 | [post] my_number [MyNumber] | main.rs:255:24:255:32 | my_number [MyNumber] | provenance | | +| main.rs:252:30:252:39 | source(...) | main.rs:223:27:223:37 | ...: i64 | provenance | | +| main.rs:252:30:252:39 | source(...) | main.rs:252:10:252:23 | [post] &mut my_number [&ref, MyNumber] | provenance | | +| main.rs:253:24:253:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | provenance | | +| main.rs:253:24:253:32 | my_number [MyNumber] | main.rs:253:14:253:33 | to_number(...) | provenance | | +| main.rs:255:24:255:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | provenance | | +| main.rs:255:24:255:32 | my_number [MyNumber] | main.rs:255:14:255:33 | to_number(...) | provenance | | nodes -| main.rs:13:9:13:9 | a | semmle.label | a | -| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) | -| main.rs:14:9:14:9 | b [&ref] | semmle.label | b [&ref] | -| main.rs:14:13:14:14 | &a [&ref] | semmle.label | &a [&ref] | -| main.rs:14:14:14:14 | a | semmle.label | a | -| main.rs:15:9:15:9 | c | semmle.label | c | -| main.rs:15:13:15:14 | * ... | semmle.label | * ... | -| main.rs:15:14:15:14 | b [&ref] | semmle.label | b [&ref] | -| main.rs:16:10:16:10 | c | semmle.label | c | -| main.rs:31:6:31:6 | [post] b [&ref] | semmle.label | [post] b [&ref] | -| main.rs:31:10:31:19 | source(...) | semmle.label | source(...) | -| main.rs:32:10:32:11 | * ... | semmle.label | * ... | -| main.rs:32:11:32:11 | b [&ref] | semmle.label | b [&ref] | -| main.rs:37:25:37:26 | &... [&ref] | semmle.label | &... [&ref] | -| main.rs:37:25:37:32 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:37:26:37:26 | n | semmle.label | n | -| main.rs:38:10:38:10 | n | semmle.label | n | -| main.rs:42:9:42:11 | val | semmle.label | val | -| main.rs:42:15:42:24 | source(...) | semmle.label | source(...) | -| main.rs:43:26:43:29 | &val [&ref] | semmle.label | &val [&ref] | -| main.rs:43:27:43:29 | val | semmle.label | val | -| main.rs:50:13:50:13 | a | semmle.label | a | -| main.rs:50:17:50:26 | source(...) | semmle.label | source(...) | -| main.rs:51:13:51:17 | ref p | semmle.label | ref p | -| main.rs:51:17:51:17 | p [&ref] | semmle.label | p [&ref] | -| main.rs:52:14:52:15 | * ... | semmle.label | * ... | -| main.rs:52:15:52:15 | p [&ref] | semmle.label | p [&ref] | -| main.rs:56:13:56:21 | ref mut a | semmle.label | ref mut a | -| main.rs:56:21:56:21 | a [&ref] | semmle.label | a [&ref] | -| main.rs:56:25:56:34 | source(...) | semmle.label | source(...) | -| main.rs:57:14:57:15 | * ... | semmle.label | * ... | -| main.rs:57:15:57:15 | a [&ref] | semmle.label | a [&ref] | -| main.rs:63:13:63:13 | a [Some] | semmle.label | a [Some] | -| main.rs:63:17:63:32 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:63:22:63:31 | source(...) | semmle.label | source(...) | -| main.rs:64:23:64:23 | a [Some] | semmle.label | a [Some] | -| main.rs:65:13:65:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:65:18:65:22 | ref p | semmle.label | ref p | -| main.rs:65:22:65:22 | p [&ref] | semmle.label | p [&ref] | -| main.rs:65:33:65:34 | * ... | semmle.label | * ... | -| main.rs:65:34:65:34 | p [&ref] | semmle.label | p [&ref] | -| main.rs:76:18:76:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] | -| main.rs:76:31:80:5 | { ... } | semmle.label | { ... } | -| main.rs:77:15:77:18 | self [MyNumber] | semmle.label | self [MyNumber] | -| main.rs:78:13:78:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | -| main.rs:78:32:78:37 | number | semmle.label | number | -| main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] | -| main.rs:82:33:86:5 | { ... } | semmle.label | { ... } | -| main.rs:83:15:83:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] | -| main.rs:84:13:84:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] | -| main.rs:84:14:84:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | -| main.rs:84:33:84:38 | number | semmle.label | number | -| main.rs:90:9:90:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | -| main.rs:90:21:90:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | -| main.rs:90:40:90:49 | source(...) | semmle.label | source(...) | -| main.rs:91:10:91:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | -| main.rs:91:10:91:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) | -| main.rs:100:9:100:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] | -| main.rs:100:21:100:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] | -| main.rs:100:22:100:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | -| main.rs:100:41:100:50 | source(...) | semmle.label | source(...) | -| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] | -| main.rs:101:10:101:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) | -| main.rs:105:9:105:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] | -| main.rs:105:13:105:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | -| main.rs:105:14:105:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| main.rs:105:15:105:24 | source(...) | semmle.label | source(...) | -| main.rs:108:9:108:9 | b | semmle.label | b | -| main.rs:108:19:108:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] | -| main.rs:109:9:109:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | -| main.rs:109:10:109:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | -| main.rs:109:11:109:11 | n | semmle.label | n | -| main.rs:111:10:111:10 | b | semmle.label | b | +| main.rs:17:13:17:13 | a | semmle.label | a | +| main.rs:17:17:17:26 | source(...) | semmle.label | source(...) | +| main.rs:18:13:18:13 | b [&ref] | semmle.label | b [&ref] | +| main.rs:18:17:18:18 | &a [&ref] | semmle.label | &a [&ref] | +| main.rs:18:18:18:18 | a | semmle.label | a | +| main.rs:19:13:19:13 | c | semmle.label | c | +| main.rs:19:17:19:18 | * ... | semmle.label | * ... | +| main.rs:19:18:19:18 | b [&ref] | semmle.label | b [&ref] | +| main.rs:20:14:20:14 | c | semmle.label | c | +| main.rs:23:29:23:30 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:23:29:23:36 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:23:30:23:30 | n | semmle.label | n | +| main.rs:24:14:24:14 | n | semmle.label | n | +| main.rs:28:13:28:15 | val | semmle.label | val | +| main.rs:28:19:28:28 | source(...) | semmle.label | source(...) | +| main.rs:29:30:29:33 | &val [&ref] | semmle.label | &val [&ref] | +| main.rs:29:31:29:33 | val | semmle.label | val | +| main.rs:33:13:33:13 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] | +| main.rs:33:17:33:32 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | +| main.rs:33:18:33:32 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| main.rs:33:19:33:28 | source(...) | semmle.label | source(...) | +| main.rs:36:13:36:13 | b | semmle.label | b | +| main.rs:36:23:36:23 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] | +| main.rs:37:13:37:19 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | +| main.rs:37:14:37:19 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | +| main.rs:37:15:37:15 | n | semmle.label | n | +| main.rs:39:14:39:14 | b | semmle.label | b | +| main.rs:51:13:51:13 | a | semmle.label | a | +| main.rs:51:17:51:26 | source(...) | semmle.label | source(...) | +| main.rs:52:13:52:17 | ref p | semmle.label | ref p | +| main.rs:52:17:52:17 | p [&ref] | semmle.label | p [&ref] | +| main.rs:53:14:53:15 | * ... | semmle.label | * ... | +| main.rs:53:15:53:15 | p [&ref] | semmle.label | p [&ref] | +| main.rs:57:13:57:13 | a [Some] | semmle.label | a [Some] | +| main.rs:57:17:57:32 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:57:22:57:31 | source(...) | semmle.label | source(...) | +| main.rs:58:15:58:15 | a [Some] | semmle.label | a [Some] | +| main.rs:59:13:59:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:59:18:59:22 | ref p | semmle.label | ref p | +| main.rs:59:22:59:22 | p [&ref] | semmle.label | p [&ref] | +| main.rs:59:33:59:34 | * ... | semmle.label | * ... | +| main.rs:59:34:59:34 | p [&ref] | semmle.label | p [&ref] | +| main.rs:73:10:73:10 | [post] b [&ref] | semmle.label | [post] b [&ref] | +| main.rs:73:14:73:23 | source(...) | semmle.label | source(...) | +| main.rs:74:14:74:15 | * ... | semmle.label | * ... | +| main.rs:74:15:74:15 | b [&ref] | semmle.label | b [&ref] | +| main.rs:105:10:105:10 | [post] c [&ref] | semmle.label | [post] c [&ref] | +| main.rs:105:14:105:23 | source(...) | semmle.label | source(...) | +| main.rs:106:14:106:15 | * ... | semmle.label | * ... | +| main.rs:106:15:106:15 | c [&ref] | semmle.label | c [&ref] | +| main.rs:112:13:112:21 | ref mut a | semmle.label | ref mut a | +| main.rs:112:21:112:21 | a [&ref] | semmle.label | a [&ref] | +| main.rs:112:25:112:34 | source(...) | semmle.label | source(...) | +| main.rs:113:14:113:15 | * ... | semmle.label | * ... | +| main.rs:113:15:113:15 | a [&ref] | semmle.label | a [&ref] | +| main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | semmle.label | ...: MyNumber [MyNumber] | +| main.rs:149:34:153:1 | { ... } | semmle.label | { ... } | +| main.rs:150:11:150:11 | m [MyNumber] | semmle.label | m [MyNumber] | +| main.rs:151:9:151:34 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:151:28:151:33 | number | semmle.label | number | +| main.rs:156:18:156:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] | +| main.rs:156:31:160:5 | { ... } | semmle.label | { ... } | +| main.rs:157:15:157:18 | self [MyNumber] | semmle.label | self [MyNumber] | +| main.rs:158:13:158:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:158:32:158:37 | number | semmle.label | number | +| main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] | +| main.rs:162:26:166:5 | { ... } | semmle.label | { ... } | +| main.rs:163:15:163:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] | +| main.rs:164:13:164:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] | +| main.rs:164:14:164:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:164:33:164:38 | number | semmle.label | number | +| main.rs:174:13:174:21 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:174:25:174:54 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:174:44:174:53 | source(...) | semmle.label | source(...) | +| main.rs:175:14:175:34 | my_number.to_number(...) | semmle.label | my_number.to_number(...) | +| main.rs:179:13:179:21 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:179:25:179:54 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:179:44:179:53 | source(...) | semmle.label | source(...) | +| main.rs:180:14:180:31 | ... .get(...) | semmle.label | ... .get(...) | +| main.rs:180:15:180:24 | &my_number [&ref, MyNumber] | semmle.label | &my_number [&ref, MyNumber] | +| main.rs:180:16:180:24 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:184:13:184:21 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:184:25:184:54 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:184:44:184:53 | source(...) | semmle.label | source(...) | +| main.rs:186:14:186:22 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:186:14:186:28 | my_number.get(...) | semmle.label | my_number.get(...) | +| main.rs:190:13:190:21 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] | +| main.rs:190:25:190:55 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] | +| main.rs:190:26:190:55 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:190:45:190:54 | source(...) | semmle.label | source(...) | +| main.rs:192:14:192:22 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] | +| main.rs:192:14:192:34 | my_number.to_number(...) | semmle.label | my_number.to_number(...) | +| main.rs:200:16:200:26 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] | +| main.rs:200:29:200:38 | ...: i64 | semmle.label | ...: i64 | +| main.rs:201:10:201:10 | [post] n [&ref] | semmle.label | [post] n [&ref] | +| main.rs:201:14:201:18 | value | semmle.label | value | +| main.rs:210:17:210:17 | [post] p [&ref] | semmle.label | [post] p [&ref] | +| main.rs:210:20:210:29 | source(...) | semmle.label | source(...) | +| main.rs:211:14:211:15 | * ... | semmle.label | * ... | +| main.rs:211:15:211:15 | p [&ref] | semmle.label | p [&ref] | +| main.rs:218:17:218:22 | [post] &mut n [&ref] | semmle.label | [post] &mut n [&ref] | +| main.rs:218:22:218:22 | [post] n | semmle.label | [post] n | +| main.rs:218:25:218:34 | source(...) | semmle.label | source(...) | +| main.rs:219:14:219:14 | n | semmle.label | n | +| main.rs:223:16:223:24 | SelfParam [Return] [&ref, MyNumber] | semmle.label | SelfParam [Return] [&ref, MyNumber] | +| main.rs:223:27:223:37 | ...: i64 | semmle.label | ...: i64 | +| main.rs:224:14:224:17 | [post] self [&ref, MyNumber] | semmle.label | [post] self [&ref, MyNumber] | +| main.rs:224:21:224:46 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:224:40:224:45 | number | semmle.label | number | +| main.rs:228:19:228:34 | ...: ... [Return] [&ref, MyNumber] | semmle.label | ...: ... [Return] [&ref, MyNumber] | +| main.rs:228:37:228:47 | ...: i64 | semmle.label | ...: i64 | +| main.rs:229:10:229:10 | [post] n [&ref, MyNumber] | semmle.label | [post] n [&ref, MyNumber] | +| main.rs:229:14:229:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] | +| main.rs:229:33:229:38 | number | semmle.label | number | +| main.rs:234:20:234:33 | [post] &mut my_number [&ref, MyNumber] | semmle.label | [post] &mut my_number [&ref, MyNumber] | +| main.rs:234:25:234:33 | [post] my_number [MyNumber] | semmle.label | [post] my_number [MyNumber] | +| main.rs:234:36:234:45 | source(...) | semmle.label | source(...) | +| main.rs:235:14:235:22 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:235:14:235:28 | my_number.get(...) | semmle.label | my_number.get(...) | +| main.rs:237:14:237:22 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:237:14:237:28 | my_number.get(...) | semmle.label | my_number.get(...) | +| main.rs:243:9:243:17 | [post] my_number [MyNumber] | semmle.label | [post] my_number [MyNumber] | +| main.rs:243:23:243:32 | source(...) | semmle.label | source(...) | +| main.rs:244:14:244:33 | to_number(...) | semmle.label | to_number(...) | +| main.rs:244:24:244:32 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:246:14:246:33 | to_number(...) | semmle.label | to_number(...) | +| main.rs:246:24:246:32 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:252:10:252:23 | [post] &mut my_number [&ref, MyNumber] | semmle.label | [post] &mut my_number [&ref, MyNumber] | +| main.rs:252:15:252:23 | [post] my_number [MyNumber] | semmle.label | [post] my_number [MyNumber] | +| main.rs:252:30:252:39 | source(...) | semmle.label | source(...) | +| main.rs:253:14:253:33 | to_number(...) | semmle.label | to_number(...) | +| main.rs:253:24:253:32 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | +| main.rs:255:14:255:33 | to_number(...) | semmle.label | to_number(...) | +| main.rs:255:24:255:32 | my_number [MyNumber] | semmle.label | my_number [MyNumber] | subpaths -| main.rs:91:10:91:18 | my_number [MyNumber] | main.rs:76:18:76:21 | SelfParam [MyNumber] | main.rs:76:31:80:5 | { ... } | main.rs:91:10:91:30 | my_number.to_number(...) | -| main.rs:101:10:101:18 | my_number [&ref, MyNumber] | main.rs:82:19:82:23 | SelfParam [&ref, MyNumber] | main.rs:82:33:86:5 | { ... } | main.rs:101:10:101:31 | my_number.get_number(...) | +| main.rs:174:13:174:21 | my_number [MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | main.rs:156:31:160:5 | { ... } | main.rs:175:14:175:34 | my_number.to_number(...) | +| main.rs:180:15:180:24 | &my_number [&ref, MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:162:26:166:5 | { ... } | main.rs:180:14:180:31 | ... .get(...) | +| main.rs:186:14:186:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:162:26:166:5 | { ... } | main.rs:186:14:186:28 | my_number.get(...) | +| main.rs:192:14:192:22 | my_number [&ref, MyNumber] | main.rs:156:18:156:21 | SelfParam [MyNumber] | main.rs:156:31:160:5 | { ... } | main.rs:192:14:192:34 | my_number.to_number(...) | +| main.rs:210:20:210:29 | source(...) | main.rs:200:29:200:38 | ...: i64 | main.rs:200:16:200:26 | ...: ... [Return] [&ref] | main.rs:210:17:210:17 | [post] p [&ref] | +| main.rs:218:25:218:34 | source(...) | main.rs:200:29:200:38 | ...: i64 | main.rs:200:16:200:26 | ...: ... [Return] [&ref] | main.rs:218:17:218:22 | [post] &mut n [&ref] | +| main.rs:234:36:234:45 | source(...) | main.rs:228:37:228:47 | ...: i64 | main.rs:228:19:228:34 | ...: ... [Return] [&ref, MyNumber] | main.rs:234:20:234:33 | [post] &mut my_number [&ref, MyNumber] | +| main.rs:235:14:235:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:162:26:166:5 | { ... } | main.rs:235:14:235:28 | my_number.get(...) | +| main.rs:237:14:237:22 | my_number [MyNumber] | main.rs:162:12:162:16 | SelfParam [&ref, MyNumber] | main.rs:162:26:166:5 | { ... } | main.rs:237:14:237:28 | my_number.get(...) | +| main.rs:243:23:243:32 | source(...) | main.rs:223:27:223:37 | ...: i64 | main.rs:223:16:223:24 | SelfParam [Return] [&ref, MyNumber] | main.rs:243:9:243:17 | [post] my_number [MyNumber] | +| main.rs:244:24:244:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | main.rs:149:34:153:1 | { ... } | main.rs:244:14:244:33 | to_number(...) | +| main.rs:246:24:246:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | main.rs:149:34:153:1 | { ... } | main.rs:246:14:246:33 | to_number(...) | +| main.rs:252:30:252:39 | source(...) | main.rs:223:27:223:37 | ...: i64 | main.rs:223:16:223:24 | SelfParam [Return] [&ref, MyNumber] | main.rs:252:10:252:23 | [post] &mut my_number [&ref, MyNumber] | +| main.rs:253:24:253:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | main.rs:149:34:153:1 | { ... } | main.rs:253:14:253:33 | to_number(...) | +| main.rs:255:24:255:32 | my_number [MyNumber] | main.rs:149:14:149:24 | ...: MyNumber [MyNumber] | main.rs:149:34:153:1 | { ... } | main.rs:255:14:255:33 | to_number(...) | testFailures #select -| main.rs:16:10:16:10 | c | main.rs:13:13:13:22 | source(...) | main.rs:16:10:16:10 | c | $@ | main.rs:13:13:13:22 | source(...) | source(...) | -| main.rs:32:10:32:11 | * ... | main.rs:31:10:31:19 | source(...) | main.rs:32:10:32:11 | * ... | $@ | main.rs:31:10:31:19 | source(...) | source(...) | -| main.rs:38:10:38:10 | n | main.rs:42:15:42:24 | source(...) | main.rs:38:10:38:10 | n | $@ | main.rs:42:15:42:24 | source(...) | source(...) | -| main.rs:52:14:52:15 | * ... | main.rs:50:17:50:26 | source(...) | main.rs:52:14:52:15 | * ... | $@ | main.rs:50:17:50:26 | source(...) | source(...) | -| main.rs:57:14:57:15 | * ... | main.rs:56:25:56:34 | source(...) | main.rs:57:14:57:15 | * ... | $@ | main.rs:56:25:56:34 | source(...) | source(...) | -| main.rs:65:33:65:34 | * ... | main.rs:63:22:63:31 | source(...) | main.rs:65:33:65:34 | * ... | $@ | main.rs:63:22:63:31 | source(...) | source(...) | -| main.rs:91:10:91:30 | my_number.to_number(...) | main.rs:90:40:90:49 | source(...) | main.rs:91:10:91:30 | my_number.to_number(...) | $@ | main.rs:90:40:90:49 | source(...) | source(...) | -| main.rs:101:10:101:31 | my_number.get_number(...) | main.rs:100:41:100:50 | source(...) | main.rs:101:10:101:31 | my_number.get_number(...) | $@ | main.rs:100:41:100:50 | source(...) | source(...) | -| main.rs:111:10:111:10 | b | main.rs:105:15:105:24 | source(...) | main.rs:111:10:111:10 | b | $@ | main.rs:105:15:105:24 | source(...) | source(...) | +| main.rs:20:14:20:14 | c | main.rs:17:17:17:26 | source(...) | main.rs:20:14:20:14 | c | $@ | main.rs:17:17:17:26 | source(...) | source(...) | +| main.rs:24:14:24:14 | n | main.rs:28:19:28:28 | source(...) | main.rs:24:14:24:14 | n | $@ | main.rs:28:19:28:28 | source(...) | source(...) | +| main.rs:39:14:39:14 | b | main.rs:33:19:33:28 | source(...) | main.rs:39:14:39:14 | b | $@ | main.rs:33:19:33:28 | source(...) | source(...) | +| main.rs:53:14:53:15 | * ... | main.rs:51:17:51:26 | source(...) | main.rs:53:14:53:15 | * ... | $@ | main.rs:51:17:51:26 | source(...) | source(...) | +| main.rs:59:33:59:34 | * ... | main.rs:57:22:57:31 | source(...) | main.rs:59:33:59:34 | * ... | $@ | main.rs:57:22:57:31 | source(...) | source(...) | +| main.rs:74:14:74:15 | * ... | main.rs:73:14:73:23 | source(...) | main.rs:74:14:74:15 | * ... | $@ | main.rs:73:14:73:23 | source(...) | source(...) | +| main.rs:106:14:106:15 | * ... | main.rs:105:14:105:23 | source(...) | main.rs:106:14:106:15 | * ... | $@ | main.rs:105:14:105:23 | source(...) | source(...) | +| main.rs:113:14:113:15 | * ... | main.rs:112:25:112:34 | source(...) | main.rs:113:14:113:15 | * ... | $@ | main.rs:112:25:112:34 | source(...) | source(...) | +| main.rs:175:14:175:34 | my_number.to_number(...) | main.rs:174:44:174:53 | source(...) | main.rs:175:14:175:34 | my_number.to_number(...) | $@ | main.rs:174:44:174:53 | source(...) | source(...) | +| main.rs:180:14:180:31 | ... .get(...) | main.rs:179:44:179:53 | source(...) | main.rs:180:14:180:31 | ... .get(...) | $@ | main.rs:179:44:179:53 | source(...) | source(...) | +| main.rs:186:14:186:28 | my_number.get(...) | main.rs:184:44:184:53 | source(...) | main.rs:186:14:186:28 | my_number.get(...) | $@ | main.rs:184:44:184:53 | source(...) | source(...) | +| main.rs:192:14:192:34 | my_number.to_number(...) | main.rs:190:45:190:54 | source(...) | main.rs:192:14:192:34 | my_number.to_number(...) | $@ | main.rs:190:45:190:54 | source(...) | source(...) | +| main.rs:211:14:211:15 | * ... | main.rs:210:20:210:29 | source(...) | main.rs:211:14:211:15 | * ... | $@ | main.rs:210:20:210:29 | source(...) | source(...) | +| main.rs:219:14:219:14 | n | main.rs:218:25:218:34 | source(...) | main.rs:219:14:219:14 | n | $@ | main.rs:218:25:218:34 | source(...) | source(...) | +| main.rs:235:14:235:28 | my_number.get(...) | main.rs:234:36:234:45 | source(...) | main.rs:235:14:235:28 | my_number.get(...) | $@ | main.rs:234:36:234:45 | source(...) | source(...) | +| main.rs:237:14:237:28 | my_number.get(...) | main.rs:234:36:234:45 | source(...) | main.rs:237:14:237:28 | my_number.get(...) | $@ | main.rs:234:36:234:45 | source(...) | source(...) | +| main.rs:244:14:244:33 | to_number(...) | main.rs:243:23:243:32 | source(...) | main.rs:244:14:244:33 | to_number(...) | $@ | main.rs:243:23:243:32 | source(...) | source(...) | +| main.rs:246:14:246:33 | to_number(...) | main.rs:243:23:243:32 | source(...) | main.rs:246:14:246:33 | to_number(...) | $@ | main.rs:243:23:243:32 | source(...) | source(...) | +| main.rs:253:14:253:33 | to_number(...) | main.rs:252:30:252:39 | source(...) | main.rs:253:14:253:33 | to_number(...) | $@ | main.rs:252:30:252:39 | source(...) | source(...) | +| main.rs:255:14:255:33 | to_number(...) | main.rs:252:30:252:39 | source(...) | main.rs:255:14:255:33 | to_number(...) | $@ | main.rs:252:30:252:39 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/pointers/main.rs b/rust/ql/test/library-tests/dataflow/pointers/main.rs index d9d5a5298d25..d7e28c9368f4 100644 --- a/rust/ql/test/library-tests/dataflow/pointers/main.rs +++ b/rust/ql/test/library-tests/dataflow/pointers/main.rs @@ -9,49 +9,105 @@ fn sink(s: i64) { println!("{}", s); } -fn read_through_borrow() { - let a = source(21); - let b = &a; - let c = *b; - sink(c); // $ hasValueFlow=21 -} +// Intraprocedural tests involving immutable borrows +mod intraprocedural_immutable_borrows { + use super::{sink, source}; -fn write_through_borrow() { - let mut a = 1; - sink(a); - let b = &mut a; - *b = source(39); - sink(a); // $ MISSING: hasValueFlow=39 -} + pub fn read_through_borrow() { + let a = source(21); + let b = &a; + let c = *b; + sink(c); // $ hasValueFlow=21 + } -fn write_and_read_through_borrow() { - let mut a = 12; - let b = &mut a; - sink(*b); - *b = source(37); - sink(*b); // $ hasValueFlow=37 - *b = 0; - sink(*b); // now cleared -} + fn takes_borrowed_value(&n: &i64) { + sink(n); // $ hasValueFlow=83 + } -fn takes_borrowed_value(&n: &i64) { - sink(n); // $ hasValueFlow=83 -} + pub fn pass_borrowed_value() { + let val = source(83); + takes_borrowed_value(&val); + } -fn pass_borrowed_value() { - let val = source(83); - takes_borrowed_value(&val); -} + pub fn ref_nested_pattern_match() { + let a = &(source(23), 1); -mod test_ref_pattern { - use super::{sink, source}; + // Match "in order", reference pattern then tuple pattern + let b = match a { + &(n, _) => n, + }; + sink(b); // $ hasValueFlow=23 - pub fn read_through_ref() { + // Match "out of order", tuple pattern then deref pattern + let c = match a { + (n, _) => match n { + &i => i, + }, + }; + sink(c); // $ MISSING: hasValueFlow=23 + } + + pub fn read_through_ref_pattern() { let a = source(21); let ref p = a; sink(*p); // $ hasValueFlow=21 } + pub fn ref_pattern_in_match() { + let a = Some(source(17)); + match a { + Some(ref p) => sink(*p), // $ hasValueFlow=17 + None => (), + }; + } +} + +// Intraprocedural tests involving mutable borrows +mod intraprocedural_mutable_borrows { + use super::{sink, source}; + + pub fn write_and_read_through_borrow() { + let mut a = 12; + let b = &mut a; + sink(*b); + *b = source(37); + sink(*b); // $ hasValueFlow=37 + *b = 0; + sink(*b); // now cleared + } + + pub fn write_through_borrow() { + let mut a = 1; + sink(a); + let b = &mut a; + *b = source(39); + sink(a); // $ MISSING: hasValueFlow=39 + } + + pub fn write_borrow_directly() { + let mut a = 1; + sink(a); + *(&mut a) = source(87); + sink(a); // $ MISSING: hasValueFlow=87 + } + + pub fn clear_through_borrow() { + let mut to_be_cleared = source(34); + let p = &mut to_be_cleared; + *p = 0; + sink(to_be_cleared); // variable is cleared + } + + pub fn write_through_borrow_in_match(cond: bool) { + let mut a = 1; + let mut b = 2; + let c = if cond { &mut a } else { &mut b }; + *c = source(24); + sink(*c); // $ hasValueFlow=24 + sink(a); // $ MISSING: hasValueFlow=24 + sink(b); // $ MISSING: hasValueFlow=24 + } + pub fn write_through_ref_mut() { let ref mut a = source(78); sink(*a); // $ hasValueFlow=78 @@ -59,19 +115,43 @@ mod test_ref_pattern { sink(*a); // now cleared } - pub fn ref_pattern_in_match() { - let a = Some(source(17)); - let b = match a { - Some(ref p) => sink(*p), // $ hasValueFlow=17 - None => (), - }; + pub fn mutate_tuple() { + let mut t = (1, 2, 3); + sink(t.1); + let r = &mut t.1; + *r = source(48); + sink(t.1); // $ MISSING: hasValueFlow=48 + let r = &mut t.1; + *r = 0; + sink(t.1); // now cleared + } + + pub fn tuple_match_mut() { + let mut a = (0, 1); + sink(a.0); + sink(a.1); + match a { + (ref mut x, ref mut y) => { + *x = source(71); + *y = 2; + } + } + sink(a.0); // $ MISSING: hasValueFlow=71 + sink(a.1); } } +#[derive(Copy, Clone)] enum MyNumber { MyNumber(i64), } +fn to_number(m: MyNumber) -> i64 { + match m { + MyNumber::MyNumber(number) => number, + } +} + impl MyNumber { fn to_number(self) -> i64 { match self { @@ -79,58 +159,129 @@ impl MyNumber { } } - fn get_number(&self) -> i64 { + fn get(&self) -> i64 { match self { &MyNumber::MyNumber(number) => number, } } } -fn through_self_in_method_no_borrow() { - let my_number = MyNumber::MyNumber(source(33)); - sink(my_number.to_number()); // $ hasValueFlow=33 -} +// Interprocedural tests involving immutable borrows +mod interprocedural_immutable_borrows { + use super::*; -fn through_self_in_method_implicit_borrow() { - let my_number = MyNumber::MyNumber(source(85)); - sink(my_number.get_number()); // $ MISSING: hasValueFlow=85 -} + pub fn through_self_in_method_no_borrow() { + let my_number = MyNumber::MyNumber(source(33)); + sink(my_number.to_number()); // $ hasValueFlow=33 + } + + pub fn through_self_in_method_explicit_borrow() { + let my_number = MyNumber::MyNumber(source(40)); + sink((&my_number).get()); // $ hasValueFlow=40 + } -fn through_self_in_method_explicit_borrow() { - let my_number = &MyNumber::MyNumber(source(40)); - sink(my_number.get_number()); // $ hasValueFlow=40 + pub fn through_self_in_method_implicit_borrow() { + let my_number = MyNumber::MyNumber(source(85)); + // Implicit borrow + sink(my_number.get()); // $ hasValueFlow=85 + } + + pub fn through_self_in_method_implicit_deref() { + let my_number = &MyNumber::MyNumber(source(58)); + // Implicit dereference + sink(my_number.to_number()); // $ hasValueFlow=58 + } } -fn ref_nested_pattern_match() { - let a = &(source(23), 1); - - // Match "in order", reference pattern then tuple pattern - let b = match a { - &(n, _) => n, - }; - sink(b); // $ hasValueFlow=23 - - // Match "out of order", tuple pattern then deref pattern - let c = match a { - (n, _) => match n { - &i => i, - }, - }; - sink(c); // $ MISSING: hasValueFlow=23 +// Interprocedural tests involving mutable borrows +mod interprocedural_mutable_borrows { + use super::*; + + fn set_int(n: &mut i64, value: i64) { + *n = value; + } + + pub fn mutates_existing_borrow() { + // Passing an already borrowed value to a function and then reading from + // the same borrow. + let mut n = 0; + let p = &mut n; + sink(*p); + set_int(p, source(38)); + sink(*p); // $ hasValueFlow=38 + } + + pub fn mutate_primitive_through_function() { + // Borrowing at the call and then reading from the unborrowed variable. + let mut n = 0; + sink(n); + set_int(&mut n, source(55)); + sink(n); // $ hasValueFlow=55 + } + + impl MyNumber { + fn set(&mut self, number: i64) { + *self = MyNumber::MyNumber(number); + } + } + + fn set_number(n: &mut MyNumber, number: i64) { + *n = MyNumber::MyNumber(number); + } + + pub fn mutate_enum_through_function() { + let mut my_number = MyNumber::MyNumber(0); + set_number(&mut my_number, source(64)); + sink(my_number.get()); // $ hasValueFlow=64 + set_number(&mut my_number, 0); + sink(my_number.get()); // $ SPURIOUS: hasValueFlow=64 + } + + pub fn mutate_enum_through_method_implicit_borrow() { + let mut my_number = MyNumber::MyNumber(0); + // Implicit borrow. + my_number.set(source(45)); + sink(to_number(my_number)); // $ hasValueFlow=45 + my_number.set(0); + sink(to_number(my_number)); // $ SPURIOUS: hasValueFlow=45 + } + + pub fn mutate_enum_through_method_explicit_borrow() { + let mut my_number = MyNumber::MyNumber(0); + // Explicit borrow. + (&mut my_number).set(source(99)); + sink(to_number(my_number)); // $ hasValueFlow=99 + (&mut my_number).set(0); + sink(to_number(my_number)); // $ SPURIOUS: hasValueFlow=99 + } } -use test_ref_pattern::*; +use interprocedural_immutable_borrows::*; +use interprocedural_mutable_borrows::*; +use intraprocedural_immutable_borrows::*; +use intraprocedural_mutable_borrows::*; fn main() { read_through_borrow(); write_through_borrow(); + write_borrow_directly(); + clear_through_borrow(); + write_through_borrow_in_match(true); write_and_read_through_borrow(); pass_borrowed_value(); through_self_in_method_no_borrow(); - through_self_in_method_implicit_borrow(); through_self_in_method_explicit_borrow(); + through_self_in_method_implicit_borrow(); + through_self_in_method_implicit_deref(); + mutates_existing_borrow(); + mutate_primitive_through_function(); + mutate_enum_through_function(); + mutate_enum_through_method_implicit_borrow(); + mutate_enum_through_method_explicit_borrow(); ref_nested_pattern_match(); - read_through_ref(); + read_through_ref_pattern(); write_through_ref_mut(); ref_pattern_in_match(); + mutate_tuple(); + tuple_match_mut(); } diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 53a5edfd8ad4..e4c6b2736d74 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -117,7 +117,7 @@ async fn test_hyper_http(case: i64) -> Result<(), Box> { // more realistic uses of results... let request = http::Request::builder().uri(url).body(String::from(""))?; let mut response = sender.send_request(request).await?; // $ Alert[rust/summary/taint-sources] - sink(&response); // $ MISSING: hasTaintFlow=request + sink(&response); // $ hasTaintFlow=request if !response.status().is_success() { return Err("request failed".into()) diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index ee15de985dcd..b58932b3909f 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -17,9 +17,8 @@ edges | main.rs:52:9:52:10 | s2 | main.rs:53:10:53:11 | s2 | provenance | | | main.rs:52:14:52:29 | ...::from(...) | main.rs:52:9:52:10 | s2 | provenance | | | main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:1 | -| main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | | +| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str(...) | provenance | MaD:2 | | main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | | -| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str(...) | provenance | MaD:2 | | main.rs:68:9:68:9 | s | main.rs:70:34:70:61 | MacroExpr | provenance | | | main.rs:68:9:68:9 | s | main.rs:73:34:73:59 | MacroExpr | provenance | | | main.rs:68:13:68:22 | source(...) | main.rs:68:9:68:9 | s | provenance | | @@ -66,7 +65,6 @@ nodes | main.rs:53:10:53:11 | s2 | semmle.label | s2 | | main.rs:63:9:63:9 | s | semmle.label | s | | main.rs:63:13:63:22 | source(...) | semmle.label | source(...) | -| main.rs:64:16:64:16 | s | semmle.label | s | | main.rs:64:16:64:25 | s.as_str(...) | semmle.label | s.as_str(...) | | main.rs:68:9:68:9 | s | semmle.label | s | | main.rs:68:13:68:22 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/variables/Ssa.expected b/rust/ql/test/library-tests/variables/Ssa.expected index 57245cc30e7e..619283dc4b5a 100644 --- a/rust/ql/test/library-tests/variables/Ssa.expected +++ b/rust/ql/test/library-tests/variables/Ssa.expected @@ -1,12 +1,3 @@ -nonSsaVariable -| main.rs:371:13:371:13 | a | -| main.rs:379:13:379:13 | i | -| main.rs:402:13:402:13 | x | -| main.rs:409:13:409:13 | z | -| main.rs:422:13:422:13 | x | -| main.rs:456:13:456:13 | z | -| main.rs:531:13:531:13 | a | -| main.rs:568:11:568:11 | a | definition | main.rs:3:14:3:14 | s | main.rs:3:14:3:14 | s | | main.rs:7:14:7:14 | i | main.rs:7:14:7:14 | i | @@ -110,13 +101,24 @@ definition | main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | | main.rs:362:9:362:9 | v | main.rs:362:9:362:9 | v | | main.rs:364:9:364:12 | text | main.rs:364:9:364:12 | text | +| main.rs:371:13:371:13 | a | main.rs:371:13:371:13 | a | +| main.rs:372:5:372:5 | a | main.rs:371:13:371:13 | a | +| main.rs:374:6:374:11 | &mut a | main.rs:371:13:371:13 | a | +| main.rs:379:13:379:13 | i | main.rs:379:13:379:13 | i | | main.rs:380:9:380:13 | ref_i | main.rs:380:9:380:13 | ref_i | +| main.rs:381:9:381:14 | &mut i | main.rs:379:13:379:13 | i | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | | main.rs:393:39:393:39 | y | main.rs:393:39:393:39 | y | +| main.rs:402:13:402:13 | x | main.rs:402:13:402:13 | x | | main.rs:403:9:403:9 | y | main.rs:403:9:403:9 | y | +| main.rs:404:22:404:27 | &mut x | main.rs:402:13:402:13 | x | +| main.rs:409:13:409:13 | z | main.rs:409:13:409:13 | z | | main.rs:410:9:410:9 | w | main.rs:410:9:410:9 | w | +| main.rs:413:9:413:14 | &mut z | main.rs:409:13:409:13 | z | +| main.rs:422:13:422:13 | x | main.rs:422:13:422:13 | x | | main.rs:423:9:423:9 | y | main.rs:423:9:423:9 | y | +| main.rs:424:9:424:14 | &mut x | main.rs:422:13:422:13 | x | | main.rs:430:9:430:9 | x | main.rs:430:9:430:9 | x | | main.rs:432:9:432:11 | cap | main.rs:432:9:432:11 | cap | | main.rs:432:15:434:5 | x | main.rs:430:9:430:9 | x | @@ -127,7 +129,9 @@ definition | main.rs:450:13:450:20 | closure2 | main.rs:450:13:450:20 | closure2 | | main.rs:451:9:451:9 | y | main.rs:448:13:448:13 | y | | main.rs:453:5:453:14 | y | main.rs:448:13:448:13 | y | +| main.rs:456:13:456:13 | z | main.rs:456:13:456:13 | z | | main.rs:458:13:458:20 | closure3 | main.rs:458:13:458:20 | closure3 | +| main.rs:458:24:460:5 | z | main.rs:456:13:456:13 | z | | main.rs:466:13:466:13 | i | main.rs:466:13:466:13 | i | | main.rs:467:9:467:13 | block | main.rs:467:9:467:13 | block | | main.rs:468:9:468:9 | i | main.rs:466:13:466:13 | i | @@ -146,11 +150,16 @@ definition | main.rs:521:17:521:17 | f | main.rs:521:17:521:17 | f | | main.rs:521:21:524:9 | self | main.rs:520:23:520:26 | self | | main.rs:521:22:521:22 | n | main.rs:521:22:521:22 | n | +| main.rs:531:13:531:13 | a | main.rs:531:13:531:13 | a | +| main.rs:532:15:532:15 | a | main.rs:531:13:531:13 | a | +| main.rs:535:5:535:5 | a | main.rs:531:13:531:13 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | | main.rs:544:5:544:5 | a | main.rs:540:13:540:13 | a | | main.rs:549:9:549:9 | x | main.rs:549:9:549:9 | x | | main.rs:553:9:553:9 | z | main.rs:553:9:553:9 | z | | main.rs:562:15:562:18 | self | main.rs:562:15:562:18 | self | +| main.rs:568:11:568:11 | a | main.rs:568:11:568:11 | a | +| main.rs:569:3:569:3 | a | main.rs:568:11:568:11 | a | | main.rs:593:9:593:22 | var_from_macro | main.rs:593:9:593:22 | var_from_macro | | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | | main.rs:596:9:596:20 | var_in_macro | main.rs:596:9:596:20 | var_in_macro | @@ -246,7 +255,12 @@ read | main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:356:13:356:13 | x | | main.rs:362:9:362:9 | v | main.rs:362:9:362:9 | v | main.rs:365:12:365:12 | v | | main.rs:364:9:364:12 | text | main.rs:364:9:364:12 | text | main.rs:366:19:366:22 | text | +| main.rs:372:5:372:5 | a | main.rs:371:13:371:13 | a | main.rs:373:15:373:15 | a | +| main.rs:372:5:372:5 | a | main.rs:371:13:371:13 | a | main.rs:374:11:374:11 | a | +| main.rs:374:6:374:11 | &mut a | main.rs:371:13:371:13 | a | main.rs:375:15:375:15 | a | +| main.rs:379:13:379:13 | i | main.rs:379:13:379:13 | i | main.rs:381:14:381:14 | i | | main.rs:380:9:380:13 | ref_i | main.rs:380:9:380:13 | ref_i | main.rs:382:6:382:10 | ref_i | +| main.rs:381:9:381:14 | &mut i | main.rs:379:13:379:13 | i | main.rs:383:15:383:15 | i | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:387:6:387:6 | x | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:388:10:388:10 | x | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:389:10:389:10 | x | @@ -256,10 +270,17 @@ read | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:396:10:396:10 | x | | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:398:9:398:9 | x | | main.rs:393:39:393:39 | y | main.rs:393:39:393:39 | y | main.rs:397:6:397:6 | y | +| main.rs:402:13:402:13 | x | main.rs:402:13:402:13 | x | main.rs:404:27:404:27 | x | | main.rs:403:9:403:9 | y | main.rs:403:9:403:9 | y | main.rs:405:6:405:6 | y | +| main.rs:404:22:404:27 | &mut x | main.rs:402:13:402:13 | x | main.rs:407:15:407:15 | x | +| main.rs:404:22:404:27 | &mut x | main.rs:402:13:402:13 | x | main.rs:411:19:411:19 | x | +| main.rs:409:13:409:13 | z | main.rs:409:13:409:13 | z | main.rs:413:14:413:14 | z | | main.rs:410:9:410:9 | w | main.rs:410:9:410:9 | w | main.rs:414:9:414:9 | w | | main.rs:410:9:410:9 | w | main.rs:410:9:410:9 | w | main.rs:416:7:416:7 | w | +| main.rs:413:9:413:14 | &mut z | main.rs:409:13:409:13 | z | main.rs:418:15:418:15 | z | +| main.rs:422:13:422:13 | x | main.rs:422:13:422:13 | x | main.rs:424:14:424:14 | x | | main.rs:423:9:423:9 | y | main.rs:423:9:423:9 | y | main.rs:425:6:425:6 | y | +| main.rs:424:9:424:14 | &mut x | main.rs:422:13:422:13 | x | main.rs:426:15:426:15 | x | | main.rs:430:9:430:9 | x | main.rs:430:9:430:9 | x | main.rs:436:15:436:15 | x | | main.rs:432:9:432:11 | cap | main.rs:432:9:432:11 | cap | main.rs:435:5:435:7 | cap | | main.rs:432:15:434:5 | x | main.rs:430:9:430:9 | x | main.rs:433:19:433:19 | x | @@ -268,7 +289,9 @@ read | main.rs:442:20:444:5 | x | main.rs:440:13:440:13 | x | main.rs:443:19:443:19 | x | | main.rs:450:13:450:20 | closure2 | main.rs:450:13:450:20 | closure2 | main.rs:453:5:453:12 | closure2 | | main.rs:453:5:453:14 | y | main.rs:448:13:448:13 | y | main.rs:454:15:454:15 | y | +| main.rs:456:13:456:13 | z | main.rs:456:13:456:13 | z | main.rs:462:15:462:15 | z | | main.rs:458:13:458:20 | closure3 | main.rs:458:13:458:20 | closure3 | main.rs:461:5:461:12 | closure3 | +| main.rs:458:24:460:5 | z | main.rs:456:13:456:13 | z | main.rs:459:9:459:9 | z | | main.rs:467:9:467:13 | block | main.rs:467:9:467:13 | block | main.rs:471:5:471:9 | block | | main.rs:471:5:471:15 | i | main.rs:466:13:466:13 | i | main.rs:472:15:472:15 | i | | main.rs:475:8:475:8 | b | main.rs:475:8:475:8 | b | main.rs:479:8:479:8 | b | @@ -291,6 +314,10 @@ read | main.rs:521:17:521:17 | f | main.rs:521:17:521:17 | f | main.rs:526:9:526:9 | f | | main.rs:521:21:524:9 | self | main.rs:520:23:520:26 | self | main.rs:523:13:523:16 | self | | main.rs:521:22:521:22 | n | main.rs:521:22:521:22 | n | main.rs:523:25:523:25 | n | +| main.rs:531:13:531:13 | a | main.rs:531:13:531:13 | a | main.rs:532:15:532:15 | a | +| main.rs:532:15:532:15 | a | main.rs:531:13:531:13 | a | main.rs:533:5:533:5 | a | +| main.rs:532:15:532:15 | a | main.rs:531:13:531:13 | a | main.rs:534:15:534:15 | a | +| main.rs:535:5:535:5 | a | main.rs:531:13:531:13 | a | main.rs:536:15:536:15 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | main.rs:541:15:541:15 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | main.rs:542:5:542:5 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | main.rs:543:15:543:15 | a | @@ -299,6 +326,8 @@ read | main.rs:549:9:549:9 | x | main.rs:549:9:549:9 | x | main.rs:551:15:551:15 | x | | main.rs:553:9:553:9 | z | main.rs:553:9:553:9 | z | main.rs:554:20:554:20 | z | | main.rs:562:15:562:18 | self | main.rs:562:15:562:18 | self | main.rs:563:6:563:9 | self | +| main.rs:568:11:568:11 | a | main.rs:568:11:568:11 | a | main.rs:569:3:569:3 | a | +| main.rs:569:3:569:3 | a | main.rs:568:11:568:11 | a | main.rs:571:13:571:13 | a | | main.rs:593:9:593:22 | var_from_macro | main.rs:593:9:593:22 | var_from_macro | main.rs:595:15:595:28 | var_from_macro | | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | | main.rs:596:9:596:20 | var_in_macro | main.rs:596:9:596:20 | var_in_macro | main.rs:601:15:601:26 | var_in_macro | @@ -382,13 +411,24 @@ firstRead | main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:356:13:356:13 | x | | main.rs:362:9:362:9 | v | main.rs:362:9:362:9 | v | main.rs:365:12:365:12 | v | | main.rs:364:9:364:12 | text | main.rs:364:9:364:12 | text | main.rs:366:19:366:22 | text | +| main.rs:371:13:371:13 | a | main.rs:371:13:371:13 | a | main.rs:372:5:372:5 | a | +| main.rs:372:5:372:5 | a | main.rs:371:13:371:13 | a | main.rs:373:15:373:15 | a | +| main.rs:374:6:374:11 | &mut a | main.rs:371:13:371:13 | a | main.rs:375:15:375:15 | a | +| main.rs:379:13:379:13 | i | main.rs:379:13:379:13 | i | main.rs:381:14:381:14 | i | | main.rs:380:9:380:13 | ref_i | main.rs:380:9:380:13 | ref_i | main.rs:382:6:382:10 | ref_i | +| main.rs:381:9:381:14 | &mut i | main.rs:379:13:379:13 | i | main.rs:383:15:383:15 | i | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:387:6:387:6 | x | | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:394:6:394:6 | x | | main.rs:393:39:393:39 | y | main.rs:393:39:393:39 | y | main.rs:397:6:397:6 | y | +| main.rs:402:13:402:13 | x | main.rs:402:13:402:13 | x | main.rs:404:27:404:27 | x | | main.rs:403:9:403:9 | y | main.rs:403:9:403:9 | y | main.rs:405:6:405:6 | y | +| main.rs:404:22:404:27 | &mut x | main.rs:402:13:402:13 | x | main.rs:407:15:407:15 | x | +| main.rs:409:13:409:13 | z | main.rs:409:13:409:13 | z | main.rs:413:14:413:14 | z | | main.rs:410:9:410:9 | w | main.rs:410:9:410:9 | w | main.rs:414:9:414:9 | w | +| main.rs:413:9:413:14 | &mut z | main.rs:409:13:409:13 | z | main.rs:418:15:418:15 | z | +| main.rs:422:13:422:13 | x | main.rs:422:13:422:13 | x | main.rs:424:14:424:14 | x | | main.rs:423:9:423:9 | y | main.rs:423:9:423:9 | y | main.rs:425:6:425:6 | y | +| main.rs:424:9:424:14 | &mut x | main.rs:422:13:422:13 | x | main.rs:426:15:426:15 | x | | main.rs:430:9:430:9 | x | main.rs:430:9:430:9 | x | main.rs:436:15:436:15 | x | | main.rs:432:9:432:11 | cap | main.rs:432:9:432:11 | cap | main.rs:435:5:435:7 | cap | | main.rs:432:15:434:5 | x | main.rs:430:9:430:9 | x | main.rs:433:19:433:19 | x | @@ -397,7 +437,9 @@ firstRead | main.rs:442:20:444:5 | x | main.rs:440:13:440:13 | x | main.rs:443:19:443:19 | x | | main.rs:450:13:450:20 | closure2 | main.rs:450:13:450:20 | closure2 | main.rs:453:5:453:12 | closure2 | | main.rs:453:5:453:14 | y | main.rs:448:13:448:13 | y | main.rs:454:15:454:15 | y | +| main.rs:456:13:456:13 | z | main.rs:456:13:456:13 | z | main.rs:462:15:462:15 | z | | main.rs:458:13:458:20 | closure3 | main.rs:458:13:458:20 | closure3 | main.rs:461:5:461:12 | closure3 | +| main.rs:458:24:460:5 | z | main.rs:456:13:456:13 | z | main.rs:459:9:459:9 | z | | main.rs:467:9:467:13 | block | main.rs:467:9:467:13 | block | main.rs:471:5:471:9 | block | | main.rs:471:5:471:15 | i | main.rs:466:13:466:13 | i | main.rs:472:15:472:15 | i | | main.rs:475:8:475:8 | b | main.rs:475:8:475:8 | b | main.rs:479:8:479:8 | b | @@ -414,11 +456,16 @@ firstRead | main.rs:521:17:521:17 | f | main.rs:521:17:521:17 | f | main.rs:525:9:525:9 | f | | main.rs:521:21:524:9 | self | main.rs:520:23:520:26 | self | main.rs:523:13:523:16 | self | | main.rs:521:22:521:22 | n | main.rs:521:22:521:22 | n | main.rs:523:25:523:25 | n | +| main.rs:531:13:531:13 | a | main.rs:531:13:531:13 | a | main.rs:532:15:532:15 | a | +| main.rs:532:15:532:15 | a | main.rs:531:13:531:13 | a | main.rs:533:5:533:5 | a | +| main.rs:535:5:535:5 | a | main.rs:531:13:531:13 | a | main.rs:536:15:536:15 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | main.rs:541:15:541:15 | a | | main.rs:544:5:544:5 | a | main.rs:540:13:540:13 | a | main.rs:545:15:545:15 | a | | main.rs:549:9:549:9 | x | main.rs:549:9:549:9 | x | main.rs:550:20:550:20 | x | | main.rs:553:9:553:9 | z | main.rs:553:9:553:9 | z | main.rs:554:20:554:20 | z | | main.rs:562:15:562:18 | self | main.rs:562:15:562:18 | self | main.rs:563:6:563:9 | self | +| main.rs:568:11:568:11 | a | main.rs:568:11:568:11 | a | main.rs:569:3:569:3 | a | +| main.rs:569:3:569:3 | a | main.rs:568:11:568:11 | a | main.rs:571:13:571:13 | a | | main.rs:593:9:593:22 | var_from_macro | main.rs:593:9:593:22 | var_from_macro | main.rs:595:15:595:28 | var_from_macro | | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | | main.rs:596:9:596:20 | var_in_macro | main.rs:596:9:596:20 | var_in_macro | main.rs:601:15:601:26 | var_in_macro | @@ -437,12 +484,14 @@ adjacentReads | main.rs:290:9:290:11 | a10 | main.rs:279:13:279:15 | a10 | main.rs:292:9:292:11 | a10 | main.rs:296:15:296:17 | a10 | | main.rs:290:9:290:11 | a10 | main.rs:279:13:279:15 | a10 | main.rs:296:15:296:17 | a10 | main.rs:310:15:310:17 | a10 | | main.rs:333:9:333:9 | f | main.rs:333:9:333:9 | f | main.rs:336:15:336:15 | f | main.rs:342:15:342:15 | f | +| main.rs:372:5:372:5 | a | main.rs:371:13:371:13 | a | main.rs:373:15:373:15 | a | main.rs:374:11:374:11 | a | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:387:6:387:6 | x | main.rs:388:10:388:10 | x | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:388:10:388:10 | x | main.rs:389:10:389:10 | x | | main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:389:10:389:10 | x | main.rs:390:12:390:12 | x | | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:394:6:394:6 | x | main.rs:395:10:395:10 | x | | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:395:10:395:10 | x | main.rs:396:10:396:10 | x | | main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:396:10:396:10 | x | main.rs:398:9:398:9 | x | +| main.rs:404:22:404:27 | &mut x | main.rs:402:13:402:13 | x | main.rs:407:15:407:15 | x | main.rs:411:19:411:19 | x | | main.rs:410:9:410:9 | w | main.rs:410:9:410:9 | w | main.rs:414:9:414:9 | w | main.rs:416:7:416:7 | w | | main.rs:476:13:476:13 | x | main.rs:476:13:476:13 | x | main.rs:477:15:477:15 | x | main.rs:478:15:478:15 | x | | main.rs:480:9:480:9 | x | main.rs:476:13:476:13 | x | main.rs:481:19:481:19 | x | main.rs:482:19:482:19 | x | @@ -452,6 +501,7 @@ adjacentReads | main.rs:492:9:492:9 | x | main.rs:492:9:492:9 | x | main.rs:496:19:496:19 | x | main.rs:500:19:500:19 | x | | main.rs:492:9:492:9 | x | main.rs:492:9:492:9 | x | main.rs:496:19:496:19 | x | main.rs:502:19:502:19 | x | | main.rs:521:17:521:17 | f | main.rs:521:17:521:17 | f | main.rs:525:9:525:9 | f | main.rs:526:9:526:9 | f | +| main.rs:532:15:532:15 | a | main.rs:531:13:531:13 | a | main.rs:533:5:533:5 | a | main.rs:534:15:534:15 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | main.rs:541:15:541:15 | a | main.rs:542:5:542:5 | a | | main.rs:540:13:540:13 | a | main.rs:540:13:540:13 | a | main.rs:542:5:542:5 | a | main.rs:543:15:543:15 | a | | main.rs:549:9:549:9 | x | main.rs:549:9:549:9 | x | main.rs:550:20:550:20 | x | main.rs:551:15:551:15 | x | @@ -553,9 +603,14 @@ assigns | main.rs:333:9:333:9 | f | main.rs:334:9:335:9 | \|...\| x | | main.rs:354:13:354:13 | f | main.rs:355:13:356:13 | \|...\| x | | main.rs:362:9:362:9 | v | main.rs:362:13:362:41 | &... | +| main.rs:371:13:371:13 | a | main.rs:371:17:371:17 | 0 | +| main.rs:379:13:379:13 | i | main.rs:379:17:379:17 | 1 | | main.rs:380:9:380:13 | ref_i | main.rs:381:9:381:14 | &mut i | +| main.rs:402:13:402:13 | x | main.rs:402:17:402:17 | 2 | | main.rs:403:9:403:9 | y | main.rs:404:9:404:28 | mutate_param(...) | +| main.rs:409:13:409:13 | z | main.rs:409:17:409:17 | 4 | | main.rs:410:9:410:9 | w | main.rs:411:9:411:19 | &mut ... | +| main.rs:422:13:422:13 | x | main.rs:422:17:422:17 | 1 | | main.rs:423:9:423:9 | y | main.rs:424:9:424:14 | &mut x | | main.rs:430:9:430:9 | x | main.rs:430:13:430:15 | 100 | | main.rs:432:9:432:11 | cap | main.rs:432:15:434:5 | \|...\| ... | @@ -564,6 +619,7 @@ assigns | main.rs:448:13:448:13 | y | main.rs:448:17:448:17 | 2 | | main.rs:450:13:450:20 | closure2 | main.rs:450:24:452:5 | \|...\| ... | | main.rs:451:9:451:9 | y | main.rs:451:13:451:13 | 3 | +| main.rs:456:13:456:13 | z | main.rs:456:17:456:17 | 2 | | main.rs:458:13:458:20 | closure3 | main.rs:458:24:460:5 | \|...\| ... | | main.rs:466:13:466:13 | i | main.rs:466:22:466:22 | 0 | | main.rs:467:9:467:13 | block | main.rs:467:17:469:5 | { ... } | @@ -573,10 +629,13 @@ assigns | main.rs:484:9:484:9 | x | main.rs:484:13:484:13 | 3 | | main.rs:492:9:492:9 | x | main.rs:492:13:492:13 | 1 | | main.rs:521:17:521:17 | f | main.rs:521:21:524:9 | \|...\| ... | +| main.rs:531:13:531:13 | a | main.rs:531:17:531:35 | MyStruct {...} | +| main.rs:535:5:535:5 | a | main.rs:535:9:535:27 | MyStruct {...} | | main.rs:540:13:540:13 | a | main.rs:540:17:540:25 | [...] | | main.rs:544:5:544:5 | a | main.rs:544:9:544:17 | [...] | | main.rs:549:9:549:9 | x | main.rs:549:13:549:14 | 16 | | main.rs:553:9:553:9 | z | main.rs:553:13:553:14 | 17 | +| main.rs:568:11:568:11 | a | main.rs:568:15:568:33 | MyStruct {...} | | main.rs:593:9:593:22 | var_from_macro | main.rs:594:9:594:25 | MacroExpr | | main.rs:594:9:594:25 | var_in_macro | main.rs:594:23:594:24 | 37 | | main.rs:596:9:596:20 | var_in_macro | main.rs:596:24:596:25 | 33 | diff --git a/rust/ql/test/library-tests/variables/Ssa.ql b/rust/ql/test/library-tests/variables/Ssa.ql index a6005c62b008..3c72849f77ac 100644 --- a/rust/ql/test/library-tests/variables/Ssa.ql +++ b/rust/ql/test/library-tests/variables/Ssa.ql @@ -5,8 +5,6 @@ import codeql.rust.dataflow.Ssa import codeql.rust.dataflow.internal.SsaImpl import ExposedForTestingOnly -query predicate nonSsaVariable(Variable v) { not v instanceof Ssa::Variable } - query predicate definition(Ssa::Definition def, Variable v) { def.getSourceVariable() = v } query predicate read(Ssa::Definition def, Variable v, CfgNode read) { diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 2462328c24cc..6b04453ec9ae 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -1,10 +1,13 @@ #select | sqlx.rs:62:26:62:46 | safe_query_3.as_str(...) | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:62:26:62:46 | safe_query_3.as_str(...) | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | +| sqlx.rs:65:30:65:52 | unsafe_query_2.as_str(...) | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:65:30:65:52 | unsafe_query_2.as_str(...) | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:67:30:67:52 | unsafe_query_4.as_str(...) | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:67:30:67:52 | unsafe_query_4.as_str(...) | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:73:25:73:45 | safe_query_3.as_str(...) | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:73:25:73:45 | safe_query_3.as_str(...) | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | +| sqlx.rs:76:29:76:51 | unsafe_query_2.as_str(...) | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:76:29:76:51 | unsafe_query_2.as_str(...) | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:78:29:78:51 | unsafe_query_4.as_str(...) | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:78:29:78:51 | unsafe_query_4.as_str(...) | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | edges -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:37 | remote_string | provenance | | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse(...) [Ok] | provenance | MaD:6 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:56:34:56:89 | MacroExpr | provenance | | | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:1 | | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap(...) | provenance | MaD:4 | @@ -12,27 +15,28 @@ edges | sqlx.rs:48:25:48:85 | ... .text(...) [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:5 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:49:9:49:21 | remote_number | sqlx.rs:52:32:52:87 | MacroExpr | provenance | | -| sqlx.rs:49:25:49:37 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse(...) [Ok] | provenance | MaD:6 | | sqlx.rs:49:25:49:52 | remote_string.parse(...) [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:5 | | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | sqlx.rs:49:9:49:21 | remote_number | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:62:26:62:37 | safe_query_3 | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:73:25:73:36 | safe_query_3 | provenance | | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:62:26:62:46 | safe_query_3.as_str(...) | provenance | MaD:2 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:73:25:73:45 | safe_query_3.as_str(...) | provenance | MaD:2 | | sqlx.rs:52:24:52:88 | res | sqlx.rs:52:32:52:87 | { ... } | provenance | | | sqlx.rs:52:32:52:87 | ...::format(...) | sqlx.rs:52:24:52:88 | res | provenance | | | sqlx.rs:52:32:52:87 | ...::must_use(...) | sqlx.rs:52:9:52:20 | safe_query_3 | provenance | | | sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:3 | | sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:7 | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:67:30:67:43 | unsafe_query_4 | provenance | | -| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:78:29:78:42 | unsafe_query_4 | provenance | | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:65:30:65:43 | unsafe_query_2 [&ref] | provenance | | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:76:29:76:42 | unsafe_query_2 [&ref] | provenance | | +| sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | +| sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:67:30:67:52 | unsafe_query_4.as_str(...) | provenance | MaD:2 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:78:29:78:51 | unsafe_query_4.as_str(...) | provenance | MaD:2 | | sqlx.rs:56:26:56:90 | res | sqlx.rs:56:34:56:89 | { ... } | provenance | | | sqlx.rs:56:34:56:89 | ...::format(...) | sqlx.rs:56:26:56:90 | res | provenance | | | sqlx.rs:56:34:56:89 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | | sqlx.rs:56:34:56:89 | MacroExpr | sqlx.rs:56:34:56:89 | ...::format(...) | provenance | MaD:3 | | sqlx.rs:56:34:56:89 | { ... } | sqlx.rs:56:34:56:89 | ...::must_use(...) | provenance | MaD:7 | -| sqlx.rs:62:26:62:37 | safe_query_3 | sqlx.rs:62:26:62:46 | safe_query_3.as_str(...) | provenance | MaD:2 | -| sqlx.rs:67:30:67:43 | unsafe_query_4 | sqlx.rs:67:30:67:52 | unsafe_query_4.as_str(...) | provenance | MaD:2 | -| sqlx.rs:73:25:73:36 | safe_query_3 | sqlx.rs:73:25:73:45 | safe_query_3.as_str(...) | provenance | MaD:2 | -| sqlx.rs:78:29:78:42 | unsafe_query_4 | sqlx.rs:78:29:78:51 | unsafe_query_4.as_str(...) | provenance | MaD:2 | +| sqlx.rs:65:30:65:43 | unsafe_query_2 [&ref] | sqlx.rs:65:30:65:52 | unsafe_query_2.as_str(...) | provenance | MaD:2 | +| sqlx.rs:76:29:76:42 | unsafe_query_2 [&ref] | sqlx.rs:76:29:76:51 | unsafe_query_2.as_str(...) | provenance | MaD:2 | models | 1 | Source: repo:https://github.com/seanmonstar/reqwest:reqwest; crate::blocking::get; remote; ReturnValue.Field[crate::result::Result::Ok(0)] | | 2 | Summary: lang:alloc; ::as_str; Argument[self]; ReturnValue; taint | @@ -50,7 +54,6 @@ nodes | sqlx.rs:48:25:48:85 | ... .text(...) [Ok] | semmle.label | ... .text(...) [Ok] | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | sqlx.rs:49:9:49:21 | remote_number | semmle.label | remote_number | -| sqlx.rs:49:25:49:37 | remote_string | semmle.label | remote_string | | sqlx.rs:49:25:49:52 | remote_string.parse(...) [Ok] | semmle.label | remote_string.parse(...) [Ok] | | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | sqlx.rs:52:9:52:20 | safe_query_3 | semmle.label | safe_query_3 | @@ -59,18 +62,21 @@ nodes | sqlx.rs:52:32:52:87 | ...::must_use(...) | semmle.label | ...::must_use(...) | | sqlx.rs:52:32:52:87 | MacroExpr | semmle.label | MacroExpr | | sqlx.rs:52:32:52:87 | { ... } | semmle.label | { ... } | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | +| sqlx.rs:54:26:54:39 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | +| sqlx.rs:54:27:54:39 | remote_string | semmle.label | remote_string | | sqlx.rs:56:9:56:22 | unsafe_query_4 | semmle.label | unsafe_query_4 | | sqlx.rs:56:26:56:90 | res | semmle.label | res | | sqlx.rs:56:34:56:89 | ...::format(...) | semmle.label | ...::format(...) | | sqlx.rs:56:34:56:89 | ...::must_use(...) | semmle.label | ...::must_use(...) | | sqlx.rs:56:34:56:89 | MacroExpr | semmle.label | MacroExpr | | sqlx.rs:56:34:56:89 | { ... } | semmle.label | { ... } | -| sqlx.rs:62:26:62:37 | safe_query_3 | semmle.label | safe_query_3 | | sqlx.rs:62:26:62:46 | safe_query_3.as_str(...) | semmle.label | safe_query_3.as_str(...) | -| sqlx.rs:67:30:67:43 | unsafe_query_4 | semmle.label | unsafe_query_4 | +| sqlx.rs:65:30:65:43 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | +| sqlx.rs:65:30:65:52 | unsafe_query_2.as_str(...) | semmle.label | unsafe_query_2.as_str(...) | | sqlx.rs:67:30:67:52 | unsafe_query_4.as_str(...) | semmle.label | unsafe_query_4.as_str(...) | -| sqlx.rs:73:25:73:36 | safe_query_3 | semmle.label | safe_query_3 | | sqlx.rs:73:25:73:45 | safe_query_3.as_str(...) | semmle.label | safe_query_3.as_str(...) | -| sqlx.rs:78:29:78:42 | unsafe_query_4 | semmle.label | unsafe_query_4 | +| sqlx.rs:76:29:76:42 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | +| sqlx.rs:76:29:76:51 | unsafe_query_2.as_str(...) | semmle.label | unsafe_query_2.as_str(...) | | sqlx.rs:78:29:78:51 | unsafe_query_4.as_str(...) | semmle.label | unsafe_query_4.as_str(...) | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-089/sqlx.rs b/rust/ql/test/query-tests/security/CWE-089/sqlx.rs index f819ea3a781e..d40a4bb2a118 100644 --- a/rust/ql/test/query-tests/security/CWE-089/sqlx.rs +++ b/rust/ql/test/query-tests/security/CWE-089/sqlx.rs @@ -62,7 +62,7 @@ async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Err let _ = conn.execute(safe_query_3.as_str()).await?; // $ sql-sink SPURIOUS: Alert[rust/sql-injection]=remote1 let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=args1 if enable_remote { - let _ = conn.execute(unsafe_query_2.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 + let _ = conn.execute(unsafe_query_2.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 let _ = conn.execute(unsafe_query_3.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 let _ = conn.execute(unsafe_query_4.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 } @@ -73,7 +73,7 @@ async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Err let _ = sqlx::query(safe_query_3.as_str()).execute(&pool).await?; // $ sql-sink SPURIOUS: Alert[rust/sql-injection]=remote1 let _ = sqlx::query(unsafe_query_1.as_str()).execute(&pool).await?; // $ sql-sink MISSING: Alert[rust/sql-injection][rust/sql-injection]=args1 if enable_remote { - let _ = sqlx::query(unsafe_query_2.as_str()).execute(&pool).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 + let _ = sqlx::query(unsafe_query_2.as_str()).execute(&pool).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 let _ = sqlx::query(unsafe_query_3.as_str()).execute(&pool).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 let _ = sqlx::query(unsafe_query_4.as_str()).execute(&pool).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 } diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index a34f9d78f520..3f417d62ebc1 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -180,43 +180,38 @@ edges | test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | test_logging.rs:167:17:167:64 | ...::assert_failed | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:167:40:167:63 | MacroExpr | test_logging.rs:167:40:167:63 | ...::Some(...) [Some] | provenance | | | test_logging.rs:167:56:167:63 | password | test_logging.rs:167:40:167:63 | MacroExpr | provenance | | -| test_logging.rs:168:34:168:66 | MacroExpr | test_logging.rs:168:34:168:75 | ... .as_str(...) | provenance | MaD:12 | | test_logging.rs:168:34:168:66 | res | test_logging.rs:168:42:168:65 | { ... } | provenance | | | test_logging.rs:168:34:168:75 | ... .as_str(...) | test_logging.rs:168:27:168:32 | expect | provenance | MaD:1 Sink:MaD:1 | | test_logging.rs:168:42:168:65 | ...::format(...) | test_logging.rs:168:34:168:66 | res | provenance | | -| test_logging.rs:168:42:168:65 | ...::must_use(...) | test_logging.rs:168:34:168:66 | MacroExpr | provenance | | +| test_logging.rs:168:42:168:65 | ...::must_use(...) | test_logging.rs:168:34:168:75 | ... .as_str(...) | provenance | MaD:12 | | test_logging.rs:168:42:168:65 | MacroExpr | test_logging.rs:168:42:168:65 | ...::format(...) | provenance | MaD:13 | | test_logging.rs:168:42:168:65 | { ... } | test_logging.rs:168:42:168:65 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:168:58:168:65 | password | test_logging.rs:168:42:168:65 | MacroExpr | provenance | | -| test_logging.rs:174:36:174:70 | MacroExpr | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:174:36:174:70 | res | test_logging.rs:174:44:174:69 | { ... } | provenance | | | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | test_logging.rs:174:30:174:34 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:174:44:174:69 | ...::format(...) | test_logging.rs:174:36:174:70 | res | provenance | | -| test_logging.rs:174:44:174:69 | ...::must_use(...) | test_logging.rs:174:36:174:70 | MacroExpr | provenance | | +| test_logging.rs:174:44:174:69 | ...::must_use(...) | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:174:44:174:69 | MacroExpr | test_logging.rs:174:44:174:69 | ...::format(...) | provenance | MaD:13 | | test_logging.rs:174:44:174:69 | { ... } | test_logging.rs:174:44:174:69 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:174:62:174:69 | password | test_logging.rs:174:44:174:69 | MacroExpr | provenance | | -| test_logging.rs:175:40:175:74 | MacroExpr | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:175:40:175:74 | res | test_logging.rs:175:48:175:73 | { ... } | provenance | | | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | test_logging.rs:175:30:175:38 | write_all | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:175:48:175:73 | ...::format(...) | test_logging.rs:175:40:175:74 | res | provenance | | -| test_logging.rs:175:48:175:73 | ...::must_use(...) | test_logging.rs:175:40:175:74 | MacroExpr | provenance | | +| test_logging.rs:175:48:175:73 | ...::must_use(...) | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:175:48:175:73 | MacroExpr | test_logging.rs:175:48:175:73 | ...::format(...) | provenance | MaD:13 | | test_logging.rs:175:48:175:73 | { ... } | test_logging.rs:175:48:175:73 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:175:66:175:73 | password | test_logging.rs:175:48:175:73 | MacroExpr | provenance | | -| test_logging.rs:178:15:178:49 | MacroExpr | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:178:15:178:49 | res | test_logging.rs:178:23:178:48 | { ... } | provenance | | | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | test_logging.rs:178:9:178:13 | write | provenance | MaD:5 Sink:MaD:5 | | test_logging.rs:178:23:178:48 | ...::format(...) | test_logging.rs:178:15:178:49 | res | provenance | | -| test_logging.rs:178:23:178:48 | ...::must_use(...) | test_logging.rs:178:15:178:49 | MacroExpr | provenance | | +| test_logging.rs:178:23:178:48 | ...::must_use(...) | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:178:23:178:48 | MacroExpr | test_logging.rs:178:23:178:48 | ...::format(...) | provenance | MaD:13 | | test_logging.rs:178:23:178:48 | { ... } | test_logging.rs:178:23:178:48 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:178:41:178:48 | password | test_logging.rs:178:23:178:48 | MacroExpr | provenance | | -| test_logging.rs:181:15:181:49 | MacroExpr | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:181:15:181:49 | res | test_logging.rs:181:23:181:48 | { ... } | provenance | | | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | test_logging.rs:181:9:181:13 | write | provenance | MaD:4 Sink:MaD:4 | | test_logging.rs:181:23:181:48 | ...::format(...) | test_logging.rs:181:15:181:49 | res | provenance | | -| test_logging.rs:181:23:181:48 | ...::must_use(...) | test_logging.rs:181:15:181:49 | MacroExpr | provenance | | +| test_logging.rs:181:23:181:48 | ...::must_use(...) | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | provenance | MaD:11 | | test_logging.rs:181:23:181:48 | MacroExpr | test_logging.rs:181:23:181:48 | ...::format(...) | provenance | MaD:13 | | test_logging.rs:181:23:181:48 | { ... } | test_logging.rs:181:23:181:48 | ...::must_use(...) | provenance | MaD:14 | | test_logging.rs:181:41:181:48 | password | test_logging.rs:181:23:181:48 | MacroExpr | provenance | | @@ -404,7 +399,6 @@ nodes | test_logging.rs:167:40:167:63 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:167:56:167:63 | password | semmle.label | password | | test_logging.rs:168:27:168:32 | expect | semmle.label | expect | -| test_logging.rs:168:34:168:66 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:168:34:168:66 | res | semmle.label | res | | test_logging.rs:168:34:168:75 | ... .as_str(...) | semmle.label | ... .as_str(...) | | test_logging.rs:168:42:168:65 | ...::format(...) | semmle.label | ...::format(...) | @@ -413,7 +407,6 @@ nodes | test_logging.rs:168:42:168:65 | { ... } | semmle.label | { ... } | | test_logging.rs:168:58:168:65 | password | semmle.label | password | | test_logging.rs:174:30:174:34 | write | semmle.label | write | -| test_logging.rs:174:36:174:70 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:174:36:174:70 | res | semmle.label | res | | test_logging.rs:174:36:174:81 | ... .as_bytes(...) | semmle.label | ... .as_bytes(...) | | test_logging.rs:174:44:174:69 | ...::format(...) | semmle.label | ...::format(...) | @@ -422,7 +415,6 @@ nodes | test_logging.rs:174:44:174:69 | { ... } | semmle.label | { ... } | | test_logging.rs:174:62:174:69 | password | semmle.label | password | | test_logging.rs:175:30:175:38 | write_all | semmle.label | write_all | -| test_logging.rs:175:40:175:74 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:175:40:175:74 | res | semmle.label | res | | test_logging.rs:175:40:175:85 | ... .as_bytes(...) | semmle.label | ... .as_bytes(...) | | test_logging.rs:175:48:175:73 | ...::format(...) | semmle.label | ...::format(...) | @@ -431,7 +423,6 @@ nodes | test_logging.rs:175:48:175:73 | { ... } | semmle.label | { ... } | | test_logging.rs:175:66:175:73 | password | semmle.label | password | | test_logging.rs:178:9:178:13 | write | semmle.label | write | -| test_logging.rs:178:15:178:49 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:178:15:178:49 | res | semmle.label | res | | test_logging.rs:178:15:178:60 | ... .as_bytes(...) | semmle.label | ... .as_bytes(...) | | test_logging.rs:178:23:178:48 | ...::format(...) | semmle.label | ...::format(...) | @@ -440,7 +431,6 @@ nodes | test_logging.rs:178:23:178:48 | { ... } | semmle.label | { ... } | | test_logging.rs:178:41:178:48 | password | semmle.label | password | | test_logging.rs:181:9:181:13 | write | semmle.label | write | -| test_logging.rs:181:15:181:49 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:181:15:181:49 | res | semmle.label | res | | test_logging.rs:181:15:181:60 | ... .as_bytes(...) | semmle.label | ... .as_bytes(...) | | test_logging.rs:181:23:181:48 | ...::format(...) | semmle.label | ...::format(...) | diff --git a/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected b/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected index cb6fc390349c..b05e99f352b0 100644 --- a/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected +++ b/rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.expected @@ -1,2 +1,12 @@ unexpectedModel +| Unexpected summary found: repo::test;::clone;Argument[self].Field[crate::option::MyOption::MySome(0)].Reference;ReturnValue.Field[crate::option::MyOption::MySome(0)];value;dfc-generated | +| Unexpected summary found: repo::test;::from;Argument[0].Field[crate::option::MyOption::MySome(0)];ReturnValue.Field[crate::option::MyOption::MySome(0)].Reference;value;dfc-generated | +| Unexpected summary found: repo::test;::cloned;Argument[self].Field[crate::option::MyOption::MySome(0)].Reference;ReturnValue.Field[crate::option::MyOption::MySome(0)];value;dfc-generated | +| Unexpected summary found: repo::test;::get_or_insert;Argument[0];Argument[self].Field[crate::option::MyOption::MySome(0)];value;dfc-generated | +| Unexpected summary found: repo::test;::get_or_insert;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated | +| Unexpected summary found: repo::test;::get_or_insert_default;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated | +| Unexpected summary found: repo::test;::get_or_insert_with;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated | +| Unexpected summary found: repo::test;::insert;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated | expectedModel +| Expected summary missing: repo::test;::take_if;Argument[self].Reference.Field[crate::option::MyOption::MySome(0)];Argument[0].Parameter[0].Reference;value;dfc-generated | +| Expected summary missing: repo::test;::take_if;Argument[self].Reference;ReturnValue;value;dfc-generated |