mirror of
https://github.com/github/codeql.git
synced 2026-04-23 07:45:17 +02:00
Merge branch 'main' into rust-df-closure
This commit is contained in:
@@ -1,4 +0,0 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* .NET 9 is now required to build the C# extractor.
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
69
rust/ql/lib/codeql/rust/dataflow/FlowSummary.qll
Normal file
69
rust/ql/lib/codeql/rust/dataflow/FlowSummary.qll
Normal 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;
|
||||
@@ -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) {
|
||||
|
||||
103
rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll
Normal file
103
rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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(...) |
|
||||
|
||||
@@ -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();
|
||||
|
||||
90
rust/ql/test/library-tests/dataflow/models/main.rs
Normal file
90
rust/ql/test/library-tests/dataflow/models/main.rs
Normal 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
|
||||
}
|
||||
57
rust/ql/test/library-tests/dataflow/models/models.expected
Normal file
57
rust/ql/test/library-tests/dataflow/models/models.expected
Normal 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(...) |
|
||||
78
rust/ql/test/library-tests/dataflow/models/models.ql
Normal file
78
rust/ql/test/library-tests/dataflow/models/models.ql
Normal 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()
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user