Merge branch 'main' into rust-df-closure

This commit is contained in:
Simon Friis Vindum
2024-12-04 09:25:18 +01:00
16 changed files with 1168 additions and 485 deletions

View File

@@ -1,4 +0,0 @@
---
category: minorAnalysis
---
* .NET 9 is now required to build the C# extractor.

View File

@@ -731,11 +731,9 @@ module LocalFlow {
or
node2 = node1.(LocalFunctionCreationNode).getAnAccess(true)
or
node1 =
unique(FlowSummaryNode n1 |
FlowSummaryImpl::Private::Steps::summaryLocalStep(n1.getSummaryNode(),
node2.(FlowSummaryNode).getSummaryNode(), true, _)
)
FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1
.(FlowSummaryNode)
.getSummaryNode(), node2.(FlowSummaryNode).getSummaryNode())
}
}

View File

@@ -160,11 +160,8 @@ predicate localMustFlowStep(Node node1, Node node2) {
or
node2.asExpr().(AssignExpr).getSource() = node1.asExpr()
or
node1 =
unique(FlowSummaryNode n1 |
FlowSummaryImpl::Private::Steps::summaryLocalStep(n1.getSummaryNode(),
node2.(FlowSummaryNode).getSummaryNode(), true, _)
)
FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1.(FlowSummaryNode).getSummaryNode(),
node2.(FlowSummaryNode).getSummaryNode())
}
import Cached

View File

@@ -175,11 +175,9 @@ module LocalFlow {
or
node1 = node2.(ImplicitBlockArgumentNode).getParameterNode(true)
or
node1 =
unique(FlowSummaryNode n1 |
FlowSummaryImpl::Private::Steps::summaryLocalStep(n1.getSummaryNode(),
node2.(FlowSummaryNode).getSummaryNode(), true, _)
)
FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1
.(FlowSummaryNode)
.getSummaryNode(), node2.(FlowSummaryNode).getSummaryNode())
}
}

View File

@@ -15,7 +15,14 @@ private import DataFlowImpl::Node as Node
module DataFlow {
final class Node = Node::Node;
final class ParameterNode = Node::ParameterNode;
/**
* The value of a parameter at function entry, viewed as a node in a data
* flow graph.
*/
final class ParameterNode extends Node instanceof Node::SourceParameterNode {
/** Gets the parameter that this node corresponds to. */
ParamBase getParameter() { result = super.getParameter().getParamBase() }
}
final class PostUpdateNode = Node::PostUpdateNode;

View File

@@ -0,0 +1,69 @@
/** Provides classes and predicates for defining flow summaries. */
private import rust
private import internal.FlowSummaryImpl as Impl
private import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprBaseImpl
// import all instances below
private module Summaries {
private import codeql.rust.Frameworks
// TODO: Use models-as-data when it's available
private class UnwrapSummary extends SummarizedCallable::Range {
UnwrapSummary() { this = "lang:core::_::<crate::option::Option>::unwrap" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[self].Variant[crate::option::Option::Some(0)]" and
output = "ReturnValue" and
preservesValue = true
}
}
}
/** Provides the `Range` class used to define the extent of `LibraryCallable`. */
module LibraryCallable {
/** A callable defined in library code, identified by a unique string. */
abstract class Range extends string {
bindingset[this]
Range() { any() }
/** Gets a call to this library callable. */
CallExprBase getACall() {
exists(Resolvable r, string crate |
r = CallExprBaseImpl::getCallResolvable(result) and
this = crate + r.getResolvedPath()
|
crate = r.getResolvedCrateOrigin() + "::_::"
or
not r.hasResolvedCrateOrigin() and
crate = ""
)
}
}
}
final class LibraryCallable = LibraryCallable::Range;
/** Provides the `Range` class used to define the extent of `SummarizedCallable`. */
module SummarizedCallable {
/** A callable with a flow summary, identified by a unique string. */
abstract class Range extends LibraryCallable::Range, Impl::Public::SummarizedCallable {
bindingset[this]
Range() { any() }
override predicate propagatesFlow(
string input, string output, boolean preservesValue, string model
) {
this.propagatesFlow(input, output, preservesValue) and model = ""
}
/**
* Holds if data may flow from `input` to `output` through this callable.
*
* `preservesValue` indicates whether this is a value-preserving step or a taint-step.
*/
abstract predicate propagatesFlow(string input, string output, boolean preservesValue);
}
}
final class SummarizedCallable = SummarizedCallable::Range;

View File

@@ -11,8 +11,8 @@ private import SsaImpl as SsaImpl
private import codeql.rust.controlflow.ControlFlowGraph
private import codeql.rust.controlflow.CfgNodes
private import codeql.rust.dataflow.Ssa
private newtype TReturnKind = TNormalReturnKind()
private import codeql.rust.dataflow.FlowSummary
private import FlowSummaryImpl as FlowSummaryImpl
/**
* A return kind. A return kind describes how a value can be returned from a
@@ -35,8 +35,13 @@ final class DataFlowCallable extends TDataFlowCallable {
*/
CfgScope asCfgScope() { this = TCfgScope(result) }
/**
* Gets the underlying library callable, if any.
*/
LibraryCallable asLibraryCallable() { this = TLibraryCallable(result) }
/** Gets a textual representation of this callable. */
string toString() { result = this.asCfgScope().toString() }
string toString() { result = [this.asCfgScope().toString(), this.asLibraryCallable().toString()] }
/** Gets the location of this callable. */
Location getLocation() { result = this.asCfgScope().getLocation() }
@@ -54,11 +59,31 @@ final class DataFlowCall extends TDataFlowCall {
CallExprBaseCfgNode asCallBaseExprCfgNode() { result = call }
DataFlowCallable getEnclosingCallable() {
result = TCfgScope(call.getExpr().getEnclosingCfgScope())
predicate isSummaryCall(
FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver
) {
this = TSummaryCall(c, receiver)
}
string toString() { result = this.asCallBaseExprCfgNode().toString() }
DataFlowCallable getEnclosingCallable() {
result = TCfgScope(call.getExpr().getEnclosingCfgScope())
or
exists(FlowSummaryImpl::Public::SummarizedCallable c |
this.isSummaryCall(c, _) and
result = TLibraryCallable(c)
)
}
string toString() {
result = this.asCallBaseExprCfgNode().toString()
or
exists(
FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver
|
this.isSummaryCall(c, receiver) and
result = "[summary] call to " + receiver + " in " + c
)
}
Location getLocation() { result = this.asCallBaseExprCfgNode().getLocation() }
}
@@ -148,6 +173,26 @@ module Node {
override Location getLocation() { none() }
}
/** A data flow node used to model flow summaries. */
class FlowSummaryNode extends Node, TFlowSummaryNode {
FlowSummaryImpl::Private::SummaryNode getSummaryNode() { this = TFlowSummaryNode(result) }
/** Gets the summarized callable that this node belongs to. */
FlowSummaryImpl::Public::SummarizedCallable getSummarizedCallable() {
result = this.getSummaryNode().getSummarizedCallable()
}
override CfgScope getCfgScope() { none() }
override DataFlowCallable getEnclosingCallable() {
result.asLibraryCallable() = this.getSummarizedCallable()
}
override EmptyLocation getLocation() { any() }
override string toString() { result = this.getSummaryNode().toString() }
}
/** A data flow node that corresponds directly to a CFG node for an AST node. */
abstract class AstCfgFlowNode extends Node {
AstCfgNode n;
@@ -189,17 +234,62 @@ module Node {
* The value of a parameter at function entry, viewed as a node in a data
* flow graph.
*/
final class ParameterNode extends AstCfgFlowNode, TParameterNode {
abstract class ParameterNode extends Node {
abstract predicate isParameterOf(DataFlowCallable c, ParameterPosition pos);
}
final class SourceParameterNode extends AstCfgFlowNode, ParameterNode, TSourceParameterNode {
override ParamBaseCfgNode n;
ParameterNode() { this = TParameterNode(n) }
SourceParameterNode() { this = TSourceParameterNode(n) }
override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
n.getAstNode() = pos.getParameterIn(c.asCfgScope().(Callable).getParamList())
}
/** Gets the parameter in the CFG that this node corresponds to. */
ParamBaseCfgNode getParameter() { result = n }
}
final class ArgumentNode extends ExprNode {
ArgumentNode() { isArgumentForCall(n, _, _) }
/** A parameter for a library callable with a flow summary. */
final class SummaryParameterNode extends ParameterNode, FlowSummaryNode {
private ParameterPosition pos_;
SummaryParameterNode() {
FlowSummaryImpl::Private::summaryParameterNode(this.getSummaryNode(), pos_)
}
override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
this.getSummarizedCallable() = c.asLibraryCallable() and pos = pos_
}
}
abstract class ArgumentNode extends Node {
abstract predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos);
}
final class ExprArgumentNode extends ArgumentNode, ExprNode {
private CallExprBaseCfgNode call_;
private RustDataFlow::ArgumentPosition pos_;
ExprArgumentNode() { isArgumentForCall(n, call_, pos_) }
override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) {
call.asCallBaseExprCfgNode() = call_ and pos = pos_
}
}
final class SummaryArgumentNode extends FlowSummaryNode, ArgumentNode {
private FlowSummaryImpl::Private::SummaryNode receiver;
private RustDataFlow::ArgumentPosition pos_;
SummaryArgumentNode() {
FlowSummaryImpl::Private::summaryArgumentNode(receiver, this.getSummaryNode(), pos_)
}
override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) {
call.isSummaryCall(_, receiver) and pos = pos_
}
}
/** An SSA node. */
@@ -222,23 +312,52 @@ module Node {
}
/** A data flow node that represents a value returned by a callable. */
final class ReturnNode extends ExprNode {
ReturnNode() { this.getCfgNode().getASuccessor() instanceof AnnotatedExitCfgNode }
abstract class ReturnNode extends Node {
abstract ReturnKind getKind();
}
ReturnKind getKind() { any() }
final class ExprReturnNode extends ExprNode, ReturnNode {
ExprReturnNode() { this.getCfgNode().getASuccessor() instanceof AnnotatedExitCfgNode }
override ReturnKind getKind() { result = TNormalReturnKind() }
}
final class SummaryReturnNode extends FlowSummaryNode, ReturnNode {
private ReturnKind rk;
SummaryReturnNode() { FlowSummaryImpl::Private::summaryReturnNode(this.getSummaryNode(), rk) }
override ReturnKind getKind() { result = rk }
}
/** A data-flow node that represents the output of a call. */
abstract class OutNode extends Node, ExprNode {
abstract class OutNode extends Node {
/** Gets the underlying call for this node. */
abstract DataFlowCall getCall();
abstract DataFlowCall getCall(ReturnKind kind);
}
final private class ExprOutNode extends ExprNode, OutNode {
ExprOutNode() { this.asExpr() instanceof CallExprBaseCfgNode }
/** Gets the underlying call CFG node that includes this out node. */
override DataFlowCall getCall() { result.asCallBaseExprCfgNode() = this.getCfgNode() }
override DataFlowCall getCall(ReturnKind kind) {
result.asCallBaseExprCfgNode() = this.getCfgNode() and
kind = TNormalReturnKind()
}
}
final class SummaryOutNode extends FlowSummaryNode, OutNode {
private DataFlowCall call;
private ReturnKind kind_;
SummaryOutNode() {
exists(FlowSummaryImpl::Private::SummaryNode receiver |
call.isSummaryCall(_, receiver) and
FlowSummaryImpl::Private::summaryOutNode(receiver, this.getSummaryNode(), kind_)
)
}
override DataFlowCall getCall(ReturnKind kind) { result = call and kind = kind_ }
}
/**
@@ -252,19 +371,35 @@ module Node {
* Nodes corresponding to AST elements, for example `ExprNode`, usually refer
* to the value before the update.
*/
final class PostUpdateNode extends Node, TExprPostUpdateNode {
abstract class PostUpdateNode extends Node {
/** Gets the node before the state update. */
abstract Node getPreUpdateNode();
override string toString() { result = "[post] " + this.getPreUpdateNode().toString() }
}
final class ExprPostUpdateNode extends PostUpdateNode, TExprPostUpdateNode {
private ExprCfgNode n;
PostUpdateNode() { this = TExprPostUpdateNode(n) }
ExprPostUpdateNode() { this = TExprPostUpdateNode(n) }
/** Gets the node before the state update. */
Node getPreUpdateNode() { result = TExprNode(n) }
override Node getPreUpdateNode() { result = TExprNode(n) }
final override CfgScope getCfgScope() { result = n.getScope() }
override CfgScope getCfgScope() { result = n.getScope() }
final override Location getLocation() { result = n.getLocation() }
override Location getLocation() { result = n.getLocation() }
}
final override string toString() { result = "[post] " + n.toString() }
final class SummaryPostUpdateNode extends FlowSummaryNode, PostUpdateNode {
private FlowSummaryNode pre;
SummaryPostUpdateNode() {
FlowSummaryImpl::Private::summaryPostUpdateNode(this.getSummaryNode(), pre.getSummaryNode())
}
override Node getPreUpdateNode() { result = pre }
final override string toString() { result = PostUpdateNode.super.toString() }
}
final class CastNode = NaNode;
@@ -277,7 +412,7 @@ module SsaFlow {
private module SsaFlow = SsaImpl::DataFlowIntegration;
private Node::ParameterNode toParameterNode(ParamCfgNode p) {
result.(Node::ParameterNode).getParameter() = p
result.(Node::SourceParameterNode).getParameter() = p
}
/** Converts a control flow node into an SSA control flow node. */
@@ -316,6 +451,15 @@ private ExprCfgNode getALastEvalNode(ExprCfgNode e) {
}
module LocalFlow {
predicate flowSummaryLocalStep(
Node::FlowSummaryNode nodeFrom, Node::FlowSummaryNode nodeTo,
FlowSummaryImpl::Public::SummarizedCallable c, string model
) {
FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.getSummaryNode(),
nodeTo.getSummaryNode(), true, model) and
c = nodeFrom.getSummarizedCallable()
}
pragma[nomagic]
predicate localFlowStepCommon(Node nodeFrom, Node nodeTo) {
nodeFrom.getCfgNode() = getALastEvalNode(nodeTo.getCfgNode())
@@ -329,9 +473,7 @@ module LocalFlow {
nodeFrom.(Node::AstCfgFlowNode).getCfgNode() =
nodeTo.(Node::SsaNode).getDefinitionExt().(Ssa::WriteDefinition).getControlFlowNode()
or
nodeFrom.(Node::ParameterNode).getParameter().(ParamCfgNode).getPat() = nodeTo.asPat()
or
SsaFlow::localFlowStep(_, nodeFrom, nodeTo, _)
nodeFrom.(Node::SourceParameterNode).getParameter().(ParamCfgNode).getPat() = nodeTo.asPat()
or
exists(AssignmentExprCfgNode a |
a.getRhs() = nodeFrom.getCfgNode() and
@@ -397,7 +539,7 @@ abstract class Content extends TContent {
}
/** A canonical path pointing to an enum variant. */
private class VariantCanonicalPath extends MkVariantCanonicalPath {
class VariantCanonicalPath extends MkVariantCanonicalPath {
CrateOriginOption crate;
string path;
string name;
@@ -407,6 +549,8 @@ private class VariantCanonicalPath extends MkVariantCanonicalPath {
/** Gets the underlying variant. */
Variant getVariant() { variantHasExtendedCanonicalPath(_, result, crate, path, name) }
string getExtendedCanonicalPath() { result = path + "::" + name }
string toString() { result = name }
Location getLocation() { result = this.getVariant().getLocation() }
@@ -564,19 +708,23 @@ module RustDataFlow implements InputSig<Location> {
/** Holds if `p` is a parameter of `c` at the position `pos`. */
predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) {
p.getCfgNode().getAstNode() = pos.getParameterIn(c.asCfgScope().(Callable).getParamList())
p.isParameterOf(c, pos)
}
/** Holds if `n` is an argument of `c` at the position `pos`. */
predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos) {
isArgumentForCall(n.getCfgNode(), call.asCallBaseExprCfgNode(), pos)
n.isArgumentOf(call, pos)
}
DataFlowCallable nodeGetEnclosingCallable(Node node) { result = node.getEnclosingCallable() }
DataFlowType getNodeType(Node node) { any() }
predicate nodeIsHidden(Node node) { node instanceof Node::SsaNode }
predicate nodeIsHidden(Node node) {
node instanceof Node::SsaNode
or
node instanceof Node::FlowSummaryNode
}
class DataFlowExpr = ExprCfgNode;
@@ -592,15 +740,15 @@ module RustDataFlow implements InputSig<Location> {
/** Gets a viable implementation of the target of the given `Call`. */
DataFlowCallable viableCallable(DataFlowCall call) {
result.asCfgScope() = call.asCallBaseExprCfgNode().getCallExprBase().getStaticTarget()
or
result.asLibraryCallable().getACall() = call.asCallBaseExprCfgNode().getCallExprBase()
}
/**
* Gets a node that can read the value returned from `call` with return kind
* `kind`.
*/
OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) {
call = result.getCall() and exists(kind)
}
OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { call = result.getCall(kind) }
// NOTE: For now we use the type `Unit` and do not benefit from type
// information in the data flow analysis.
@@ -637,8 +785,19 @@ module RustDataFlow implements InputSig<Location> {
* are the value-preserving intra-callable flow steps.
*/
predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) {
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo) and
(
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo)
or
exists(boolean isUseStep | SsaFlow::localFlowStep(_, nodeFrom, nodeTo, isUseStep) |
isUseStep = false
or
isUseStep = true and
not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _)
)
) and
model = ""
or
LocalFlow::flowSummaryLocalStep(nodeFrom, nodeTo, _, model)
}
/**
@@ -646,7 +805,10 @@ module RustDataFlow implements InputSig<Location> {
* that does not follow a call edge. For example, a step through a global
* variable.
*/
predicate jumpStep(Node node1, Node node2) { none() }
predicate jumpStep(Node node1, Node node2) {
FlowSummaryImpl::Private::Steps::summaryJumpStep(node1.(Node::FlowSummaryNode).getSummaryNode(),
node2.(Node::FlowSummaryNode).getSummaryNode())
}
/** Holds if path `p` resolves to struct `s`. */
private predicate pathResolveToStructCanonicalPath(Path p, StructCanonicalPath s) {
@@ -661,15 +823,13 @@ module RustDataFlow implements InputSig<Location> {
exists(CrateOriginOption crate, string path |
resolveExtendedCanonicalPath(p.getQualifier(), crate, path) and
v = MkVariantCanonicalPath(crate, path, p.getPart().getNameRef().getText())
or
exists(string name |
not p.hasQualifier() and
resolveExtendedCanonicalPath(p, crate, path + "::" + name) and
v = MkVariantCanonicalPath(crate, path, name)
)
)
or
// TODO: Remove once library types are extracted
not p.hasQualifier() and
v = MkVariantCanonicalPath(_, "crate::std::option::Option", p.getPart().getNameRef().getText())
or
// TODO: Remove once library types are extracted
not p.hasQualifier() and
v = MkVariantCanonicalPath(_, "crate::std::result::Result", p.getPart().getNameRef().getText())
}
/** Holds if `p` destructs an enum variant `v`. */
@@ -725,6 +885,9 @@ module RustDataFlow implements InputSig<Location> {
node2.asExpr() = access
)
)
or
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(Node::FlowSummaryNode).getSummaryNode(),
cs, node2.(Node::FlowSummaryNode).getSummaryNode())
}
/** Holds if `ce` constructs an enum value of type `v`. */
@@ -789,6 +952,9 @@ module RustDataFlow implements InputSig<Location> {
or
tupleAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
)
or
FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(Node::FlowSummaryNode).getSummaryNode(),
cs, node2.(Node::FlowSummaryNode).getSummaryNode())
}
/**
@@ -798,13 +964,19 @@ module RustDataFlow implements InputSig<Location> {
*/
predicate clearsContent(Node n, ContentSet cs) {
tupleAssignment(_, n, cs.(SingletonContentSet).getContent())
or
FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(Node::FlowSummaryNode).getSummaryNode(),
cs)
}
/**
* Holds if the value that is being tracked is expected to be stored inside content `c`
* at node `n`.
*/
predicate expectsContent(Node n, ContentSet c) { none() }
predicate expectsContent(Node n, ContentSet cs) {
FlowSummaryImpl::Private::Steps::summaryExpectsContent(n.(Node::FlowSummaryNode)
.getSummaryNode(), cs)
}
class NodeRegion instanceof Void {
string toString() { result = "NodeRegion" }
@@ -824,7 +996,12 @@ module RustDataFlow implements InputSig<Location> {
* One example would be to allow flow like `p.foo = p.bar;`, which is disallowed
* by default as a heuristic.
*/
predicate allowParameterReturnInSelf(ParameterNode p) { none() }
predicate allowParameterReturnInSelf(ParameterNode p) {
exists(DataFlowCallable c, ParameterPosition pos |
p.isParameterOf(c, pos) and
FlowSummaryImpl::Private::summaryAllowParameterReturnInSelf(c.asLibraryCallable(), pos)
)
}
/**
* Holds if the value of `node2` is given by `node1`.
@@ -837,6 +1014,10 @@ module RustDataFlow implements InputSig<Location> {
*/
predicate localMustFlowStep(Node node1, Node node2) {
SsaFlow::localMustFlowStep(_, node1, node2)
or
FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1
.(Node::FlowSummaryNode)
.getSummaryNode(), node2.(Node::FlowSummaryNode).getSummaryNode())
}
class LambdaCallKind = Unit;
@@ -882,46 +1063,70 @@ private module Cached {
cached
newtype TNode =
TExprNode(ExprCfgNode n) or
TParameterNode(ParamBaseCfgNode p) or
TSourceParameterNode(ParamBaseCfgNode p) or
TPatNode(PatCfgNode p) or
TExprPostUpdateNode(ExprCfgNode e) {
isArgumentForCall(e, _, _) or e = any(FieldExprCfgNode access).getExpr()
} or
TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node)
TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or
TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn)
cached
newtype TDataFlowCall = TCall(CallExprBaseCfgNode c)
newtype TDataFlowCall =
TCall(CallExprBaseCfgNode c) or
TSummaryCall(
FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver
) {
FlowSummaryImpl::Private::summaryCallbackRange(c, receiver)
}
cached
newtype TDataFlowCallable = TCfgScope(CfgScope scope)
newtype TDataFlowCallable =
TCfgScope(CfgScope scope) or
TLibraryCallable(LibraryCallable c)
/** This is the local flow predicate that is exposed. */
cached
predicate localFlowStepImpl(Node::Node nodeFrom, Node::Node nodeTo) {
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo)
or
SsaFlow::localFlowStep(_, nodeFrom, nodeTo, _)
or
// Simple flow through library code is included in the exposed local
// step relation, even though flow is technically inter-procedural
FlowSummaryImpl::Private::Steps::summaryThroughStepValue(nodeFrom, nodeTo, _)
}
cached
newtype TParameterPosition =
TPositionalParameterPosition(int i) {
i in [0 .. max([any(ParamList l).getNumberOfParams(), any(ArgList l).getNumberOfArgs()]) - 1]
or
FlowSummaryImpl::ParsePositions::isParsedArgumentPosition(_, i)
or
FlowSummaryImpl::ParsePositions::isParsedParameterPosition(_, i)
} or
TSelfParameterPosition()
cached
newtype TReturnKind = TNormalReturnKind()
private CrateOriginOption langCoreCrate() { result.asSome() = "lang:core" }
cached
newtype TVariantCanonicalPath =
MkVariantCanonicalPath(CrateOriginOption crate, string path, string name) {
variantHasExtendedCanonicalPath(_, _, crate, path, name)
or
// TODO: Remove once library types are extracted
crate.isNone() and
path = "crate::std::option::Option" and
name = "Some"
or
// TODO: Remove once library types are extracted
crate.isNone() and
path = "crate::std::result::Result" and
name = ["Ok", "Err"]
crate = langCoreCrate() and
(
path = "crate::option::Option" and
name = "Some"
or
path = "crate::result::Result" and
name = ["Ok", "Err"]
)
}
cached
@@ -936,11 +1141,11 @@ private module Cached {
pos in [0 .. v.getVariant().getFieldList().(TupleFieldList).getNumberOfFields() - 1]
or
// TODO: Remove once library types are extracted
v = MkVariantCanonicalPath(_, "crate::std::option::Option", "Some") and
v = MkVariantCanonicalPath(langCoreCrate(), "crate::option::Option", "Some") and
pos = 0
or
// TODO: Remove once library types are extracted
v = MkVariantCanonicalPath(_, "crate::std::result::Result", ["Ok", "Err"]) and
v = MkVariantCanonicalPath(langCoreCrate(), "crate::result::Result", ["Ok", "Err"]) and
pos = 0
} or
TVariantFieldContent(VariantCanonicalPath v, string field) {

View File

@@ -0,0 +1,103 @@
/**
* Provides classes and predicates for defining flow summaries.
*/
private import rust
private import codeql.dataflow.internal.FlowSummaryImpl
private import codeql.dataflow.internal.AccessPathSyntax as AccessPath
private import codeql.rust.dataflow.internal.DataFlowImpl
private import codeql.rust.dataflow.FlowSummary
module Input implements InputSig<Location, RustDataFlow> {
class SummarizedCallableBase = string;
RustDataFlow::ArgumentPosition callbackSelfParameterPosition() { none() }
ReturnKind getStandardReturnValueKind() { result = TNormalReturnKind() }
string encodeParameterPosition(ParameterPosition pos) { result = pos.toString() }
predicate encodeArgumentPosition = encodeParameterPosition/1;
string encodeContent(ContentSet cs, string arg) {
exists(Content c | cs = TSingletonContentSet(c) |
exists(VariantCanonicalPath v | result = "Variant" |
exists(int pos |
c = TVariantPositionContent(v, pos) and
arg = v.getExtendedCanonicalPath() + "(" + pos + ")"
)
or
exists(string field |
c = TVariantFieldContent(v, field) and
arg = v.getExtendedCanonicalPath() + "::" + field
)
)
)
}
string encodeReturn(ReturnKind rk, string arg) { none() }
string encodeWithoutContent(ContentSet c, string arg) {
result = "Without" + encodeContent(c, arg)
}
string encodeWithContent(ContentSet c, string arg) { result = "With" + encodeContent(c, arg) }
bindingset[token]
ParameterPosition decodeUnknownParameterPosition(AccessPath::AccessPathTokenBase token) {
// needed to support `Argument[x..y]` ranges
token.getName() = "Argument" and
result.getPosition() = AccessPath::parseInt(token.getAnArgument())
}
bindingset[token]
RustDataFlow::ArgumentPosition decodeUnknownArgumentPosition(AccessPath::AccessPathTokenBase token) {
// needed to support `Parameter[x..y]` ranges
token.getName() = "Parameter" and
result.getPosition() = AccessPath::parseInt(token.getAnArgument())
}
bindingset[token]
ContentSet decodeUnknownContent(AccessPath::AccessPathTokenBase token) { none() }
bindingset[token]
ContentSet decodeUnknownWithContent(AccessPath::AccessPathTokenBase token) { none() }
}
private import Make<Location, RustDataFlow, Input> as Impl
private module StepsInput implements Impl::Private::StepsInputSig {
DataFlowCall getACall(Public::SummarizedCallable sc) {
result.asCallBaseExprCfgNode().getCallExprBase() = sc.(LibraryCallable).getACall()
}
}
module Private {
import Impl::Private
module Steps = Impl::Private::Steps<StepsInput>;
}
module Public = Impl::Public;
module ParsePositions {
private import Private
private predicate isParamBody(string body) {
body = any(AccessPathToken tok).getAnArgument("Parameter")
}
private predicate isArgBody(string body) {
body = any(AccessPathToken tok).getAnArgument("Argument")
}
predicate isParsedParameterPosition(string c, int i) {
isParamBody(c) and
i = AccessPath::parseInt(c)
}
predicate isParsedArgumentPosition(string c, int i) {
isArgBody(c) and
i = AccessPath::parseInt(c)
}
}

View File

@@ -17,7 +17,7 @@ module Impl {
private import codeql.rust.elements.internal.PathExprImpl::Impl
pragma[nomagic]
private Resolvable getCallResolvable(CallExprBase call) {
Resolvable getCallResolvable(CallExprBase call) {
result = call.(MethodCallExpr)
or
result = call.(CallExpr).getFunction().(PathExpr).getPath()

View File

@@ -123,268 +123,271 @@ localStep
| main.rs:120:10:120:10 | b | main.rs:121:10:121:10 | b |
| main.rs:121:10:121:10 | [post] b | main.rs:122:10:122:10 | b |
| main.rs:121:10:121:10 | b | main.rs:122:10:122:10 | b |
| main.rs:134:9:134:9 | [SSA] p | main.rs:138:10:138:10 | p |
| main.rs:134:9:134:9 | [SSA] p | main.rs:135:10:135:10 | p |
| main.rs:134:9:134:9 | p | main.rs:134:9:134:9 | [SSA] p |
| main.rs:134:13:137:5 | Point {...} | main.rs:134:9:134:9 | p |
| main.rs:138:10:138:10 | [post] p | main.rs:139:10:139:10 | p |
| main.rs:138:10:138:10 | p | main.rs:139:10:139:10 | p |
| main.rs:143:9:143:13 | [SSA] p | main.rs:147:10:147:10 | p |
| main.rs:143:9:143:13 | p | main.rs:143:9:143:13 | [SSA] p |
| main.rs:143:17:146:5 | Point {...} | main.rs:143:9:143:13 | p |
| main.rs:147:10:147:10 | [post] p | main.rs:148:5:148:5 | p |
| main.rs:147:10:147:10 | p | main.rs:148:5:148:5 | p |
| main.rs:148:5:148:5 | [post] p | main.rs:149:10:149:10 | p |
| main.rs:148:5:148:5 | p | main.rs:149:10:149:10 | p |
| main.rs:148:11:148:20 | source(...) | main.rs:148:5:148:7 | p.y |
| main.rs:153:9:153:9 | [SSA] p | main.rs:157:32:157:32 | p |
| main.rs:153:9:153:9 | p | main.rs:153:9:153:9 | [SSA] p |
| main.rs:153:13:156:5 | Point {...} | main.rs:153:9:153:9 | p |
| main.rs:157:20:157:20 | [SSA] a | main.rs:158:10:158:10 | a |
| main.rs:157:20:157:20 | a | main.rs:157:20:157:20 | [SSA] a |
| main.rs:157:26:157:26 | [SSA] b | main.rs:159:10:159:10 | b |
| main.rs:157:26:157:26 | b | main.rs:157:26:157:26 | [SSA] b |
| main.rs:157:32:157:32 | p | main.rs:157:9:157:28 | Point {...} |
| main.rs:168:9:168:9 | [SSA] p | main.rs:175:10:175:10 | p |
| main.rs:168:9:168:9 | p | main.rs:168:9:168:9 | [SSA] p |
| main.rs:168:13:174:5 | Point3D {...} | main.rs:168:9:168:9 | p |
| main.rs:175:10:175:10 | [post] p | main.rs:176:10:176:10 | p |
| main.rs:175:10:175:10 | p | main.rs:176:10:176:10 | p |
| main.rs:176:10:176:10 | [post] p | main.rs:177:10:177:10 | p |
| main.rs:176:10:176:10 | p | main.rs:177:10:177:10 | p |
| main.rs:181:9:181:9 | [SSA] p | main.rs:188:11:188:11 | p |
| main.rs:181:9:181:9 | p | main.rs:181:9:181:9 | [SSA] p |
| main.rs:181:13:187:5 | Point3D {...} | main.rs:181:9:181:9 | p |
| main.rs:188:5:194:5 | match p { ... } | main.rs:180:26:195:1 | { ... } |
| main.rs:188:11:188:11 | p | main.rs:189:9:189:45 | Point3D {...} |
| main.rs:189:34:189:34 | [SSA] x | main.rs:190:18:190:18 | x |
| main.rs:189:34:189:34 | x | main.rs:189:34:189:34 | [SSA] x |
| main.rs:189:37:189:37 | [SSA] y | main.rs:191:18:191:18 | y |
| main.rs:189:37:189:37 | y | main.rs:189:37:189:37 | [SSA] y |
| main.rs:189:42:189:42 | [SSA] z | main.rs:192:18:192:18 | z |
| main.rs:189:42:189:42 | z | main.rs:189:42:189:42 | [SSA] z |
| main.rs:189:50:193:9 | { ... } | main.rs:188:5:194:5 | match p { ... } |
| main.rs:201:9:201:10 | [SSA] s1 | main.rs:203:11:203:12 | s1 |
| main.rs:201:9:201:10 | s1 | main.rs:201:9:201:10 | [SSA] s1 |
| main.rs:201:14:201:37 | ...::Some(...) | main.rs:201:9:201:10 | s1 |
| main.rs:202:9:202:10 | [SSA] s2 | main.rs:207:11:207:12 | s2 |
| main.rs:202:9:202:10 | s2 | main.rs:202:9:202:10 | [SSA] s2 |
| main.rs:202:14:202:28 | ...::Some(...) | main.rs:202:9:202:10 | s2 |
| main.rs:203:11:203:12 | s1 | main.rs:204:9:204:23 | TupleStructPat |
| main.rs:203:11:203:12 | s1 | main.rs:205:9:205:20 | ...::None |
| main.rs:204:22:204:22 | [SSA] n | main.rs:204:33:204:33 | n |
| main.rs:204:22:204:22 | n | main.rs:204:22:204:22 | [SSA] n |
| main.rs:204:28:204:34 | sink(...) | main.rs:203:5:206:5 | match s1 { ... } |
| main.rs:205:25:205:31 | sink(...) | main.rs:203:5:206:5 | match s1 { ... } |
| main.rs:207:5:210:5 | match s2 { ... } | main.rs:200:37:211:1 | { ... } |
| main.rs:207:11:207:12 | s2 | main.rs:208:9:208:23 | TupleStructPat |
| main.rs:207:11:207:12 | s2 | main.rs:209:9:209:20 | ...::None |
| main.rs:208:22:208:22 | [SSA] n | main.rs:208:33:208:33 | n |
| main.rs:208:22:208:22 | n | main.rs:208:22:208:22 | [SSA] n |
| main.rs:208:28:208:34 | sink(...) | main.rs:207:5:210:5 | match s2 { ... } |
| main.rs:209:25:209:31 | sink(...) | main.rs:207:5:210:5 | match s2 { ... } |
| main.rs:214:9:214:10 | [SSA] s1 | main.rs:216:11:216:12 | s1 |
| main.rs:214:9:214:10 | s1 | main.rs:214:9:214:10 | [SSA] s1 |
| main.rs:214:14:214:29 | Some(...) | main.rs:214:9:214:10 | s1 |
| main.rs:215:9:215:10 | [SSA] s2 | main.rs:220:11:220:12 | s2 |
| main.rs:215:9:215:10 | s2 | main.rs:215:9:215:10 | [SSA] s2 |
| main.rs:215:14:215:20 | Some(...) | main.rs:215:9:215:10 | s2 |
| main.rs:216:11:216:12 | s1 | main.rs:217:9:217:15 | TupleStructPat |
| main.rs:216:11:216:12 | s1 | main.rs:218:9:218:12 | None |
| main.rs:217:14:217:14 | [SSA] n | main.rs:217:25:217:25 | n |
| main.rs:217:14:217:14 | n | main.rs:217:14:217:14 | [SSA] n |
| main.rs:217:20:217:26 | sink(...) | main.rs:216:5:219:5 | match s1 { ... } |
| main.rs:218:17:218:23 | sink(...) | main.rs:216:5:219:5 | match s1 { ... } |
| main.rs:220:5:223:5 | match s2 { ... } | main.rs:213:39:224:1 | { ... } |
| main.rs:220:11:220:12 | s2 | main.rs:221:9:221:15 | TupleStructPat |
| main.rs:220:11:220:12 | s2 | main.rs:222:9:222:12 | None |
| main.rs:221:14:221:14 | [SSA] n | main.rs:221:25:221:25 | n |
| main.rs:221:14:221:14 | n | main.rs:221:14:221:14 | [SSA] n |
| main.rs:221:20:221:26 | sink(...) | main.rs:220:5:223:5 | match s2 { ... } |
| main.rs:222:17:222:23 | sink(...) | main.rs:220:5:223:5 | match s2 { ... } |
| main.rs:232:9:232:10 | [SSA] s1 | main.rs:234:11:234:12 | s1 |
| main.rs:232:9:232:10 | s1 | main.rs:232:9:232:10 | [SSA] s1 |
| main.rs:232:14:232:39 | ...::A(...) | main.rs:232:9:232:10 | s1 |
| main.rs:233:9:233:10 | [SSA] s2 | main.rs:241:11:241:12 | s2 |
| main.rs:233:9:233:10 | s2 | main.rs:233:9:233:10 | [SSA] s2 |
| main.rs:233:14:233:30 | ...::B(...) | main.rs:233:9:233:10 | s2 |
| main.rs:234:11:234:12 | s1 | main.rs:235:9:235:25 | TupleStructPat |
| main.rs:234:11:234:12 | s1 | main.rs:236:9:236:25 | TupleStructPat |
| main.rs:234:11:234:12 | s1 | main.rs:238:11:238:12 | s1 |
| main.rs:235:24:235:24 | [SSA] n | main.rs:235:35:235:35 | n |
| main.rs:235:24:235:24 | n | main.rs:235:24:235:24 | [SSA] n |
| main.rs:235:30:235:36 | sink(...) | main.rs:234:5:237:5 | match s1 { ... } |
| main.rs:236:24:236:24 | [SSA] n | main.rs:236:35:236:35 | n |
| main.rs:236:24:236:24 | n | main.rs:236:24:236:24 | [SSA] n |
| main.rs:236:30:236:36 | sink(...) | main.rs:234:5:237:5 | match s1 { ... } |
| main.rs:238:11:238:12 | s1 | main.rs:239:9:239:45 | ... \| ... |
| main.rs:239:9:239:45 | ... \| ... | main.rs:239:9:239:25 | TupleStructPat |
| main.rs:239:9:239:45 | ... \| ... | main.rs:239:29:239:45 | TupleStructPat |
| main.rs:239:9:239:45 | [SSA] [match(true)] phi | main.rs:239:55:239:55 | n |
| main.rs:239:24:239:24 | [SSA] [input] [match(true)] phi | main.rs:239:9:239:45 | [SSA] [match(true)] phi |
| main.rs:239:24:239:24 | [SSA] n | main.rs:239:24:239:24 | [SSA] [input] [match(true)] phi |
| main.rs:239:24:239:24 | n | main.rs:239:24:239:24 | [SSA] n |
| main.rs:239:44:239:44 | [SSA] [input] [match(true)] phi | main.rs:239:9:239:45 | [SSA] [match(true)] phi |
| main.rs:239:44:239:44 | [SSA] n | main.rs:239:44:239:44 | [SSA] [input] [match(true)] phi |
| main.rs:239:44:239:44 | n | main.rs:239:44:239:44 | [SSA] n |
| main.rs:239:50:239:56 | sink(...) | main.rs:238:5:240:5 | match s1 { ... } |
| main.rs:241:5:244:5 | match s2 { ... } | main.rs:231:48:245:1 | { ... } |
| main.rs:241:11:241:12 | s2 | main.rs:242:9:242:25 | TupleStructPat |
| main.rs:241:11:241:12 | s2 | main.rs:243:9:243:25 | TupleStructPat |
| main.rs:242:24:242:24 | [SSA] n | main.rs:242:35:242:35 | n |
| main.rs:242:24:242:24 | n | main.rs:242:24:242:24 | [SSA] n |
| main.rs:242:30:242:36 | sink(...) | main.rs:241:5:244:5 | match s2 { ... } |
| main.rs:243:24:243:24 | [SSA] n | main.rs:243:35:243:35 | n |
| main.rs:243:24:243:24 | n | main.rs:243:24:243:24 | [SSA] n |
| main.rs:243:30:243:36 | sink(...) | main.rs:241:5:244:5 | match s2 { ... } |
| main.rs:250:9:250:10 | [SSA] s1 | main.rs:252:11:252:12 | s1 |
| main.rs:250:9:250:10 | s1 | main.rs:250:9:250:10 | [SSA] s1 |
| main.rs:250:14:250:26 | A(...) | main.rs:250:9:250:10 | s1 |
| main.rs:251:9:251:10 | [SSA] s2 | main.rs:259:11:259:12 | s2 |
| main.rs:251:9:251:10 | s2 | main.rs:251:9:251:10 | [SSA] s2 |
| main.rs:251:14:251:17 | B(...) | main.rs:251:9:251:10 | s2 |
| main.rs:252:11:252:12 | s1 | main.rs:253:9:253:12 | TupleStructPat |
| main.rs:252:11:252:12 | s1 | main.rs:254:9:254:12 | TupleStructPat |
| main.rs:252:11:252:12 | s1 | main.rs:256:11:256:12 | s1 |
| main.rs:253:11:253:11 | [SSA] n | main.rs:253:22:253:22 | n |
| main.rs:253:11:253:11 | n | main.rs:253:11:253:11 | [SSA] n |
| main.rs:253:17:253:23 | sink(...) | main.rs:252:5:255:5 | match s1 { ... } |
| main.rs:254:11:254:11 | [SSA] n | main.rs:254:22:254:22 | n |
| main.rs:254:11:254:11 | n | main.rs:254:11:254:11 | [SSA] n |
| main.rs:254:17:254:23 | sink(...) | main.rs:252:5:255:5 | match s1 { ... } |
| main.rs:256:11:256:12 | s1 | main.rs:257:9:257:19 | ... \| ... |
| main.rs:257:9:257:19 | ... \| ... | main.rs:257:9:257:12 | TupleStructPat |
| main.rs:257:9:257:19 | ... \| ... | main.rs:257:16:257:19 | TupleStructPat |
| main.rs:257:9:257:19 | [SSA] [match(true)] phi | main.rs:257:29:257:29 | n |
| main.rs:257:11:257:11 | [SSA] [input] [match(true)] phi | main.rs:257:9:257:19 | [SSA] [match(true)] phi |
| main.rs:257:11:257:11 | [SSA] n | main.rs:257:11:257:11 | [SSA] [input] [match(true)] phi |
| main.rs:257:11:257:11 | n | main.rs:257:11:257:11 | [SSA] n |
| main.rs:257:18:257:18 | [SSA] [input] [match(true)] phi | main.rs:257:9:257:19 | [SSA] [match(true)] phi |
| main.rs:257:18:257:18 | [SSA] n | main.rs:257:18:257:18 | [SSA] [input] [match(true)] phi |
| main.rs:257:18:257:18 | n | main.rs:257:18:257:18 | [SSA] n |
| main.rs:257:24:257:30 | sink(...) | main.rs:256:5:258:5 | match s1 { ... } |
| main.rs:259:5:262:5 | match s2 { ... } | main.rs:249:50:263:1 | { ... } |
| main.rs:259:11:259:12 | s2 | main.rs:260:9:260:12 | TupleStructPat |
| main.rs:259:11:259:12 | s2 | main.rs:261:9:261:12 | TupleStructPat |
| main.rs:260:11:260:11 | [SSA] n | main.rs:260:22:260:22 | n |
| main.rs:260:11:260:11 | n | main.rs:260:11:260:11 | [SSA] n |
| main.rs:260:17:260:23 | sink(...) | main.rs:259:5:262:5 | match s2 { ... } |
| main.rs:261:11:261:11 | [SSA] n | main.rs:261:22:261:22 | n |
| main.rs:261:11:261:11 | n | main.rs:261:11:261:11 | [SSA] n |
| main.rs:261:17:261:23 | sink(...) | main.rs:259:5:262:5 | match s2 { ... } |
| main.rs:271:9:271:10 | [SSA] s1 | main.rs:275:11:275:12 | s1 |
| main.rs:271:9:271:10 | s1 | main.rs:271:9:271:10 | [SSA] s1 |
| main.rs:271:14:273:5 | ...::C {...} | main.rs:271:9:271:10 | s1 |
| main.rs:274:9:274:10 | [SSA] s2 | main.rs:282:11:282:12 | s2 |
| main.rs:274:9:274:10 | s2 | main.rs:274:9:274:10 | [SSA] s2 |
| main.rs:274:14:274:43 | ...::D {...} | main.rs:274:9:274:10 | s2 |
| main.rs:275:11:275:12 | s1 | main.rs:276:9:276:38 | ...::C {...} |
| main.rs:275:11:275:12 | s1 | main.rs:277:9:277:38 | ...::D {...} |
| main.rs:275:11:275:12 | s1 | main.rs:279:11:279:12 | s1 |
| main.rs:276:36:276:36 | [SSA] n | main.rs:276:48:276:48 | n |
| main.rs:276:36:276:36 | n | main.rs:276:36:276:36 | [SSA] n |
| main.rs:276:43:276:49 | sink(...) | main.rs:275:5:278:5 | match s1 { ... } |
| main.rs:277:36:277:36 | [SSA] n | main.rs:277:48:277:48 | n |
| main.rs:277:36:277:36 | n | main.rs:277:36:277:36 | [SSA] n |
| main.rs:277:43:277:49 | sink(...) | main.rs:275:5:278:5 | match s1 { ... } |
| main.rs:279:11:279:12 | s1 | main.rs:280:9:280:71 | ... \| ... |
| main.rs:280:9:280:71 | ... \| ... | main.rs:280:9:280:38 | ...::C {...} |
| main.rs:280:9:280:71 | ... \| ... | main.rs:280:42:280:71 | ...::D {...} |
| main.rs:280:9:280:71 | [SSA] [match(true)] phi | main.rs:280:81:280:81 | n |
| main.rs:280:36:280:36 | [SSA] [input] [match(true)] phi | main.rs:280:9:280:71 | [SSA] [match(true)] phi |
| main.rs:280:36:280:36 | [SSA] n | main.rs:280:36:280:36 | [SSA] [input] [match(true)] phi |
| main.rs:280:36:280:36 | n | main.rs:280:36:280:36 | [SSA] n |
| main.rs:280:69:280:69 | [SSA] [input] [match(true)] phi | main.rs:280:9:280:71 | [SSA] [match(true)] phi |
| main.rs:280:69:280:69 | [SSA] n | main.rs:280:69:280:69 | [SSA] [input] [match(true)] phi |
| main.rs:280:69:280:69 | n | main.rs:280:69:280:69 | [SSA] n |
| main.rs:280:76:280:82 | sink(...) | main.rs:279:5:281:5 | match s1 { ... } |
| main.rs:282:5:285:5 | match s2 { ... } | main.rs:270:49:286:1 | { ... } |
| main.rs:282:11:282:12 | s2 | main.rs:283:9:283:38 | ...::C {...} |
| main.rs:282:11:282:12 | s2 | main.rs:284:9:284:38 | ...::D {...} |
| main.rs:283:36:283:36 | [SSA] n | main.rs:283:48:283:48 | n |
| main.rs:283:36:283:36 | n | main.rs:283:36:283:36 | [SSA] n |
| main.rs:283:43:283:49 | sink(...) | main.rs:282:5:285:5 | match s2 { ... } |
| main.rs:284:36:284:36 | [SSA] n | main.rs:284:48:284:48 | n |
| main.rs:284:36:284:36 | n | main.rs:284:36:284:36 | [SSA] n |
| main.rs:284:43:284:49 | sink(...) | main.rs:282:5:285:5 | match s2 { ... } |
| main.rs:291:9:291:10 | [SSA] s1 | main.rs:295:11:295:12 | s1 |
| main.rs:291:9:291:10 | s1 | main.rs:291:9:291:10 | [SSA] s1 |
| main.rs:291:14:293:5 | C {...} | main.rs:291:9:291:10 | s1 |
| main.rs:294:9:294:10 | [SSA] s2 | main.rs:302:11:302:12 | s2 |
| main.rs:294:9:294:10 | s2 | main.rs:294:9:294:10 | [SSA] s2 |
| main.rs:294:14:294:29 | D {...} | main.rs:294:9:294:10 | s2 |
| main.rs:295:11:295:12 | s1 | main.rs:296:9:296:24 | C {...} |
| main.rs:295:11:295:12 | s1 | main.rs:297:9:297:24 | D {...} |
| main.rs:295:11:295:12 | s1 | main.rs:299:11:299:12 | s1 |
| main.rs:296:22:296:22 | [SSA] n | main.rs:296:34:296:34 | n |
| main.rs:296:22:296:22 | n | main.rs:296:22:296:22 | [SSA] n |
| main.rs:296:29:296:35 | sink(...) | main.rs:295:5:298:5 | match s1 { ... } |
| main.rs:297:22:297:22 | [SSA] n | main.rs:297:34:297:34 | n |
| main.rs:297:22:297:22 | n | main.rs:297:22:297:22 | [SSA] n |
| main.rs:297:29:297:35 | sink(...) | main.rs:295:5:298:5 | match s1 { ... } |
| main.rs:299:11:299:12 | s1 | main.rs:300:9:300:43 | ... \| ... |
| main.rs:300:9:300:43 | ... \| ... | main.rs:300:9:300:24 | C {...} |
| main.rs:300:9:300:43 | ... \| ... | main.rs:300:28:300:43 | D {...} |
| main.rs:300:9:300:43 | [SSA] [match(true)] phi | main.rs:300:53:300:53 | n |
| main.rs:300:22:300:22 | [SSA] [input] [match(true)] phi | main.rs:300:9:300:43 | [SSA] [match(true)] phi |
| main.rs:300:22:300:22 | [SSA] n | main.rs:300:22:300:22 | [SSA] [input] [match(true)] phi |
| main.rs:300:22:300:22 | n | main.rs:300:22:300:22 | [SSA] n |
| main.rs:300:41:300:41 | [SSA] [input] [match(true)] phi | main.rs:300:9:300:43 | [SSA] [match(true)] phi |
| main.rs:300:41:300:41 | [SSA] n | main.rs:300:41:300:41 | [SSA] [input] [match(true)] phi |
| main.rs:300:41:300:41 | n | main.rs:300:41:300:41 | [SSA] n |
| main.rs:300:48:300:54 | sink(...) | main.rs:299:5:301:5 | match s1 { ... } |
| main.rs:302:5:305:5 | match s2 { ... } | main.rs:290:51:306:1 | { ... } |
| main.rs:302:11:302:12 | s2 | main.rs:303:9:303:24 | C {...} |
| main.rs:302:11:302:12 | s2 | main.rs:304:9:304:24 | D {...} |
| main.rs:303:22:303:22 | [SSA] n | main.rs:303:34:303:34 | n |
| main.rs:303:22:303:22 | n | main.rs:303:22:303:22 | [SSA] n |
| main.rs:303:29:303:35 | sink(...) | main.rs:302:5:305:5 | match s2 { ... } |
| main.rs:304:22:304:22 | [SSA] n | main.rs:304:34:304:34 | n |
| main.rs:304:22:304:22 | n | main.rs:304:22:304:22 | [SSA] n |
| main.rs:304:29:304:35 | sink(...) | main.rs:302:5:305:5 | match s2 { ... } |
| main.rs:312:9:312:9 | [SSA] f | main.rs:313:10:313:10 | f |
| main.rs:312:9:312:9 | f | main.rs:312:9:312:9 | [SSA] f |
| main.rs:312:13:312:52 | \|...\| ... | main.rs:312:9:312:9 | f |
| main.rs:312:14:312:17 | ... | main.rs:312:14:312:17 | cond |
| main.rs:312:14:312:17 | [SSA] cond | main.rs:312:23:312:26 | cond |
| main.rs:312:14:312:17 | cond | main.rs:312:14:312:17 | [SSA] cond |
| main.rs:312:28:312:41 | { ... } | main.rs:312:20:312:52 | if cond {...} else {...} |
| main.rs:312:30:312:39 | source(...) | main.rs:312:28:312:41 | { ... } |
| main.rs:312:48:312:52 | { ... } | main.rs:312:20:312:52 | if cond {...} else {...} |
| main.rs:312:50:312:50 | 0 | main.rs:312:48:312:52 | { ... } |
| main.rs:317:9:317:9 | [SSA] f | main.rs:324:5:324:5 | f |
| main.rs:317:9:317:9 | f | main.rs:317:9:317:9 | [SSA] f |
| main.rs:317:13:322:9 | \|...\| ... | main.rs:317:9:317:9 | f |
| main.rs:317:14:317:17 | ... | main.rs:317:14:317:17 | cond |
| main.rs:317:14:317:17 | [SSA] cond | main.rs:318:12:318:15 | cond |
| main.rs:317:14:317:17 | cond | main.rs:317:14:317:17 | [SSA] cond |
| main.rs:317:20:317:23 | ... | main.rs:317:20:317:23 | data |
| main.rs:317:20:317:23 | [SSA] data | main.rs:319:18:319:21 | data |
| main.rs:317:20:317:23 | data | main.rs:317:20:317:23 | [SSA] data |
| main.rs:318:17:320:9 | { ... } | main.rs:318:9:322:9 | if cond {...} else {...} |
| main.rs:320:16:322:9 | { ... } | main.rs:318:9:322:9 | if cond {...} else {...} |
| main.rs:321:13:321:19 | sink(...) | main.rs:320:16:322:9 | { ... } |
| main.rs:323:9:323:9 | [SSA] a | main.rs:324:13:324:13 | a |
| main.rs:323:9:323:9 | a | main.rs:323:9:323:9 | [SSA] a |
| main.rs:323:13:323:22 | source(...) | main.rs:323:9:323:9 | a |
| main.rs:328:9:328:9 | [SSA] f | main.rs:335:13:335:13 | f |
| main.rs:328:9:328:9 | f | main.rs:328:9:328:9 | [SSA] f |
| main.rs:328:13:333:9 | \|...\| ... | main.rs:328:9:328:9 | f |
| main.rs:328:14:328:17 | ... | main.rs:328:14:328:17 | cond |
| main.rs:328:14:328:17 | [SSA] cond | main.rs:329:12:329:15 | cond |
| main.rs:328:14:328:17 | cond | main.rs:328:14:328:17 | [SSA] cond |
| main.rs:328:20:328:23 | ... | main.rs:328:20:328:23 | data |
| main.rs:328:20:328:23 | [SSA] data | main.rs:330:13:330:16 | data |
| main.rs:328:20:328:23 | data | main.rs:328:20:328:23 | [SSA] data |
| main.rs:329:17:331:9 | { ... } | main.rs:329:9:333:9 | if cond {...} else {...} |
| main.rs:330:13:330:16 | data | main.rs:329:17:331:9 | { ... } |
| main.rs:331:16:333:9 | { ... } | main.rs:329:9:333:9 | if cond {...} else {...} |
| main.rs:332:13:332:13 | 0 | main.rs:331:16:333:9 | { ... } |
| main.rs:334:9:334:9 | [SSA] a | main.rs:335:21:335:21 | a |
| main.rs:334:9:334:9 | a | main.rs:334:9:334:9 | [SSA] a |
| main.rs:334:13:334:22 | source(...) | main.rs:334:9:334:9 | a |
| main.rs:335:9:335:9 | [SSA] b | main.rs:336:10:336:10 | b |
| main.rs:335:9:335:9 | b | main.rs:335:9:335:9 | [SSA] b |
| main.rs:335:13:335:22 | f(...) | main.rs:335:9:335:9 | b |
| main.rs:134:13:134:40 | Point {...} | main.rs:134:9:134:9 | p |
| main.rs:135:10:135:10 | [post] p | main.rs:136:10:136:10 | p |
| main.rs:135:10:135:10 | p | main.rs:136:10:136:10 | p |
| main.rs:140:9:140:13 | [SSA] p | main.rs:141:10:141:10 | p |
| main.rs:140:9:140:13 | p | main.rs:140:9:140:13 | [SSA] p |
| main.rs:140:17:140:44 | Point {...} | main.rs:140:9:140:13 | p |
| main.rs:141:10:141:10 | [post] p | main.rs:142:5:142:5 | p |
| main.rs:141:10:141:10 | p | main.rs:142:5:142:5 | p |
| main.rs:142:5:142:5 | [post] p | main.rs:143:10:143:10 | p |
| main.rs:142:5:142:5 | p | main.rs:143:10:143:10 | p |
| main.rs:142:11:142:20 | source(...) | main.rs:142:5:142:7 | p.y |
| main.rs:147:9:147:9 | [SSA] p | main.rs:151:32:151:32 | p |
| main.rs:147:9:147:9 | p | main.rs:147:9:147:9 | [SSA] p |
| main.rs:147:13:150:5 | Point {...} | main.rs:147:9:147:9 | p |
| main.rs:151:20:151:20 | [SSA] a | main.rs:152:10:152:10 | a |
| main.rs:151:20:151:20 | a | main.rs:151:20:151:20 | [SSA] a |
| main.rs:151:26:151:26 | [SSA] b | main.rs:153:10:153:10 | b |
| main.rs:151:26:151:26 | b | main.rs:151:26:151:26 | [SSA] b |
| main.rs:151:32:151:32 | p | main.rs:151:9:151:28 | Point {...} |
| main.rs:162:9:162:9 | [SSA] p | main.rs:169:10:169:10 | p |
| main.rs:162:9:162:9 | p | main.rs:162:9:162:9 | [SSA] p |
| main.rs:162:13:168:5 | Point3D {...} | main.rs:162:9:162:9 | p |
| main.rs:169:10:169:10 | [post] p | main.rs:170:10:170:10 | p |
| main.rs:169:10:169:10 | p | main.rs:170:10:170:10 | p |
| main.rs:170:10:170:10 | [post] p | main.rs:171:10:171:10 | p |
| main.rs:170:10:170:10 | p | main.rs:171:10:171:10 | p |
| main.rs:175:9:175:9 | [SSA] p | main.rs:182:11:182:11 | p |
| main.rs:175:9:175:9 | p | main.rs:175:9:175:9 | [SSA] p |
| main.rs:175:13:181:5 | Point3D {...} | main.rs:175:9:175:9 | p |
| main.rs:182:5:191:5 | match p { ... } | main.rs:174:26:192:1 | { ... } |
| main.rs:182:11:182:11 | p | main.rs:183:9:186:9 | Point3D {...} |
| main.rs:184:28:184:28 | [SSA] x | main.rs:187:18:187:18 | x |
| main.rs:184:28:184:28 | x | main.rs:184:28:184:28 | [SSA] x |
| main.rs:184:31:184:31 | [SSA] y | main.rs:188:18:188:18 | y |
| main.rs:184:31:184:31 | y | main.rs:184:31:184:31 | [SSA] y |
| main.rs:185:13:185:13 | [SSA] z | main.rs:189:18:189:18 | z |
| main.rs:185:13:185:13 | z | main.rs:185:13:185:13 | [SSA] z |
| main.rs:186:14:190:9 | { ... } | main.rs:182:5:191:5 | match p { ... } |
| main.rs:198:9:198:10 | [SSA] s1 | main.rs:200:11:200:12 | s1 |
| main.rs:198:9:198:10 | s1 | main.rs:198:9:198:10 | [SSA] s1 |
| main.rs:198:14:198:37 | ...::Some(...) | main.rs:198:9:198:10 | s1 |
| main.rs:199:9:199:10 | [SSA] s2 | main.rs:204:11:204:12 | s2 |
| main.rs:199:9:199:10 | s2 | main.rs:199:9:199:10 | [SSA] s2 |
| main.rs:199:14:199:28 | ...::Some(...) | main.rs:199:9:199:10 | s2 |
| main.rs:200:11:200:12 | s1 | main.rs:201:9:201:23 | TupleStructPat |
| main.rs:200:11:200:12 | s1 | main.rs:202:9:202:20 | ...::None |
| main.rs:201:22:201:22 | [SSA] n | main.rs:201:33:201:33 | n |
| main.rs:201:22:201:22 | n | main.rs:201:22:201:22 | [SSA] n |
| main.rs:201:28:201:34 | sink(...) | main.rs:200:5:203:5 | match s1 { ... } |
| main.rs:202:25:202:31 | sink(...) | main.rs:200:5:203:5 | match s1 { ... } |
| main.rs:204:5:207:5 | match s2 { ... } | main.rs:197:37:208:1 | { ... } |
| main.rs:204:11:204:12 | s2 | main.rs:205:9:205:23 | TupleStructPat |
| main.rs:204:11:204:12 | s2 | main.rs:206:9:206:20 | ...::None |
| main.rs:205:22:205:22 | [SSA] n | main.rs:205:33:205:33 | n |
| main.rs:205:22:205:22 | n | main.rs:205:22:205:22 | [SSA] n |
| main.rs:205:28:205:34 | sink(...) | main.rs:204:5:207:5 | match s2 { ... } |
| main.rs:206:25:206:31 | sink(...) | main.rs:204:5:207:5 | match s2 { ... } |
| main.rs:211:9:211:10 | [SSA] s1 | main.rs:213:11:213:12 | s1 |
| main.rs:211:9:211:10 | s1 | main.rs:211:9:211:10 | [SSA] s1 |
| main.rs:211:14:211:29 | Some(...) | main.rs:211:9:211:10 | s1 |
| main.rs:212:9:212:10 | [SSA] s2 | main.rs:217:11:217:12 | s2 |
| main.rs:212:9:212:10 | s2 | main.rs:212:9:212:10 | [SSA] s2 |
| main.rs:212:14:212:20 | Some(...) | main.rs:212:9:212:10 | s2 |
| main.rs:213:11:213:12 | s1 | main.rs:214:9:214:15 | TupleStructPat |
| main.rs:213:11:213:12 | s1 | main.rs:215:9:215:12 | None |
| main.rs:214:14:214:14 | [SSA] n | main.rs:214:25:214:25 | n |
| main.rs:214:14:214:14 | n | main.rs:214:14:214:14 | [SSA] n |
| main.rs:214:20:214:26 | sink(...) | main.rs:213:5:216:5 | match s1 { ... } |
| main.rs:215:17:215:23 | sink(...) | main.rs:213:5:216:5 | match s1 { ... } |
| main.rs:217:5:220:5 | match s2 { ... } | main.rs:210:39:221:1 | { ... } |
| main.rs:217:11:217:12 | s2 | main.rs:218:9:218:15 | TupleStructPat |
| main.rs:217:11:217:12 | s2 | main.rs:219:9:219:12 | None |
| main.rs:218:14:218:14 | [SSA] n | main.rs:218:25:218:25 | n |
| main.rs:218:14:218:14 | n | main.rs:218:14:218:14 | [SSA] n |
| main.rs:218:20:218:26 | sink(...) | main.rs:217:5:220:5 | match s2 { ... } |
| main.rs:219:17:219:23 | sink(...) | main.rs:217:5:220:5 | match s2 { ... } |
| main.rs:224:9:224:10 | [SSA] s1 | main.rs:225:10:225:11 | s1 |
| main.rs:224:9:224:10 | s1 | main.rs:224:9:224:10 | [SSA] s1 |
| main.rs:224:14:224:29 | Some(...) | main.rs:224:9:224:10 | s1 |
| main.rs:234:9:234:10 | [SSA] s1 | main.rs:236:11:236:12 | s1 |
| main.rs:234:9:234:10 | s1 | main.rs:234:9:234:10 | [SSA] s1 |
| main.rs:234:14:234:39 | ...::A(...) | main.rs:234:9:234:10 | s1 |
| main.rs:235:9:235:10 | [SSA] s2 | main.rs:243:11:243:12 | s2 |
| main.rs:235:9:235:10 | s2 | main.rs:235:9:235:10 | [SSA] s2 |
| main.rs:235:14:235:30 | ...::B(...) | main.rs:235:9:235:10 | s2 |
| main.rs:236:11:236:12 | s1 | main.rs:237:9:237:25 | TupleStructPat |
| main.rs:236:11:236:12 | s1 | main.rs:238:9:238:25 | TupleStructPat |
| main.rs:236:11:236:12 | s1 | main.rs:240:11:240:12 | s1 |
| main.rs:237:24:237:24 | [SSA] n | main.rs:237:35:237:35 | n |
| main.rs:237:24:237:24 | n | main.rs:237:24:237:24 | [SSA] n |
| main.rs:237:30:237:36 | sink(...) | main.rs:236:5:239:5 | match s1 { ... } |
| main.rs:238:24:238:24 | [SSA] n | main.rs:238:35:238:35 | n |
| main.rs:238:24:238:24 | n | main.rs:238:24:238:24 | [SSA] n |
| main.rs:238:30:238:36 | sink(...) | main.rs:236:5:239:5 | match s1 { ... } |
| main.rs:240:11:240:12 | s1 | main.rs:241:9:241:45 | ... \| ... |
| main.rs:241:9:241:45 | ... \| ... | main.rs:241:9:241:25 | TupleStructPat |
| main.rs:241:9:241:45 | ... \| ... | main.rs:241:29:241:45 | TupleStructPat |
| main.rs:241:9:241:45 | [SSA] [match(true)] phi | main.rs:241:55:241:55 | n |
| main.rs:241:24:241:24 | [SSA] [input] [match(true)] phi | main.rs:241:9:241:45 | [SSA] [match(true)] phi |
| main.rs:241:24:241:24 | [SSA] n | main.rs:241:24:241:24 | [SSA] [input] [match(true)] phi |
| main.rs:241:24:241:24 | n | main.rs:241:24:241:24 | [SSA] n |
| main.rs:241:44:241:44 | [SSA] [input] [match(true)] phi | main.rs:241:9:241:45 | [SSA] [match(true)] phi |
| main.rs:241:44:241:44 | [SSA] n | main.rs:241:44:241:44 | [SSA] [input] [match(true)] phi |
| main.rs:241:44:241:44 | n | main.rs:241:44:241:44 | [SSA] n |
| main.rs:241:50:241:56 | sink(...) | main.rs:240:5:242:5 | match s1 { ... } |
| main.rs:243:5:246:5 | match s2 { ... } | main.rs:233:48:247:1 | { ... } |
| main.rs:243:11:243:12 | s2 | main.rs:244:9:244:25 | TupleStructPat |
| main.rs:243:11:243:12 | s2 | main.rs:245:9:245:25 | TupleStructPat |
| main.rs:244:24:244:24 | [SSA] n | main.rs:244:35:244:35 | n |
| main.rs:244:24:244:24 | n | main.rs:244:24:244:24 | [SSA] n |
| main.rs:244:30:244:36 | sink(...) | main.rs:243:5:246:5 | match s2 { ... } |
| main.rs:245:24:245:24 | [SSA] n | main.rs:245:35:245:35 | n |
| main.rs:245:24:245:24 | n | main.rs:245:24:245:24 | [SSA] n |
| main.rs:245:30:245:36 | sink(...) | main.rs:243:5:246:5 | match s2 { ... } |
| main.rs:252:9:252:10 | [SSA] s1 | main.rs:254:11:254:12 | s1 |
| main.rs:252:9:252:10 | s1 | main.rs:252:9:252:10 | [SSA] s1 |
| main.rs:252:14:252:26 | A(...) | main.rs:252:9:252:10 | s1 |
| main.rs:253:9:253:10 | [SSA] s2 | main.rs:261:11:261:12 | s2 |
| main.rs:253:9:253:10 | s2 | main.rs:253:9:253:10 | [SSA] s2 |
| main.rs:253:14:253:17 | B(...) | main.rs:253:9:253:10 | s2 |
| main.rs:254:11:254:12 | s1 | main.rs:255:9:255:12 | TupleStructPat |
| main.rs:254:11:254:12 | s1 | main.rs:256:9:256:12 | TupleStructPat |
| main.rs:254:11:254:12 | s1 | main.rs:258:11:258:12 | s1 |
| main.rs:255:11:255:11 | [SSA] n | main.rs:255:22:255:22 | n |
| main.rs:255:11:255:11 | n | main.rs:255:11:255:11 | [SSA] n |
| main.rs:255:17:255:23 | sink(...) | main.rs:254:5:257:5 | match s1 { ... } |
| main.rs:256:11:256:11 | [SSA] n | main.rs:256:22:256:22 | n |
| main.rs:256:11:256:11 | n | main.rs:256:11:256:11 | [SSA] n |
| main.rs:256:17:256:23 | sink(...) | main.rs:254:5:257:5 | match s1 { ... } |
| main.rs:258:11:258:12 | s1 | main.rs:259:9:259:19 | ... \| ... |
| main.rs:259:9:259:19 | ... \| ... | main.rs:259:9:259:12 | TupleStructPat |
| main.rs:259:9:259:19 | ... \| ... | main.rs:259:16:259:19 | TupleStructPat |
| main.rs:259:9:259:19 | [SSA] [match(true)] phi | main.rs:259:29:259:29 | n |
| main.rs:259:11:259:11 | [SSA] [input] [match(true)] phi | main.rs:259:9:259:19 | [SSA] [match(true)] phi |
| main.rs:259:11:259:11 | [SSA] n | main.rs:259:11:259:11 | [SSA] [input] [match(true)] phi |
| main.rs:259:11:259:11 | n | main.rs:259:11:259:11 | [SSA] n |
| main.rs:259:18:259:18 | [SSA] [input] [match(true)] phi | main.rs:259:9:259:19 | [SSA] [match(true)] phi |
| main.rs:259:18:259:18 | [SSA] n | main.rs:259:18:259:18 | [SSA] [input] [match(true)] phi |
| main.rs:259:18:259:18 | n | main.rs:259:18:259:18 | [SSA] n |
| main.rs:259:24:259:30 | sink(...) | main.rs:258:5:260:5 | match s1 { ... } |
| main.rs:261:5:264:5 | match s2 { ... } | main.rs:251:50:265:1 | { ... } |
| main.rs:261:11:261:12 | s2 | main.rs:262:9:262:12 | TupleStructPat |
| main.rs:261:11:261:12 | s2 | main.rs:263:9:263:12 | TupleStructPat |
| main.rs:262:11:262:11 | [SSA] n | main.rs:262:22:262:22 | n |
| main.rs:262:11:262:11 | n | main.rs:262:11:262:11 | [SSA] n |
| main.rs:262:17:262:23 | sink(...) | main.rs:261:5:264:5 | match s2 { ... } |
| main.rs:263:11:263:11 | [SSA] n | main.rs:263:22:263:22 | n |
| main.rs:263:11:263:11 | n | main.rs:263:11:263:11 | [SSA] n |
| main.rs:263:17:263:23 | sink(...) | main.rs:261:5:264:5 | match s2 { ... } |
| main.rs:273:9:273:10 | [SSA] s1 | main.rs:277:11:277:12 | s1 |
| main.rs:273:9:273:10 | s1 | main.rs:273:9:273:10 | [SSA] s1 |
| main.rs:273:14:275:5 | ...::C {...} | main.rs:273:9:273:10 | s1 |
| main.rs:276:9:276:10 | [SSA] s2 | main.rs:284:11:284:12 | s2 |
| main.rs:276:9:276:10 | s2 | main.rs:276:9:276:10 | [SSA] s2 |
| main.rs:276:14:276:43 | ...::D {...} | main.rs:276:9:276:10 | s2 |
| main.rs:277:11:277:12 | s1 | main.rs:278:9:278:38 | ...::C {...} |
| main.rs:277:11:277:12 | s1 | main.rs:279:9:279:38 | ...::D {...} |
| main.rs:277:11:277:12 | s1 | main.rs:281:11:281:12 | s1 |
| main.rs:278:36:278:36 | [SSA] n | main.rs:278:48:278:48 | n |
| main.rs:278:36:278:36 | n | main.rs:278:36:278:36 | [SSA] n |
| main.rs:278:43:278:49 | sink(...) | main.rs:277:5:280:5 | match s1 { ... } |
| main.rs:279:36:279:36 | [SSA] n | main.rs:279:48:279:48 | n |
| main.rs:279:36:279:36 | n | main.rs:279:36:279:36 | [SSA] n |
| main.rs:279:43:279:49 | sink(...) | main.rs:277:5:280:5 | match s1 { ... } |
| main.rs:281:11:281:12 | s1 | main.rs:282:9:282:71 | ... \| ... |
| main.rs:282:9:282:71 | ... \| ... | main.rs:282:9:282:38 | ...::C {...} |
| main.rs:282:9:282:71 | ... \| ... | main.rs:282:42:282:71 | ...::D {...} |
| main.rs:282:9:282:71 | [SSA] [match(true)] phi | main.rs:282:81:282:81 | n |
| main.rs:282:36:282:36 | [SSA] [input] [match(true)] phi | main.rs:282:9:282:71 | [SSA] [match(true)] phi |
| main.rs:282:36:282:36 | [SSA] n | main.rs:282:36:282:36 | [SSA] [input] [match(true)] phi |
| main.rs:282:36:282:36 | n | main.rs:282:36:282:36 | [SSA] n |
| main.rs:282:69:282:69 | [SSA] [input] [match(true)] phi | main.rs:282:9:282:71 | [SSA] [match(true)] phi |
| main.rs:282:69:282:69 | [SSA] n | main.rs:282:69:282:69 | [SSA] [input] [match(true)] phi |
| main.rs:282:69:282:69 | n | main.rs:282:69:282:69 | [SSA] n |
| main.rs:282:76:282:82 | sink(...) | main.rs:281:5:283:5 | match s1 { ... } |
| main.rs:284:5:287:5 | match s2 { ... } | main.rs:272:49:288:1 | { ... } |
| main.rs:284:11:284:12 | s2 | main.rs:285:9:285:38 | ...::C {...} |
| main.rs:284:11:284:12 | s2 | main.rs:286:9:286:38 | ...::D {...} |
| main.rs:285:36:285:36 | [SSA] n | main.rs:285:48:285:48 | n |
| main.rs:285:36:285:36 | n | main.rs:285:36:285:36 | [SSA] n |
| main.rs:285:43:285:49 | sink(...) | main.rs:284:5:287:5 | match s2 { ... } |
| main.rs:286:36:286:36 | [SSA] n | main.rs:286:48:286:48 | n |
| main.rs:286:36:286:36 | n | main.rs:286:36:286:36 | [SSA] n |
| main.rs:286:43:286:49 | sink(...) | main.rs:284:5:287:5 | match s2 { ... } |
| main.rs:293:9:293:10 | [SSA] s1 | main.rs:297:11:297:12 | s1 |
| main.rs:293:9:293:10 | s1 | main.rs:293:9:293:10 | [SSA] s1 |
| main.rs:293:14:295:5 | C {...} | main.rs:293:9:293:10 | s1 |
| main.rs:296:9:296:10 | [SSA] s2 | main.rs:304:11:304:12 | s2 |
| main.rs:296:9:296:10 | s2 | main.rs:296:9:296:10 | [SSA] s2 |
| main.rs:296:14:296:29 | D {...} | main.rs:296:9:296:10 | s2 |
| main.rs:297:11:297:12 | s1 | main.rs:298:9:298:24 | C {...} |
| main.rs:297:11:297:12 | s1 | main.rs:299:9:299:24 | D {...} |
| main.rs:297:11:297:12 | s1 | main.rs:301:11:301:12 | s1 |
| main.rs:298:22:298:22 | [SSA] n | main.rs:298:34:298:34 | n |
| main.rs:298:22:298:22 | n | main.rs:298:22:298:22 | [SSA] n |
| main.rs:298:29:298:35 | sink(...) | main.rs:297:5:300:5 | match s1 { ... } |
| main.rs:299:22:299:22 | [SSA] n | main.rs:299:34:299:34 | n |
| main.rs:299:22:299:22 | n | main.rs:299:22:299:22 | [SSA] n |
| main.rs:299:29:299:35 | sink(...) | main.rs:297:5:300:5 | match s1 { ... } |
| main.rs:301:11:301:12 | s1 | main.rs:302:9:302:43 | ... \| ... |
| main.rs:302:9:302:43 | ... \| ... | main.rs:302:9:302:24 | C {...} |
| main.rs:302:9:302:43 | ... \| ... | main.rs:302:28:302:43 | D {...} |
| main.rs:302:9:302:43 | [SSA] [match(true)] phi | main.rs:302:53:302:53 | n |
| main.rs:302:22:302:22 | [SSA] [input] [match(true)] phi | main.rs:302:9:302:43 | [SSA] [match(true)] phi |
| main.rs:302:22:302:22 | [SSA] n | main.rs:302:22:302:22 | [SSA] [input] [match(true)] phi |
| main.rs:302:22:302:22 | n | main.rs:302:22:302:22 | [SSA] n |
| main.rs:302:41:302:41 | [SSA] [input] [match(true)] phi | main.rs:302:9:302:43 | [SSA] [match(true)] phi |
| main.rs:302:41:302:41 | [SSA] n | main.rs:302:41:302:41 | [SSA] [input] [match(true)] phi |
| main.rs:302:41:302:41 | n | main.rs:302:41:302:41 | [SSA] n |
| main.rs:302:48:302:54 | sink(...) | main.rs:301:5:303:5 | match s1 { ... } |
| main.rs:304:5:307:5 | match s2 { ... } | main.rs:292:51:308:1 | { ... } |
| main.rs:304:11:304:12 | s2 | main.rs:305:9:305:24 | C {...} |
| main.rs:304:11:304:12 | s2 | main.rs:306:9:306:24 | D {...} |
| main.rs:305:22:305:22 | [SSA] n | main.rs:305:34:305:34 | n |
| main.rs:305:22:305:22 | n | main.rs:305:22:305:22 | [SSA] n |
| main.rs:305:29:305:35 | sink(...) | main.rs:304:5:307:5 | match s2 { ... } |
| main.rs:306:22:306:22 | [SSA] n | main.rs:306:34:306:34 | n |
| main.rs:306:22:306:22 | n | main.rs:306:22:306:22 | [SSA] n |
| main.rs:306:29:306:35 | sink(...) | main.rs:304:5:307:5 | match s2 { ... } |
| main.rs:314:9:314:9 | [SSA] f | main.rs:315:10:315:10 | f |
| main.rs:314:9:314:9 | f | main.rs:314:9:314:9 | [SSA] f |
| main.rs:314:13:314:52 | \|...\| ... | main.rs:314:9:314:9 | f |
| main.rs:314:14:314:17 | ... | main.rs:314:14:314:17 | cond |
| main.rs:314:14:314:17 | [SSA] cond | main.rs:314:23:314:26 | cond |
| main.rs:314:14:314:17 | cond | main.rs:314:14:314:17 | [SSA] cond |
| main.rs:314:28:314:41 | { ... } | main.rs:314:20:314:52 | if cond {...} else {...} |
| main.rs:314:30:314:39 | source(...) | main.rs:314:28:314:41 | { ... } |
| main.rs:314:48:314:52 | { ... } | main.rs:314:20:314:52 | if cond {...} else {...} |
| main.rs:314:50:314:50 | 0 | main.rs:314:48:314:52 | { ... } |
| main.rs:319:9:319:9 | [SSA] f | main.rs:326:5:326:5 | f |
| main.rs:319:9:319:9 | f | main.rs:319:9:319:9 | [SSA] f |
| main.rs:319:13:324:9 | \|...\| ... | main.rs:319:9:319:9 | f |
| main.rs:319:14:319:17 | ... | main.rs:319:14:319:17 | cond |
| main.rs:319:14:319:17 | [SSA] cond | main.rs:320:12:320:15 | cond |
| main.rs:319:14:319:17 | cond | main.rs:319:14:319:17 | [SSA] cond |
| main.rs:319:20:319:23 | ... | main.rs:319:20:319:23 | data |
| main.rs:319:20:319:23 | [SSA] data | main.rs:321:18:321:21 | data |
| main.rs:319:20:319:23 | data | main.rs:319:20:319:23 | [SSA] data |
| main.rs:320:17:322:9 | { ... } | main.rs:320:9:324:9 | if cond {...} else {...} |
| main.rs:322:16:324:9 | { ... } | main.rs:320:9:324:9 | if cond {...} else {...} |
| main.rs:323:13:323:19 | sink(...) | main.rs:322:16:324:9 | { ... } |
| main.rs:325:9:325:9 | [SSA] a | main.rs:326:13:326:13 | a |
| main.rs:325:9:325:9 | a | main.rs:325:9:325:9 | [SSA] a |
| main.rs:325:13:325:22 | source(...) | main.rs:325:9:325:9 | a |
| main.rs:330:9:330:9 | [SSA] f | main.rs:337:13:337:13 | f |
| main.rs:330:9:330:9 | f | main.rs:330:9:330:9 | [SSA] f |
| main.rs:330:13:335:9 | \|...\| ... | main.rs:330:9:330:9 | f |
| main.rs:330:14:330:17 | ... | main.rs:330:14:330:17 | cond |
| main.rs:330:14:330:17 | [SSA] cond | main.rs:331:12:331:15 | cond |
| main.rs:330:14:330:17 | cond | main.rs:330:14:330:17 | [SSA] cond |
| main.rs:330:20:330:23 | ... | main.rs:330:20:330:23 | data |
| main.rs:330:20:330:23 | [SSA] data | main.rs:332:13:332:16 | data |
| main.rs:330:20:330:23 | data | main.rs:330:20:330:23 | [SSA] data |
| main.rs:331:17:333:9 | { ... } | main.rs:331:9:335:9 | if cond {...} else {...} |
| main.rs:332:13:332:16 | data | main.rs:331:17:333:9 | { ... } |
| main.rs:333:16:335:9 | { ... } | main.rs:331:9:335:9 | if cond {...} else {...} |
| main.rs:334:13:334:13 | 0 | main.rs:333:16:335:9 | { ... } |
| main.rs:336:9:336:9 | [SSA] a | main.rs:337:21:337:21 | a |
| main.rs:336:9:336:9 | a | main.rs:336:9:336:9 | [SSA] a |
| main.rs:336:13:336:22 | source(...) | main.rs:336:9:336:9 | a |
| main.rs:337:9:337:9 | [SSA] b | main.rs:338:10:338:10 | b |
| main.rs:337:9:337:9 | b | main.rs:337:9:337:9 | [SSA] b |
| main.rs:337:13:337:22 | f(...) | main.rs:337:9:337:9 | b |
storeStep
| main.rs:94:14:94:22 | source(...) | tuple.0 | main.rs:94:13:94:26 | TupleExpr |
| main.rs:94:25:94:25 | 2 | tuple.1 | main.rs:94:13:94:26 | TupleExpr |
@@ -399,28 +402,36 @@ storeStep
| main.rs:118:17:118:26 | source(...) | tuple.1 | main.rs:118:13:118:27 | TupleExpr |
| main.rs:119:14:119:14 | a | tuple.0 | main.rs:119:13:119:18 | TupleExpr |
| main.rs:119:17:119:17 | 3 | tuple.1 | main.rs:119:13:119:18 | TupleExpr |
| main.rs:135:12:135:20 | source(...) | Point.x | main.rs:134:13:137:5 | Point {...} |
| main.rs:136:12:136:12 | 2 | Point.y | main.rs:134:13:137:5 | Point {...} |
| main.rs:144:12:144:20 | source(...) | Point.x | main.rs:143:17:146:5 | Point {...} |
| main.rs:145:12:145:12 | 2 | Point.y | main.rs:143:17:146:5 | Point {...} |
| main.rs:154:12:154:21 | source(...) | Point.x | main.rs:153:13:156:5 | Point {...} |
| main.rs:155:12:155:12 | 2 | Point.y | main.rs:153:13:156:5 | Point {...} |
| main.rs:169:16:172:9 | Point {...} | Point3D.plane | main.rs:168:13:174:5 | Point3D {...} |
| main.rs:170:16:170:16 | 2 | Point.x | main.rs:169:16:172:9 | Point {...} |
| main.rs:171:16:171:25 | source(...) | Point.y | main.rs:169:16:172:9 | Point {...} |
| main.rs:173:12:173:12 | 4 | Point3D.z | main.rs:168:13:174:5 | Point3D {...} |
| main.rs:182:16:185:9 | Point {...} | Point3D.plane | main.rs:181:13:187:5 | Point3D {...} |
| main.rs:183:16:183:16 | 2 | Point.x | main.rs:182:16:185:9 | Point {...} |
| main.rs:184:16:184:25 | source(...) | Point.y | main.rs:182:16:185:9 | Point {...} |
| main.rs:186:12:186:12 | 4 | Point3D.z | main.rs:181:13:187:5 | Point3D {...} |
| main.rs:214:19:214:28 | source(...) | Some | main.rs:214:14:214:29 | Some(...) |
| main.rs:215:19:215:19 | 2 | Some | main.rs:215:14:215:20 | Some(...) |
| main.rs:232:29:232:38 | source(...) | A | main.rs:232:14:232:39 | ...::A(...) |
| main.rs:233:29:233:29 | 2 | B | main.rs:233:14:233:30 | ...::B(...) |
| main.rs:272:18:272:27 | source(...) | C | main.rs:271:14:273:5 | ...::C {...} |
| main.rs:274:41:274:41 | 2 | D | main.rs:274:14:274:43 | ...::D {...} |
| main.rs:343:27:343:27 | 0 | Some | main.rs:343:22:343:28 | Some(...) |
| main.rs:134:24:134:32 | source(...) | Point.x | main.rs:134:13:134:40 | Point {...} |
| main.rs:134:38:134:38 | 2 | Point.y | main.rs:134:13:134:40 | Point {...} |
| main.rs:140:28:140:36 | source(...) | Point.x | main.rs:140:17:140:44 | Point {...} |
| main.rs:140:42:140:42 | 2 | Point.y | main.rs:140:17:140:44 | Point {...} |
| main.rs:148:12:148:21 | source(...) | Point.x | main.rs:147:13:150:5 | Point {...} |
| main.rs:149:12:149:12 | 2 | Point.y | main.rs:147:13:150:5 | Point {...} |
| main.rs:163:16:166:9 | Point {...} | Point3D.plane | main.rs:162:13:168:5 | Point3D {...} |
| main.rs:164:16:164:16 | 2 | Point.x | main.rs:163:16:166:9 | Point {...} |
| main.rs:165:16:165:25 | source(...) | Point.y | main.rs:163:16:166:9 | Point {...} |
| main.rs:167:12:167:12 | 4 | Point3D.z | main.rs:162:13:168:5 | Point3D {...} |
| main.rs:176:16:179:9 | Point {...} | Point3D.plane | main.rs:175:13:181:5 | Point3D {...} |
| main.rs:177:16:177:16 | 2 | Point.x | main.rs:176:16:179:9 | Point {...} |
| main.rs:178:16:178:25 | source(...) | Point.y | main.rs:176:16:179:9 | Point {...} |
| main.rs:180:12:180:12 | 4 | Point3D.z | main.rs:175:13:181:5 | Point3D {...} |
| main.rs:198:27:198:36 | source(...) | Some | main.rs:198:14:198:37 | ...::Some(...) |
| main.rs:199:27:199:27 | 2 | Some | main.rs:199:14:199:28 | ...::Some(...) |
| main.rs:211:19:211:28 | source(...) | Some | main.rs:211:14:211:29 | Some(...) |
| main.rs:212:19:212:19 | 2 | Some | main.rs:212:14:212:20 | Some(...) |
| main.rs:224:19:224:28 | source(...) | Some | main.rs:224:14:224:29 | Some(...) |
| main.rs:234:29:234:38 | source(...) | A | main.rs:234:14:234:39 | ...::A(...) |
| main.rs:235:29:235:29 | 2 | B | main.rs:235:14:235:30 | ...::B(...) |
| main.rs:252:16:252:25 | source(...) | A | main.rs:252:14:252:26 | A(...) |
| main.rs:253:16:253:16 | 2 | B | main.rs:253:14:253:17 | B(...) |
| main.rs:274:18:274:27 | source(...) | C | main.rs:273:14:275:5 | ...::C {...} |
| main.rs:276:41:276:41 | 2 | D | main.rs:276:14:276:43 | ...::D {...} |
| main.rs:294:18:294:27 | source(...) | C | main.rs:293:14:295:5 | C {...} |
| main.rs:296:27:296:27 | 2 | D | main.rs:296:14:296:29 | D {...} |
| main.rs:345:27:345:27 | 0 | Some | main.rs:345:22:345:28 | Some(...) |
readStep
| file://:0:0:0:0 | [summary param] self in lang:core::_::<crate::option::Option>::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::<crate::option::Option>::unwrap |
| main.rs:33:9:33:15 | TupleStructPat | Some | main.rs:33:14:33:14 | _ |
| main.rs:95:10:95:10 | a | tuple.0 | main.rs:95:10:95:12 | a.0 |
| main.rs:96:10:96:10 | a | tuple.1 | main.rs:96:10:96:12 | a.1 |
@@ -431,24 +442,38 @@ readStep
| main.rs:113:10:113:10 | a | tuple.0 | main.rs:113:10:113:12 | a.0 |
| main.rs:114:10:114:10 | a | tuple.1 | main.rs:114:10:114:12 | a.1 |
| main.rs:120:10:120:10 | b | tuple.0 | main.rs:120:10:120:12 | b.0 |
| main.rs:120:10:120:12 | b.0 | tuple.0 | main.rs:120:10:120:14 | ... .0 |
| main.rs:120:10:120:12 | b.0 | tuple.0 | main.rs:120:10:120:15 | ... .0 |
| main.rs:121:10:121:10 | b | tuple.0 | main.rs:121:10:121:12 | b.0 |
| main.rs:121:10:121:12 | b.0 | tuple.1 | main.rs:121:10:121:14 | ... .1 |
| main.rs:121:10:121:12 | b.0 | tuple.1 | main.rs:121:10:121:15 | ... .1 |
| main.rs:122:10:122:10 | b | tuple.1 | main.rs:122:10:122:12 | b.1 |
| main.rs:157:9:157:28 | Point {...} | Point.x | main.rs:157:20:157:20 | a |
| main.rs:157:9:157:28 | Point {...} | Point.y | main.rs:157:26:157:26 | b |
| main.rs:189:9:189:45 | Point3D {...} | Point3D.plane | main.rs:189:26:189:39 | Point {...} |
| main.rs:217:9:217:15 | TupleStructPat | Some | main.rs:217:14:217:14 | n |
| main.rs:221:9:221:15 | TupleStructPat | Some | main.rs:221:14:221:14 | n |
| main.rs:235:9:235:25 | TupleStructPat | A | main.rs:235:24:235:24 | n |
| main.rs:236:9:236:25 | TupleStructPat | B | main.rs:236:24:236:24 | n |
| main.rs:239:9:239:25 | TupleStructPat | A | main.rs:239:24:239:24 | n |
| main.rs:239:29:239:45 | TupleStructPat | B | main.rs:239:44:239:44 | n |
| main.rs:242:9:242:25 | TupleStructPat | A | main.rs:242:24:242:24 | n |
| main.rs:243:9:243:25 | TupleStructPat | B | main.rs:243:24:243:24 | n |
| main.rs:276:9:276:38 | ...::C {...} | C | main.rs:276:36:276:36 | n |
| main.rs:277:9:277:38 | ...::D {...} | D | main.rs:277:36:277:36 | n |
| main.rs:280:9:280:38 | ...::C {...} | C | main.rs:280:36:280:36 | n |
| main.rs:280:42:280:71 | ...::D {...} | D | main.rs:280:69:280:69 | n |
| main.rs:283:9:283:38 | ...::C {...} | C | main.rs:283:36:283:36 | n |
| main.rs:284:9:284:38 | ...::D {...} | D | main.rs:284:36:284:36 | n |
| main.rs:151:9:151:28 | Point {...} | Point.x | main.rs:151:20:151:20 | a |
| main.rs:151:9:151:28 | Point {...} | Point.y | main.rs:151:26:151:26 | b |
| main.rs:183:9:186:9 | Point3D {...} | Point3D.plane | main.rs:184:20:184:33 | Point {...} |
| main.rs:201:9:201:23 | TupleStructPat | Some | main.rs:201:22:201:22 | n |
| main.rs:205:9:205:23 | TupleStructPat | Some | main.rs:205:22:205:22 | n |
| main.rs:214:9:214:15 | TupleStructPat | Some | main.rs:214:14:214:14 | n |
| main.rs:218:9:218:15 | TupleStructPat | Some | main.rs:218:14:218:14 | n |
| main.rs:237:9:237:25 | TupleStructPat | A | main.rs:237:24:237:24 | n |
| main.rs:238:9:238:25 | TupleStructPat | B | main.rs:238:24:238:24 | n |
| main.rs:241:9:241:25 | TupleStructPat | A | main.rs:241:24:241:24 | n |
| main.rs:241:29:241:45 | TupleStructPat | B | main.rs:241:44:241:44 | n |
| main.rs:244:9:244:25 | TupleStructPat | A | main.rs:244:24:244:24 | n |
| main.rs:245:9:245:25 | TupleStructPat | B | main.rs:245:24:245:24 | n |
| main.rs:255:9:255:12 | TupleStructPat | A | main.rs:255:11:255:11 | n |
| main.rs:256:9:256:12 | TupleStructPat | B | main.rs:256:11:256:11 | n |
| main.rs:259:9:259:12 | TupleStructPat | A | main.rs:259:11:259:11 | n |
| main.rs:259:16:259:19 | TupleStructPat | B | main.rs:259:18:259:18 | n |
| main.rs:262:9:262:12 | TupleStructPat | A | main.rs:262:11:262:11 | n |
| main.rs:263:9:263:12 | TupleStructPat | B | main.rs:263:11:263:11 | n |
| main.rs:278:9:278:38 | ...::C {...} | C | main.rs:278:36:278:36 | n |
| main.rs:279:9:279:38 | ...::D {...} | D | main.rs:279:36:279:36 | n |
| main.rs:282:9:282:38 | ...::C {...} | C | main.rs:282:36:282:36 | n |
| main.rs:282:42:282:71 | ...::D {...} | D | main.rs:282:69:282:69 | n |
| main.rs:285:9:285:38 | ...::C {...} | C | main.rs:285:36:285:36 | n |
| main.rs:286:9:286:38 | ...::D {...} | D | main.rs:286:36:286:36 | n |
| main.rs:298:9:298:24 | C {...} | C | main.rs:298:22:298:22 | n |
| main.rs:299:9:299:24 | D {...} | D | main.rs:299:22:299:22 | n |
| main.rs:302:9:302:24 | C {...} | C | main.rs:302:22:302:22 | n |
| main.rs:302:28:302:43 | D {...} | D | main.rs:302:41:302:41 | n |
| main.rs:305:9:305:24 | C {...} | C | main.rs:305:22:305:22 | n |
| main.rs:306:9:306:24 | D {...} | D | main.rs:306:22:306:22 | n |

View File

@@ -20,39 +20,60 @@ edges
| main.rs:119:13:119:18 | TupleExpr [tuple.0, tuple.1] | main.rs:121:10:121:10 | b [tuple.0, tuple.1] | provenance | |
| main.rs:119:14:119:14 | a [tuple.1] | main.rs:119:13:119:18 | TupleExpr [tuple.0, tuple.1] | provenance | |
| main.rs:121:10:121:10 | b [tuple.0, tuple.1] | main.rs:121:10:121:12 | b.0 [tuple.1] | provenance | |
| main.rs:121:10:121:12 | b.0 [tuple.1] | main.rs:121:10:121:14 | ... .1 | provenance | |
| main.rs:153:13:156:5 | Point {...} [Point.x] | main.rs:157:9:157:28 | Point {...} [Point.x] | provenance | |
| main.rs:154:12:154:21 | source(...) | main.rs:153:13:156:5 | Point {...} [Point.x] | provenance | |
| main.rs:157:9:157:28 | Point {...} [Point.x] | main.rs:157:20:157:20 | a | provenance | |
| main.rs:157:20:157:20 | a | main.rs:158:10:158:10 | a | provenance | |
| main.rs:214:14:214:29 | Some(...) [Some] | main.rs:217:9:217:15 | TupleStructPat [Some] | provenance | |
| main.rs:214:19:214:28 | source(...) | main.rs:214:14:214:29 | Some(...) [Some] | provenance | |
| main.rs:217:9:217:15 | TupleStructPat [Some] | main.rs:217:14:217:14 | n | provenance | |
| main.rs:217:14:217:14 | n | main.rs:217:25:217:25 | n | provenance | |
| main.rs:232:14:232:39 | ...::A(...) [A] | main.rs:235:9:235:25 | TupleStructPat [A] | provenance | |
| main.rs:232:14:232:39 | ...::A(...) [A] | main.rs:239:9:239:25 | TupleStructPat [A] | provenance | |
| main.rs:232:29:232:38 | source(...) | main.rs:232:14:232:39 | ...::A(...) [A] | provenance | |
| main.rs:235:9:235:25 | TupleStructPat [A] | main.rs:235:24:235:24 | n | provenance | |
| main.rs:235:24:235:24 | n | main.rs:235:35:235:35 | n | provenance | |
| main.rs:239:9:239:25 | TupleStructPat [A] | main.rs:239:24:239:24 | n | provenance | |
| main.rs:239:24:239:24 | n | main.rs:239:55:239:55 | n | provenance | |
| main.rs:271:14:273:5 | ...::C {...} [C] | main.rs:276:9:276:38 | ...::C {...} [C] | provenance | |
| main.rs:271:14:273:5 | ...::C {...} [C] | main.rs:280:9:280:38 | ...::C {...} [C] | provenance | |
| main.rs:272:18:272:27 | source(...) | main.rs:271:14:273:5 | ...::C {...} [C] | provenance | |
| main.rs:276:9:276:38 | ...::C {...} [C] | main.rs:276:36:276:36 | n | provenance | |
| main.rs:276:36:276:36 | n | main.rs:276:48:276:48 | n | provenance | |
| main.rs:280:9:280:38 | ...::C {...} [C] | main.rs:280:36:280:36 | n | provenance | |
| main.rs:280:36:280:36 | n | main.rs:280:81:280:81 | n | provenance | |
| main.rs:312:20:312:52 | if cond {...} else {...} | main.rs:313:10:313:16 | f(...) | provenance | |
| main.rs:312:30:312:39 | source(...) | main.rs:312:20:312:52 | if cond {...} else {...} | provenance | |
| main.rs:317:20:317:23 | ... | main.rs:319:18:319:21 | data | provenance | |
| main.rs:323:13:323:22 | source(...) | main.rs:324:13:324:13 | a | provenance | |
| main.rs:324:13:324:13 | a | main.rs:317:20:317:23 | ... | provenance | |
| main.rs:328:20:328:23 | ... | main.rs:329:9:333:9 | if cond {...} else {...} | provenance | |
| main.rs:334:13:334:22 | source(...) | main.rs:335:21:335:21 | a | provenance | |
| main.rs:335:13:335:22 | f(...) | main.rs:336:10:336:10 | b | provenance | |
| main.rs:335:21:335:21 | a | main.rs:328:20:328:23 | ... | provenance | |
| main.rs:335:21:335:21 | a | main.rs:335:13:335:22 | f(...) | provenance | |
| main.rs:121:10:121:12 | b.0 [tuple.1] | main.rs:121:10:121:15 | ... .1 | provenance | |
| main.rs:147:13:150:5 | Point {...} [Point.x] | main.rs:151:9:151:28 | Point {...} [Point.x] | provenance | |
| main.rs:148:12:148:21 | source(...) | main.rs:147:13:150:5 | Point {...} [Point.x] | provenance | |
| main.rs:151:9:151:28 | Point {...} [Point.x] | main.rs:151:20:151:20 | a | provenance | |
| main.rs:151:20:151:20 | a | main.rs:152:10:152:10 | a | provenance | |
| main.rs:198:14:198:37 | ...::Some(...) [Some] | main.rs:201:9:201:23 | TupleStructPat [Some] | provenance | |
| main.rs:198:27:198:36 | source(...) | main.rs:198:14:198:37 | ...::Some(...) [Some] | provenance | |
| main.rs:201:9:201:23 | TupleStructPat [Some] | main.rs:201:22:201:22 | n | provenance | |
| main.rs:201:22:201:22 | n | main.rs:201:33:201:33 | n | provenance | |
| main.rs:211:14:211:29 | Some(...) [Some] | main.rs:214:9:214:15 | TupleStructPat [Some] | provenance | |
| main.rs:211:19:211:28 | source(...) | main.rs:211:14:211:29 | Some(...) [Some] | provenance | |
| main.rs:214:9:214:15 | TupleStructPat [Some] | main.rs:214:14:214:14 | n | provenance | |
| main.rs:214:14:214:14 | n | main.rs:214:25:214:25 | n | provenance | |
| main.rs:224:14:224:29 | Some(...) [Some] | main.rs:225:10:225:11 | s1 [Some] | provenance | |
| main.rs:224:19:224:28 | source(...) | main.rs:224:14:224:29 | Some(...) [Some] | provenance | |
| main.rs:225:10:225:11 | s1 [Some] | main.rs:225:10:225:20 | ... .unwrap(...) | provenance | |
| main.rs:234:14:234:39 | ...::A(...) [A] | main.rs:237:9:237:25 | TupleStructPat [A] | provenance | |
| main.rs:234:14:234:39 | ...::A(...) [A] | main.rs:241:9:241:25 | TupleStructPat [A] | provenance | |
| main.rs:234:29:234:38 | source(...) | main.rs:234:14:234:39 | ...::A(...) [A] | provenance | |
| main.rs:237:9:237:25 | TupleStructPat [A] | main.rs:237:24:237:24 | n | provenance | |
| main.rs:237:24:237:24 | n | main.rs:237:35:237:35 | n | provenance | |
| main.rs:241:9:241:25 | TupleStructPat [A] | main.rs:241:24:241:24 | n | provenance | |
| main.rs:241:24:241:24 | n | main.rs:241:55:241:55 | n | provenance | |
| main.rs:252:14:252:26 | A(...) [A] | main.rs:255:9:255:12 | TupleStructPat [A] | provenance | |
| main.rs:252:14:252:26 | A(...) [A] | main.rs:259:9:259:12 | TupleStructPat [A] | provenance | |
| main.rs:252:16:252:25 | source(...) | main.rs:252:14:252:26 | A(...) [A] | provenance | |
| main.rs:255:9:255:12 | TupleStructPat [A] | main.rs:255:11:255:11 | n | provenance | |
| main.rs:255:11:255:11 | n | main.rs:255:22:255:22 | n | provenance | |
| main.rs:259:9:259:12 | TupleStructPat [A] | main.rs:259:11:259:11 | n | provenance | |
| main.rs:259:11:259:11 | n | main.rs:259:29:259:29 | n | provenance | |
| main.rs:273:14:275:5 | ...::C {...} [C] | main.rs:278:9:278:38 | ...::C {...} [C] | provenance | |
| main.rs:273:14:275:5 | ...::C {...} [C] | main.rs:282:9:282:38 | ...::C {...} [C] | provenance | |
| main.rs:274:18:274:27 | source(...) | main.rs:273:14:275:5 | ...::C {...} [C] | provenance | |
| main.rs:278:9:278:38 | ...::C {...} [C] | main.rs:278:36:278:36 | n | provenance | |
| main.rs:278:36:278:36 | n | main.rs:278:48:278:48 | n | provenance | |
| main.rs:282:9:282:38 | ...::C {...} [C] | main.rs:282:36:282:36 | n | provenance | |
| main.rs:282:36:282:36 | n | main.rs:282:81:282:81 | n | provenance | |
| main.rs:293:14:295:5 | C {...} [C] | main.rs:298:9:298:24 | C {...} [C] | provenance | |
| main.rs:293:14:295:5 | C {...} [C] | main.rs:302:9:302:24 | C {...} [C] | provenance | |
| main.rs:294:18:294:27 | source(...) | main.rs:293:14:295:5 | C {...} [C] | provenance | |
| main.rs:298:9:298:24 | C {...} [C] | main.rs:298:22:298:22 | n | provenance | |
| main.rs:298:22:298:22 | n | main.rs:298:34:298:34 | n | provenance | |
| main.rs:302:9:302:24 | C {...} [C] | main.rs:302:22:302:22 | n | provenance | |
| main.rs:302:22:302:22 | n | main.rs:302:53:302:53 | n | provenance | |
| main.rs:314:20:314:52 | if cond {...} else {...} | main.rs:315:10:315:16 | f(...) | provenance | |
| main.rs:314:30:314:39 | source(...) | main.rs:314:20:314:52 | if cond {...} else {...} | provenance | |
| main.rs:319:20:319:23 | ... | main.rs:321:18:321:21 | data | provenance | |
| main.rs:325:13:325:22 | source(...) | main.rs:326:13:326:13 | a | provenance | |
| main.rs:326:13:326:13 | a | main.rs:319:20:319:23 | ... | provenance | |
| main.rs:330:20:330:23 | ... | main.rs:331:9:335:9 | if cond {...} else {...} | provenance | |
| main.rs:336:13:336:22 | source(...) | main.rs:337:21:337:21 | a | provenance | |
| main.rs:337:13:337:22 | f(...) | main.rs:338:10:338:10 | b | provenance | |
| main.rs:337:21:337:21 | a | main.rs:330:20:330:23 | ... | provenance | |
| main.rs:337:21:337:21 | a | main.rs:337:13:337:22 | f(...) | provenance | |
nodes
| main.rs:15:10:15:18 | source(...) | semmle.label | source(...) |
| main.rs:19:13:19:21 | source(...) | semmle.label | source(...) |
@@ -84,48 +105,73 @@ nodes
| main.rs:119:14:119:14 | a [tuple.1] | semmle.label | a [tuple.1] |
| main.rs:121:10:121:10 | b [tuple.0, tuple.1] | semmle.label | b [tuple.0, tuple.1] |
| main.rs:121:10:121:12 | b.0 [tuple.1] | semmle.label | b.0 [tuple.1] |
| main.rs:121:10:121:14 | ... .1 | semmle.label | ... .1 |
| main.rs:153:13:156:5 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] |
| main.rs:154:12:154:21 | source(...) | semmle.label | source(...) |
| main.rs:157:9:157:28 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] |
| main.rs:157:20:157:20 | a | semmle.label | a |
| main.rs:158:10:158:10 | a | semmle.label | a |
| main.rs:214:14:214:29 | Some(...) [Some] | semmle.label | Some(...) [Some] |
| main.rs:214:19:214:28 | source(...) | semmle.label | source(...) |
| main.rs:217:9:217:15 | TupleStructPat [Some] | semmle.label | TupleStructPat [Some] |
| main.rs:217:14:217:14 | n | semmle.label | n |
| main.rs:217:25:217:25 | n | semmle.label | n |
| main.rs:232:14:232:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] |
| main.rs:232:29:232:38 | source(...) | semmle.label | source(...) |
| main.rs:235:9:235:25 | TupleStructPat [A] | semmle.label | TupleStructPat [A] |
| main.rs:235:24:235:24 | n | semmle.label | n |
| main.rs:235:35:235:35 | n | semmle.label | n |
| main.rs:239:9:239:25 | TupleStructPat [A] | semmle.label | TupleStructPat [A] |
| main.rs:239:24:239:24 | n | semmle.label | n |
| main.rs:239:55:239:55 | n | semmle.label | n |
| main.rs:271:14:273:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:272:18:272:27 | source(...) | semmle.label | source(...) |
| main.rs:276:9:276:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:276:36:276:36 | n | semmle.label | n |
| main.rs:276:48:276:48 | n | semmle.label | n |
| main.rs:280:9:280:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:280:36:280:36 | n | semmle.label | n |
| main.rs:280:81:280:81 | n | semmle.label | n |
| main.rs:312:20:312:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
| main.rs:312:30:312:39 | source(...) | semmle.label | source(...) |
| main.rs:313:10:313:16 | f(...) | semmle.label | f(...) |
| main.rs:317:20:317:23 | ... | semmle.label | ... |
| main.rs:319:18:319:21 | data | semmle.label | data |
| main.rs:323:13:323:22 | source(...) | semmle.label | source(...) |
| main.rs:324:13:324:13 | a | semmle.label | a |
| main.rs:328:20:328:23 | ... | semmle.label | ... |
| main.rs:329:9:333:9 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
| main.rs:334:13:334:22 | source(...) | semmle.label | source(...) |
| main.rs:335:13:335:22 | f(...) | semmle.label | f(...) |
| main.rs:335:21:335:21 | a | semmle.label | a |
| main.rs:336:10:336:10 | b | semmle.label | b |
| main.rs:121:10:121:15 | ... .1 | semmle.label | ... .1 |
| main.rs:147:13:150:5 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] |
| main.rs:148:12:148:21 | source(...) | semmle.label | source(...) |
| main.rs:151:9:151:28 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] |
| main.rs:151:20:151:20 | a | semmle.label | a |
| main.rs:152:10:152:10 | a | semmle.label | a |
| main.rs:198:14:198:37 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] |
| main.rs:198:27:198:36 | source(...) | semmle.label | source(...) |
| main.rs:201:9:201:23 | TupleStructPat [Some] | semmle.label | TupleStructPat [Some] |
| main.rs:201:22:201:22 | n | semmle.label | n |
| main.rs:201:33:201:33 | n | semmle.label | n |
| main.rs:211:14:211:29 | Some(...) [Some] | semmle.label | Some(...) [Some] |
| main.rs:211:19:211:28 | source(...) | semmle.label | source(...) |
| main.rs:214:9:214:15 | TupleStructPat [Some] | semmle.label | TupleStructPat [Some] |
| main.rs:214:14:214:14 | n | semmle.label | n |
| main.rs:214:25:214:25 | n | semmle.label | n |
| main.rs:224:14:224:29 | Some(...) [Some] | semmle.label | Some(...) [Some] |
| main.rs:224:19:224:28 | source(...) | semmle.label | source(...) |
| main.rs:225:10:225:11 | s1 [Some] | semmle.label | s1 [Some] |
| main.rs:225:10:225:20 | ... .unwrap(...) | semmle.label | ... .unwrap(...) |
| main.rs:234:14:234:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] |
| main.rs:234:29:234:38 | source(...) | semmle.label | source(...) |
| main.rs:237:9:237:25 | TupleStructPat [A] | semmle.label | TupleStructPat [A] |
| main.rs:237:24:237:24 | n | semmle.label | n |
| main.rs:237:35:237:35 | n | semmle.label | n |
| main.rs:241:9:241:25 | TupleStructPat [A] | semmle.label | TupleStructPat [A] |
| main.rs:241:24:241:24 | n | semmle.label | n |
| main.rs:241:55:241:55 | n | semmle.label | n |
| main.rs:252:14:252:26 | A(...) [A] | semmle.label | A(...) [A] |
| main.rs:252:16:252:25 | source(...) | semmle.label | source(...) |
| main.rs:255:9:255:12 | TupleStructPat [A] | semmle.label | TupleStructPat [A] |
| main.rs:255:11:255:11 | n | semmle.label | n |
| main.rs:255:22:255:22 | n | semmle.label | n |
| main.rs:259:9:259:12 | TupleStructPat [A] | semmle.label | TupleStructPat [A] |
| main.rs:259:11:259:11 | n | semmle.label | n |
| main.rs:259:29:259:29 | n | semmle.label | n |
| main.rs:273:14:275:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:274:18:274:27 | source(...) | semmle.label | source(...) |
| main.rs:278:9:278:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:278:36:278:36 | n | semmle.label | n |
| main.rs:278:48:278:48 | n | semmle.label | n |
| main.rs:282:9:282:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:282:36:282:36 | n | semmle.label | n |
| main.rs:282:81:282:81 | n | semmle.label | n |
| main.rs:293:14:295:5 | C {...} [C] | semmle.label | C {...} [C] |
| main.rs:294:18:294:27 | source(...) | semmle.label | source(...) |
| main.rs:298:9:298:24 | C {...} [C] | semmle.label | C {...} [C] |
| main.rs:298:22:298:22 | n | semmle.label | n |
| main.rs:298:34:298:34 | n | semmle.label | n |
| main.rs:302:9:302:24 | C {...} [C] | semmle.label | C {...} [C] |
| main.rs:302:22:302:22 | n | semmle.label | n |
| main.rs:302:53:302:53 | n | semmle.label | n |
| main.rs:314:20:314:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
| main.rs:314:30:314:39 | source(...) | semmle.label | source(...) |
| main.rs:315:10:315:16 | f(...) | semmle.label | f(...) |
| main.rs:319:20:319:23 | ... | semmle.label | ... |
| main.rs:321:18:321:21 | data | semmle.label | data |
| main.rs:325:13:325:22 | source(...) | semmle.label | source(...) |
| main.rs:326:13:326:13 | a | semmle.label | a |
| main.rs:330:20:330:23 | ... | semmle.label | ... |
| main.rs:331:9:335:9 | if cond {...} else {...} | semmle.label | if cond {...} else {...} |
| main.rs:336:13:336:22 | source(...) | semmle.label | source(...) |
| main.rs:337:13:337:22 | f(...) | semmle.label | f(...) |
| main.rs:337:21:337:21 | a | semmle.label | a |
| main.rs:338:10:338:10 | b | semmle.label | b |
subpaths
| main.rs:335:21:335:21 | a | main.rs:328:20:328:23 | ... | main.rs:329:9:333:9 | if cond {...} else {...} | main.rs:335:13:335:22 | f(...) |
| main.rs:337:21:337:21 | a | main.rs:330:20:330:23 | ... | main.rs:331:9:335:9 | if cond {...} else {...} | main.rs:337:13:337:22 | f(...) |
testFailures
#select
| main.rs:15:10:15:18 | source(...) | main.rs:15:10:15:18 | source(...) | main.rs:15:10:15:18 | source(...) | $@ | main.rs:15:10:15:18 | source(...) | source(...) |
@@ -137,13 +183,19 @@ testFailures
| main.rs:95:10:95:12 | a.0 | main.rs:94:14:94:22 | source(...) | main.rs:95:10:95:12 | a.0 | $@ | main.rs:94:14:94:22 | source(...) | source(...) |
| main.rs:110:10:110:12 | a.1 | main.rs:108:21:108:30 | source(...) | main.rs:110:10:110:12 | a.1 | $@ | main.rs:108:21:108:30 | source(...) | source(...) |
| main.rs:113:10:113:12 | a.0 | main.rs:111:11:111:20 | source(...) | main.rs:113:10:113:12 | a.0 | $@ | main.rs:111:11:111:20 | source(...) | source(...) |
| main.rs:121:10:121:14 | ... .1 | main.rs:118:17:118:26 | source(...) | main.rs:121:10:121:14 | ... .1 | $@ | main.rs:118:17:118:26 | source(...) | source(...) |
| main.rs:158:10:158:10 | a | main.rs:154:12:154:21 | source(...) | main.rs:158:10:158:10 | a | $@ | main.rs:154:12:154:21 | source(...) | source(...) |
| main.rs:217:25:217:25 | n | main.rs:214:19:214:28 | source(...) | main.rs:217:25:217:25 | n | $@ | main.rs:214:19:214:28 | source(...) | source(...) |
| main.rs:235:35:235:35 | n | main.rs:232:29:232:38 | source(...) | main.rs:235:35:235:35 | n | $@ | main.rs:232:29:232:38 | source(...) | source(...) |
| main.rs:239:55:239:55 | n | main.rs:232:29:232:38 | source(...) | main.rs:239:55:239:55 | n | $@ | main.rs:232:29:232:38 | source(...) | source(...) |
| main.rs:276:48:276:48 | n | main.rs:272:18:272:27 | source(...) | main.rs:276:48:276:48 | n | $@ | main.rs:272:18:272:27 | source(...) | source(...) |
| main.rs:280:81:280:81 | n | main.rs:272:18:272:27 | source(...) | main.rs:280:81:280:81 | n | $@ | main.rs:272:18:272:27 | source(...) | source(...) |
| main.rs:313:10:313:16 | f(...) | main.rs:312:30:312:39 | source(...) | main.rs:313:10:313:16 | f(...) | $@ | main.rs:312:30:312:39 | source(...) | source(...) |
| main.rs:319:18:319:21 | data | main.rs:323:13:323:22 | source(...) | main.rs:319:18:319:21 | data | $@ | main.rs:323:13:323:22 | source(...) | source(...) |
| main.rs:336:10:336:10 | b | main.rs:334:13:334:22 | source(...) | main.rs:336:10:336:10 | b | $@ | main.rs:334:13:334:22 | source(...) | source(...) |
| main.rs:121:10:121:15 | ... .1 | main.rs:118:17:118:26 | source(...) | main.rs:121:10:121:15 | ... .1 | $@ | main.rs:118:17:118:26 | source(...) | source(...) |
| main.rs:152:10:152:10 | a | main.rs:148:12:148:21 | source(...) | main.rs:152:10:152:10 | a | $@ | main.rs:148:12:148:21 | source(...) | source(...) |
| main.rs:201:33:201:33 | n | main.rs:198:27:198:36 | source(...) | main.rs:201:33:201:33 | n | $@ | main.rs:198:27:198:36 | source(...) | source(...) |
| main.rs:214:25:214:25 | n | main.rs:211:19:211:28 | source(...) | main.rs:214:25:214:25 | n | $@ | main.rs:211:19:211:28 | source(...) | source(...) |
| main.rs:225:10:225:20 | ... .unwrap(...) | main.rs:224:19:224:28 | source(...) | main.rs:225:10:225:20 | ... .unwrap(...) | $@ | main.rs:224:19:224:28 | source(...) | source(...) |
| main.rs:237:35:237:35 | n | main.rs:234:29:234:38 | source(...) | main.rs:237:35:237:35 | n | $@ | main.rs:234:29:234:38 | source(...) | source(...) |
| main.rs:241:55:241:55 | n | main.rs:234:29:234:38 | source(...) | main.rs:241:55:241:55 | n | $@ | main.rs:234:29:234:38 | source(...) | source(...) |
| main.rs:255:22:255:22 | n | main.rs:252:16:252:25 | source(...) | main.rs:255:22:255:22 | n | $@ | main.rs:252:16:252:25 | source(...) | source(...) |
| main.rs:259:29:259:29 | n | main.rs:252:16:252:25 | source(...) | main.rs:259:29:259:29 | n | $@ | main.rs:252:16:252:25 | source(...) | source(...) |
| main.rs:278:48:278:48 | n | main.rs:274:18:274:27 | source(...) | main.rs:278:48:278:48 | n | $@ | main.rs:274:18:274:27 | source(...) | source(...) |
| main.rs:282:81:282:81 | n | main.rs:274:18:274:27 | source(...) | main.rs:282:81:282:81 | n | $@ | main.rs:274:18:274:27 | source(...) | source(...) |
| main.rs:298:34:298:34 | n | main.rs:294:18:294:27 | source(...) | main.rs:298:34:298:34 | n | $@ | main.rs:294:18:294:27 | source(...) | source(...) |
| main.rs:302:53:302:53 | n | main.rs:294:18:294:27 | source(...) | main.rs:302:53:302:53 | n | $@ | main.rs:294:18:294:27 | source(...) | source(...) |
| main.rs:315:10:315:16 | f(...) | main.rs:314:30:314:39 | source(...) | main.rs:315:10:315:16 | f(...) | $@ | main.rs:314:30:314:39 | source(...) | source(...) |
| main.rs:321:18:321:21 | data | main.rs:325:13:325:22 | source(...) | main.rs:321:18:321:21 | data | $@ | main.rs:325:13:325:22 | source(...) | source(...) |
| main.rs:338:10:338:10 | b | main.rs:336:13:336:22 | source(...) | main.rs:338:10:338:10 | b | $@ | main.rs:336:13:336:22 | source(...) | source(...) |

View File

@@ -117,8 +117,8 @@ fn tuple_mutation() {
fn tuple_nested() {
let a = (3, source(59));
let b = (a, 3);
sink(b.0.0);
sink(b.0.1); // $ hasValueFlow=59
sink(b.0 .0);
sink(b.0 .1); // $ hasValueFlow=59
sink(b.1);
}
@@ -131,19 +131,13 @@ struct Point {
}
fn struct_field() {
let p = Point {
x: source(9),
y: 2,
};
let p = Point { x: source(9), y: 2 };
sink(p.x); // $ MISSING: hasValueFlow=9
sink(p.y);
}
fn struct_mutation() {
let mut p = Point {
x: source(9),
y: 2,
};
let mut p = Point { x: source(9), y: 2 };
sink(p.y);
p.y = source(54);
sink(p.y); // $ MISSING: hasValueFlow=54
@@ -161,7 +155,7 @@ fn struct_pattern_match() {
struct Point3D {
plane: Point,
z: i64
z: i64,
}
fn struct_nested_field() {
@@ -170,7 +164,7 @@ fn struct_nested_field() {
x: 2,
y: source(77),
},
z: 4
z: 4,
};
sink(p.plane.x);
sink(p.plane.y); // $ MISSING: hasValueFlow=77
@@ -183,10 +177,13 @@ fn struct_nested_match() {
x: 2,
y: source(93),
},
z: 4
z: 4,
};
match p {
Point3D { plane: Point { x, y }, z, } => {
Point3D {
plane: Point { x, y },
z,
} => {
sink(x);
sink(y); // MISSING: hasValueFlow=93
sink(z);
@@ -201,7 +198,7 @@ fn option_pattern_match_qualified() {
let s1 = Option::Some(source(13));
let s2 = Option::Some(2);
match s1 {
Option::Some(n) => sink(n), // $ MISSING: hasValueFlow=13
Option::Some(n) => sink(n), // $ hasValueFlow=13
Option::None => sink(0),
}
match s2 {
@@ -223,6 +220,11 @@ fn option_pattern_match_unqualified() {
}
}
fn option_unwrap() {
let s1 = Some(source(19));
sink(s1.unwrap()); // $ hasValueFlow=19
}
enum MyTupleEnum {
A(i64),
B(i64),
@@ -250,11 +252,11 @@ fn custom_tuple_enum_pattern_match_unqualified() {
let s1 = A(source(16));
let s2 = B(2);
match s1 {
A(n) => sink(n), // $ MISSING: hasValueFlow=16
A(n) => sink(n), // $ hasValueFlow=16
B(n) => sink(n),
}
match s1 {
A(n) | B(n) => sink(n), // $ MISSING: hasValueFlow=16
A(n) | B(n) => sink(n), // $ hasValueFlow=16
}
match s2 {
A(n) => sink(n),
@@ -293,11 +295,11 @@ fn custom_record_enum_pattern_match_unqualified() {
};
let s2 = D { field_d: 2 };
match s1 {
C { field_c: n } => sink(n), // $ MISSING: hasValueFlow=18
C { field_c: n } => sink(n), // $ hasValueFlow=18
D { field_d: n } => sink(n),
}
match s1 {
C { field_c: n } | D { field_d: n } => sink(n), // $ MISSING: hasValueFlow=18
C { field_c: n } | D { field_d: n } => sink(n), // $ hasValueFlow=18
}
match s2 {
C { field_c: n } => sink(n),
@@ -355,6 +357,7 @@ fn main() {
struct_nested_match();
option_pattern_match_qualified();
option_pattern_match_unqualified();
option_unwrap();
custom_tuple_enum_pattern_match_qualified();
custom_tuple_enum_pattern_match_unqualified();
custom_record_enum_pattern_match_qualified();

View File

@@ -0,0 +1,90 @@
fn source(i: i64) -> i64 {
1000 + i
}
fn sink(s: i64) {
println!("{}", s);
}
// has a flow model
fn identity(i: i64) -> i64 {
0
}
fn test_identify() {
let s = source(1);
sink(identity(s)); // $ hasValueFlow=1
}
enum MyPosEnum {
A(i64),
B(i64),
}
// has a flow model
fn get_var_pos(e: MyPosEnum) -> i64 {
0
}
fn test_get_var_pos() {
let s = source(2);
let e1 = MyPosEnum::A(s);
sink(get_var_pos(e1)); // $ hasValueFlow=2
let e2 = MyPosEnum::B(s);
sink(get_var_pos(e2));
}
// has a flow model
fn set_var_pos(i: i64) -> MyPosEnum {
MyPosEnum::A(0)
}
fn test_set_var_pos() {
let s = source(3);
let e1 = set_var_pos(s);
match e1 {
MyPosEnum::A(i) => sink(i),
MyPosEnum::B(i) => sink(i), // $ hasValueFlow=3
}
}
enum MyFieldEnum {
C { field_c: i64 },
D { field_d: i64 },
}
// has a flow model
fn get_var_field(e: MyFieldEnum) -> i64 {
0
}
fn test_get_var_field() {
let s = source(4);
let e1 = MyFieldEnum::C { field_c: s };
sink(get_var_field(e1)); // $ hasValueFlow=4
let e2 = MyFieldEnum::D { field_d: s };
sink(get_var_field(e2));
}
// has a flow model
fn set_var_field(i: i64) -> MyFieldEnum {
MyFieldEnum::C { field_c: 0 }
}
fn test_set_var_field() {
let s = source(5);
let e1 = set_var_field(s);
match e1 {
MyFieldEnum::C { field_c: i } => sink(i),
MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=5
}
}
fn main() {
test_identify();
test_get_var_pos();
test_set_var_pos();
test_get_var_field();
test_set_var_field();
let dummy = Some(0); // ensure that the the `lang:core` crate is extracted
}

View File

@@ -0,0 +1,57 @@
models
edges
| main.rs:15:13:15:21 | source(...) | main.rs:16:19:16:19 | s | provenance | |
| main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | |
| main.rs:30:13:30:21 | source(...) | main.rs:31:27:31:27 | s | provenance | |
| main.rs:31:14:31:28 | ...::A(...) [A] | main.rs:32:22:32:23 | e1 [A] | provenance | |
| main.rs:31:27:31:27 | s | main.rs:31:14:31:28 | ...::A(...) [A] | provenance | |
| main.rs:32:22:32:23 | e1 [A] | main.rs:32:10:32:24 | get_var_pos(...) | provenance | |
| main.rs:43:13:43:21 | source(...) | main.rs:44:26:44:26 | s | provenance | |
| main.rs:44:14:44:27 | set_var_pos(...) [B] | main.rs:47:9:47:23 | TupleStructPat [B] | provenance | |
| main.rs:44:26:44:26 | s | main.rs:44:14:44:27 | set_var_pos(...) [B] | provenance | |
| main.rs:47:9:47:23 | TupleStructPat [B] | main.rs:47:22:47:22 | i | provenance | |
| main.rs:47:22:47:22 | i | main.rs:47:33:47:33 | i | provenance | |
| main.rs:62:13:62:21 | source(...) | main.rs:63:40:63:40 | s | provenance | |
| main.rs:63:14:63:42 | ...::C {...} [C] | main.rs:64:24:64:25 | e1 [C] | provenance | |
| main.rs:63:40:63:40 | s | main.rs:63:14:63:42 | ...::C {...} [C] | provenance | |
| main.rs:64:24:64:25 | e1 [C] | main.rs:64:10:64:26 | get_var_field(...) | provenance | |
| main.rs:75:13:75:21 | source(...) | main.rs:76:28:76:28 | s | provenance | |
| main.rs:76:14:76:29 | set_var_field(...) [D] | main.rs:79:9:79:37 | ...::D {...} [D] | provenance | |
| main.rs:76:28:76:28 | s | main.rs:76:14:76:29 | set_var_field(...) [D] | provenance | |
| main.rs:79:9:79:37 | ...::D {...} [D] | main.rs:79:35:79:35 | i | provenance | |
| main.rs:79:35:79:35 | i | main.rs:79:47:79:47 | i | provenance | |
nodes
| main.rs:15:13:15:21 | source(...) | semmle.label | source(...) |
| main.rs:16:10:16:20 | identity(...) | semmle.label | identity(...) |
| main.rs:16:19:16:19 | s | semmle.label | s |
| main.rs:30:13:30:21 | source(...) | semmle.label | source(...) |
| main.rs:31:14:31:28 | ...::A(...) [A] | semmle.label | ...::A(...) [A] |
| main.rs:31:27:31:27 | s | semmle.label | s |
| main.rs:32:10:32:24 | get_var_pos(...) | semmle.label | get_var_pos(...) |
| main.rs:32:22:32:23 | e1 [A] | semmle.label | e1 [A] |
| main.rs:43:13:43:21 | source(...) | semmle.label | source(...) |
| main.rs:44:14:44:27 | set_var_pos(...) [B] | semmle.label | set_var_pos(...) [B] |
| main.rs:44:26:44:26 | s | semmle.label | s |
| main.rs:47:9:47:23 | TupleStructPat [B] | semmle.label | TupleStructPat [B] |
| main.rs:47:22:47:22 | i | semmle.label | i |
| main.rs:47:33:47:33 | i | semmle.label | i |
| main.rs:62:13:62:21 | source(...) | semmle.label | source(...) |
| main.rs:63:14:63:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
| main.rs:63:40:63:40 | s | semmle.label | s |
| main.rs:64:10:64:26 | get_var_field(...) | semmle.label | get_var_field(...) |
| main.rs:64:24:64:25 | e1 [C] | semmle.label | e1 [C] |
| main.rs:75:13:75:21 | source(...) | semmle.label | source(...) |
| main.rs:76:14:76:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] |
| main.rs:76:28:76:28 | s | semmle.label | s |
| main.rs:79:9:79:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
| main.rs:79:35:79:35 | i | semmle.label | i |
| main.rs:79:47:79:47 | i | semmle.label | i |
subpaths
testFailures
invalidSpecComponent
#select
| main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) |
| main.rs:32:10:32:24 | get_var_pos(...) | main.rs:30:13:30:21 | source(...) | main.rs:32:10:32:24 | get_var_pos(...) | $@ | main.rs:30:13:30:21 | source(...) | source(...) |
| main.rs:47:33:47:33 | i | main.rs:43:13:43:21 | source(...) | main.rs:47:33:47:33 | i | $@ | main.rs:43:13:43:21 | source(...) | source(...) |
| main.rs:64:10:64:26 | get_var_field(...) | main.rs:62:13:62:21 | source(...) | main.rs:64:10:64:26 | get_var_field(...) | $@ | main.rs:62:13:62:21 | source(...) | source(...) |
| main.rs:79:47:79:47 | i | main.rs:75:13:75:21 | source(...) | main.rs:79:47:79:47 | i | $@ | main.rs:75:13:75:21 | source(...) | source(...) |

View File

@@ -0,0 +1,78 @@
/**
* @kind path-problem
*/
import rust
import utils.InlineFlowTest
import codeql.rust.dataflow.DataFlow
import codeql.rust.dataflow.FlowSummary
import codeql.rust.dataflow.TaintTracking
import codeql.rust.dataflow.internal.FlowSummaryImpl
import PathGraph
query predicate invalidSpecComponent(SummarizedCallable sc, string s, string c) {
(sc.propagatesFlow(s, _, _) or sc.propagatesFlow(_, s, _)) and
Private::External::invalidSpecComponent(s, c)
}
private class SummarizedCallableIdentity extends SummarizedCallable::Range {
SummarizedCallableIdentity() { this = "repo::test::_::crate::identity" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[0]" and
output = "ReturnValue" and
preservesValue = true
}
}
private class SummarizedCallableGetVarPos extends SummarizedCallable::Range {
SummarizedCallableGetVarPos() { this = "repo::test::_::crate::get_var_pos" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[0].Variant[crate::MyPosEnum::A(0)]" and
output = "ReturnValue" and
preservesValue = true
}
}
private class SummarizedCallableSetVarPos extends SummarizedCallable::Range {
SummarizedCallableSetVarPos() { this = "repo::test::_::crate::set_var_pos" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[0]" and
output = "ReturnValue.Variant[crate::MyPosEnum::B(0)]" and
preservesValue = true
}
}
private class SummarizedCallableGetVarField extends SummarizedCallable::Range {
SummarizedCallableGetVarField() { this = "repo::test::_::crate::get_var_field" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[0].Variant[crate::MyFieldEnum::C::field_c]" and
output = "ReturnValue" and
preservesValue = true
}
}
private class SummarizedCallableSetVarField extends SummarizedCallable::Range {
SummarizedCallableSetVarField() { this = "repo::test::_::crate::set_var_field" }
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
input = "Argument[0]" and
output = "ReturnValue.Variant[crate::MyFieldEnum::D::field_d]" and
preservesValue = true
}
}
module CustomConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { DefaultFlowConfig::isSource(source) }
predicate isSink(DataFlow::Node sink) { DefaultFlowConfig::isSink(sink) }
}
import ValueFlowTest<CustomConfig>
from PathNode source, PathNode sink
where flowPath(source, sink)
select sink, source, sink, "$@", source, source.toString()

View File

@@ -1207,6 +1207,11 @@ module Make<
)
}
/** Holds if the value of `succ` is uniquely determined by the value of `pred`. */
predicate summaryLocalMustFlowStep(SummaryNode pred, SummaryNode succ) {
pred = unique(SummaryNode n1 | summaryLocalStep(n1, succ, true, _))
}
/**
* Holds if there is a read step of content `c` from `pred` to `succ`, which
* is synthesized from a flow summary.