Merge pull request #18872 from paldepind/rust-ref-mut

Rust: Allow SSA and some data flow for mutable borrows
This commit is contained in:
Simon Friis Vindum
2025-03-04 09:25:18 +01:00
committed by GitHub
20 changed files with 1036 additions and 459 deletions

View File

@@ -11,7 +11,13 @@ private module Input implements InputSig<Location, RustDataFlow> {
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()) }
}

View File

@@ -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<Location> {
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<Location> {
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<Location> {
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<Location> {
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<Location> {
)
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

View File

@@ -47,26 +47,7 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
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<Location> {
) 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. */

View File

@@ -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(...) |

View File

@@ -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();
}

View File

@@ -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 |

View File

@@ -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 | * ... |

View File

@@ -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(...) |

View File

@@ -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

View File

@@ -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] |

View File

@@ -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(...) |

View File

@@ -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
}
fn write_through_borrow() {
let mut a = 1;
sink(a);
let b = &mut a;
*b = source(39);
sink(a); // $ MISSING: hasValueFlow=39
}
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 pass_borrowed_value() {
let val = source(83);
takes_borrowed_value(&val);
}
mod test_ref_pattern {
// Intraprocedural tests involving immutable borrows
mod intraprocedural_immutable_borrows {
use super::{sink, source};
pub fn read_through_ref() {
pub fn read_through_borrow() {
let a = source(21);
let b = &a;
let c = *b;
sink(c); // $ hasValueFlow=21
}
fn takes_borrowed_value(&n: &i64) {
sink(n); // $ hasValueFlow=83
}
pub fn pass_borrowed_value() {
let val = source(83);
takes_borrowed_value(&val);
}
pub 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
}
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::*;
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
}
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 through_self_in_method_implicit_borrow() {
let my_number = MyNumber::MyNumber(source(85));
sink(my_number.get_number()); // $ MISSING: hasValueFlow=85
// 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
}
}
fn through_self_in_method_explicit_borrow() {
let my_number = &MyNumber::MyNumber(source(40));
sink(my_number.get_number()); // $ hasValueFlow=40
}
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
}
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();
}

View File

@@ -117,7 +117,7 @@ async fn test_hyper_http(case: i64) -> Result<(), Box<dyn std::error::Error>> {
// 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())

View File

@@ -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(...) |

View File

@@ -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 | <captured entry> 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 | <captured exit> 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 | <captured entry> 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 | <captured entry> 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 | <captured entry> 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 | <captured entry> 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 | <captured exit> 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 | <captured entry> 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 | <captured exit> 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 | <captured entry> 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 | <captured entry> 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 | <captured entry> 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 | <captured exit> 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 | <captured entry> 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 | <captured exit> 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 | <captured entry> 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 |

View File

@@ -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) {

View File

@@ -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; <crate::string::String>::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

View File

@@ -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
}

View File

@@ -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(...) |

View File

@@ -1,2 +1,12 @@
unexpectedModel
| Unexpected summary found: repo::test;<crate::option::MyOption as crate::clone::Clone>::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;<crate::option::MyOption as crate::convert::From>::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;<crate::option::MyOption>::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;<crate::option::MyOption>::get_or_insert;Argument[0];Argument[self].Field[crate::option::MyOption::MySome(0)];value;dfc-generated |
| Unexpected summary found: repo::test;<crate::option::MyOption>::get_or_insert;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated |
| Unexpected summary found: repo::test;<crate::option::MyOption>::get_or_insert_default;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated |
| Unexpected summary found: repo::test;<crate::option::MyOption>::get_or_insert_with;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated |
| Unexpected summary found: repo::test;<crate::option::MyOption>::insert;Argument[self].Field[crate::option::MyOption::MySome(0)];ReturnValue.Reference;value;dfc-generated |
expectedModel
| Expected summary missing: repo::test;<crate::option::MyOption>::take_if;Argument[self].Reference.Field[crate::option::MyOption::MySome(0)];Argument[0].Parameter[0].Reference;value;dfc-generated |
| Expected summary missing: repo::test;<crate::option::MyOption>::take_if;Argument[self].Reference;ReturnValue;value;dfc-generated |