mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Merge branch 'main' into http
This commit is contained in:
@@ -149,11 +149,7 @@ fn write_schema(
|
||||
.iter()
|
||||
.map(|node| node_src_to_schema_class(node, &super_types)),
|
||||
);
|
||||
// the concat dance is currently required by bazel
|
||||
let template = mustache::compile_str(include_str!(concat!(
|
||||
env!("CARGO_MANIFEST_DIR"),
|
||||
"/src/templates/schema.mustache"
|
||||
)))?;
|
||||
let template = mustache::compile_str(include_str!("templates/schema.mustache"))?;
|
||||
let res = template.render_to_string(&schema)?;
|
||||
Ok(fix_blank_lines(&res))
|
||||
}
|
||||
@@ -557,11 +553,7 @@ fn write_extractor(grammar: &AstSrc) -> mustache::Result<String> {
|
||||
enums: grammar.enums.iter().map(enum_to_extractor_info).collect(),
|
||||
nodes: grammar.nodes.iter().map(node_to_extractor_info).collect(),
|
||||
};
|
||||
// the concat dance is currently required by bazel
|
||||
let template = mustache::compile_str(include_str!(concat!(
|
||||
env!("CARGO_MANIFEST_DIR"),
|
||||
"/src/templates/extractor.mustache"
|
||||
)))?;
|
||||
let template = mustache::compile_str(include_str!("templates/extractor.mustache"))?;
|
||||
let res = template.render_to_string(&extractor_info)?;
|
||||
Ok(fix_blank_lines(&res))
|
||||
}
|
||||
|
||||
@@ -78,6 +78,12 @@ private import codeql.rust.elements.internal.PathResolution
|
||||
/** Holds if `p` may resolve to multiple items including `i`. */
|
||||
query predicate multiplePathResolutions(Path p, ItemNode i) {
|
||||
i = resolvePath(p) and
|
||||
// `use foo::bar` may use both a type `bar` and a value `bar`
|
||||
not p =
|
||||
any(UseTree use |
|
||||
not use.isGlob() and
|
||||
not use.hasUseTreeList()
|
||||
).getPath() and
|
||||
strictcount(resolvePath(p)) > 1
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +100,32 @@ class ModeledEnvironmentSource extends EnvironmentSource::Range {
|
||||
ModeledEnvironmentSource() { sourceNode(this, "environment-source") }
|
||||
}
|
||||
|
||||
/**
|
||||
* A data flow source corresponding to the program's database reads.
|
||||
*/
|
||||
final class DatabaseSource = DatabaseSource::Range;
|
||||
|
||||
/**
|
||||
* Provides a class for modeling new sources for the program's database reads.
|
||||
*/
|
||||
module DatabaseSource {
|
||||
/**
|
||||
* A data flow source corresponding to the program's database reads.
|
||||
*/
|
||||
abstract class Range extends ThreatModelSource::Range {
|
||||
override string getThreatModel() { result = "database" }
|
||||
|
||||
override string getSourceType() { result = "DatabaseSource" }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An externally modeled source for data from the program's database.
|
||||
*/
|
||||
class ModeledDatabaseSource extends DatabaseSource::Range {
|
||||
ModeledDatabaseSource() { sourceNode(this, "database") }
|
||||
}
|
||||
|
||||
/**
|
||||
* A data flow source for remote (network) data.
|
||||
*/
|
||||
|
||||
@@ -82,35 +82,6 @@ module Ssa {
|
||||
*/
|
||||
final CfgNode getAFirstRead() { SsaImpl::firstRead(this, result) }
|
||||
|
||||
/**
|
||||
* Gets a last control flow node that reads the value of this SSA definition.
|
||||
* That is, a read that can reach the end of the enclosing CFG scope, or another
|
||||
* SSA definition for the source variable, without passing through any other read.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* ```rust
|
||||
* fn phi(b : bool) { // defines b_0
|
||||
* let mut x = 1; // defines x_0
|
||||
* println!("{}", x);
|
||||
* println!("{}", x + 1); // last read of x_0
|
||||
*
|
||||
* if b { // last read of b_0
|
||||
* x = 2; // defines x_1
|
||||
* println!("{}", x);
|
||||
* println!("{}", x + 1); // last read of x_1
|
||||
* } else {
|
||||
* x = 3; // defines x_2
|
||||
* println!("{}", x);
|
||||
* println!("{}", x + 1); // last read of x_2
|
||||
* }
|
||||
* // defines x_3 = phi(x_1, x_2)
|
||||
* println!("{}", x); // last read of x_3
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
final CfgNode getALastRead() { SsaImpl::lastRead(this, result) }
|
||||
|
||||
/**
|
||||
* Holds if `read1` and `read2` are adjacent reads of this SSA definition.
|
||||
* That is, `read2` can be reached from `read1` without passing through
|
||||
|
||||
@@ -843,6 +843,15 @@ final class ElementContent extends Content, TElementContent {
|
||||
override Location getLocation() { result instanceof EmptyLocation }
|
||||
}
|
||||
|
||||
/**
|
||||
* A value that a future resolves to.
|
||||
*/
|
||||
final class FutureContent extends Content, TFutureContent {
|
||||
override string toString() { result = "future" }
|
||||
|
||||
override Location getLocation() { result instanceof EmptyLocation }
|
||||
}
|
||||
|
||||
/**
|
||||
* Content stored at a position in a tuple.
|
||||
*
|
||||
@@ -1194,6 +1203,12 @@ module RustDataFlow implements InputSig<Location> {
|
||||
c instanceof FunctionCallReturnContent
|
||||
)
|
||||
or
|
||||
exists(AwaitExprCfgNode await |
|
||||
c instanceof FutureContent and
|
||||
node1.asExpr() = await.getExpr() and
|
||||
node2.asExpr() = await
|
||||
)
|
||||
or
|
||||
VariableCapture::readStep(node1, c, node2)
|
||||
)
|
||||
or
|
||||
@@ -1211,6 +1226,17 @@ module RustDataFlow implements InputSig<Location> {
|
||||
)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate referenceAssignment(Node node1, Node node2, ReferenceContent c) {
|
||||
exists(AssignmentExprCfgNode assignment, PrefixExprCfgNode deref |
|
||||
assignment.getLhs() = deref and
|
||||
deref.getOperatorName() = "*" and
|
||||
node1.asExpr() = assignment.getRhs() and
|
||||
node2.asExpr() = deref.getExpr() and
|
||||
exists(c)
|
||||
)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate storeContentStep(Node node1, Content c, Node node2) {
|
||||
exists(CallExprCfgNode call, int pos |
|
||||
@@ -1242,6 +1268,8 @@ module RustDataFlow implements InputSig<Location> {
|
||||
or
|
||||
fieldAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
|
||||
or
|
||||
referenceAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
|
||||
or
|
||||
exists(AssignmentExprCfgNode assignment, IndexExprCfgNode index |
|
||||
c instanceof ElementContent and
|
||||
assignment.getLhs() = index and
|
||||
@@ -1285,6 +1313,8 @@ module RustDataFlow implements InputSig<Location> {
|
||||
predicate clearsContent(Node n, ContentSet cs) {
|
||||
fieldAssignment(_, n, cs.(SingletonContentSet).getContent())
|
||||
or
|
||||
referenceAssignment(_, n, cs.(SingletonContentSet).getContent())
|
||||
or
|
||||
FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(Node::FlowSummaryNode).getSummaryNode(),
|
||||
cs)
|
||||
or
|
||||
@@ -1538,7 +1568,8 @@ private module Cached {
|
||||
[
|
||||
any(IndexExprCfgNode i).getBase(), any(FieldExprCfgNode access).getExpr(),
|
||||
any(TryExprCfgNode try).getExpr(),
|
||||
any(PrefixExprCfgNode pe | pe.getOperatorName() = "*").getExpr()
|
||||
any(PrefixExprCfgNode pe | pe.getOperatorName() = "*").getExpr(),
|
||||
any(AwaitExprCfgNode a).getExpr()
|
||||
]
|
||||
} or
|
||||
TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or
|
||||
@@ -1594,6 +1625,7 @@ private module Cached {
|
||||
// TODO: Remove once library types are extracted
|
||||
TVariantInLibTupleFieldContent(VariantInLib::VariantInLib v, int pos) { pos = v.getAPosition() } or
|
||||
TElementContent() or
|
||||
TFutureContent() or
|
||||
TTuplePositionContent(int pos) {
|
||||
pos in [0 .. max([
|
||||
any(TuplePat pat).getNumberOfFields(),
|
||||
|
||||
@@ -89,6 +89,10 @@ module Input implements InputSig<Location, RustDataFlow> {
|
||||
arg = v.getExtendedCanonicalPath() + "(" + v.getPosition() + ")"
|
||||
)
|
||||
or
|
||||
result = "Reference" and
|
||||
c = TReferenceContent() and
|
||||
arg = ""
|
||||
or
|
||||
result = "Element" and
|
||||
c = TElementContent() and
|
||||
arg = ""
|
||||
@@ -98,6 +102,10 @@ module Input implements InputSig<Location, RustDataFlow> {
|
||||
c = TTuplePositionContent(pos) and
|
||||
arg = pos.toString()
|
||||
)
|
||||
or
|
||||
result = "Future" and
|
||||
c = TFutureContent() and
|
||||
arg = ""
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -47,8 +47,6 @@ module SsaInput implements SsaImplCommon::InputSig<Location> {
|
||||
|
||||
BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
|
||||
|
||||
class ExitBasicBlock = BasicBlocks::ExitBasicBlock;
|
||||
|
||||
/**
|
||||
* A variable amenable to SSA construction.
|
||||
*
|
||||
@@ -218,25 +216,6 @@ private predicate adjacentDefSkipUncertainReads(
|
||||
SsaInput::variableRead(bb2, i2, _, true)
|
||||
}
|
||||
|
||||
private predicate adjacentDefReachesUncertainReadExt(
|
||||
DefinitionExt def, BasicBlock bb1, int i1, BasicBlock bb2, int i2
|
||||
) {
|
||||
adjacentDefReachesReadExt(def, bb1, i1, bb2, i2) and
|
||||
SsaInput::variableRead(bb2, i2, _, false)
|
||||
}
|
||||
|
||||
/** Same as `lastRefRedef`, but skips uncertain reads. */
|
||||
pragma[nomagic]
|
||||
private predicate lastRefSkipUncertainReadsExt(DefinitionExt def, BasicBlock bb, int i) {
|
||||
Impl::lastRef(def, bb, i) and
|
||||
not SsaInput::variableRead(bb, i, def.getSourceVariable(), false)
|
||||
or
|
||||
exists(BasicBlock bb0, int i0 |
|
||||
Impl::lastRef(def, bb0, i0) and
|
||||
adjacentDefReachesUncertainReadExt(def, bb, i, bb0, i0)
|
||||
)
|
||||
}
|
||||
|
||||
private VariableAccess getACapturedVariableAccess(BasicBlock bb, Variable v) {
|
||||
result = bb.getANode().getAstNode() and
|
||||
result.isCapture() and
|
||||
@@ -381,20 +360,6 @@ private module Cached {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the read of `def` at `read` may be a last read. That is, `read`
|
||||
* can either reach another definition of the underlying source variable or
|
||||
* the end of the CFG scope, without passing through another non-pseudo read.
|
||||
*/
|
||||
cached
|
||||
predicate lastRead(Definition def, CfgNode read) {
|
||||
exists(BasicBlock bb, int i |
|
||||
lastRefSkipUncertainReadsExt(def, bb, i) and
|
||||
variableReadActual(bb, i, _) and
|
||||
read = bb.getNode(i)
|
||||
)
|
||||
}
|
||||
|
||||
cached
|
||||
Definition uncertainWriteDefinitionInput(UncertainWriteDefinition def) {
|
||||
Impl::uncertainWriteDefinitionInput(def, result)
|
||||
@@ -491,7 +456,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
|
||||
exists(ConditionBasicBlock conditionBlock, ConditionalSuccessor s |
|
||||
guard = conditionBlock.getLastNode() and
|
||||
s.getValue() = branch and
|
||||
conditionBlock.controls(bb, s)
|
||||
conditionBlock.edgeDominates(bb, s)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,31 @@
|
||||
private import rust
|
||||
private import codeql.rust.elements.internal.generated.ParentChild
|
||||
|
||||
private newtype TNamespace =
|
||||
TTypeNamespace() or
|
||||
TValueNamespace()
|
||||
|
||||
/**
|
||||
* A namespace.
|
||||
*
|
||||
* Either the _value_ namespace or the _type_ namespace, see
|
||||
* https://doc.rust-lang.org/reference/names/namespaces.html.
|
||||
*/
|
||||
final class Namespace extends TNamespace {
|
||||
/** Holds if this is the value namespace. */
|
||||
predicate isValue() { this = TValueNamespace() }
|
||||
|
||||
/** Holds if this is the type namespace. */
|
||||
predicate isType() { this = TTypeNamespace() }
|
||||
|
||||
/** Gets a textual representation of this namespace. */
|
||||
string toString() {
|
||||
this.isValue() and result = "value"
|
||||
or
|
||||
this.isType() and result = "type"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An item that may be referred to by a path, and which is a node in
|
||||
* the _item graph_.
|
||||
@@ -46,11 +71,15 @@ private import codeql.rust.elements.internal.generated.ParentChild
|
||||
* - https://doc.rust-lang.org/reference/names/scopes.html
|
||||
* - https://doc.rust-lang.org/reference/paths.html
|
||||
* - https://doc.rust-lang.org/reference/visibility-and-privacy.html
|
||||
* - https://doc.rust-lang.org/reference/names/namespaces.html
|
||||
*/
|
||||
abstract class ItemNode extends AstNode {
|
||||
/** Gets the (original) name of this item. */
|
||||
abstract string getName();
|
||||
|
||||
/** Gets the namespace that this item belongs to, if any. */
|
||||
abstract Namespace getNamespace();
|
||||
|
||||
/** Gets the visibility of this item, if any. */
|
||||
abstract Visibility getVisibility();
|
||||
|
||||
@@ -143,30 +172,44 @@ abstract private class ModuleLikeNode extends ItemNode {
|
||||
private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
|
||||
override string getName() { result = "(source file)" }
|
||||
|
||||
override Namespace getNamespace() {
|
||||
result.isType() // can be referenced with `super`
|
||||
}
|
||||
|
||||
override Visibility getVisibility() { none() }
|
||||
}
|
||||
|
||||
private class ConstItemNode extends ItemNode instanceof Const {
|
||||
override string getName() { result = Const.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isValue() }
|
||||
|
||||
override Visibility getVisibility() { result = Const.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class EnumItemNode extends ItemNode instanceof Enum {
|
||||
override string getName() { result = Enum.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
|
||||
override Visibility getVisibility() { result = Enum.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class VariantItemNode extends ItemNode instanceof Variant {
|
||||
override string getName() { result = Variant.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() {
|
||||
if super.getFieldList() instanceof RecordFieldList then result.isType() else result.isValue()
|
||||
}
|
||||
|
||||
override Visibility getVisibility() { result = Variant.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class FunctionItemNode extends ItemNode instanceof Function {
|
||||
override string getName() { result = Function.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isValue() }
|
||||
|
||||
override Visibility getVisibility() { result = Function.super.getVisibility() }
|
||||
}
|
||||
|
||||
@@ -184,57 +227,92 @@ abstract private class ImplOrTraitItemNode extends ItemNode {
|
||||
}
|
||||
}
|
||||
|
||||
private class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
|
||||
class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
|
||||
ItemNode resolveSelfTy() { result = resolvePath(super.getSelfTy().(PathTypeRepr).getPath()) }
|
||||
|
||||
override string getName() { result = "(impl)" }
|
||||
|
||||
override Namespace getNamespace() {
|
||||
result.isType() // can be referenced with `Self`
|
||||
}
|
||||
|
||||
override Visibility getVisibility() { result = Impl.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class MacroCallItemNode extends ItemNode instanceof MacroCall {
|
||||
override string getName() { result = "(macro call)" }
|
||||
|
||||
override Namespace getNamespace() { none() }
|
||||
|
||||
override Visibility getVisibility() { none() }
|
||||
}
|
||||
|
||||
private class ModuleItemNode extends ModuleLikeNode instanceof Module {
|
||||
override string getName() { result = Module.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
|
||||
override Visibility getVisibility() { result = Module.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class StructItemNode extends ItemNode instanceof Struct {
|
||||
override string getName() { result = Struct.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() {
|
||||
result.isType() // the struct itself
|
||||
or
|
||||
not super.getFieldList() instanceof RecordFieldList and
|
||||
result.isValue() // the constructor
|
||||
}
|
||||
|
||||
override Visibility getVisibility() { result = Struct.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
|
||||
class TraitItemNode extends ImplOrTraitItemNode instanceof Trait {
|
||||
override string getName() { result = Trait.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
|
||||
override Visibility getVisibility() { result = Trait.super.getVisibility() }
|
||||
}
|
||||
|
||||
class TypeAliasItemNode extends ItemNode instanceof TypeAlias {
|
||||
override string getName() { result = TypeAlias.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
|
||||
override Visibility getVisibility() { result = TypeAlias.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class UnionItemNode extends ItemNode instanceof Union {
|
||||
override string getName() { result = Union.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
|
||||
override Visibility getVisibility() { result = Union.super.getVisibility() }
|
||||
}
|
||||
|
||||
private class UseItemNode extends ItemNode instanceof Use {
|
||||
override string getName() { result = "(use)" }
|
||||
|
||||
override Namespace getNamespace() { none() }
|
||||
|
||||
override Visibility getVisibility() { none() }
|
||||
}
|
||||
|
||||
private class BlockExprItemNode extends ItemNode instanceof BlockExpr {
|
||||
override string getName() { result = "(block expr)" }
|
||||
|
||||
override Namespace getNamespace() { none() }
|
||||
|
||||
override Visibility getVisibility() { none() }
|
||||
}
|
||||
|
||||
private class TypeParamItemNode extends ItemNode instanceof TypeParam {
|
||||
override string getName() { result = TypeParam.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
|
||||
override Visibility getVisibility() { none() }
|
||||
}
|
||||
|
||||
@@ -320,19 +398,22 @@ private predicate useTreeDeclares(UseTree tree, string name) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `item` explicitly declares a sub item named `name`. This includes
|
||||
* items declared by `use` statements, except for glob imports.
|
||||
* Holds if `item` explicitly declares a sub item named `name` in the
|
||||
* namespace `ns`. This includes items declared by `use` statements,
|
||||
* except for glob imports.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private predicate declares(ItemNode item, string name) {
|
||||
private predicate declares(ItemNode item, Namespace ns, string name) {
|
||||
exists(ItemNode child | child.getImmediateParent() = item |
|
||||
child.getName() = name
|
||||
child.getName() = name and
|
||||
child.getNamespace() = ns
|
||||
or
|
||||
useTreeDeclares(child.(Use).getUseTree(), name)
|
||||
useTreeDeclares(child.(Use).getUseTree(), name) and
|
||||
exists(ns) // `use foo::bar` can refer to both a value and a type
|
||||
)
|
||||
or
|
||||
exists(MacroCallItemNode call |
|
||||
declares(call, name) and
|
||||
declares(call, ns, name) and
|
||||
call.getImmediateParent() = item
|
||||
)
|
||||
}
|
||||
@@ -351,19 +432,20 @@ private class RelevantPath extends Path {
|
||||
|
||||
/**
|
||||
* Holds if the unqualified path `p` references an item named `name`, and `name`
|
||||
* may be looked up inside enclosing item `encl`.
|
||||
* may be looked up in the `ns` namespace inside enclosing item `encl`.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private predicate unqualifiedPathLookup(RelevantPath p, string name, ItemNode encl) {
|
||||
private predicate unqualifiedPathLookup(RelevantPath p, string name, Namespace ns, ItemNode encl) {
|
||||
exists(ItemNode encl0 |
|
||||
// lookup in the immediately enclosing item
|
||||
p.isUnqualified(name) and
|
||||
encl0.getADescendant() = p
|
||||
encl0.getADescendant() = p and
|
||||
exists(ns)
|
||||
or
|
||||
// lookup in an outer scope, but only if the item is not declared in inner scope
|
||||
exists(ItemNode mid |
|
||||
unqualifiedPathLookup(p, name, mid) and
|
||||
not declares(mid, name)
|
||||
unqualifiedPathLookup(p, name, ns, mid) and
|
||||
not declares(mid, ns, name)
|
||||
|
|
||||
// nested modules do not have unqualified access to items from outer modules,
|
||||
// except for items declared at top-level in the source file
|
||||
@@ -374,16 +456,30 @@ private predicate unqualifiedPathLookup(RelevantPath p, string name, ItemNode en
|
||||
|
|
||||
// functions in `impl` blocks need to use explicit `Self::` to access other
|
||||
// functions in the `impl` block
|
||||
if encl0 instanceof ImplOrTraitItemNode then encl = encl0.getImmediateParent() else encl = encl0
|
||||
if encl0 instanceof ImplOrTraitItemNode and ns.isValue()
|
||||
then encl = encl0.getImmediateParent()
|
||||
else encl = encl0
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the item that `path` resolves to, if any. */
|
||||
cached
|
||||
ItemNode resolvePath(RelevantPath path) {
|
||||
exists(ItemNode encl, string name |
|
||||
unqualifiedPathLookup(path, name, encl) and
|
||||
result = encl.getASuccessor(name)
|
||||
pragma[nomagic]
|
||||
private ItemNode getASuccessor(ItemNode pred, string name, Namespace ns) {
|
||||
result = pred.getASuccessor(name) and
|
||||
ns = result.getNamespace()
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode resolvePath0(RelevantPath path) {
|
||||
exists(ItemNode encl, Namespace ns, string name, ItemNode res |
|
||||
unqualifiedPathLookup(path, name, ns, encl) and
|
||||
res = getASuccessor(encl, name, ns)
|
||||
|
|
||||
if
|
||||
not any(RelevantPath parent).getQualifier() = path and
|
||||
name = "Self" and
|
||||
res instanceof ImplItemNode
|
||||
then result = res.(ImplItemNode).resolveSelfTy()
|
||||
else result = res
|
||||
)
|
||||
or
|
||||
exists(ItemNode q, string name |
|
||||
@@ -394,6 +490,47 @@ ItemNode resolvePath(RelevantPath path) {
|
||||
result = resolveUseTreeListItem(_, _, path)
|
||||
}
|
||||
|
||||
/** Holds if path `p` must be looked up in namespace `n`. */
|
||||
private predicate pathUsesNamespace(Path p, Namespace n) {
|
||||
n.isValue() and
|
||||
(
|
||||
p = any(PathExpr pe).getPath()
|
||||
or
|
||||
p = any(TupleStructPat tsp).getPath()
|
||||
)
|
||||
or
|
||||
n.isType() and
|
||||
(
|
||||
p = any(Visibility v).getPath()
|
||||
or
|
||||
p = any(RecordExpr re).getPath()
|
||||
or
|
||||
p = any(PathTypeRepr ptr).getPath()
|
||||
or
|
||||
p = any(RecordPat rp).getPath()
|
||||
or
|
||||
p =
|
||||
any(UseTree use |
|
||||
use.isGlob()
|
||||
or
|
||||
use.hasUseTreeList()
|
||||
).getPath()
|
||||
or
|
||||
p = any(Path parent).getQualifier()
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the item that `path` resolves to, if any. */
|
||||
cached
|
||||
ItemNode resolvePath(RelevantPath path) {
|
||||
result = resolvePath0(path) and
|
||||
(
|
||||
pathUsesNamespace(path, result.getNamespace())
|
||||
or
|
||||
not pathUsesNamespace(path, _)
|
||||
)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode resolvePathQualifier(RelevantPath path, string name) {
|
||||
result = resolvePath(path.getQualifier()) and
|
||||
@@ -452,14 +589,14 @@ pragma[nomagic]
|
||||
private predicate useImportEdge(Use use, string name, ItemNode item) {
|
||||
exists(UseTree tree, ItemNode used |
|
||||
used = resolveUseTreeListItem(use, tree) and
|
||||
not exists(tree.getUseTreeList()) and
|
||||
not tree.hasUseTreeList() and
|
||||
if tree.isGlob()
|
||||
then
|
||||
exists(ItemNode encl |
|
||||
exists(ItemNode encl, Namespace ns |
|
||||
encl.getADescendant() = use and
|
||||
item = used.getASuccessor(name) and
|
||||
item = getASuccessor(used, name, ns) and
|
||||
// glob imports can be shadowed
|
||||
not declares(encl, name)
|
||||
not declares(encl, ns, name)
|
||||
)
|
||||
else item = used
|
||||
|
|
||||
|
||||
24
rust/ql/lib/codeql/rust/frameworks/tokio-postgres.model.yml
Normal file
24
rust/ql/lib/codeql/rust/frameworks/tokio-postgres.model.yml
Normal file
@@ -0,0 +1,24 @@
|
||||
extensions:
|
||||
- addsTo:
|
||||
pack: codeql/rust-all
|
||||
extensible: sinkModel
|
||||
data:
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::execute", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::batch_execute", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::execute_raw", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::prepare", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::prepare_typed", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::query", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::query_opt", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::query_raw", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::query_typed", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::query_typed_raw", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::simple_query", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::client::Client>::simple_query_raw", "Argument[0]", "sql-injection", "manual"]
|
||||
|
||||
- addsTo:
|
||||
pack: codeql/rust-all
|
||||
extensible: sourceModel
|
||||
data:
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::row::Row>::get", "ReturnValue", "database", "manual"]
|
||||
- ["repo:https://github.com/sfackler/rust-postgres:tokio-postgres", "<crate::row::Row>::try_get", "ReturnValue.Variant[crate::result::Result::Ok(0)]", "database", "manual"]
|
||||
@@ -81,9 +81,8 @@ module ModelGeneratorInput implements ModelGeneratorInputSig<Location, RustDataF
|
||||
}
|
||||
|
||||
bindingset[c]
|
||||
string paramReturnNodeAsOutput(R::Callable c, ParameterPosition pos) {
|
||||
// TODO: Implement this to support returning through parameters.
|
||||
result = "paramReturnNodeAsOutput(" + c + ", " + pos + ")"
|
||||
string paramReturnNodeAsOutput(Callable c, ParameterPosition pos) {
|
||||
result = paramReturnNodeAsContentOutput(c, pos)
|
||||
}
|
||||
|
||||
bindingset[c]
|
||||
|
||||
@@ -11,7 +11,7 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) {
|
||||
}
|
||||
|
||||
query predicate controls(ConditionBasicBlock bb1, BasicBlock bb2, SuccessorType t) {
|
||||
bb1.controls(bb2, t)
|
||||
bb1.edgeDominates(bb2, t)
|
||||
}
|
||||
|
||||
query predicate successor(ConditionBasicBlock bb1, BasicBlock bb2, SuccessorType t) {
|
||||
|
||||
@@ -42,10 +42,20 @@ edges
|
||||
| main.rs:101:13:101:30 | mn.data_through(...) | main.rs:101:9:101:9 | b | provenance | |
|
||||
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | provenance | |
|
||||
| main.rs:101:29:101:29 | a | main.rs:101:13:101:30 | mn.data_through(...) | provenance | |
|
||||
<<<<<<< HEAD
|
||||
| main.rs:138:9:138:9 | a | main.rs:139:10:139:10 | a | provenance | |
|
||||
| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | a | provenance | |
|
||||
| main.rs:148:13:148:13 | c | main.rs:149:14:149:14 | c | provenance | |
|
||||
| main.rs:148:17:148:25 | source(...) | main.rs:148:13:148:13 | c | provenance | |
|
||||
=======
|
||||
| main.rs:139:25:139:30 | ...: i64 | main.rs:140:10:140:10 | c | provenance | |
|
||||
| main.rs:140:6:140:6 | [post] n [&ref] | main.rs:139:12:139:22 | ...: ... [Return] [&ref] | provenance | |
|
||||
| main.rs:140:10:140:10 | c | main.rs:140:6:140:6 | [post] n [&ref] | provenance | |
|
||||
| main.rs:148:13:148:13 | [post] m [&ref] | main.rs:149:11:149:11 | m [&ref] | provenance | |
|
||||
| main.rs:148:16:148:25 | source(...) | main.rs:139:25:139:30 | ...: i64 | provenance | |
|
||||
| main.rs:148:16:148:25 | source(...) | main.rs:148:13:148:13 | [post] m [&ref] | provenance | |
|
||||
| main.rs:149:11:149:11 | m [&ref] | main.rs:149:10:149:11 | * ... | provenance | |
|
||||
>>>>>>> main
|
||||
nodes
|
||||
| main.rs:12:28:14:1 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:13:5:13:13 | source(...) | semmle.label | source(...) |
|
||||
@@ -102,11 +112,20 @@ nodes
|
||||
| main.rs:148:13:148:13 | c | semmle.label | c |
|
||||
| main.rs:148:17:148:25 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:149:14:149:14 | c | semmle.label | c |
|
||||
| main.rs:139:12:139:22 | ...: ... [Return] [&ref] | semmle.label | ...: ... [Return] [&ref] |
|
||||
| main.rs:139:25:139:30 | ...: i64 | semmle.label | ...: i64 |
|
||||
| main.rs:140:6:140:6 | [post] n [&ref] | semmle.label | [post] n [&ref] |
|
||||
| main.rs:140:10:140:10 | c | semmle.label | c |
|
||||
| main.rs:148:13:148:13 | [post] m [&ref] | semmle.label | [post] m [&ref] |
|
||||
| main.rs:148:16:148:25 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:149:10:149:11 | * ... | semmle.label | * ... |
|
||||
| main.rs:149:11:149:11 | m [&ref] | semmle.label | m [&ref] |
|
||||
subpaths
|
||||
| main.rs:36:26:36:26 | a | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:36:13:36:27 | pass_through(...) |
|
||||
| main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:41:13:44:6 | pass_through(...) |
|
||||
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | main.rs:55:13:55:27 | pass_through(...) |
|
||||
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | main.rs:77:43:83:5 | { ... } | main.rs:101:13:101:30 | mn.data_through(...) |
|
||||
| main.rs:148:16:148:25 | source(...) | main.rs:139:25:139:30 | ...: i64 | main.rs:139:12:139:22 | ...: ... [Return] [&ref] | main.rs:148:13:148:13 | [post] m [&ref] |
|
||||
testFailures
|
||||
#select
|
||||
| main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) |
|
||||
@@ -119,3 +138,4 @@ testFailures
|
||||
| main.rs:102:10:102:10 | b | main.rs:100:13:100:21 | source(...) | main.rs:102:10:102:10 | b | $@ | main.rs:100:13:100:21 | source(...) | source(...) |
|
||||
| main.rs:139:10:139:10 | a | main.rs:138:13:138:21 | source(...) | main.rs:139:10:139:10 | a | $@ | main.rs:138:13:138:21 | source(...) | source(...) |
|
||||
| main.rs:149:14:149:14 | c | main.rs:148:17:148:25 | source(...) | main.rs:149:14:149:14 | c | $@ | main.rs:148:17:148:25 | source(...) | source(...) |
|
||||
| main.rs:149:10:149:11 | * ... | main.rs:148:16:148:25 | source(...) | main.rs:149:10:149:11 | * ... | $@ | main.rs:148:16:148:25 | source(...) | source(...) |
|
||||
|
||||
@@ -157,6 +157,27 @@ fn test_async_await() {
|
||||
sink(a); // $ MISSING: hasValueFlow=1
|
||||
|
||||
futures::executor::block_on(test_async_await_async_part());
|
||||
// Flow out of mutable parameters.
|
||||
|
||||
fn set_int(n: &mut i64, c: i64) {
|
||||
*n = c;
|
||||
}
|
||||
|
||||
fn mutates_argument_1() {
|
||||
// Passing an already borrowed value to a function and then reading from the same borrow.
|
||||
let mut n = 0;
|
||||
let m = &mut n;
|
||||
sink(*m);
|
||||
set_int(m, source(37));
|
||||
sink(*m); // $ hasValueFlow=37
|
||||
}
|
||||
|
||||
fn mutates_argument_2() {
|
||||
// Borrowing at the call and then reading from the unborrowed variable.
|
||||
let mut n = 0;
|
||||
sink(n);
|
||||
set_int(&mut n, source(88));
|
||||
sink(n); // $ MISSING: hasValueFlow=88
|
||||
}
|
||||
|
||||
fn main() {
|
||||
@@ -171,4 +192,6 @@ fn main() {
|
||||
|
||||
test_operator_overloading();
|
||||
test_async_await();
|
||||
mutates_argument_1();
|
||||
mutates_argument_2();
|
||||
}
|
||||
|
||||
@@ -48,3 +48,21 @@
|
||||
| main.rs:170:5:170:25 | data_through_method(...) | main.rs:98:1:103:1 | fn data_through_method |
|
||||
| main.rs:172:5:172:31 | test_operator_overloading(...) | main.rs:120:1:135:1 | fn test_operator_overloading |
|
||||
| main.rs:173:5:173:22 | test_async_await(...) | main.rs:155:1:160:1 | fn test_async_await |
|
||||
| main.rs:147:5:147:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:148:5:148:26 | set_int(...) | main.rs:139:1:141:1 | fn set_int |
|
||||
| main.rs:148:16:148:25 | source(...) | main.rs:1:1:3:1 | fn source |
|
||||
| main.rs:149:5:149:12 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:155:5:155:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:156:5:156:31 | set_int(...) | main.rs:139:1:141:1 | fn set_int |
|
||||
| main.rs:156:21:156:30 | source(...) | main.rs:1:1:3:1 | fn source |
|
||||
| main.rs:157:5:157:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:161:5:161:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
|
||||
| main.rs:162:5:162:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
|
||||
| main.rs:163:5:163:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
|
||||
| main.rs:164:5:164:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
|
||||
| main.rs:166:5:166:24 | data_out_of_method(...) | main.rs:86:1:90:1 | fn data_out_of_method |
|
||||
| main.rs:167:5:167:28 | data_in_to_method_call(...) | main.rs:92:1:96:1 | fn data_in_to_method_call |
|
||||
| main.rs:168:5:168:25 | data_through_method(...) | main.rs:98:1:103:1 | fn data_through_method |
|
||||
| main.rs:170:5:170:31 | test_operator_overloading(...) | main.rs:120:1:135:1 | fn test_operator_overloading |
|
||||
| main.rs:171:5:171:24 | mutates_argument_1(...) | main.rs:143:1:150:1 | fn mutates_argument_1 |
|
||||
| main.rs:172:5:172:24 | mutates_argument_2(...) | main.rs:152:1:158:1 | fn mutates_argument_2 |
|
||||
|
||||
@@ -203,6 +203,17 @@ fn test_apply_flow_through() {
|
||||
sink(t); // $ hasValueFlow=33
|
||||
}
|
||||
|
||||
// has a flow model with value flow from argument to returned future
|
||||
async fn get_async_number(a: i64) -> i64 {
|
||||
37
|
||||
}
|
||||
|
||||
async fn test_get_async_number() {
|
||||
let s = source(46);
|
||||
let t = get_async_number(s).await;
|
||||
sink(t); // $ hasValueFlow=46
|
||||
}
|
||||
|
||||
impl MyFieldEnum {
|
||||
// has a source model
|
||||
fn source(&self, i: i64) -> MyFieldEnum {
|
||||
@@ -268,7 +279,8 @@ fn test_simple_sink() {
|
||||
simple_sink(s); // $ hasValueFlow=17
|
||||
}
|
||||
|
||||
fn main() {
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
test_identify();
|
||||
test_get_var_pos();
|
||||
test_set_var_pos();
|
||||
@@ -286,5 +298,6 @@ fn main() {
|
||||
test_enum_method_sink();
|
||||
test_simple_source();
|
||||
test_simple_sink();
|
||||
test_get_async_number().await;
|
||||
let dummy = Some(0); // ensure that the the `lang:core` crate is extracted
|
||||
}
|
||||
|
||||
@@ -9,14 +9,15 @@ models
|
||||
| 8 | Summary: repo::test; crate::apply; Argument[1].ReturnValue; ReturnValue; value |
|
||||
| 9 | Summary: repo::test; crate::coerce; Argument[0]; ReturnValue; taint |
|
||||
| 10 | Summary: repo::test; crate::get_array_element; Argument[0].Element; ReturnValue; value |
|
||||
| 11 | Summary: repo::test; crate::get_struct_field; Argument[0].Struct[crate::MyStruct::field1]; ReturnValue; value |
|
||||
| 12 | Summary: repo::test; crate::get_tuple_element; Argument[0].Tuple[0]; ReturnValue; value |
|
||||
| 13 | Summary: repo::test; crate::get_var_field; Argument[0].Variant[crate::MyFieldEnum::C::field_c]; ReturnValue; value |
|
||||
| 14 | Summary: repo::test; crate::get_var_pos; Argument[0].Variant[crate::MyPosEnum::A(0)]; ReturnValue; value |
|
||||
| 15 | Summary: repo::test; crate::set_array_element; Argument[0]; ReturnValue.Element; value |
|
||||
| 16 | Summary: repo::test; crate::set_tuple_element; Argument[0]; ReturnValue.Tuple[1]; value |
|
||||
| 17 | Summary: repo::test; crate::set_var_field; Argument[0]; ReturnValue.Variant[crate::MyFieldEnum::D::field_d]; value |
|
||||
| 18 | Summary: repo::test; crate::set_var_pos; Argument[0]; ReturnValue.Variant[crate::MyPosEnum::B(0)]; value |
|
||||
| 11 | Summary: repo::test; crate::get_async_number; Argument[0]; ReturnValue.Future; value |
|
||||
| 12 | Summary: repo::test; crate::get_struct_field; Argument[0].Struct[crate::MyStruct::field1]; ReturnValue; value |
|
||||
| 13 | Summary: repo::test; crate::get_tuple_element; Argument[0].Tuple[0]; ReturnValue; value |
|
||||
| 14 | Summary: repo::test; crate::get_var_field; Argument[0].Variant[crate::MyFieldEnum::C::field_c]; ReturnValue; value |
|
||||
| 15 | Summary: repo::test; crate::get_var_pos; Argument[0].Variant[crate::MyPosEnum::A(0)]; ReturnValue; value |
|
||||
| 16 | Summary: repo::test; crate::set_array_element; Argument[0]; ReturnValue.Element; value |
|
||||
| 17 | Summary: repo::test; crate::set_tuple_element; Argument[0]; ReturnValue.Tuple[1]; value |
|
||||
| 18 | Summary: repo::test; crate::set_var_field; Argument[0]; ReturnValue.Variant[crate::MyFieldEnum::D::field_d]; value |
|
||||
| 19 | Summary: repo::test; crate::set_var_pos; Argument[0]; ReturnValue.Variant[crate::MyPosEnum::B(0)]; value |
|
||||
edges
|
||||
| main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | |
|
||||
| main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | |
|
||||
@@ -37,8 +38,8 @@ edges
|
||||
| main.rs:41:14:41:28 | ...::A(...) [A] | main.rs:41:9:41:10 | e1 [A] | provenance | |
|
||||
| main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | |
|
||||
| main.rs:41:27:41:27 | s | main.rs:41:14:41:28 | ...::A(...) [A] | provenance | |
|
||||
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:14 |
|
||||
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:14 |
|
||||
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:15 |
|
||||
| main.rs:42:22:42:23 | e1 [A] | main.rs:42:10:42:24 | get_var_pos(...) | provenance | MaD:15 |
|
||||
| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | |
|
||||
| main.rs:53:9:53:9 | s | main.rs:54:26:54:26 | s | provenance | |
|
||||
| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | s | provenance | |
|
||||
@@ -47,8 +48,8 @@ edges
|
||||
| main.rs:54:9:54:10 | e1 [B] | main.rs:55:11:55:12 | e1 [B] | provenance | |
|
||||
| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | |
|
||||
| main.rs:54:14:54:27 | set_var_pos(...) [B] | main.rs:54:9:54:10 | e1 [B] | provenance | |
|
||||
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:18 |
|
||||
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:18 |
|
||||
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:19 |
|
||||
| main.rs:54:26:54:26 | s | main.rs:54:14:54:27 | set_var_pos(...) [B] | provenance | MaD:19 |
|
||||
| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
|
||||
| main.rs:55:11:55:12 | e1 [B] | main.rs:57:9:57:23 | ...::B(...) [B] | provenance | |
|
||||
| main.rs:57:9:57:23 | ...::B(...) [B] | main.rs:57:22:57:22 | i | provenance | |
|
||||
@@ -65,8 +66,8 @@ edges
|
||||
| main.rs:73:14:73:42 | ...::C {...} [C] | main.rs:73:9:73:10 | e1 [C] | provenance | |
|
||||
| main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:73:40:73:40 | s | main.rs:73:14:73:42 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:13 |
|
||||
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:13 |
|
||||
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:14 |
|
||||
| main.rs:74:24:74:25 | e1 [C] | main.rs:74:10:74:26 | get_var_field(...) | provenance | MaD:14 |
|
||||
| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | |
|
||||
| main.rs:85:9:85:9 | s | main.rs:86:28:86:28 | s | provenance | |
|
||||
| main.rs:85:13:85:21 | source(...) | main.rs:85:9:85:9 | s | provenance | |
|
||||
@@ -75,8 +76,8 @@ edges
|
||||
| main.rs:86:9:86:10 | e1 [D] | main.rs:87:11:87:12 | e1 [D] | provenance | |
|
||||
| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | |
|
||||
| main.rs:86:14:86:29 | set_var_field(...) [D] | main.rs:86:9:86:10 | e1 [D] | provenance | |
|
||||
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:17 |
|
||||
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:17 |
|
||||
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:18 |
|
||||
| main.rs:86:28:86:28 | s | main.rs:86:14:86:29 | set_var_field(...) [D] | provenance | MaD:18 |
|
||||
| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:87:11:87:12 | e1 [D] | main.rs:89:9:89:37 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:89:9:89:37 | ...::D {...} [D] | main.rs:89:35:89:35 | i | provenance | |
|
||||
@@ -93,8 +94,8 @@ edges
|
||||
| main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | main.rs:105:9:105:17 | my_struct [MyStruct.field1] | provenance | |
|
||||
| main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | |
|
||||
| main.rs:106:17:106:17 | s | main.rs:105:21:108:5 | MyStruct {...} [MyStruct.field1] | provenance | |
|
||||
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:11 |
|
||||
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:11 |
|
||||
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:12 |
|
||||
| main.rs:109:27:109:35 | my_struct [MyStruct.field1] | main.rs:109:10:109:36 | get_struct_field(...) | provenance | MaD:12 |
|
||||
| main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | |
|
||||
| main.rs:138:9:138:9 | s | main.rs:139:29:139:29 | s | provenance | |
|
||||
| main.rs:138:13:138:21 | source(...) | main.rs:138:9:138:9 | s | provenance | |
|
||||
@@ -111,8 +112,8 @@ edges
|
||||
| main.rs:149:9:149:11 | arr [element] | main.rs:150:10:150:12 | arr [element] | provenance | |
|
||||
| main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | |
|
||||
| main.rs:149:15:149:34 | set_array_element(...) [element] | main.rs:149:9:149:11 | arr [element] | provenance | |
|
||||
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:15 |
|
||||
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:15 |
|
||||
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:16 |
|
||||
| main.rs:149:33:149:33 | s | main.rs:149:15:149:34 | set_array_element(...) [element] | provenance | MaD:16 |
|
||||
| main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | |
|
||||
| main.rs:150:10:150:12 | arr [element] | main.rs:150:10:150:15 | arr[0] | provenance | |
|
||||
| main.rs:159:9:159:9 | s | main.rs:160:14:160:14 | s | provenance | |
|
||||
@@ -125,8 +126,8 @@ edges
|
||||
| main.rs:160:13:160:18 | TupleExpr [tuple.0] | main.rs:160:9:160:9 | t [tuple.0] | provenance | |
|
||||
| main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | |
|
||||
| main.rs:160:14:160:14 | s | main.rs:160:13:160:18 | TupleExpr [tuple.0] | provenance | |
|
||||
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:12 |
|
||||
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:12 |
|
||||
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:13 |
|
||||
| main.rs:161:28:161:28 | t [tuple.0] | main.rs:161:10:161:29 | get_tuple_element(...) | provenance | MaD:13 |
|
||||
| main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | |
|
||||
| main.rs:172:9:172:9 | s | main.rs:173:31:173:31 | s | provenance | |
|
||||
| main.rs:172:13:172:22 | source(...) | main.rs:172:9:172:9 | s | provenance | |
|
||||
@@ -135,8 +136,8 @@ edges
|
||||
| main.rs:173:9:173:9 | t [tuple.1] | main.rs:175:10:175:10 | t [tuple.1] | provenance | |
|
||||
| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | |
|
||||
| main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | main.rs:173:9:173:9 | t [tuple.1] | provenance | |
|
||||
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:16 |
|
||||
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:16 |
|
||||
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:17 |
|
||||
| main.rs:173:31:173:31 | s | main.rs:173:13:173:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:17 |
|
||||
| main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | |
|
||||
| main.rs:175:10:175:10 | t [tuple.1] | main.rs:175:10:175:12 | t.1 | provenance | |
|
||||
| main.rs:184:9:184:9 | s | main.rs:189:11:189:11 | s | provenance | |
|
||||
@@ -177,62 +178,74 @@ edges
|
||||
| main.rs:202:19:202:19 | s | main.rs:201:14:201:14 | ... | provenance | MaD:7 |
|
||||
| main.rs:202:19:202:19 | s | main.rs:202:13:202:23 | apply(...) | provenance | MaD:7 |
|
||||
| main.rs:202:19:202:19 | s | main.rs:202:13:202:23 | apply(...) | provenance | MaD:7 |
|
||||
| main.rs:222:9:222:9 | s [D] | main.rs:223:11:223:11 | s [D] | provenance | |
|
||||
| main.rs:222:9:222:9 | s [D] | main.rs:223:11:223:11 | s [D] | provenance | |
|
||||
| main.rs:222:13:222:23 | enum_source | main.rs:222:13:222:27 | enum_source(...) [D] | provenance | Src:MaD:5 |
|
||||
| main.rs:222:13:222:23 | enum_source | main.rs:222:13:222:27 | enum_source(...) [D] | provenance | Src:MaD:5 |
|
||||
| main.rs:222:13:222:27 | enum_source(...) [D] | main.rs:222:9:222:9 | s [D] | provenance | |
|
||||
| main.rs:222:13:222:27 | enum_source(...) [D] | main.rs:222:9:222:9 | s [D] | provenance | |
|
||||
| main.rs:223:11:223:11 | s [D] | main.rs:225:9:225:37 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:223:11:223:11 | s [D] | main.rs:225:9:225:37 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:225:9:225:37 | ...::D {...} [D] | main.rs:225:35:225:35 | i | provenance | |
|
||||
| main.rs:225:9:225:37 | ...::D {...} [D] | main.rs:225:35:225:35 | i | provenance | |
|
||||
| main.rs:225:35:225:35 | i | main.rs:225:47:225:47 | i | provenance | |
|
||||
| main.rs:225:35:225:35 | i | main.rs:225:47:225:47 | i | provenance | |
|
||||
| main.rs:231:9:231:9 | s [C] | main.rs:232:11:232:11 | s [C] | provenance | |
|
||||
| main.rs:231:9:231:9 | s [C] | main.rs:232:11:232:11 | s [C] | provenance | |
|
||||
| main.rs:231:13:231:24 | e.source(...) [C] | main.rs:231:9:231:9 | s [C] | provenance | |
|
||||
| main.rs:231:13:231:24 | e.source(...) [C] | main.rs:231:9:231:9 | s [C] | provenance | |
|
||||
| main.rs:231:15:231:20 | source | main.rs:231:13:231:24 | e.source(...) [C] | provenance | Src:MaD:4 |
|
||||
| main.rs:231:15:231:20 | source | main.rs:231:13:231:24 | e.source(...) [C] | provenance | Src:MaD:4 |
|
||||
| main.rs:232:11:232:11 | s [C] | main.rs:233:9:233:37 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:232:11:232:11 | s [C] | main.rs:233:9:233:37 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:233:9:233:37 | ...::C {...} [C] | main.rs:233:35:233:35 | i | provenance | |
|
||||
| main.rs:233:9:233:37 | ...::C {...} [C] | main.rs:233:35:233:35 | i | provenance | |
|
||||
| main.rs:233:35:233:35 | i | main.rs:233:47:233:47 | i | provenance | |
|
||||
| main.rs:233:35:233:35 | i | main.rs:233:47:233:47 | i | provenance | |
|
||||
| main.rs:242:9:242:9 | s | main.rs:243:41:243:41 | s | provenance | |
|
||||
| main.rs:242:9:242:9 | s | main.rs:243:41:243:41 | s | provenance | |
|
||||
| main.rs:242:13:242:22 | source(...) | main.rs:242:9:242:9 | s | provenance | |
|
||||
| main.rs:242:13:242:22 | source(...) | main.rs:242:9:242:9 | s | provenance | |
|
||||
| main.rs:243:15:243:43 | ...::C {...} [C] | main.rs:243:5:243:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 |
|
||||
| main.rs:243:15:243:43 | ...::C {...} [C] | main.rs:243:5:243:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 |
|
||||
| main.rs:243:41:243:41 | s | main.rs:243:15:243:43 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:243:41:243:41 | s | main.rs:243:15:243:43 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:248:9:248:9 | s | main.rs:249:39:249:39 | s | provenance | |
|
||||
| main.rs:248:9:248:9 | s | main.rs:249:39:249:39 | s | provenance | |
|
||||
| main.rs:248:13:248:22 | source(...) | main.rs:248:9:248:9 | s | provenance | |
|
||||
| main.rs:248:13:248:22 | source(...) | main.rs:248:9:248:9 | s | provenance | |
|
||||
| main.rs:249:9:249:9 | e [D] | main.rs:250:5:250:5 | e [D] | provenance | |
|
||||
| main.rs:249:9:249:9 | e [D] | main.rs:250:5:250:5 | e [D] | provenance | |
|
||||
| main.rs:249:13:249:41 | ...::D {...} [D] | main.rs:249:9:249:9 | e [D] | provenance | |
|
||||
| main.rs:249:13:249:41 | ...::D {...} [D] | main.rs:249:9:249:9 | e [D] | provenance | |
|
||||
| main.rs:249:39:249:39 | s | main.rs:249:13:249:41 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:249:39:249:39 | s | main.rs:249:13:249:41 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:250:5:250:5 | e [D] | main.rs:250:7:250:10 | sink | provenance | MaD:1 Sink:MaD:1 |
|
||||
| main.rs:250:5:250:5 | e [D] | main.rs:250:7:250:10 | sink | provenance | MaD:1 Sink:MaD:1 |
|
||||
| main.rs:259:9:259:9 | s | main.rs:260:10:260:10 | s | provenance | |
|
||||
| main.rs:259:9:259:9 | s | main.rs:260:10:260:10 | s | provenance | |
|
||||
| main.rs:259:13:259:25 | simple_source | main.rs:259:13:259:29 | simple_source(...) | provenance | Src:MaD:6 MaD:6 |
|
||||
| main.rs:259:13:259:25 | simple_source | main.rs:259:13:259:29 | simple_source(...) | provenance | Src:MaD:6 MaD:6 |
|
||||
| main.rs:259:13:259:29 | simple_source(...) | main.rs:259:9:259:9 | s | provenance | |
|
||||
| main.rs:259:13:259:29 | simple_source(...) | main.rs:259:9:259:9 | s | provenance | |
|
||||
| main.rs:267:9:267:9 | s | main.rs:268:17:268:17 | s | provenance | |
|
||||
| main.rs:267:9:267:9 | s | main.rs:268:17:268:17 | s | provenance | |
|
||||
| main.rs:267:13:267:22 | source(...) | main.rs:267:9:267:9 | s | provenance | |
|
||||
| main.rs:267:13:267:22 | source(...) | main.rs:267:9:267:9 | s | provenance | |
|
||||
| main.rs:268:17:268:17 | s | main.rs:268:5:268:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 |
|
||||
| main.rs:268:17:268:17 | s | main.rs:268:5:268:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 |
|
||||
| main.rs:212:9:212:9 | s | main.rs:213:30:213:30 | s | provenance | |
|
||||
| main.rs:212:9:212:9 | s | main.rs:213:30:213:30 | s | provenance | |
|
||||
| main.rs:212:13:212:22 | source(...) | main.rs:212:9:212:9 | s | provenance | |
|
||||
| main.rs:212:13:212:22 | source(...) | main.rs:212:9:212:9 | s | provenance | |
|
||||
| main.rs:213:9:213:9 | t | main.rs:214:10:214:10 | t | provenance | |
|
||||
| main.rs:213:9:213:9 | t | main.rs:214:10:214:10 | t | provenance | |
|
||||
| main.rs:213:13:213:31 | get_async_number(...) [future] | main.rs:213:13:213:37 | await ... | provenance | |
|
||||
| main.rs:213:13:213:31 | get_async_number(...) [future] | main.rs:213:13:213:37 | await ... | provenance | |
|
||||
| main.rs:213:13:213:37 | await ... | main.rs:213:9:213:9 | t | provenance | |
|
||||
| main.rs:213:13:213:37 | await ... | main.rs:213:9:213:9 | t | provenance | |
|
||||
| main.rs:213:30:213:30 | s | main.rs:213:13:213:31 | get_async_number(...) [future] | provenance | MaD:11 |
|
||||
| main.rs:213:30:213:30 | s | main.rs:213:13:213:31 | get_async_number(...) [future] | provenance | MaD:11 |
|
||||
| main.rs:233:9:233:9 | s [D] | main.rs:234:11:234:11 | s [D] | provenance | |
|
||||
| main.rs:233:9:233:9 | s [D] | main.rs:234:11:234:11 | s [D] | provenance | |
|
||||
| main.rs:233:13:233:23 | enum_source | main.rs:233:13:233:27 | enum_source(...) [D] | provenance | Src:MaD:5 |
|
||||
| main.rs:233:13:233:23 | enum_source | main.rs:233:13:233:27 | enum_source(...) [D] | provenance | Src:MaD:5 |
|
||||
| main.rs:233:13:233:27 | enum_source(...) [D] | main.rs:233:9:233:9 | s [D] | provenance | |
|
||||
| main.rs:233:13:233:27 | enum_source(...) [D] | main.rs:233:9:233:9 | s [D] | provenance | |
|
||||
| main.rs:234:11:234:11 | s [D] | main.rs:236:9:236:37 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:234:11:234:11 | s [D] | main.rs:236:9:236:37 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:236:9:236:37 | ...::D {...} [D] | main.rs:236:35:236:35 | i | provenance | |
|
||||
| main.rs:236:9:236:37 | ...::D {...} [D] | main.rs:236:35:236:35 | i | provenance | |
|
||||
| main.rs:236:35:236:35 | i | main.rs:236:47:236:47 | i | provenance | |
|
||||
| main.rs:236:35:236:35 | i | main.rs:236:47:236:47 | i | provenance | |
|
||||
| main.rs:242:9:242:9 | s [C] | main.rs:243:11:243:11 | s [C] | provenance | |
|
||||
| main.rs:242:9:242:9 | s [C] | main.rs:243:11:243:11 | s [C] | provenance | |
|
||||
| main.rs:242:13:242:24 | e.source(...) [C] | main.rs:242:9:242:9 | s [C] | provenance | |
|
||||
| main.rs:242:13:242:24 | e.source(...) [C] | main.rs:242:9:242:9 | s [C] | provenance | |
|
||||
| main.rs:242:15:242:20 | source | main.rs:242:13:242:24 | e.source(...) [C] | provenance | Src:MaD:4 |
|
||||
| main.rs:242:15:242:20 | source | main.rs:242:13:242:24 | e.source(...) [C] | provenance | Src:MaD:4 |
|
||||
| main.rs:243:11:243:11 | s [C] | main.rs:244:9:244:37 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:243:11:243:11 | s [C] | main.rs:244:9:244:37 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:244:9:244:37 | ...::C {...} [C] | main.rs:244:35:244:35 | i | provenance | |
|
||||
| main.rs:244:9:244:37 | ...::C {...} [C] | main.rs:244:35:244:35 | i | provenance | |
|
||||
| main.rs:244:35:244:35 | i | main.rs:244:47:244:47 | i | provenance | |
|
||||
| main.rs:244:35:244:35 | i | main.rs:244:47:244:47 | i | provenance | |
|
||||
| main.rs:253:9:253:9 | s | main.rs:254:41:254:41 | s | provenance | |
|
||||
| main.rs:253:9:253:9 | s | main.rs:254:41:254:41 | s | provenance | |
|
||||
| main.rs:253:13:253:22 | source(...) | main.rs:253:9:253:9 | s | provenance | |
|
||||
| main.rs:253:13:253:22 | source(...) | main.rs:253:9:253:9 | s | provenance | |
|
||||
| main.rs:254:15:254:43 | ...::C {...} [C] | main.rs:254:5:254:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 |
|
||||
| main.rs:254:15:254:43 | ...::C {...} [C] | main.rs:254:5:254:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 |
|
||||
| main.rs:254:41:254:41 | s | main.rs:254:15:254:43 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:254:41:254:41 | s | main.rs:254:15:254:43 | ...::C {...} [C] | provenance | |
|
||||
| main.rs:259:9:259:9 | s | main.rs:260:39:260:39 | s | provenance | |
|
||||
| main.rs:259:9:259:9 | s | main.rs:260:39:260:39 | s | provenance | |
|
||||
| main.rs:259:13:259:22 | source(...) | main.rs:259:9:259:9 | s | provenance | |
|
||||
| main.rs:259:13:259:22 | source(...) | main.rs:259:9:259:9 | s | provenance | |
|
||||
| main.rs:260:9:260:9 | e [D] | main.rs:261:5:261:5 | e [D] | provenance | |
|
||||
| main.rs:260:9:260:9 | e [D] | main.rs:261:5:261:5 | e [D] | provenance | |
|
||||
| main.rs:260:13:260:41 | ...::D {...} [D] | main.rs:260:9:260:9 | e [D] | provenance | |
|
||||
| main.rs:260:13:260:41 | ...::D {...} [D] | main.rs:260:9:260:9 | e [D] | provenance | |
|
||||
| main.rs:260:39:260:39 | s | main.rs:260:13:260:41 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:260:39:260:39 | s | main.rs:260:13:260:41 | ...::D {...} [D] | provenance | |
|
||||
| main.rs:261:5:261:5 | e [D] | main.rs:261:7:261:10 | sink | provenance | MaD:1 Sink:MaD:1 |
|
||||
| main.rs:261:5:261:5 | e [D] | main.rs:261:7:261:10 | sink | provenance | MaD:1 Sink:MaD:1 |
|
||||
| main.rs:270:9:270:9 | s | main.rs:271:10:271:10 | s | provenance | |
|
||||
| main.rs:270:9:270:9 | s | main.rs:271:10:271:10 | s | provenance | |
|
||||
| main.rs:270:13:270:25 | simple_source | main.rs:270:13:270:29 | simple_source(...) | provenance | Src:MaD:6 MaD:6 |
|
||||
| main.rs:270:13:270:25 | simple_source | main.rs:270:13:270:29 | simple_source(...) | provenance | Src:MaD:6 MaD:6 |
|
||||
| main.rs:270:13:270:29 | simple_source(...) | main.rs:270:9:270:9 | s | provenance | |
|
||||
| main.rs:270:13:270:29 | simple_source(...) | main.rs:270:9:270:9 | s | provenance | |
|
||||
| main.rs:278:9:278:9 | s | main.rs:279:17:279:17 | s | provenance | |
|
||||
| main.rs:278:9:278:9 | s | main.rs:279:17:279:17 | s | provenance | |
|
||||
| main.rs:278:13:278:22 | source(...) | main.rs:278:9:278:9 | s | provenance | |
|
||||
| main.rs:278:13:278:22 | source(...) | main.rs:278:9:278:9 | s | provenance | |
|
||||
| main.rs:279:17:279:17 | s | main.rs:279:5:279:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 |
|
||||
| main.rs:279:17:279:17 | s | main.rs:279:5:279:15 | simple_sink | provenance | MaD:3 Sink:MaD:3 |
|
||||
nodes
|
||||
| main.rs:15:9:15:9 | s | semmle.label | s |
|
||||
| main.rs:15:9:15:9 | s | semmle.label | s |
|
||||
@@ -416,74 +429,88 @@ nodes
|
||||
| main.rs:202:19:202:19 | s | semmle.label | s |
|
||||
| main.rs:203:10:203:10 | t | semmle.label | t |
|
||||
| main.rs:203:10:203:10 | t | semmle.label | t |
|
||||
| main.rs:222:9:222:9 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:222:9:222:9 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:222:13:222:23 | enum_source | semmle.label | enum_source |
|
||||
| main.rs:222:13:222:23 | enum_source | semmle.label | enum_source |
|
||||
| main.rs:222:13:222:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] |
|
||||
| main.rs:222:13:222:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] |
|
||||
| main.rs:223:11:223:11 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:223:11:223:11 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:225:9:225:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:225:9:225:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:225:35:225:35 | i | semmle.label | i |
|
||||
| main.rs:225:35:225:35 | i | semmle.label | i |
|
||||
| main.rs:225:47:225:47 | i | semmle.label | i |
|
||||
| main.rs:225:47:225:47 | i | semmle.label | i |
|
||||
| main.rs:231:9:231:9 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:231:9:231:9 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:231:13:231:24 | e.source(...) [C] | semmle.label | e.source(...) [C] |
|
||||
| main.rs:231:13:231:24 | e.source(...) [C] | semmle.label | e.source(...) [C] |
|
||||
| main.rs:231:15:231:20 | source | semmle.label | source |
|
||||
| main.rs:231:15:231:20 | source | semmle.label | source |
|
||||
| main.rs:232:11:232:11 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:232:11:232:11 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:233:9:233:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:233:9:233:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:233:35:233:35 | i | semmle.label | i |
|
||||
| main.rs:233:35:233:35 | i | semmle.label | i |
|
||||
| main.rs:233:47:233:47 | i | semmle.label | i |
|
||||
| main.rs:233:47:233:47 | i | semmle.label | i |
|
||||
| main.rs:242:9:242:9 | s | semmle.label | s |
|
||||
| main.rs:242:9:242:9 | s | semmle.label | s |
|
||||
| main.rs:242:13:242:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:242:13:242:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:243:5:243:13 | enum_sink | semmle.label | enum_sink |
|
||||
| main.rs:243:5:243:13 | enum_sink | semmle.label | enum_sink |
|
||||
| main.rs:243:15:243:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:243:15:243:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:243:41:243:41 | s | semmle.label | s |
|
||||
| main.rs:243:41:243:41 | s | semmle.label | s |
|
||||
| main.rs:248:9:248:9 | s | semmle.label | s |
|
||||
| main.rs:248:9:248:9 | s | semmle.label | s |
|
||||
| main.rs:248:13:248:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:248:13:248:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:249:9:249:9 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:249:9:249:9 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:249:13:249:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:249:13:249:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:249:39:249:39 | s | semmle.label | s |
|
||||
| main.rs:249:39:249:39 | s | semmle.label | s |
|
||||
| main.rs:250:5:250:5 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:250:5:250:5 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:250:7:250:10 | sink | semmle.label | sink |
|
||||
| main.rs:250:7:250:10 | sink | semmle.label | sink |
|
||||
| main.rs:212:9:212:9 | s | semmle.label | s |
|
||||
| main.rs:212:9:212:9 | s | semmle.label | s |
|
||||
| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:213:9:213:9 | t | semmle.label | t |
|
||||
| main.rs:213:9:213:9 | t | semmle.label | t |
|
||||
| main.rs:213:13:213:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] |
|
||||
| main.rs:213:13:213:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] |
|
||||
| main.rs:213:13:213:37 | await ... | semmle.label | await ... |
|
||||
| main.rs:213:13:213:37 | await ... | semmle.label | await ... |
|
||||
| main.rs:213:30:213:30 | s | semmle.label | s |
|
||||
| main.rs:213:30:213:30 | s | semmle.label | s |
|
||||
| main.rs:214:10:214:10 | t | semmle.label | t |
|
||||
| main.rs:214:10:214:10 | t | semmle.label | t |
|
||||
| main.rs:233:9:233:9 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:233:9:233:9 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:233:13:233:23 | enum_source | semmle.label | enum_source |
|
||||
| main.rs:233:13:233:23 | enum_source | semmle.label | enum_source |
|
||||
| main.rs:233:13:233:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] |
|
||||
| main.rs:233:13:233:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] |
|
||||
| main.rs:234:11:234:11 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:234:11:234:11 | s [D] | semmle.label | s [D] |
|
||||
| main.rs:236:9:236:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:236:9:236:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:236:35:236:35 | i | semmle.label | i |
|
||||
| main.rs:236:35:236:35 | i | semmle.label | i |
|
||||
| main.rs:236:47:236:47 | i | semmle.label | i |
|
||||
| main.rs:236:47:236:47 | i | semmle.label | i |
|
||||
| main.rs:242:9:242:9 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:242:9:242:9 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:242:13:242:24 | e.source(...) [C] | semmle.label | e.source(...) [C] |
|
||||
| main.rs:242:13:242:24 | e.source(...) [C] | semmle.label | e.source(...) [C] |
|
||||
| main.rs:242:15:242:20 | source | semmle.label | source |
|
||||
| main.rs:242:15:242:20 | source | semmle.label | source |
|
||||
| main.rs:243:11:243:11 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:243:11:243:11 | s [C] | semmle.label | s [C] |
|
||||
| main.rs:244:9:244:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:244:9:244:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:244:35:244:35 | i | semmle.label | i |
|
||||
| main.rs:244:35:244:35 | i | semmle.label | i |
|
||||
| main.rs:244:47:244:47 | i | semmle.label | i |
|
||||
| main.rs:244:47:244:47 | i | semmle.label | i |
|
||||
| main.rs:253:9:253:9 | s | semmle.label | s |
|
||||
| main.rs:253:9:253:9 | s | semmle.label | s |
|
||||
| main.rs:253:13:253:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:253:13:253:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:254:5:254:13 | enum_sink | semmle.label | enum_sink |
|
||||
| main.rs:254:5:254:13 | enum_sink | semmle.label | enum_sink |
|
||||
| main.rs:254:15:254:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:254:15:254:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] |
|
||||
| main.rs:254:41:254:41 | s | semmle.label | s |
|
||||
| main.rs:254:41:254:41 | s | semmle.label | s |
|
||||
| main.rs:259:9:259:9 | s | semmle.label | s |
|
||||
| main.rs:259:9:259:9 | s | semmle.label | s |
|
||||
| main.rs:259:13:259:25 | simple_source | semmle.label | simple_source |
|
||||
| main.rs:259:13:259:25 | simple_source | semmle.label | simple_source |
|
||||
| main.rs:259:13:259:29 | simple_source(...) | semmle.label | simple_source(...) |
|
||||
| main.rs:259:13:259:29 | simple_source(...) | semmle.label | simple_source(...) |
|
||||
| main.rs:260:10:260:10 | s | semmle.label | s |
|
||||
| main.rs:260:10:260:10 | s | semmle.label | s |
|
||||
| main.rs:267:9:267:9 | s | semmle.label | s |
|
||||
| main.rs:267:9:267:9 | s | semmle.label | s |
|
||||
| main.rs:267:13:267:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:267:13:267:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:268:5:268:15 | simple_sink | semmle.label | simple_sink |
|
||||
| main.rs:268:5:268:15 | simple_sink | semmle.label | simple_sink |
|
||||
| main.rs:268:17:268:17 | s | semmle.label | s |
|
||||
| main.rs:268:17:268:17 | s | semmle.label | s |
|
||||
| main.rs:259:13:259:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:259:13:259:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:260:9:260:9 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:260:9:260:9 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:260:13:260:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:260:13:260:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] |
|
||||
| main.rs:260:39:260:39 | s | semmle.label | s |
|
||||
| main.rs:260:39:260:39 | s | semmle.label | s |
|
||||
| main.rs:261:5:261:5 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:261:5:261:5 | e [D] | semmle.label | e [D] |
|
||||
| main.rs:261:7:261:10 | sink | semmle.label | sink |
|
||||
| main.rs:261:7:261:10 | sink | semmle.label | sink |
|
||||
| main.rs:270:9:270:9 | s | semmle.label | s |
|
||||
| main.rs:270:9:270:9 | s | semmle.label | s |
|
||||
| main.rs:270:13:270:25 | simple_source | semmle.label | simple_source |
|
||||
| main.rs:270:13:270:25 | simple_source | semmle.label | simple_source |
|
||||
| main.rs:270:13:270:29 | simple_source(...) | semmle.label | simple_source(...) |
|
||||
| main.rs:270:13:270:29 | simple_source(...) | semmle.label | simple_source(...) |
|
||||
| main.rs:271:10:271:10 | s | semmle.label | s |
|
||||
| main.rs:271:10:271:10 | s | semmle.label | s |
|
||||
| main.rs:278:9:278:9 | s | semmle.label | s |
|
||||
| main.rs:278:9:278:9 | s | semmle.label | s |
|
||||
| main.rs:278:13:278:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:278:13:278:22 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:279:5:279:15 | simple_sink | semmle.label | simple_sink |
|
||||
| main.rs:279:5:279:15 | simple_sink | semmle.label | simple_sink |
|
||||
| main.rs:279:17:279:17 | s | semmle.label | s |
|
||||
| main.rs:279:17:279:17 | s | semmle.label | s |
|
||||
subpaths
|
||||
| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | main.rs:194:17:194:42 | if ... {...} else {...} | main.rs:195:13:195:24 | apply(...) |
|
||||
| main.rs:195:23:195:23 | f [captured s] | main.rs:194:40:194:40 | s | main.rs:194:17:194:42 | if ... {...} else {...} | main.rs:195:13:195:24 | apply(...) |
|
||||
@@ -519,15 +546,17 @@ invalidSpecComponent
|
||||
| main.rs:196:10:196:10 | t | main.rs:193:13:193:22 | source(...) | main.rs:196:10:196:10 | t | $@ | main.rs:193:13:193:22 | source(...) | source(...) |
|
||||
| main.rs:203:10:203:10 | t | main.rs:200:13:200:22 | source(...) | main.rs:203:10:203:10 | t | $@ | main.rs:200:13:200:22 | source(...) | source(...) |
|
||||
| main.rs:203:10:203:10 | t | main.rs:200:13:200:22 | source(...) | main.rs:203:10:203:10 | t | $@ | main.rs:200:13:200:22 | source(...) | source(...) |
|
||||
| main.rs:225:47:225:47 | i | main.rs:222:13:222:23 | enum_source | main.rs:225:47:225:47 | i | $@ | main.rs:222:13:222:23 | enum_source | enum_source |
|
||||
| main.rs:225:47:225:47 | i | main.rs:222:13:222:23 | enum_source | main.rs:225:47:225:47 | i | $@ | main.rs:222:13:222:23 | enum_source | enum_source |
|
||||
| main.rs:233:47:233:47 | i | main.rs:231:15:231:20 | source | main.rs:233:47:233:47 | i | $@ | main.rs:231:15:231:20 | source | source |
|
||||
| main.rs:233:47:233:47 | i | main.rs:231:15:231:20 | source | main.rs:233:47:233:47 | i | $@ | main.rs:231:15:231:20 | source | source |
|
||||
| main.rs:243:5:243:13 | enum_sink | main.rs:242:13:242:22 | source(...) | main.rs:243:5:243:13 | enum_sink | $@ | main.rs:242:13:242:22 | source(...) | source(...) |
|
||||
| main.rs:243:5:243:13 | enum_sink | main.rs:242:13:242:22 | source(...) | main.rs:243:5:243:13 | enum_sink | $@ | main.rs:242:13:242:22 | source(...) | source(...) |
|
||||
| main.rs:250:7:250:10 | sink | main.rs:248:13:248:22 | source(...) | main.rs:250:7:250:10 | sink | $@ | main.rs:248:13:248:22 | source(...) | source(...) |
|
||||
| main.rs:250:7:250:10 | sink | main.rs:248:13:248:22 | source(...) | main.rs:250:7:250:10 | sink | $@ | main.rs:248:13:248:22 | source(...) | source(...) |
|
||||
| main.rs:260:10:260:10 | s | main.rs:259:13:259:25 | simple_source | main.rs:260:10:260:10 | s | $@ | main.rs:259:13:259:25 | simple_source | simple_source |
|
||||
| main.rs:260:10:260:10 | s | main.rs:259:13:259:25 | simple_source | main.rs:260:10:260:10 | s | $@ | main.rs:259:13:259:25 | simple_source | simple_source |
|
||||
| main.rs:268:5:268:15 | simple_sink | main.rs:267:13:267:22 | source(...) | main.rs:268:5:268:15 | simple_sink | $@ | main.rs:267:13:267:22 | source(...) | source(...) |
|
||||
| main.rs:268:5:268:15 | simple_sink | main.rs:267:13:267:22 | source(...) | main.rs:268:5:268:15 | simple_sink | $@ | main.rs:267:13:267:22 | source(...) | source(...) |
|
||||
| main.rs:214:10:214:10 | t | main.rs:212:13:212:22 | source(...) | main.rs:214:10:214:10 | t | $@ | main.rs:212:13:212:22 | source(...) | source(...) |
|
||||
| main.rs:214:10:214:10 | t | main.rs:212:13:212:22 | source(...) | main.rs:214:10:214:10 | t | $@ | main.rs:212:13:212:22 | source(...) | source(...) |
|
||||
| main.rs:236:47:236:47 | i | main.rs:233:13:233:23 | enum_source | main.rs:236:47:236:47 | i | $@ | main.rs:233:13:233:23 | enum_source | enum_source |
|
||||
| main.rs:236:47:236:47 | i | main.rs:233:13:233:23 | enum_source | main.rs:236:47:236:47 | i | $@ | main.rs:233:13:233:23 | enum_source | enum_source |
|
||||
| main.rs:244:47:244:47 | i | main.rs:242:15:242:20 | source | main.rs:244:47:244:47 | i | $@ | main.rs:242:15:242:20 | source | source |
|
||||
| main.rs:244:47:244:47 | i | main.rs:242:15:242:20 | source | main.rs:244:47:244:47 | i | $@ | main.rs:242:15:242:20 | source | source |
|
||||
| main.rs:254:5:254:13 | enum_sink | main.rs:253:13:253:22 | source(...) | main.rs:254:5:254:13 | enum_sink | $@ | main.rs:253:13:253:22 | source(...) | source(...) |
|
||||
| main.rs:254:5:254:13 | enum_sink | main.rs:253:13:253:22 | source(...) | main.rs:254:5:254:13 | enum_sink | $@ | main.rs:253:13:253:22 | source(...) | source(...) |
|
||||
| main.rs:261:7:261:10 | sink | main.rs:259:13:259:22 | source(...) | main.rs:261:7:261:10 | sink | $@ | main.rs:259:13:259:22 | source(...) | source(...) |
|
||||
| main.rs:261:7:261:10 | sink | main.rs:259:13:259:22 | source(...) | main.rs:261:7:261:10 | sink | $@ | main.rs:259:13:259:22 | source(...) | source(...) |
|
||||
| main.rs:271:10:271:10 | s | main.rs:270:13:270:25 | simple_source | main.rs:271:10:271:10 | s | $@ | main.rs:270:13:270:25 | simple_source | simple_source |
|
||||
| main.rs:271:10:271:10 | s | main.rs:270:13:270:25 | simple_source | main.rs:271:10:271:10 | s | $@ | main.rs:270:13:270:25 | simple_source | simple_source |
|
||||
| main.rs:279:5:279:15 | simple_sink | main.rs:278:13:278:22 | source(...) | main.rs:279:5:279:15 | simple_sink | $@ | main.rs:278:13:278:22 | source(...) | source(...) |
|
||||
| main.rs:279:5:279:15 | simple_sink | main.rs:278:13:278:22 | source(...) | main.rs:279:5:279:15 | simple_sink | $@ | main.rs:278:13:278:22 | source(...) | source(...) |
|
||||
|
||||
@@ -30,3 +30,4 @@ extensions:
|
||||
- ["repo::test", "crate::set_tuple_element", "Argument[0]", "ReturnValue.Tuple[1]", "value", "manual"]
|
||||
- ["repo::test", "crate::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"]
|
||||
- ["repo::test", "crate::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"]
|
||||
- ["repo::test", "crate::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"]
|
||||
|
||||
2
rust/ql/test/library-tests/dataflow/models/options.yml
Normal file
2
rust/ql/test/library-tests/dataflow/models/options.yml
Normal file
@@ -0,0 +1,2 @@
|
||||
qltest_dependencies:
|
||||
- tokio = { version = "1", features = ["full"] }
|
||||
@@ -8,42 +8,45 @@ edges
|
||||
| main.rs:15:9:15:9 | c | main.rs:16:10:16:10 | c | provenance | |
|
||||
| main.rs:15:13:15:14 | * ... | main.rs:15:9:15:9 | c | provenance | |
|
||||
| main.rs:15:14:15:14 | b [&ref] | main.rs:15:13:15:14 | * ... | provenance | |
|
||||
| main.rs:35:25:35:26 | &... [&ref] | main.rs:35:26:35:26 | n | provenance | |
|
||||
| main.rs:35:25:35:32 | ...: ... [&ref] | main.rs:35:25:35:26 | &... [&ref] | provenance | |
|
||||
| main.rs:35:26:35:26 | n | main.rs:36:10:36:10 | n | provenance | |
|
||||
| main.rs:40:9:40:11 | val | main.rs:41:27:41:29 | val | provenance | |
|
||||
| main.rs:40:15:40:24 | source(...) | main.rs:40:9:40:11 | val | provenance | |
|
||||
| main.rs:41:26:41:29 | &val [&ref] | main.rs:35:25:35:32 | ...: ... [&ref] | provenance | |
|
||||
| main.rs:41:27:41:29 | val | main.rs:41:26:41:29 | &val [&ref] | provenance | |
|
||||
| main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:50:15:50:18 | self [MyNumber] | provenance | |
|
||||
| main.rs:50:15:50:18 | self [MyNumber] | main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | main.rs:51:32:51:37 | number | provenance | |
|
||||
| main.rs:51:32:51:37 | number | main.rs:49:31:55:5 | { ... } | provenance | |
|
||||
| main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | main.rs:58:15:58:18 | self [&ref, MyNumber] | provenance | |
|
||||
| main.rs:58:15:58:18 | self [&ref, MyNumber] | main.rs:59:13:59:39 | &... [&ref, MyNumber] | provenance | |
|
||||
| main.rs:59:13:59:39 | &... [&ref, MyNumber] | main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | main.rs:59:33:59:38 | number | provenance | |
|
||||
| main.rs:59:33:59:38 | number | main.rs:57:33:63:5 | { ... } | provenance | |
|
||||
| main.rs:67:9:67:17 | my_number [MyNumber] | main.rs:68:10:68:18 | my_number [MyNumber] | provenance | |
|
||||
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | main.rs:67:9:67:17 | my_number [MyNumber] | provenance | |
|
||||
| main.rs:67:40:67:49 | source(...) | main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | provenance | |
|
||||
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:68:10:68:30 | my_number.to_number(...) | provenance | |
|
||||
| main.rs:77:9:77:17 | my_number [&ref, MyNumber] | main.rs:78:10:78:18 | my_number [&ref, MyNumber] | provenance | |
|
||||
| main.rs:77:21:77:51 | &... [&ref, MyNumber] | main.rs:77:9:77:17 | my_number [&ref, MyNumber] | provenance | |
|
||||
| main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | main.rs:77:21:77:51 | &... [&ref, MyNumber] | provenance | |
|
||||
| main.rs:77:41:77:50 | source(...) | main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | provenance | |
|
||||
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:78:10:78:31 | my_number.get_number(...) | provenance | |
|
||||
| main.rs:82:9:82:9 | a [&ref, tuple.0] | main.rs:85:19:85:19 | a [&ref, tuple.0] | provenance | |
|
||||
| main.rs:82:13:82:28 | &... [&ref, tuple.0] | main.rs:82:9:82:9 | a [&ref, tuple.0] | provenance | |
|
||||
| main.rs:82:14:82:28 | TupleExpr [tuple.0] | main.rs:82:13:82:28 | &... [&ref, tuple.0] | provenance | |
|
||||
| main.rs:82:15:82:24 | source(...) | main.rs:82:14:82:28 | TupleExpr [tuple.0] | provenance | |
|
||||
| main.rs:85:9:85:9 | b | main.rs:88:10:88:10 | b | provenance | |
|
||||
| main.rs:85:19:85:19 | a [&ref, tuple.0] | main.rs:86:9:86:15 | &... [&ref, tuple.0] | provenance | |
|
||||
| main.rs:86:9:86:15 | &... [&ref, tuple.0] | main.rs:86:10:86:15 | TuplePat [tuple.0] | provenance | |
|
||||
| main.rs:86:10:86:15 | TuplePat [tuple.0] | main.rs:86:11:86:11 | n | provenance | |
|
||||
| main.rs:86:11:86:11 | n | main.rs:85:9:85:9 | b | provenance | |
|
||||
| main.rs:31:6:31:6 | [post] b [&ref] | main.rs:32:11:32:11 | b [&ref] | provenance | |
|
||||
| main.rs:31:10:31:19 | source(...) | main.rs:31:6:31:6 | [post] b [&ref] | provenance | |
|
||||
| main.rs:32:11:32:11 | b [&ref] | main.rs:32:10:32:11 | * ... | provenance | |
|
||||
| main.rs:37:25:37:26 | &... [&ref] | main.rs:37:26:37:26 | n | provenance | |
|
||||
| main.rs:37:25:37:32 | ...: ... [&ref] | main.rs:37:25:37:26 | &... [&ref] | provenance | |
|
||||
| main.rs:37:26:37:26 | n | main.rs:38:10:38:10 | n | provenance | |
|
||||
| main.rs:42:9:42:11 | val | main.rs:43:27:43:29 | val | provenance | |
|
||||
| main.rs:42:15:42:24 | source(...) | main.rs:42:9:42:11 | val | provenance | |
|
||||
| main.rs:43:26:43:29 | &val [&ref] | main.rs:37:25:37:32 | ...: ... [&ref] | provenance | |
|
||||
| main.rs:43:27:43:29 | val | main.rs:43:26:43:29 | &val [&ref] | provenance | |
|
||||
| main.rs:51:18:51:21 | SelfParam [MyNumber] | main.rs:52:15:52:18 | self [MyNumber] | provenance | |
|
||||
| main.rs:52:15:52:18 | self [MyNumber] | main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | main.rs:53:32:53:37 | number | provenance | |
|
||||
| main.rs:53:32:53:37 | number | main.rs:51:31:57:5 | { ... } | provenance | |
|
||||
| main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | main.rs:60:15:60:18 | self [&ref, MyNumber] | provenance | |
|
||||
| main.rs:60:15:60:18 | self [&ref, MyNumber] | main.rs:61:13:61:39 | &... [&ref, MyNumber] | provenance | |
|
||||
| main.rs:61:13:61:39 | &... [&ref, MyNumber] | main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | main.rs:61:33:61:38 | number | provenance | |
|
||||
| main.rs:61:33:61:38 | number | main.rs:59:33:65:5 | { ... } | provenance | |
|
||||
| main.rs:69:9:69:17 | my_number [MyNumber] | main.rs:70:10:70:18 | my_number [MyNumber] | provenance | |
|
||||
| main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | main.rs:69:9:69:17 | my_number [MyNumber] | provenance | |
|
||||
| main.rs:69:40:69:49 | source(...) | main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:51:18:51:21 | SelfParam [MyNumber] | provenance | |
|
||||
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:70:10:70:30 | my_number.to_number(...) | provenance | |
|
||||
| main.rs:79:9:79:17 | my_number [&ref, MyNumber] | main.rs:80:10:80:18 | my_number [&ref, MyNumber] | provenance | |
|
||||
| main.rs:79:21:79:51 | &... [&ref, MyNumber] | main.rs:79:9:79:17 | my_number [&ref, MyNumber] | provenance | |
|
||||
| main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | main.rs:79:21:79:51 | &... [&ref, MyNumber] | provenance | |
|
||||
| main.rs:79:41:79:50 | source(...) | main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | provenance | |
|
||||
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | provenance | |
|
||||
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:80:10:80:31 | my_number.get_number(...) | provenance | |
|
||||
| main.rs:84:9:84:9 | a [&ref, tuple.0] | main.rs:87:19:87:19 | a [&ref, tuple.0] | provenance | |
|
||||
| main.rs:84:13:84:28 | &... [&ref, tuple.0] | main.rs:84:9:84:9 | a [&ref, tuple.0] | provenance | |
|
||||
| main.rs:84:14:84:28 | TupleExpr [tuple.0] | main.rs:84:13:84:28 | &... [&ref, tuple.0] | provenance | |
|
||||
| main.rs:84:15:84:24 | source(...) | main.rs:84:14:84:28 | TupleExpr [tuple.0] | provenance | |
|
||||
| main.rs:87:9:87:9 | b | main.rs:90:10:90:10 | b | provenance | |
|
||||
| main.rs:87:19:87:19 | a [&ref, tuple.0] | main.rs:88:9:88:15 | &... [&ref, tuple.0] | provenance | |
|
||||
| main.rs:88:9:88:15 | &... [&ref, tuple.0] | main.rs:88:10:88:15 | TuplePat [tuple.0] | provenance | |
|
||||
| main.rs:88:10:88:15 | TuplePat [tuple.0] | main.rs:88:11:88:11 | n | provenance | |
|
||||
| main.rs:88:11:88:11 | n | main.rs:87:9:87:9 | b | provenance | |
|
||||
nodes
|
||||
| main.rs:13:9:13:9 | a | semmle.label | a |
|
||||
| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) |
|
||||
@@ -54,53 +57,58 @@ nodes
|
||||
| main.rs:15:13:15:14 | * ... | semmle.label | * ... |
|
||||
| main.rs:15:14:15:14 | b [&ref] | semmle.label | b [&ref] |
|
||||
| main.rs:16:10:16:10 | c | semmle.label | c |
|
||||
| main.rs:35:25:35:26 | &... [&ref] | semmle.label | &... [&ref] |
|
||||
| main.rs:35:25:35:32 | ...: ... [&ref] | semmle.label | ...: ... [&ref] |
|
||||
| main.rs:35:26:35:26 | n | semmle.label | n |
|
||||
| main.rs:36:10:36:10 | n | semmle.label | n |
|
||||
| main.rs:40:9:40:11 | val | semmle.label | val |
|
||||
| main.rs:40:15:40:24 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:41:26:41:29 | &val [&ref] | semmle.label | &val [&ref] |
|
||||
| main.rs:41:27:41:29 | val | semmle.label | val |
|
||||
| main.rs:49:18:49:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
|
||||
| main.rs:49:31:55:5 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:50:15:50:18 | self [MyNumber] | semmle.label | self [MyNumber] |
|
||||
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:51:32:51:37 | number | semmle.label | number |
|
||||
| main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
|
||||
| main.rs:57:33:63:5 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:58:15:58:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
|
||||
| main.rs:59:13:59:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
|
||||
| main.rs:59:14:59:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:59:33:59:38 | number | semmle.label | number |
|
||||
| main.rs:67:9:67:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
|
||||
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:67:40:67:49 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:68:10:68:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
|
||||
| main.rs:68:10:68:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
|
||||
| main.rs:77:9:77:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
|
||||
| main.rs:77:21:77:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
|
||||
| main.rs:77:22:77:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:77:41:77:50 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
|
||||
| main.rs:78:10:78:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
|
||||
| main.rs:82:9:82:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
|
||||
| main.rs:82:13:82:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
|
||||
| main.rs:82:14:82:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
|
||||
| main.rs:82:15:82:24 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:85:9:85:9 | b | semmle.label | b |
|
||||
| main.rs:85:19:85:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
|
||||
| main.rs:86:9:86:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
|
||||
| main.rs:86:10:86:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
|
||||
| main.rs:86:11:86:11 | n | semmle.label | n |
|
||||
| main.rs:88:10:88:10 | b | semmle.label | b |
|
||||
| main.rs:31:6:31:6 | [post] b [&ref] | semmle.label | [post] b [&ref] |
|
||||
| main.rs:31:10:31:19 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:32:10:32:11 | * ... | semmle.label | * ... |
|
||||
| main.rs:32:11:32:11 | b [&ref] | semmle.label | b [&ref] |
|
||||
| main.rs:37:25:37:26 | &... [&ref] | semmle.label | &... [&ref] |
|
||||
| main.rs:37:25:37:32 | ...: ... [&ref] | semmle.label | ...: ... [&ref] |
|
||||
| main.rs:37:26:37:26 | n | semmle.label | n |
|
||||
| main.rs:38:10:38:10 | n | semmle.label | n |
|
||||
| main.rs:42:9:42:11 | val | semmle.label | val |
|
||||
| main.rs:42:15:42:24 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:43:26:43:29 | &val [&ref] | semmle.label | &val [&ref] |
|
||||
| main.rs:43:27:43:29 | val | semmle.label | val |
|
||||
| main.rs:51:18:51:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
|
||||
| main.rs:51:31:57:5 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:52:15:52:18 | self [MyNumber] | semmle.label | self [MyNumber] |
|
||||
| main.rs:53:13:53:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:53:32:53:37 | number | semmle.label | number |
|
||||
| main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | semmle.label | SelfParam [&ref, MyNumber] |
|
||||
| main.rs:59:33:65:5 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:60:15:60:18 | self [&ref, MyNumber] | semmle.label | self [&ref, MyNumber] |
|
||||
| main.rs:61:13:61:39 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
|
||||
| main.rs:61:14:61:39 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:61:33:61:38 | number | semmle.label | number |
|
||||
| main.rs:69:9:69:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
|
||||
| main.rs:69:21:69:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:69:40:69:49 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:70:10:70:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
|
||||
| main.rs:70:10:70:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
|
||||
| main.rs:79:9:79:17 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
|
||||
| main.rs:79:21:79:51 | &... [&ref, MyNumber] | semmle.label | &... [&ref, MyNumber] |
|
||||
| main.rs:79:22:79:51 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
|
||||
| main.rs:79:41:79:50 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | semmle.label | my_number [&ref, MyNumber] |
|
||||
| main.rs:80:10:80:31 | my_number.get_number(...) | semmle.label | my_number.get_number(...) |
|
||||
| main.rs:84:9:84:9 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
|
||||
| main.rs:84:13:84:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
|
||||
| main.rs:84:14:84:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] |
|
||||
| main.rs:84:15:84:24 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:87:9:87:9 | b | semmle.label | b |
|
||||
| main.rs:87:19:87:19 | a [&ref, tuple.0] | semmle.label | a [&ref, tuple.0] |
|
||||
| main.rs:88:9:88:15 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] |
|
||||
| main.rs:88:10:88:15 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] |
|
||||
| main.rs:88:11:88:11 | n | semmle.label | n |
|
||||
| main.rs:90:10:90:10 | b | semmle.label | b |
|
||||
subpaths
|
||||
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:49:31:55:5 | { ... } | main.rs:68:10:68:30 | my_number.to_number(...) |
|
||||
| main.rs:78:10:78:18 | my_number [&ref, MyNumber] | main.rs:57:19:57:23 | SelfParam [&ref, MyNumber] | main.rs:57:33:63:5 | { ... } | main.rs:78:10:78:31 | my_number.get_number(...) |
|
||||
| main.rs:70:10:70:18 | my_number [MyNumber] | main.rs:51:18:51:21 | SelfParam [MyNumber] | main.rs:51:31:57:5 | { ... } | main.rs:70:10:70:30 | my_number.to_number(...) |
|
||||
| main.rs:80:10:80:18 | my_number [&ref, MyNumber] | main.rs:59:19:59:23 | SelfParam [&ref, MyNumber] | main.rs:59:33:65:5 | { ... } | main.rs:80:10:80:31 | my_number.get_number(...) |
|
||||
testFailures
|
||||
#select
|
||||
| main.rs:16:10:16:10 | c | main.rs:13:13:13:22 | source(...) | main.rs:16:10:16:10 | c | $@ | main.rs:13:13:13:22 | source(...) | source(...) |
|
||||
| main.rs:36:10:36:10 | n | main.rs:40:15:40:24 | source(...) | main.rs:36:10:36:10 | n | $@ | main.rs:40:15:40:24 | source(...) | source(...) |
|
||||
| main.rs:68:10:68:30 | my_number.to_number(...) | main.rs:67:40:67:49 | source(...) | main.rs:68:10:68:30 | my_number.to_number(...) | $@ | main.rs:67:40:67:49 | source(...) | source(...) |
|
||||
| main.rs:78:10:78:31 | my_number.get_number(...) | main.rs:77:41:77:50 | source(...) | main.rs:78:10:78:31 | my_number.get_number(...) | $@ | main.rs:77:41:77:50 | source(...) | source(...) |
|
||||
| main.rs:88:10:88:10 | b | main.rs:82:15:82:24 | source(...) | main.rs:88:10:88:10 | b | $@ | main.rs:82:15:82:24 | source(...) | source(...) |
|
||||
| main.rs:32:10:32:11 | * ... | main.rs:31:10:31:19 | source(...) | main.rs:32:10:32:11 | * ... | $@ | main.rs:31:10:31:19 | source(...) | source(...) |
|
||||
| main.rs:38:10:38:10 | n | main.rs:42:15:42:24 | source(...) | main.rs:38:10:38:10 | n | $@ | main.rs:42:15:42:24 | source(...) | source(...) |
|
||||
| main.rs:70:10:70:30 | my_number.to_number(...) | main.rs:69:40:69:49 | source(...) | main.rs:70:10:70:30 | my_number.to_number(...) | $@ | main.rs:69:40:69:49 | source(...) | source(...) |
|
||||
| main.rs:80:10:80:31 | my_number.get_number(...) | main.rs:79:41:79:50 | source(...) | main.rs:80:10:80:31 | my_number.get_number(...) | $@ | main.rs:79:41:79:50 | source(...) | source(...) |
|
||||
| main.rs:90:10:90:10 | b | main.rs:84:15:84:24 | source(...) | main.rs:90:10:90:10 | b | $@ | main.rs:84:15:84:24 | source(...) | source(...) |
|
||||
|
||||
@@ -29,7 +29,9 @@ fn write_and_read_through_borrow() {
|
||||
let b = &mut a;
|
||||
sink(*b);
|
||||
*b = source(37);
|
||||
sink(*b); // $ MISSING: hasValueFlow=37
|
||||
sink(*b); // $ hasValueFlow=37
|
||||
*b = 0;
|
||||
sink(*b); // now cleared
|
||||
}
|
||||
|
||||
fn takes_borrowed_value(&n: &i64) {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import rust
|
||||
import codeql.rust.Concepts
|
||||
import codeql.rust.security.SqlInjectionExtensions
|
||||
import utils.test.InlineExpectationsTest
|
||||
|
||||
module PostgresTest implements TestSig {
|
||||
string getARelevantTag() { result = "sql-sink" }
|
||||
string getARelevantTag() { result = ["sql-sink", "database-read"] }
|
||||
|
||||
predicate hasActualResult(Location location, string element, string tag, string value) {
|
||||
exists(SqlInjection::Sink sink |
|
||||
@@ -13,6 +14,14 @@ module PostgresTest implements TestSig {
|
||||
tag = "sql-sink" and
|
||||
value = ""
|
||||
)
|
||||
or
|
||||
exists(ModeledDatabaseSource source |
|
||||
location = source.getLocation() and
|
||||
location.getFile().getBaseName() != "" and
|
||||
element = source.toString() and
|
||||
tag = "database-read" and
|
||||
value = ""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
// conn.query_typed_raw(query.as_str(), &[])?;
|
||||
|
||||
for row in &conn.query("SELECT id, name, age FROM person", &[])? { // $ sql-sink
|
||||
let id: i32 = row.get("id");
|
||||
let name: &str = row.get("name");
|
||||
let age: i32 = row.get("age");
|
||||
let id: i32 = row.get("id"); // $ database-read
|
||||
let name: &str = row.try_get("name")?; // $ database-read
|
||||
let age: i32 = row.try_get("age").unwrap(); // $ database-read
|
||||
println!("found person: {} {} {}", id, name, age);
|
||||
}
|
||||
|
||||
|
||||
@@ -212,6 +212,74 @@ mod m10 {
|
||||
}
|
||||
}
|
||||
|
||||
mod m11 {
|
||||
pub struct Foo {} // I61
|
||||
|
||||
fn Foo() {} // I62
|
||||
|
||||
pub fn f() {
|
||||
let _ = Foo {}; // $ item=I61
|
||||
Foo(); // $ item=I62
|
||||
} // I63
|
||||
|
||||
mod f {} // I66
|
||||
|
||||
pub enum Bar {
|
||||
FooBar {}, // I64
|
||||
} // I65
|
||||
|
||||
use Bar::FooBar; // $ item=I64
|
||||
|
||||
fn FooBar() {} // I65
|
||||
|
||||
#[rustfmt::skip]
|
||||
fn g(x: Foo) { // $ item=I61
|
||||
let _ = FooBar {}; // $ item=I64
|
||||
let _ = FooBar(); // $ item=I65
|
||||
}
|
||||
|
||||
struct S; // I67
|
||||
enum E {
|
||||
C, // I68
|
||||
}
|
||||
|
||||
use E::C; // $ item=I68
|
||||
|
||||
fn h() {
|
||||
let _ = S; // $ item=I67
|
||||
let _ = C; // $ item=I68
|
||||
}
|
||||
}
|
||||
|
||||
mod m12 {
|
||||
#[rustfmt::skip]
|
||||
trait MyParamTrait<
|
||||
T // I69
|
||||
> {
|
||||
type AssociatedType; // I70
|
||||
|
||||
fn f(
|
||||
&self,
|
||||
x: T // $ item=I69
|
||||
) -> Self::AssociatedType; // $ item=I70
|
||||
}
|
||||
}
|
||||
|
||||
mod m13 {
|
||||
pub fn f() {} // I71
|
||||
pub struct f {} // I72
|
||||
|
||||
mod m14 {
|
||||
use crate::m13::f; // $ item=I71 item=I72
|
||||
|
||||
#[rustfmt::skip]
|
||||
fn g(x: f) { // $ item=I72
|
||||
let _ = f {}; // $ item=I72
|
||||
f(); // $ item=I71
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
my::nested::nested1::nested2::f(); // $ item=I4
|
||||
my::f(); // $ item=I38
|
||||
@@ -230,4 +298,5 @@ fn main() {
|
||||
m7::f(); // $ item=I45
|
||||
m8::g(); // $ item=I55
|
||||
m9::f(); // $ item=I57
|
||||
m11::f(); // $ item=I63
|
||||
}
|
||||
|
||||
@@ -13,6 +13,11 @@ mod
|
||||
| main.rs:139:1:182:1 | mod m8 |
|
||||
| main.rs:184:1:192:1 | mod m9 |
|
||||
| main.rs:194:1:213:1 | mod m10 |
|
||||
| main.rs:215:1:252:1 | mod m11 |
|
||||
| main.rs:225:5:225:12 | mod f |
|
||||
| main.rs:254:1:266:1 | mod m12 |
|
||||
| main.rs:268:1:281:1 | mod m13 |
|
||||
| main.rs:272:5:280:5 | mod m14 |
|
||||
| my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
@@ -38,7 +43,7 @@ resolvePath
|
||||
| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
|
||||
| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
|
||||
| main.rs:40:9:40:13 | super | main.rs:1:1:233:2 | SourceFile |
|
||||
| main.rs:40:9:40:13 | super | main.rs:1:1:302:2 | SourceFile |
|
||||
| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
|
||||
@@ -50,7 +55,7 @@ resolvePath
|
||||
| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
|
||||
| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
|
||||
| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
|
||||
| main.rs:68:5:68:8 | self | main.rs:1:1:233:2 | SourceFile |
|
||||
| main.rs:68:5:68:8 | self | main.rs:1:1:302:2 | SourceFile |
|
||||
| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
|
||||
| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
|
||||
| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
|
||||
@@ -64,7 +69,7 @@ resolvePath
|
||||
| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
|
||||
| main.rs:117:13:117:17 | super | main.rs:1:1:233:2 | SourceFile |
|
||||
| main.rs:117:13:117:17 | super | main.rs:1:1:302:2 | SourceFile |
|
||||
| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
|
||||
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
|
||||
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
|
||||
@@ -99,42 +104,65 @@ resolvePath
|
||||
| main.rs:207:7:209:7 | MyStruct::<...> | main.rs:195:5:201:5 | struct MyStruct |
|
||||
| main.rs:208:9:208:9 | T | main.rs:204:14:204:14 | TypeParam |
|
||||
| main.rs:211:9:211:16 | MyStruct | main.rs:195:5:201:5 | struct MyStruct |
|
||||
| main.rs:216:5:216:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:216:5:216:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
|
||||
| main.rs:216:5:216:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
|
||||
| main.rs:216:5:216:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
|
||||
| main.rs:216:5:216:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
|
||||
| main.rs:217:5:217:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:217:5:217:9 | ...::f | my.rs:5:1:7:1 | fn f |
|
||||
| main.rs:218:5:218:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| main.rs:218:5:218:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| main.rs:218:5:218:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
| main.rs:218:5:218:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:219:5:219:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:220:5:220:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:221:5:221:9 | crate | main.rs:1:1:233:2 | SourceFile |
|
||||
| main.rs:221:5:221:12 | ...::h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:222:5:222:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:222:5:222:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:222:5:222:13 | ...::g | main.rs:23:9:27:9 | fn g |
|
||||
| main.rs:223:5:223:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:223:5:223:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:223:5:223:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
|
||||
| main.rs:223:5:223:17 | ...::h | main.rs:30:27:34:13 | fn h |
|
||||
| main.rs:224:5:224:6 | m4 | main.rs:39:1:46:1 | mod m4 |
|
||||
| main.rs:224:5:224:9 | ...::i | main.rs:42:5:45:5 | fn i |
|
||||
| main.rs:225:5:225:5 | h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:226:5:226:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:227:5:227:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:228:5:228:5 | j | main.rs:97:1:101:1 | fn j |
|
||||
| main.rs:229:5:229:6 | m6 | main.rs:109:1:120:1 | mod m6 |
|
||||
| main.rs:229:5:229:9 | ...::g | main.rs:114:5:119:5 | fn g |
|
||||
| main.rs:230:5:230:6 | m7 | main.rs:122:1:137:1 | mod m7 |
|
||||
| main.rs:230:5:230:9 | ...::f | main.rs:129:5:136:5 | fn f |
|
||||
| main.rs:231:5:231:6 | m8 | main.rs:139:1:182:1 | mod m8 |
|
||||
| main.rs:231:5:231:9 | ...::g | main.rs:169:5:181:5 | fn g |
|
||||
| main.rs:232:5:232:6 | m9 | main.rs:184:1:192:1 | mod m9 |
|
||||
| main.rs:232:5:232:9 | ...::f | main.rs:187:5:191:5 | fn f |
|
||||
| main.rs:221:17:221:19 | Foo | main.rs:216:5:216:21 | struct Foo |
|
||||
| main.rs:222:9:222:11 | Foo | main.rs:218:5:218:15 | fn Foo |
|
||||
| main.rs:231:9:231:11 | Bar | main.rs:227:5:229:5 | enum Bar |
|
||||
| main.rs:231:9:231:19 | ...::FooBar | main.rs:228:9:228:17 | FooBar |
|
||||
| main.rs:236:13:236:15 | Foo | main.rs:216:5:216:21 | struct Foo |
|
||||
| main.rs:237:17:237:22 | FooBar | main.rs:228:9:228:17 | FooBar |
|
||||
| main.rs:238:17:238:22 | FooBar | main.rs:233:5:233:18 | fn FooBar |
|
||||
| main.rs:246:9:246:9 | E | main.rs:241:15:244:5 | enum E |
|
||||
| main.rs:246:9:246:12 | ...::C | main.rs:243:9:243:9 | C |
|
||||
| main.rs:249:17:249:17 | S | main.rs:241:5:241:13 | struct S |
|
||||
| main.rs:250:17:250:17 | C | main.rs:243:9:243:9 | C |
|
||||
| main.rs:263:16:263:16 | T | main.rs:257:7:257:7 | TypeParam |
|
||||
| main.rs:264:14:264:17 | Self | main.rs:255:5:265:5 | trait MyParamTrait |
|
||||
| main.rs:264:14:264:33 | ...::AssociatedType | main.rs:259:9:259:28 | TypeAlias |
|
||||
| main.rs:273:13:273:17 | crate | main.rs:1:1:302:2 | SourceFile |
|
||||
| main.rs:273:13:273:22 | ...::m13 | main.rs:268:1:281:1 | mod m13 |
|
||||
| main.rs:273:13:273:25 | ...::f | main.rs:269:5:269:17 | fn f |
|
||||
| main.rs:273:13:273:25 | ...::f | main.rs:269:19:270:19 | struct f |
|
||||
| main.rs:276:17:276:17 | f | main.rs:269:19:270:19 | struct f |
|
||||
| main.rs:277:21:277:21 | f | main.rs:269:19:270:19 | struct f |
|
||||
| main.rs:278:13:278:13 | f | main.rs:269:5:269:17 | fn f |
|
||||
| main.rs:284:5:284:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:284:5:284:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
|
||||
| main.rs:284:5:284:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
|
||||
| main.rs:284:5:284:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
|
||||
| main.rs:284:5:284:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
|
||||
| main.rs:285:5:285:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:285:5:285:9 | ...::f | my.rs:5:1:7:1 | fn f |
|
||||
| main.rs:286:5:286:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| main.rs:286:5:286:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| main.rs:286:5:286:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
| main.rs:286:5:286:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:287:5:287:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:288:5:288:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:289:5:289:9 | crate | main.rs:1:1:302:2 | SourceFile |
|
||||
| main.rs:289:5:289:12 | ...::h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:290:5:290:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:290:5:290:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:290:5:290:13 | ...::g | main.rs:23:9:27:9 | fn g |
|
||||
| main.rs:291:5:291:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:291:5:291:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:291:5:291:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
|
||||
| main.rs:291:5:291:17 | ...::h | main.rs:30:27:34:13 | fn h |
|
||||
| main.rs:292:5:292:6 | m4 | main.rs:39:1:46:1 | mod m4 |
|
||||
| main.rs:292:5:292:9 | ...::i | main.rs:42:5:45:5 | fn i |
|
||||
| main.rs:293:5:293:5 | h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:294:5:294:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:295:5:295:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:296:5:296:5 | j | main.rs:97:1:101:1 | fn j |
|
||||
| main.rs:297:5:297:6 | m6 | main.rs:109:1:120:1 | mod m6 |
|
||||
| main.rs:297:5:297:9 | ...::g | main.rs:114:5:119:5 | fn g |
|
||||
| main.rs:298:5:298:6 | m7 | main.rs:122:1:137:1 | mod m7 |
|
||||
| main.rs:298:5:298:9 | ...::f | main.rs:129:5:136:5 | fn f |
|
||||
| main.rs:299:5:299:6 | m8 | main.rs:139:1:182:1 | mod m8 |
|
||||
| main.rs:299:5:299:9 | ...::g | main.rs:169:5:181:5 | fn g |
|
||||
| main.rs:300:5:300:6 | m9 | main.rs:184:1:192:1 | mod m9 |
|
||||
| main.rs:300:5:300:9 | ...::f | main.rs:187:5:191:5 | fn f |
|
||||
| main.rs:301:5:301:7 | m11 | main.rs:215:1:252:1 | mod m11 |
|
||||
| main.rs:301:5:301:10 | ...::f | main.rs:220:5:223:5 | fn f |
|
||||
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
|
||||
@@ -423,127 +423,6 @@ firstRead
|
||||
| main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro |
|
||||
| main.rs:596:9:596:20 | var_in_macro | main.rs:596:9:596:20 | var_in_macro | main.rs:601:15:601:26 | var_in_macro |
|
||||
| main.rs:600:15:600:42 | var_in_macro | main.rs:600:15:600:42 | var_in_macro | main.rs:600:30:600:41 | var_in_macro |
|
||||
lastRead
|
||||
| main.rs:3:14:3:14 | s | main.rs:3:14:3:14 | s | main.rs:4:20:4:20 | s |
|
||||
| main.rs:7:14:7:14 | i | main.rs:7:14:7:14 | i | main.rs:8:20:8:20 | i |
|
||||
| main.rs:11:18:11:18 | i | main.rs:11:18:11:18 | i | main.rs:12:16:12:16 | i |
|
||||
| main.rs:16:9:16:10 | x1 | main.rs:16:9:16:10 | x1 | main.rs:17:15:17:16 | x1 |
|
||||
| main.rs:21:9:21:14 | x2 | main.rs:21:13:21:14 | x2 | main.rs:22:15:22:16 | x2 |
|
||||
| main.rs:23:5:23:6 | x2 | main.rs:21:13:21:14 | x2 | main.rs:24:15:24:16 | x2 |
|
||||
| main.rs:28:9:28:13 | x | main.rs:28:13:28:13 | x | main.rs:29:20:29:20 | x |
|
||||
| main.rs:30:5:30:5 | x | main.rs:28:13:28:13 | x | main.rs:31:20:31:20 | x |
|
||||
| main.rs:35:9:35:10 | x3 | main.rs:35:9:35:10 | x3 | main.rs:38:9:38:10 | x3 |
|
||||
| main.rs:37:9:37:10 | x3 | main.rs:37:9:37:10 | x3 | main.rs:39:15:39:16 | x3 |
|
||||
| main.rs:43:9:43:10 | x4 | main.rs:43:9:43:10 | x4 | main.rs:49:15:49:16 | x4 |
|
||||
| main.rs:46:13:46:14 | x4 | main.rs:46:13:46:14 | x4 | main.rs:47:19:47:20 | x4 |
|
||||
| main.rs:60:13:60:14 | a1 | main.rs:60:13:60:14 | a1 | main.rs:68:15:68:16 | a1 |
|
||||
| main.rs:61:13:61:14 | b1 | main.rs:61:13:61:14 | b1 | main.rs:69:15:69:16 | b1 |
|
||||
| main.rs:64:13:64:13 | x | main.rs:64:13:64:13 | x | main.rs:70:15:70:15 | x |
|
||||
| main.rs:65:13:65:13 | y | main.rs:65:13:65:13 | y | main.rs:71:15:71:15 | y |
|
||||
| main.rs:75:9:75:10 | p1 | main.rs:75:9:75:10 | p1 | main.rs:79:9:79:10 | p1 |
|
||||
| main.rs:77:12:77:13 | a2 | main.rs:77:12:77:13 | a2 | main.rs:80:15:80:16 | a2 |
|
||||
| main.rs:78:12:78:13 | b2 | main.rs:78:12:78:13 | b2 | main.rs:81:15:81:16 | b2 |
|
||||
| main.rs:85:9:85:10 | s1 | main.rs:85:9:85:10 | s1 | main.rs:88:11:88:12 | s1 |
|
||||
| main.rs:87:17:87:22 | s2 | main.rs:87:21:87:22 | s2 | main.rs:89:19:89:20 | s2 |
|
||||
| main.rs:94:14:94:15 | x5 | main.rs:94:14:94:15 | x5 | main.rs:98:15:98:16 | x5 |
|
||||
| main.rs:102:9:102:10 | s1 | main.rs:102:9:102:10 | s1 | main.rs:105:11:105:12 | s1 |
|
||||
| main.rs:104:20:104:25 | s2 | main.rs:104:24:104:25 | s2 | main.rs:106:19:106:20 | s2 |
|
||||
| main.rs:111:9:111:10 | x6 | main.rs:111:9:111:10 | x6 | main.rs:114:11:114:12 | x6 |
|
||||
| main.rs:112:9:112:10 | y1 | main.rs:112:9:112:10 | y1 | main.rs:124:15:124:16 | y1 |
|
||||
| main.rs:116:14:116:15 | y1 | main.rs:116:14:116:15 | y1 | main.rs:119:23:119:24 | y1 |
|
||||
| main.rs:128:9:128:15 | numbers | main.rs:128:9:128:15 | numbers | main.rs:142:11:142:17 | numbers |
|
||||
| main.rs:132:13:132:17 | first | main.rs:132:13:132:17 | first | main.rs:136:23:136:27 | first |
|
||||
| main.rs:133:13:133:17 | third | main.rs:133:13:133:17 | third | main.rs:137:23:137:27 | third |
|
||||
| main.rs:134:13:134:17 | fifth | main.rs:134:13:134:17 | fifth | main.rs:138:23:138:27 | fifth |
|
||||
| main.rs:144:13:144:17 | first | main.rs:144:13:144:17 | first | main.rs:148:23:148:27 | first |
|
||||
| main.rs:146:13:146:16 | last | main.rs:146:13:146:16 | last | main.rs:149:23:149:26 | last |
|
||||
| main.rs:155:9:155:10 | p2 | main.rs:155:9:155:10 | p2 | main.rs:157:11:157:12 | p2 |
|
||||
| main.rs:159:16:159:17 | x7 | main.rs:159:16:159:17 | x7 | main.rs:160:24:160:25 | x7 |
|
||||
| main.rs:169:9:169:11 | msg | main.rs:169:9:169:11 | msg | main.rs:171:11:171:13 | msg |
|
||||
| main.rs:173:17:173:35 | [match(true)] id_variable | main.rs:173:17:173:27 | id_variable | main.rs:174:24:174:34 | id_variable |
|
||||
| main.rs:178:26:178:27 | id | main.rs:178:26:178:27 | id | main.rs:179:23:179:24 | id |
|
||||
| main.rs:189:9:189:14 | either | main.rs:189:9:189:14 | either | main.rs:190:11:190:16 | either |
|
||||
| main.rs:191:9:191:44 | [match(true)] phi | main.rs:191:9:191:44 | a3 | main.rs:192:26:192:27 | a3 |
|
||||
| main.rs:203:9:203:10 | tv | main.rs:203:9:203:10 | tv | main.rs:212:11:212:12 | tv |
|
||||
| main.rs:205:9:205:81 | [match(true)] phi | main.rs:205:9:205:81 | a4 | main.rs:206:26:206:27 | a4 |
|
||||
| main.rs:209:9:209:83 | [match(true)] phi | main.rs:209:9:209:83 | a5 | main.rs:210:26:210:27 | a5 |
|
||||
| main.rs:213:9:213:83 | [match(true)] phi | main.rs:213:9:213:83 | a6 | main.rs:214:26:214:27 | a6 |
|
||||
| main.rs:219:9:219:14 | either | main.rs:219:9:219:14 | either | main.rs:220:11:220:16 | either |
|
||||
| main.rs:221:9:221:44 | [match(true)] phi | main.rs:221:9:221:44 | a7 | main.rs:222:16:222:17 | a7 |
|
||||
| main.rs:221:9:221:44 | [match(true)] phi | main.rs:221:9:221:44 | a7 | main.rs:223:26:223:27 | a7 |
|
||||
| main.rs:229:9:229:14 | either | main.rs:229:9:229:14 | either | main.rs:231:11:231:16 | either |
|
||||
| main.rs:232:9:233:52 | [match(true)] e | main.rs:232:13:232:13 | e | main.rs:237:15:237:15 | e |
|
||||
| main.rs:233:14:233:51 | [match(true)] phi | main.rs:233:14:233:51 | a11 | main.rs:235:23:235:25 | a11 |
|
||||
| main.rs:236:33:236:35 | a12 | main.rs:236:33:236:35 | a12 | main.rs:238:28:238:30 | a12 |
|
||||
| main.rs:253:9:253:10 | fv | main.rs:253:9:253:10 | fv | main.rs:254:11:254:12 | fv |
|
||||
| main.rs:255:9:255:109 | [match(true)] phi | main.rs:255:9:255:109 | a13 | main.rs:256:26:256:28 | a13 |
|
||||
| main.rs:261:5:261:6 | a8 | main.rs:261:5:261:6 | a8 | main.rs:266:15:266:16 | a8 |
|
||||
| main.rs:263:9:263:10 | b3 | main.rs:263:9:263:10 | b3 | main.rs:267:15:267:16 | b3 |
|
||||
| main.rs:264:9:264:10 | c1 | main.rs:264:9:264:10 | c1 | main.rs:268:15:268:16 | c1 |
|
||||
| main.rs:272:6:272:41 | [match(true)] phi | main.rs:272:6:272:41 | a9 | main.rs:274:15:274:16 | a9 |
|
||||
| main.rs:279:9:279:15 | a10 | main.rs:279:13:279:15 | a10 | main.rs:283:15:283:17 | a10 |
|
||||
| main.rs:280:9:280:14 | b4 | main.rs:280:13:280:14 | b4 | main.rs:284:15:284:16 | b4 |
|
||||
| main.rs:281:9:281:14 | c2 | main.rs:281:13:281:14 | c2 | main.rs:285:15:285:16 | c2 |
|
||||
| main.rs:288:9:288:10 | c2 | main.rs:281:13:281:14 | c2 | main.rs:298:15:298:16 | c2 |
|
||||
| main.rs:289:9:289:10 | b4 | main.rs:280:13:280:14 | b4 | main.rs:311:15:311:16 | b4 |
|
||||
| main.rs:290:9:290:11 | a10 | main.rs:279:13:279:15 | a10 | main.rs:310:15:310:17 | a10 |
|
||||
| main.rs:302:13:302:15 | a10 | main.rs:302:13:302:15 | a10 | main.rs:305:23:305:25 | a10 |
|
||||
| main.rs:303:13:303:14 | b4 | main.rs:303:13:303:14 | b4 | main.rs:306:23:306:24 | b4 |
|
||||
| main.rs:315:9:315:23 | example_closure | main.rs:315:9:315:23 | example_closure | main.rs:319:9:319:23 | example_closure |
|
||||
| main.rs:316:10:316:10 | x | main.rs:316:10:316:10 | x | main.rs:317:9:317:9 | x |
|
||||
| main.rs:318:9:318:10 | n1 | main.rs:318:9:318:10 | n1 | main.rs:320:15:320:16 | n1 |
|
||||
| main.rs:323:9:323:26 | immutable_variable | main.rs:323:9:323:26 | immutable_variable | main.rs:327:9:327:26 | immutable_variable |
|
||||
| main.rs:324:10:324:10 | x | main.rs:324:10:324:10 | x | main.rs:325:9:325:9 | x |
|
||||
| main.rs:326:9:326:10 | n2 | main.rs:326:9:326:10 | n2 | main.rs:328:15:328:16 | n2 |
|
||||
| main.rs:333:9:333:9 | f | main.rs:333:9:333:9 | f | main.rs:342:15:342:15 | f |
|
||||
| main.rs:334:10:334:10 | x | main.rs:334:10:334:10 | x | main.rs:335:9:335:9 | x |
|
||||
| main.rs:338:10:338:10 | x | main.rs:338:10:338:10 | x | main.rs:339:9:339:9 | x |
|
||||
| main.rs:346:14:346:14 | x | main.rs:346:14:346:14 | x | main.rs:347:17:347:17 | x |
|
||||
| main.rs:354:13:354:13 | f | main.rs:354:13:354:13 | f | main.rs:357:19:357:19 | f |
|
||||
| main.rs:355:14:355:14 | x | main.rs:355:14:355:14 | x | main.rs:356:13:356:13 | x |
|
||||
| main.rs:362:9:362:9 | v | main.rs:362:9:362:9 | v | main.rs:365:12:365:12 | v |
|
||||
| main.rs:364:9:364:12 | text | main.rs:364:9:364:12 | text | main.rs:366:19:366:22 | text |
|
||||
| main.rs:380:9:380:13 | ref_i | main.rs:380:9:380:13 | ref_i | main.rs:382:6:382:10 | ref_i |
|
||||
| main.rs:386:17:386:17 | x | main.rs:386:17:386:17 | x | main.rs:390:12:390:12 | x |
|
||||
| main.rs:393:22:393:22 | x | main.rs:393:22:393:22 | x | main.rs:398:9:398:9 | x |
|
||||
| main.rs:393:39:393:39 | y | main.rs:393:39:393:39 | y | main.rs:397:6:397:6 | y |
|
||||
| main.rs:403:9:403:9 | y | main.rs:403:9:403:9 | y | main.rs:405:6:405:6 | y |
|
||||
| main.rs:410:9:410:9 | w | main.rs:410:9:410:9 | w | main.rs:416:7:416:7 | w |
|
||||
| main.rs:423:9:423:9 | y | main.rs:423:9:423:9 | y | main.rs:425:6:425:6 | y |
|
||||
| main.rs:430:9:430:9 | x | main.rs:430:9:430:9 | x | main.rs:436:15:436:15 | x |
|
||||
| main.rs:432:9:432:11 | cap | main.rs:432:9:432:11 | cap | main.rs:435:5:435:7 | cap |
|
||||
| main.rs:432:15:434:5 | <captured entry> x | main.rs:430:9:430:9 | x | main.rs:433:19:433:19 | x |
|
||||
| main.rs:440:9:440:13 | x | main.rs:440:13:440:13 | x | main.rs:446:15:446:15 | x |
|
||||
| main.rs:442:9:442:16 | closure1 | main.rs:442:9:442:16 | closure1 | main.rs:445:5:445:12 | closure1 |
|
||||
| main.rs:442:20:444:5 | <captured entry> x | main.rs:440:13:440:13 | x | main.rs:443:19:443:19 | x |
|
||||
| main.rs:450:9:450:20 | closure2 | main.rs:450:13:450:20 | closure2 | main.rs:453:5:453:12 | closure2 |
|
||||
| main.rs:453:5:453:14 | <captured exit> y | main.rs:448:13:448:13 | y | main.rs:454:15:454:15 | y |
|
||||
| main.rs:458:9:458:20 | closure3 | main.rs:458:13:458:20 | closure3 | main.rs:461:5:461:12 | closure3 |
|
||||
| main.rs:467:9:467:13 | block | main.rs:467:9:467:13 | block | main.rs:471:5:471:9 | block |
|
||||
| main.rs:471:5:471:15 | <captured exit> i | main.rs:466:13:466:13 | i | main.rs:472:15:472:15 | i |
|
||||
| main.rs:475:8:475:8 | b | main.rs:475:8:475:8 | b | main.rs:479:8:479:8 | b |
|
||||
| main.rs:476:9:476:13 | x | main.rs:476:13:476:13 | x | main.rs:478:15:478:15 | x |
|
||||
| main.rs:479:5:487:5 | phi | main.rs:476:13:476:13 | x | main.rs:488:15:488:15 | x |
|
||||
| main.rs:480:9:480:9 | x | main.rs:476:13:476:13 | x | main.rs:482:19:482:19 | x |
|
||||
| main.rs:484:9:484:9 | x | main.rs:476:13:476:13 | x | main.rs:486:19:486:19 | x |
|
||||
| main.rs:491:13:491:14 | b1 | main.rs:491:13:491:14 | b1 | main.rs:493:8:493:9 | b1 |
|
||||
| main.rs:491:24:491:25 | b2 | main.rs:491:24:491:25 | b2 | main.rs:499:8:499:9 | b2 |
|
||||
| main.rs:492:9:492:9 | x | main.rs:492:9:492:9 | x | main.rs:500:19:500:19 | x |
|
||||
| main.rs:492:9:492:9 | x | main.rs:492:9:492:9 | x | main.rs:502:19:502:19 | x |
|
||||
| main.rs:512:15:512:23 | SelfParam | main.rs:512:20:512:23 | self | main.rs:513:16:513:19 | self |
|
||||
| main.rs:516:11:516:14 | SelfParam | main.rs:516:11:516:14 | self | main.rs:517:9:517:12 | self |
|
||||
| main.rs:521:13:521:17 | f | main.rs:521:17:521:17 | f | main.rs:526:9:526:9 | f |
|
||||
| main.rs:521:21:524:9 | <captured entry> self | main.rs:520:23:520:26 | self | main.rs:523:13:523:16 | self |
|
||||
| main.rs:521:22:521:22 | n | main.rs:521:22:521:22 | n | main.rs:523:25:523:25 | n |
|
||||
| main.rs:540:9:540:13 | a | main.rs:540:13:540:13 | a | main.rs:543:15:543:15 | a |
|
||||
| main.rs:544:5:544:5 | a | main.rs:540:13:540:13 | a | main.rs:545:15:545:15 | a |
|
||||
| main.rs:549:9:549:9 | x | main.rs:549:9:549:9 | x | main.rs:551:15:551:15 | x |
|
||||
| main.rs:553:9:553:9 | z | main.rs:553:9:553:9 | z | main.rs:554:20:554:20 | z |
|
||||
| main.rs:562:10:562:18 | SelfParam | main.rs:562:15:562:18 | self | main.rs:563:6:563:9 | self |
|
||||
| main.rs:593:9:593:22 | var_from_macro | main.rs:593:9:593:22 | var_from_macro | main.rs:595:15:595:28 | var_from_macro |
|
||||
| main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro | main.rs:594:9:594:25 | var_in_macro |
|
||||
| main.rs:596:9:596:20 | var_in_macro | main.rs:596:9:596:20 | var_in_macro | main.rs:601:15:601:26 | var_in_macro |
|
||||
| main.rs:600:15:600:42 | var_in_macro | main.rs:600:15:600:42 | var_in_macro | main.rs:600:30:600:41 | var_in_macro |
|
||||
adjacentReads
|
||||
| main.rs:35:9:35:10 | x3 | main.rs:35:9:35:10 | x3 | main.rs:36:15:36:16 | x3 | main.rs:38:9:38:10 | x3 |
|
||||
| main.rs:43:9:43:10 | x4 | main.rs:43:9:43:10 | x4 | main.rs:44:15:44:16 | x4 | main.rs:49:15:49:16 | x4 |
|
||||
|
||||
@@ -17,10 +17,6 @@ query predicate firstRead(Ssa::Definition def, Variable v, CfgNode read) {
|
||||
def.getSourceVariable() = v and read = def.getAFirstRead()
|
||||
}
|
||||
|
||||
query predicate lastRead(Ssa::Definition def, Variable v, CfgNode read) {
|
||||
def.getSourceVariable() = v and read = def.getALastRead()
|
||||
}
|
||||
|
||||
query predicate adjacentReads(Ssa::Definition def, Variable v, CfgNode read1, CfgNode read2) {
|
||||
def.getSourceVariable() = v and
|
||||
def.hasAdjacentReads(read1, read2)
|
||||
|
||||
@@ -44,7 +44,9 @@ impl<T> MyOption<T> {
|
||||
}
|
||||
}
|
||||
|
||||
// summary=repo::test;<crate::option::MyOption>::as_ref;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// NOTE: The returned value inside the variant should be inside a `Reference`, requires handling
|
||||
// `ref` in patterns.
|
||||
// summary=repo::test;<crate::option::MyOption>::as_ref;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
pub fn as_ref(&self) -> MyOption<&T> {
|
||||
match *self {
|
||||
MySome(ref x) => MySome(x),
|
||||
@@ -52,7 +54,7 @@ impl<T> MyOption<T> {
|
||||
}
|
||||
}
|
||||
|
||||
// summary=repo::test;<crate::option::MyOption>::as_mut;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::as_mut;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
pub fn as_mut(&mut self) -> MyOption<&mut T> {
|
||||
match *self {
|
||||
MySome(ref mut x) => MySome(x),
|
||||
@@ -285,8 +287,11 @@ impl<T> MyOption<T> {
|
||||
}
|
||||
}
|
||||
|
||||
// MISSING: summary=repo::test;<crate::option::MyOption>::insert;Argument[0];ReturnValue;value;dfc-generated
|
||||
// SPURIOUS-summary=repo::test;<crate::option::MyOption>::insert;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::insert;Argument[0];Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// The below should be `ReturnValue.Reference` and not just `ReturnValue`.
|
||||
// SPURIOUS-summary=repo::test;<crate::option::MyOption>::insert;Argument[0];ReturnValue;value;dfc-generated
|
||||
// The content of `self` is overwritten so it does not flow to the return value.
|
||||
// SPURIOUS-summary=repo::test;<crate::option::MyOption>::insert;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
pub fn insert(&mut self, value: T) -> &mut T {
|
||||
*self = MySome(value);
|
||||
|
||||
@@ -294,13 +299,14 @@ impl<T> MyOption<T> {
|
||||
unsafe { self.as_mut().unwrap_unchecked() }
|
||||
}
|
||||
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
// MISSING: repo::test;<crate::option::MyOption>::get_or_insert;Argument[0];ReturnValue;value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert;Argument[0];Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert;Argument[0];ReturnValue;value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
pub fn get_or_insert(&mut self, value: T) -> &mut T {
|
||||
self.get_or_insert_with(|| value)
|
||||
}
|
||||
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert_default;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert_default;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
pub fn get_or_insert_default(&mut self) -> &mut T
|
||||
where
|
||||
T: Default,
|
||||
@@ -308,7 +314,7 @@ impl<T> MyOption<T> {
|
||||
self.get_or_insert_with(T::default)
|
||||
}
|
||||
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert_with;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::get_or_insert_with;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue;value;dfc-generated
|
||||
// MISSING: Mutating `self` parameter.
|
||||
pub fn get_or_insert_with<F>(&mut self, f: F) -> &mut T
|
||||
where
|
||||
@@ -329,7 +335,7 @@ impl<T> MyOption<T> {
|
||||
mem::replace(self, MyNone)
|
||||
}
|
||||
|
||||
// summary=repo::test;<crate::option::MyOption>::take_if;Argument[self].Variant[crate::option::MyOption::MySome(0)];Argument[0].Parameter[0];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::take_if;Argument[self].Reference.Variant[crate::option::MyOption::MySome(0)];Argument[0].Parameter[0];value;dfc-generated
|
||||
// MISSING: Uses `take` which doesn't have flow
|
||||
pub fn take_if<P>(&mut self, predicate: P) -> MyOption<T>
|
||||
where
|
||||
@@ -378,7 +384,7 @@ impl<T, U> MyOption<(T, U)> {
|
||||
}
|
||||
|
||||
impl<T> MyOption<&T> {
|
||||
// summary=repo::test;<crate::option::MyOption>::copied;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::copied;Argument[self].Variant[crate::option::MyOption::MySome(0)].Reference;ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
pub fn copied(self) -> MyOption<T>
|
||||
where
|
||||
T: Copy,
|
||||
@@ -404,7 +410,7 @@ impl<T> MyOption<&T> {
|
||||
}
|
||||
|
||||
impl<T> MyOption<&mut T> {
|
||||
// summary=repo::test;<crate::option::MyOption>::copied;Argument[self].Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption>::copied;Argument[self].Variant[crate::option::MyOption::MySome(0)].Reference;ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
pub fn copied(self) -> MyOption<T>
|
||||
where
|
||||
T: Copy,
|
||||
@@ -474,14 +480,14 @@ impl<T> From<T> for MyOption<T> {
|
||||
}
|
||||
|
||||
impl<'a, T> From<&'a MyOption<T>> for MyOption<&'a T> {
|
||||
// summary=repo::test;<crate::option::MyOption as crate::convert::From>::from;Argument[0].Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption as crate::convert::From>::from;Argument[0].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
fn from(o: &'a MyOption<T>) -> MyOption<&'a T> {
|
||||
o.as_ref()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> From<&'a mut MyOption<T>> for MyOption<&'a mut T> {
|
||||
// summary=repo::test;<crate::option::MyOption as crate::convert::From>::from;Argument[0].Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
// summary=repo::test;<crate::option::MyOption as crate::convert::From>::from;Argument[0].Reference.Variant[crate::option::MyOption::MySome(0)];ReturnValue.Variant[crate::option::MyOption::MySome(0)];value;dfc-generated
|
||||
fn from(o: &'a mut MyOption<T>) -> MyOption<&'a mut T> {
|
||||
o.as_mut()
|
||||
}
|
||||
|
||||
@@ -76,3 +76,15 @@ impl MyStruct {
|
||||
pub fn apply<F>(n: i64, f: F) -> i64 where F : FnOnce(i64) -> i64 {
|
||||
f(n)
|
||||
}
|
||||
|
||||
// Flow out of mutated arguments
|
||||
|
||||
// summary=repo::test;crate::summaries::set_int;Argument[1];Argument[0].Reference;value;dfc-generated
|
||||
pub fn set_int(n: &mut i64, c: i64) {
|
||||
*n = c;
|
||||
}
|
||||
|
||||
// summary=repo::test;crate::summaries::read_int;Argument[0].Reference;ReturnValue;value;dfc-generated
|
||||
pub fn read_int(n: &mut i64) -> i64 {
|
||||
*n
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user