diff --git a/MODULE.bazel b/MODULE.bazel index 474e6df0aba8..3b2532b08afd 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -230,6 +230,7 @@ use_repo( "kotlin-compiler-2.1.0-Beta1", "kotlin-compiler-2.1.20-Beta1", "kotlin-compiler-2.2.0-Beta1", + "kotlin-compiler-2.2.20-Beta2", "kotlin-compiler-embeddable-1.6.0", "kotlin-compiler-embeddable-1.6.20", "kotlin-compiler-embeddable-1.7.0", @@ -242,6 +243,7 @@ use_repo( "kotlin-compiler-embeddable-2.1.0-Beta1", "kotlin-compiler-embeddable-2.1.20-Beta1", "kotlin-compiler-embeddable-2.2.0-Beta1", + "kotlin-compiler-embeddable-2.2.20-Beta2", "kotlin-stdlib-1.6.0", "kotlin-stdlib-1.6.20", "kotlin-stdlib-1.7.0", @@ -254,6 +256,7 @@ use_repo( "kotlin-stdlib-2.1.0-Beta1", "kotlin-stdlib-2.1.20-Beta1", "kotlin-stdlib-2.2.0-Beta1", + "kotlin-stdlib-2.2.20-Beta2", ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index 241e94c0065e..dffad0539b0e 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,7 +1,13 @@ -## 0.4.13 +## 0.4.14 No user-facing changes. +## 0.4.13 + +### Bug Fixes + +* The `actions/artifact-poisoning/critical` and `actions/artifact-poisoning/medium` queries now exclude artifacts downloaded to `$[{ runner.temp }}` in addition to `/tmp`. + ## 0.4.12 ### Minor Analysis Improvements diff --git a/actions/ql/lib/change-notes/2025-07-11-artifact-poisoning.md b/actions/ql/lib/change-notes/2025-07-11-artifact-poisoning.md deleted file mode 100644 index 893a695a22c6..000000000000 --- a/actions/ql/lib/change-notes/2025-07-11-artifact-poisoning.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* The `actions/artifact-poisoning/critical` and `actions/artifact-poisoning/medium` queries now exclude artifacts downloaded to `$[{ runner.temp }}` in addition to `/tmp`. diff --git a/actions/ql/lib/change-notes/released/0.4.13.md b/actions/ql/lib/change-notes/released/0.4.13.md index b061eef7d3b4..1c7fa59a3568 100644 --- a/actions/ql/lib/change-notes/released/0.4.13.md +++ b/actions/ql/lib/change-notes/released/0.4.13.md @@ -1,3 +1,5 @@ ## 0.4.13 -No user-facing changes. +### Bug Fixes + +* The `actions/artifact-poisoning/critical` and `actions/artifact-poisoning/medium` queries now exclude artifacts downloaded to `$[{ runner.temp }}` in addition to `/tmp`. diff --git a/csharp/ql/lib/change-notes/released/5.1.10.md b/actions/ql/lib/change-notes/released/0.4.14.md similarity index 71% rename from csharp/ql/lib/change-notes/released/5.1.10.md rename to actions/ql/lib/change-notes/released/0.4.14.md index f22ccf3e6e9d..09e581963738 100644 --- a/csharp/ql/lib/change-notes/released/5.1.10.md +++ b/actions/ql/lib/change-notes/released/0.4.14.md @@ -1,3 +1,3 @@ -## 5.1.10 +## 0.4.14 No user-facing changes. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 88ad5ab8f224..3841668fe04e 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.13 +lastReleaseVersion: 0.4.14 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 81cda8662de5..dd2723b03157 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.14-dev +version: 0.4.15-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index d0db2aff304d..09fb20778fcf 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.6 + +No user-facing changes. + ## 0.6.5 No user-facing changes. diff --git a/java/ql/lib/change-notes/released/7.3.3.md b/actions/ql/src/change-notes/released/0.6.6.md similarity index 73% rename from java/ql/lib/change-notes/released/7.3.3.md rename to actions/ql/src/change-notes/released/0.6.6.md index 3546e57ff574..ab10d897be1d 100644 --- a/java/ql/lib/change-notes/released/7.3.3.md +++ b/actions/ql/src/change-notes/released/0.6.6.md @@ -1,3 +1,3 @@ -## 7.3.3 +## 0.6.6 No user-facing changes. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index 86780fb61480..f4cae0a77ada 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.5 +lastReleaseVersion: 0.6.6 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index f422500da370..911d1e191682 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.6-dev +version: 0.6.7-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/config/identical-files.json b/config/identical-files.json index 56aac5604734..89beb48acd40 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -231,35 +231,10 @@ "java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.qhelp", "java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qhelp" ], - "CryptoAlgorithms Python/JS/Ruby": [ - "javascript/ql/lib/semmle/javascript/security/CryptoAlgorithms.qll", - "python/ql/lib/semmle/python/concepts/CryptoAlgorithms.qll", - "ruby/ql/lib/codeql/ruby/security/CryptoAlgorithms.qll", - "rust/ql/lib/codeql/rust/security/CryptoAlgorithms.qll" - ], - "CryptoAlgorithmNames Python/JS/Ruby": [ - "javascript/ql/lib/semmle/javascript/security/internal/CryptoAlgorithmNames.qll", - "python/ql/lib/semmle/python/concepts/internal/CryptoAlgorithmNames.qll", - "ruby/ql/lib/codeql/ruby/security/internal/CryptoAlgorithmNames.qll", - "rust/ql/lib/codeql/rust/security/internal/CryptoAlgorithmNames.qll" - ], - "SensitiveDataHeuristics Python/JS": [ - "javascript/ql/lib/semmle/javascript/security/internal/SensitiveDataHeuristics.qll", - "python/ql/lib/semmle/python/security/internal/SensitiveDataHeuristics.qll", - "ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll", - "swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll", - "rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll" - ], "IncompleteUrlSubstringSanitization": [ "javascript/ql/src/Security/CWE-020/IncompleteUrlSubstringSanitization.qll", "ruby/ql/src/queries/security/cwe-020/IncompleteUrlSubstringSanitization.qll" ], - "Concepts Python/Ruby/JS": [ - "python/ql/lib/semmle/python/internal/ConceptsShared.qll", - "ruby/ql/lib/codeql/ruby/internal/ConceptsShared.qll", - "javascript/ql/lib/semmle/javascript/internal/ConceptsShared.qll", - "rust/ql/lib/codeql/rust/internal/ConceptsShared.qll" - ], "ApiGraphModels": [ "javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModels.qll", "ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModels.qll", diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 6b056a683e43..def048bdd3c3 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,11 +1,26 @@ +## 5.4.0 + +### New Features + +* Exposed various SSA-related classes (`Definition`, `PhiNode`, `ExplicitDefinition`, `DirectExplicitDefinition`, and `IndirectExplicitDefinition`) which were previously only usable inside the internal dataflow directory. + +### Minor Analysis Improvements + +* The `cpp/overrun-write` query now recognizes more bound checks and thus produces fewer false positives. + ## 5.3.0 ### Deprecated APIs * The `UnknownDefaultLocation`, `UnknownExprLocation`, and `UnknownStmtLocation` classes have been deprecated. Use `UnknownLocation` instead. +### New Features + +* Added a `isFinalValueOfParameter` predicate to `DataFlow::Node` which holds when a dataflow node represents the final value of an output parameter of a function. + ### Minor Analysis Improvements +* The `FunctionWithWrappers` library (`semmle.code.cpp.security.FunctionWithWrappers`) no longer considers calls through function pointers as wrapper functions. * The analysis of C/C++ code targeting 64-bit Arm platforms has been improved. This includes support for the Arm-specific builtin functions, support for the `arm_neon.h` header and Neon vector types, and support for the `fp8` scalar type. The `arm_sve.h` header and scalable vectors are only partially supported at this point. * Added support for `__fp16 _Complex` and `__bf16 _Complex` types * Added `sql-injection` sink models for the Oracle Call Interface (OCI) database library functions `OCIStmtPrepare` and `OCIStmtPrepare2`. diff --git a/cpp/ql/lib/change-notes/2025-07-10-final.md b/cpp/ql/lib/change-notes/2025-07-10-final.md deleted file mode 100644 index 8e6b3dba2662..000000000000 --- a/cpp/ql/lib/change-notes/2025-07-10-final.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added a `isFinalValueOfParameter` predicate to DataFlow::Node which holds when a dataflow node represents the final value of an output parameter of a function. diff --git a/cpp/ql/lib/change-notes/released/5.3.0.md b/cpp/ql/lib/change-notes/released/5.3.0.md index 439486f3fca1..a7ea151fcf33 100644 --- a/cpp/ql/lib/change-notes/released/5.3.0.md +++ b/cpp/ql/lib/change-notes/released/5.3.0.md @@ -4,8 +4,13 @@ * The `UnknownDefaultLocation`, `UnknownExprLocation`, and `UnknownStmtLocation` classes have been deprecated. Use `UnknownLocation` instead. +### New Features + +* Added a `isFinalValueOfParameter` predicate to `DataFlow::Node` which holds when a dataflow node represents the final value of an output parameter of a function. + ### Minor Analysis Improvements +* The `FunctionWithWrappers` library (`semmle.code.cpp.security.FunctionWithWrappers`) no longer considers calls through function pointers as wrapper functions. * The analysis of C/C++ code targeting 64-bit Arm platforms has been improved. This includes support for the Arm-specific builtin functions, support for the `arm_neon.h` header and Neon vector types, and support for the `fp8` scalar type. The `arm_sve.h` header and scalable vectors are only partially supported at this point. * Added support for `__fp16 _Complex` and `__bf16 _Complex` types * Added `sql-injection` sink models for the Oracle Call Interface (OCI) database library functions `OCIStmtPrepare` and `OCIStmtPrepare2`. diff --git a/cpp/ql/lib/change-notes/released/5.4.0.md b/cpp/ql/lib/change-notes/released/5.4.0.md new file mode 100644 index 000000000000..8c8cea5440c6 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/5.4.0.md @@ -0,0 +1,9 @@ +## 5.4.0 + +### New Features + +* Exposed various SSA-related classes (`Definition`, `PhiNode`, `ExplicitDefinition`, `DirectExplicitDefinition`, and `IndirectExplicitDefinition`) which were previously only usable inside the internal dataflow directory. + +### Minor Analysis Improvements + +* The `cpp/overrun-write` query now recognizes more bound checks and thus produces fewer false positives. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index b0a1c83e5bc9..afb2156eaa2b 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.3.0 +lastReleaseVersion: 5.4.0 diff --git a/cpp/ql/lib/ext/Windows.model.yml b/cpp/ql/lib/ext/Windows.model.yml index 9df7c16850f8..ccebfc9f3401 100644 --- a/cpp/ql/lib/ext/Windows.model.yml +++ b/cpp/ql/lib/ext/Windows.model.yml @@ -36,4 +36,14 @@ extensions: # processthreadsapi.h - ["", "", False, "CreateThread", "", "", "Argument[@3]", "Argument[2].Parameter[@0]", "value", "manual"] - ["", "", False, "CreateRemoteThread", "", "", "Argument[@4]", "Argument[3].Parameter[@0]", "value", "manual"] - - ["", "", False, "CreateRemoteThreadEx", "", "", "Argument[@4]", "Argument[3].Parameter[@0]", "value", "manual"] \ No newline at end of file + - ["", "", False, "CreateRemoteThreadEx", "", "", "Argument[@4]", "Argument[3].Parameter[@0]", "value", "manual"] + # wdm.h + - ["", "", False, "RtlCopyVolatileMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"] + - ["", "", False, "RtlCopyDeviceMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"] + - ["", "", False, "RtlCopyMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"] + - ["", "", False, "RtlCopyMemoryNonTemporal", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"] + - ["", "", False, "RtlCopyUnicodeString", "", "", "Argument[*1].Field[*Buffer]", "Argument[*0].Field[*Buffer]", "value", "manual"] + - ["", "", False, "RtlMoveMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"] + - ["", "", False, "RtlMoveVolatileMemory", "", "", "Argument[*@1]", "Argument[*@0]", "value", "manual"] + # winternl.h + - ["", "", False, "RtlInitUnicodeString", "", "", "Argument[*1]", "Argument[*0].Field[*Buffer]", "value", "manual"] \ No newline at end of file diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index c34c35f239aa..7c1fb8aad1cc 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 5.3.1-dev +version: 5.4.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll index 1e0b39be1ac7..9c6069d4a0c5 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll @@ -15,6 +15,13 @@ class StandardSsa extends SsaHelper { } /** + * NOTE: If possible, prefer the SSA classes exposed by the new dataflow + * library: + * ``` + * import semmle.code.cpp.dataflow.new.DataFlow + * // use `DataFlow::Ssa::Definition` + * ``` + * * A definition of one or more SSA variables, including phi node definitions. * An _SSA variable_, as defined in the literature, is effectively the pair of * an `SsaDefinition d` and a `StackVariable v`, written `(d, v)` in this diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll index 1a4c777af35b..b5e899bf0aac 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll @@ -1,6 +1,5 @@ private import cpp private import semmle.code.cpp.ir.IR -private import semmle.code.cpp.ir.dataflow.DataFlow private import DataFlowPrivate private import DataFlowUtil private import DataFlowImplCommon as DataFlowImplCommon @@ -60,7 +59,7 @@ private module VirtualDispatch { * `resolve` predicate to stitch that information together and resolve the * call. */ - abstract DataFlow::Node getDispatchValue(); + abstract Node getDispatchValue(); /** Gets a candidate target for this call. */ abstract Function resolve(); @@ -72,17 +71,13 @@ private module VirtualDispatch { * parameter is true when the search is allowed to continue backwards into * a parameter; non-recursive callers should pass `_` for `allowFromArg`. */ - predicate flowsFrom(DataFlow::Node src, boolean allowFromArg) { + predicate flowsFrom(Node src, boolean allowFromArg) { src = this.getDispatchValue() and allowFromArg = true or - exists(DataFlow::Node other, boolean allowOtherFromArg | - this.flowsFrom(other, allowOtherFromArg) - | + exists(Node other, boolean allowOtherFromArg | this.flowsFrom(other, allowOtherFromArg) | // Call argument exists(DataFlowCall call, Position i | - other - .(DataFlow::ParameterNode) - .isParameterOf(pragma[only_bind_into](call).getStaticCallTarget(), i) and + other.(ParameterNode).isParameterOf(pragma[only_bind_into](call).getStaticCallTarget(), i) and src.(ArgumentNode).argumentOf(call, pragma[only_bind_into](pragma[only_bind_out](i))) ) and allowOtherFromArg = true and @@ -96,7 +91,7 @@ private module VirtualDispatch { allowFromArg = false or // Local flow - DataFlow::localFlowStep(src, other) and + localFlowStep(src, other) and allowFromArg = allowOtherFromArg or // Flow from global variable to load. @@ -159,11 +154,11 @@ private module VirtualDispatch { private class DataSensitiveExprCall extends DataSensitiveCall { DataSensitiveExprCall() { not exists(this.getStaticCallTarget()) } - override DataFlow::Node getDispatchValue() { result.asOperand() = this.getCallTargetOperand() } + override Node getDispatchValue() { result.asOperand() = this.getCallTargetOperand() } override Function resolve() { exists(FunctionInstruction fi | - this.flowsFrom(DataFlow::instructionNode(fi), _) and + this.flowsFrom(instructionNode(fi), _) and result = fi.getFunctionSymbol() ) and ( @@ -186,7 +181,7 @@ private module VirtualDispatch { ) } - override DataFlow::Node getDispatchValue() { result.asInstruction() = this.getArgument(-1) } + override Node getDispatchValue() { result.asInstruction() = this.getArgument(-1) } override MemberFunction resolve() { exists(Class overridingClass | @@ -213,7 +208,7 @@ private module VirtualDispatch { pragma[noinline] private predicate hasFlowFromCastFrom(Class derivedClass) { exists(ConvertToBaseInstruction toBase | - this.flowsFrom(DataFlow::instructionNode(toBase), _) and + this.flowsFrom(instructionNode(toBase), _) and derivedClass = toBase.getDerivedClass() ) } @@ -270,7 +265,7 @@ private predicate mayBenefitFromCallContext( exists(InitializeParameterInstruction init | not exists(call.getStaticCallTarget()) and init.getEnclosingFunction() = f.getUnderlyingCallable() and - call.flowsFrom(DataFlow::instructionNode(init), _) and + call.flowsFrom(instructionNode(init), _) and init.getParameter().getIndex() = arg ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index d7f26dd00513..f308ee190e7a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -4,7 +4,7 @@ private import semmle.code.cpp.ir.IR private import DataFlowDispatch private import semmle.code.cpp.ir.internal.IRCppLanguage private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl -private import SsaInternals as Ssa +private import SsaImpl as Ssa private import DataFlowImplCommon as DataFlowImplCommon private import codeql.util.Unit private import Node0ToString @@ -1982,19 +1982,23 @@ module IteratorFlow { predicate allowFlowIntoUncertainDef(IteratorSsa::UncertainWriteDefinition def) { any() } + class GuardValue = Void; + class Guard extends Void { - predicate hasBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { + predicate hasValueBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue val + ) { none() } - predicate controlsBranchEdge( - SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch + predicate valueControlsBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue val ) { none() } } - predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) { + predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, GuardValue val) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 38a4d827a4da..bc3dda5fd345 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -13,7 +13,7 @@ private import semmle.code.cpp.models.interfaces.DataFlow private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl private import DataFlowPrivate private import ModelUtil -private import SsaInternals as Ssa +private import SsaImpl as SsaImpl private import DataFlowImplCommon as DataFlowImplCommon private import codeql.util.Unit private import Node0ToString @@ -39,38 +39,39 @@ private newtype TIRDataFlowNode = TNode0(Node0Impl node) { DataFlowImplCommon::forceCachingInSameStage() } or TGlobalLikeVariableNode(GlobalLikeVariable var, int indirectionIndex) { indirectionIndex = - [getMinIndirectionsForType(var.getUnspecifiedType()) .. Ssa::getMaxIndirectionsForType(var.getUnspecifiedType())] + [getMinIndirectionsForType(var.getUnspecifiedType()) .. SsaImpl::getMaxIndirectionsForType(var.getUnspecifiedType())] } or TPostUpdateNodeImpl(Operand operand, int indirectionIndex) { operand = any(FieldAddress fa).getObjectAddressOperand() and - indirectionIndex = [0 .. Ssa::countIndirectionsForCppType(Ssa::getLanguageType(operand))] + indirectionIndex = + [0 .. SsaImpl::countIndirectionsForCppType(SsaImpl::getLanguageType(operand))] or - Ssa::isModifiableByCall(operand, indirectionIndex) + SsaImpl::isModifiableByCall(operand, indirectionIndex) } or - TSsaSynthNode(Ssa::SynthNode n) or + TSsaSynthNode(SsaImpl::SynthNode n) or TSsaIteratorNode(IteratorFlow::IteratorFlowNode n) or TRawIndirectOperand0(Node0Impl node, int indirectionIndex) { - Ssa::hasRawIndirectOperand(node.asOperand(), indirectionIndex) + SsaImpl::hasRawIndirectOperand(node.asOperand(), indirectionIndex) } or TRawIndirectInstruction0(Node0Impl node, int indirectionIndex) { not exists(node.asOperand()) and - Ssa::hasRawIndirectInstruction(node.asInstruction(), indirectionIndex) + SsaImpl::hasRawIndirectInstruction(node.asInstruction(), indirectionIndex) } or TFinalParameterNode(Parameter p, int indirectionIndex) { - exists(Ssa::FinalParameterUse use | + exists(SsaImpl::FinalParameterUse use | use.getParameter() = p and use.getIndirectionIndex() = indirectionIndex ) } or - TFinalGlobalValue(Ssa::GlobalUse globalUse) or - TInitialGlobalValue(Ssa::GlobalDef globalUse) or + TFinalGlobalValue(SsaImpl::GlobalUse globalUse) or + TInitialGlobalValue(SsaImpl::GlobalDef globalUse) or TBodyLessParameterNodeImpl(Parameter p, int indirectionIndex) { // Rule out parameters of catch blocks. not exists(p.getCatchBlock()) and // We subtract one because `getMaxIndirectionsForType` returns the maximum // indirection for a glvalue of a given type, and this doesn't apply to // parameters. - indirectionIndex = [0 .. Ssa::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] and + indirectionIndex = [0 .. SsaImpl::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] and not any(InitializeParameterInstruction init).getParameter() = p } or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) @@ -81,7 +82,7 @@ private newtype TIRDataFlowNode = class FieldAddress extends Operand { FieldAddressInstruction fai; - FieldAddress() { fai = this.getDef() and not Ssa::ignoreOperand(this) } + FieldAddress() { fai = this.getDef() and not SsaImpl::ignoreOperand(this) } /** Gets the field associated with this instruction. */ Field getField() { result = fai.getField() } @@ -126,7 +127,7 @@ predicate conversionFlow( ) or additional = true and - Ssa::isAdditionalConversionFlow(opFrom, instrTo) + SsaImpl::isAdditionalConversionFlow(opFrom, instrTo) ) or isPointerArith = true and @@ -183,7 +184,7 @@ class Node extends TIRDataFlowNode { or this.asOperand().getUse() = block.getInstruction(i) or - exists(Ssa::SynthNode ssaNode | + exists(SsaImpl::SynthNode ssaNode | this.(SsaSynthNode).getSynthNode() = ssaNode and ssaNode.getBasicBlock() = block and ssaNode.getIndex() = i @@ -364,10 +365,10 @@ class Node extends TIRDataFlowNode { * pointed to by `p`. */ Expr asDefinition(boolean uncertain) { - exists(StoreInstruction store, Ssa::Definition def | + exists(StoreInstruction store, SsaImpl::Definition def | store = this.asInstruction() and result = asDefinitionImpl(store) and - Ssa::defToNode(this, def, _) and + SsaImpl::defToNode(this, def, _) and if def.isCertain() then uncertain = false else uncertain = true ) } @@ -627,7 +628,7 @@ class OperandNode extends Node, Node0 { * For example, `stripPointers(int*&)` is `int*` and `stripPointers(int*)` is `int`. */ Type stripPointer(Type t) { - result = any(Ssa::Indirection ind | ind.getType() = t).getBaseType() + result = any(SsaImpl::Indirection ind | ind.getType() = t).getBaseType() or result = t.(PointerToMemberType).getBaseType() or @@ -694,12 +695,12 @@ class PostFieldUpdateNode extends PostUpdateNodeImpl { * in a data flow graph. */ class SsaSynthNode extends Node, TSsaSynthNode { - Ssa::SynthNode node; + SsaImpl::SynthNode node; SsaSynthNode() { this = TSsaSynthNode(node) } /** Gets the synthesized SSA node associated with this node. */ - Ssa::SynthNode getSynthNode() { result = node } + SsaImpl::SynthNode getSynthNode() { result = node } override DataFlowCallable getEnclosingCallable() { result.asSourceCallable() = this.getFunction() @@ -782,12 +783,12 @@ class SideEffectOperandNode extends Node instanceof IndirectOperand { * from a function body. */ class FinalGlobalValue extends Node, TFinalGlobalValue { - Ssa::GlobalUse globalUse; + SsaImpl::GlobalUse globalUse; FinalGlobalValue() { this = TFinalGlobalValue(globalUse) } /** Gets the underlying SSA use. */ - Ssa::GlobalUse getGlobalUse() { result = globalUse } + SsaImpl::GlobalUse getGlobalUse() { result = globalUse } override DataFlowCallable getEnclosingCallable() { result.asSourceCallable() = this.getFunction() @@ -814,12 +815,12 @@ class FinalGlobalValue extends Node, TFinalGlobalValue { * a function body. */ class InitialGlobalValue extends Node, TInitialGlobalValue { - Ssa::GlobalDef globalDef; + SsaImpl::GlobalDef globalDef; InitialGlobalValue() { this = TInitialGlobalValue(globalDef) } /** Gets the underlying SSA definition. */ - Ssa::GlobalDef getGlobalDef() { result = globalDef } + SsaImpl::GlobalDef getGlobalDef() { result = globalDef } override DataFlowCallable getEnclosingCallable() { result.asSourceCallable() = this.getFunction() @@ -1288,11 +1289,11 @@ class UninitializedNode extends Node { LocalVariable v; UninitializedNode() { - exists(Ssa::Definition def, Ssa::SourceVariable sv | + exists(SsaImpl::Definition def, SsaImpl::SourceVariable sv | def.getIndirectionIndex() = 0 and def.getValue().asInstruction() instanceof UninitializedInstruction and - Ssa::defToNode(this, def, sv) and - v = sv.getBaseVariable().(Ssa::BaseIRVariable).getIRVariable().getAst() + SsaImpl::defToNode(this, def, sv) and + v = sv.getBaseVariable().(SsaImpl::BaseIRVariable).getIRVariable().getAst() ) } @@ -1722,7 +1723,7 @@ private module Cached { cached predicate flowsToBackEdge(Node n) { exists(Node succ, IRBlock bb1, IRBlock bb2 | - Ssa::ssaFlow(n, succ) and + SsaImpl::ssaFlow(n, succ) and bb1 = n.getBasicBlock() and bb2 = succ.getBasicBlock() and bb1 != bb2 and @@ -1820,7 +1821,7 @@ private module Cached { predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) { ( // Def-use/Use-use flow - Ssa::ssaFlow(nodeFrom, nodeTo) + SsaImpl::ssaFlow(nodeFrom, nodeTo) or IteratorFlow::localFlowStep(nodeFrom, nodeTo) or @@ -1833,7 +1834,7 @@ private module Cached { | simpleOperandLocalFlowStep(iFrom, opTo) and // Omit when the instruction node also represents the operand. - not iFrom = Ssa::getIRRepresentationOfOperand(opTo) + not iFrom = SsaImpl::getIRRepresentationOfOperand(opTo) ) or // Indirect operand -> (indirect) instruction flow @@ -1906,7 +1907,7 @@ private module Cached { // We also want a write coming out of an `OutNode` to flow `nodeTo`. // This is different from `reverseFlowInstruction` since `nodeFrom` can never // be an `OutNode` when it's defined by an instruction. - Ssa::outNodeHasAddressAndIndex(nodeFrom, address, indirectionIndex) + SsaImpl::outNodeHasAddressAndIndex(nodeFrom, address, indirectionIndex) ) } @@ -2099,7 +2100,7 @@ private newtype TContent = TFieldContent(Field f, int indirectionIndex) { // the indirection index for field content starts at 1 (because `TFieldContent` is thought of as // the address of the field, `FieldAddress` in the IR). - indirectionIndex = [1 .. Ssa::getMaxIndirectionsForType(f.getUnspecifiedType())] and + indirectionIndex = [1 .. SsaImpl::getMaxIndirectionsForType(f.getUnspecifiedType())] and // Reads and writes of union fields are tracked using `UnionContent`. not f.getDeclaringType() instanceof Union } or @@ -2111,7 +2112,9 @@ private newtype TContent = // field can be read by any read of the union's fields. Again, the indirection index // is 1-based (because 0 is considered the address). indirectionIndex = - [1 .. max(Ssa::getMaxIndirectionsForType(getAFieldWithSize(u, bytes).getUnspecifiedType()))] + [1 .. max(SsaImpl::getMaxIndirectionsForType(getAFieldWithSize(u, bytes) + .getUnspecifiedType()) + )] ) } or TElementContent(int indirectionIndex) { @@ -2354,7 +2357,7 @@ module BarrierGuard { controls(g, result, edge) ) or - result = Ssa::BarrierGuard::getABarrierNode() + result = SsaImpl::BarrierGuard::getABarrierNode() } /** @@ -2453,7 +2456,7 @@ module BarrierGuard { ) or result = - Ssa::BarrierGuardWithIntParam::getABarrierNode(indirectionIndex) + SsaImpl::BarrierGuardWithIntParam::getABarrierNode(indirectionIndex) } } @@ -2490,7 +2493,7 @@ module InstructionBarrierGuard::getABarrierNode() + result = SsaImpl::BarrierGuard::getABarrierNode() } bindingset[value, n] @@ -2520,7 +2523,7 @@ module InstructionBarrierGuard::getABarrierNode(indirectionIndex) + SsaImpl::BarrierGuardWithIntParam::getABarrierNode(indirectionIndex) } } @@ -2576,3 +2579,16 @@ Function getARuntimeTarget(Call call) { result = DataFlowImplCommon::viableCallableLambda(dfCall, _).asSourceCallable() ) } + +/** A module that provides static single assignment (SSA) information. */ +module Ssa { + class Definition = SsaImpl::Definition; + + class ExplicitDefinition = SsaImpl::ExplicitDefinition; + + class DirectExplicitDefinition = SsaImpl::DirectExplicitDefinition; + + class IndirectExplicitDefinition = SsaImpl::IndirectExplicitDefinition; + + class PhiNode = SsaImpl::PhiNode; +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll index 055f48c80ec8..f880bee1c1c4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll @@ -4,15 +4,15 @@ */ private import semmle.code.cpp.ir.IR -private import semmle.code.cpp.ir.dataflow.DataFlow +private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs private import DataFlowUtil private import DataFlowPrivate -private import SsaInternals as Ssa +private import SsaImpl as Ssa /** * Gets the instruction that goes into `input` for `call`. */ -DataFlow::Node callInput(CallInstruction call, FunctionInput input) { +Node callInput(CallInstruction call, FunctionInput input) { // An argument or qualifier exists(int index | result.asOperand() = call.getArgumentOperand(index) and @@ -62,8 +62,8 @@ Node callOutput(CallInstruction call, FunctionOutput output) { result = callOutputWithIndirectionIndex(call, output, _) } -DataFlow::Node callInput(CallInstruction call, FunctionInput input, int d) { - exists(DataFlow::Node n | n = callInput(call, input) and d > 0 | +Node callInput(CallInstruction call, FunctionInput input, int d) { + exists(Node n | n = callInput(call, input) and d > 0 | // An argument or qualifier hasOperandAndIndex(result, n.asOperand(), d) or @@ -85,7 +85,7 @@ private IndirectReturnOutNode getIndirectReturnOutNode(CallInstruction call, int */ bindingset[d] Node callOutput(CallInstruction call, FunctionOutput output, int d) { - exists(DataFlow::Node n, int indirectionIndex | + exists(Node n, int indirectionIndex | n = callOutputWithIndirectionIndex(call, output, indirectionIndex) and d > 0 | // The return value diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintDataFlowRelevantIR.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintDataFlowRelevantIR.qll index 2a654828ee54..22550e187ace 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintDataFlowRelevantIR.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintDataFlowRelevantIR.qll @@ -1,6 +1,6 @@ private import cpp private import semmle.code.cpp.ir.IR -private import SsaInternals as Ssa +private import SsaImpl as Ssa /** * A property provider that hides all instructions and operands that are not relevant for IR dataflow. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll index cf612ce73687..e310db319319 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll @@ -2,7 +2,7 @@ private import cpp private import semmle.code.cpp.ir.IR private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate -private import SsaInternals as Ssa +private import SsaImpl as Ssa private import PrintIRUtilities /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll similarity index 90% rename from cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index fd9ba967a13d..3af2ea38a641 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1,4 +1,4 @@ -private import codeql.ssa.Ssa as SsaImplCommon +private import codeql.ssa.Ssa as Ssa private import semmle.code.cpp.ir.IR private import DataFlowUtil private import DataFlowImplCommon as DataFlowImplCommon @@ -12,7 +12,7 @@ private import semmle.code.cpp.ir.internal.IRCppLanguage private import semmle.code.cpp.ir.dataflow.internal.ModelUtil private import semmle.code.cpp.ir.implementation.raw.internal.TranslatedInitialization private import DataFlowPrivate -import SsaInternalsCommon +import SsaImplCommon private module SourceVariables { cached @@ -884,7 +884,7 @@ private predicate baseSourceVariableIsGlobal( ) } -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaInput implements Ssa::InputSig { import InputSigCommon import SourceVariables @@ -958,9 +958,11 @@ class GlobalDef extends Definition { GlobalLikeVariable getVariable() { result = impl.getVariable() } } -private module SsaImpl = SsaImplCommon::Make; +private module SsaImpl = Ssa::Make; private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationInputSig { + private import codeql.util.Boolean + class Expr extends Instruction { Expr() { exists(IRBlock bb, int i | @@ -992,10 +994,14 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI result instanceof FalseEdge } + class GuardValue = Boolean; + class Guard instanceof IRGuards::IRGuardCondition { string toString() { result = super.toString() } - predicate hasBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { + predicate hasValueBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch + ) { exists(EdgeKind kind | super.getBlock() = bb1 and kind = getConditionalEdge(branch) and @@ -1003,12 +1009,14 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI ) } - predicate controlsBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { - this.hasBranchEdge(bb1, bb2, branch) + predicate valueControlsBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch + ) { + this.hasValueBranchEdge(bb1, bb2, branch) } } - predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) { + predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, GuardValue branch) { guard.(IRGuards::IRGuardCondition).controls(bb, branch) } @@ -1037,7 +1045,8 @@ module BarrierGuardWithIntParam { } private predicate guardChecks( - DataFlowIntegrationInput::Guard g, SsaImpl::Definition def, boolean branch, int indirectionIndex + DataFlowIntegrationInput::Guard g, SsaImpl::Definition def, + DataFlowIntegrationInput::GuardValue branch, int indirectionIndex ) { exists(UseImpl use | guardChecksNode(g, use.getNode(), branch, indirectionIndex) and @@ -1116,9 +1125,11 @@ class PhiNode extends Definition instanceof SsaImpl::PhiNode { /** An static single assignment (SSA) definition. */ class Definition extends SsaImpl::Definition { - // TODO: Include prior definitions of uncertain writes or rename predicate - // i.e. the disjunct `SsaImpl::uncertainWriteDefinitionInput(this, result)` - private Definition getAPhiInputOrPriorDefinition() { result = this.(PhiNode).getAnInput() } + private Definition getAPhiInputOrPriorDefinition() { + result = this.(PhiNode).getAnInput() + or + SsaImpl::uncertainWriteDefinitionInput(this, result) + } /** * Gets a definition that ultimately defines this SSA definition and is @@ -1129,6 +1140,36 @@ class Definition extends SsaImpl::Definition { not result instanceof PhiNode } + /** Gets an `Operand` that represents a use of this definition. */ + Operand getAUse() { + exists(SourceVariable sv, IRBlock bb, int i, UseImpl use | + ssaDefReachesRead(sv, this, bb, i) and + use.hasIndexInBlock(bb, i, sv) and + result = use.getNode().asOperand() + ) + } + + /** + * Gets an `Operand` that represents an indirect use of this definition. + * + * The use is indirect because the operand represents a pointer that points + * to the value written by this definition. For example in: + * ```cpp + * 1. int x = 42; + * 2. int* p = &x; + * ``` + * There is an `ExplicitDefinition` corresponding to `x = 42` on line 1 and + * the definition has an indirect use on line 2 because `&x` points to the + * value that was defined by the definition. + */ + Operand getAnIndirectUse(int indirectionIndex) { + exists(SourceVariable sv, IRBlock bb, int i, UseImpl use | + ssaDefReachesRead(sv, this, bb, i) and + use.hasIndexInBlock(bb, i, sv) and + result = use.getNode().asIndirectOperand(indirectionIndex) + ) + } + /** * INTERNAL: Do not use. */ @@ -1161,4 +1202,63 @@ class Definition extends SsaImpl::Definition { Type getUnspecifiedType() { result = this.getUnderlyingType().getUnspecifiedType() } } +/** + * An SSA definition that corresponds to an explicit definition. + */ +class ExplicitDefinition extends Definition, SsaImpl::WriteDefinition { + DefImpl def; + + ExplicitDefinition() { + exists(IRBlock bb, int i, SourceVariable sv | + this.definesAt(sv, bb, i) and + def.hasIndexInBlock(sv, bb, i) + ) + } + + /** + * Gets the `Instruction` computing the value that is written to the + * associated SSA variable by this SSA definition. + * + * If `this.getIndirectionIndex() = 0` (i.e., if `this` is an instance of + * `DirectExplicitDefinition`) then the SSA variable is present in the source + * code. + * However, if `this.getIndirectionIndex() > 0` (i.e., if `this` is an + * instance of `IndirectExplicitDefinition`) then the SSA variable associated + * with this definition represents the memory pointed to by a variable in the + * source code. + */ + Instruction getAssignedInstruction() { result = def.getValue().asInstruction() } +} + +/** + * An explicit SSA definition that writes an indirect value to a pointer. + * + * For example in: + * ```cpp + * int x = 42; // (1) + * int* p = &x; // (2) + * ``` + * There are three `ExplicitDefinition`: + * 1. A `DirectExplicitDefinition` at (1) which writes `42` to the SSA variable + * corresponding to `x`. + * 2. A `DirectExplicitDefinition` at (2) which writes `&x` to the SSA variable + * corresponding to `p`. + * 3. A `IndirectExplicitDefinition` at (2) which writes `*&x` (i.e., `x`) to + * the SSA variable corresponding to `*p`. + */ +class IndirectExplicitDefinition extends ExplicitDefinition { + IndirectExplicitDefinition() { this.getIndirectionIndex() > 0 } +} + +/** + * An SSA definition that corresponds to an explicit definition. + * + * Unlike `ExplicitDefinition` this class does not include indirect + * explicit definition. See `IndirectExplicitDefinition` if you want to include + * those. + */ +class DirectExplicitDefinition extends ExplicitDefinition { + DirectExplicitDefinition() { this.getIndirectionIndex() = 0 } +} + import SsaCached diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll similarity index 100% rename from cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternalsCommon.qll rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll index 83fac3ebb49a..f190569330f5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll @@ -5,7 +5,7 @@ private import semmle.code.cpp.models.interfaces.DataFlow private import semmle.code.cpp.models.interfaces.SideEffect private import DataFlowUtil private import DataFlowPrivate -private import SsaInternals as Ssa +private import SsaImpl as Ssa private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl private import semmle.code.cpp.ir.dataflow.FlowSteps diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll index bd1ffcd5ce15..d8c1c6115c80 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll @@ -42,6 +42,7 @@ private newtype TOpcode = TCompareGT() or TCompareLE() or TCompareGE() or + TSpaceship() or TPointerAdd() or TPointerSub() or TPointerDiff() or @@ -92,7 +93,9 @@ private newtype TOpcode = TUninitializedGroup() or TInlineAsm() or TUnreached() or - TNewObj() + TNewObj() or + TTypeidExpr() or + TTypeidType() /** * An opcode that specifies the operation performed by an `Instruction`. @@ -763,6 +766,15 @@ module Opcode { final override string toString() { result = "CompareGE" } } + /** + * The `Opcode` for a `SpaceshipInstruction`. + * + * See the `SpaceshipInstruction` documentation for more details. + */ + class Spaceship extends BinaryOpcode, TSpaceship { + final override string toString() { result = "Spaceship" } + } + /** * The `Opcode` for a `PointerAddInstruction`. * @@ -1281,4 +1293,29 @@ module Opcode { class NewObj extends Opcode, TNewObj { final override string toString() { result = "NewObj" } } + + /** + * The `Opcode` for a `TypeidInstruction`. + * + * See the `TypeidInstruction` documentation for more details. + */ + abstract class Typeid extends Opcode { } + + /** + * The `Opcode` for a `TypeidExprInstruction`. + * + * See the `TypeidExprInstruction` documentation for more details. + */ + class TypeidExpr extends Typeid, UnaryOpcode, TTypeidExpr { + final override string toString() { result = "TypeidExpr" } + } + + /** + * The `Opcode` for a `TypeidTypeInstruction`. + * + * See the `TypeidTypeInstruction` documentation for more details. + */ + class TypeidType extends Typeid, TTypeidType { + final override string toString() { result = "TypeidType" } + } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 96c18a04ff7b..a564508e16b4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -1604,6 +1604,13 @@ class CompareGEInstruction extends RelationalInstruction { override predicate isStrict() { none() } } +/** + * An instruction that represents a three-way comparison operator. + */ +class SpaceshipInstruction extends BinaryInstruction { + SpaceshipInstruction() { this.getOpcode() instanceof Opcode::Spaceship } +} + /** * An instruction that branches to one of multiple successor instructions based on the value of an * integer operand. @@ -2293,3 +2300,26 @@ class NextVarArgInstruction extends UnaryInstruction { class NewObjInstruction extends Instruction { NewObjInstruction() { this.getOpcode() instanceof Opcode::NewObj } } + +/** + * An instruction that returns the type info for its operand. + */ +class TypeidInstruction extends Instruction { + TypeidInstruction() { this.getOpcode() instanceof Opcode::Typeid } +} + +/** + * An instruction that returns the type info for its operand, where the + * operand occurs as an expression in the AST. + */ +class TypeidExprInstruction extends TypeidInstruction, UnaryInstruction { + TypeidExprInstruction() { this.getOpcode() instanceof Opcode::TypeidExpr } +} + +/** + * An instruction that returns the type info for its operand, where the + * operand occurs as a type in the AST. + */ +class TypeidTypeInstruction extends TypeidInstruction { + TypeidTypeInstruction() { this.getOpcode() instanceof Opcode::TypeidType } +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 96c18a04ff7b..a564508e16b4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -1604,6 +1604,13 @@ class CompareGEInstruction extends RelationalInstruction { override predicate isStrict() { none() } } +/** + * An instruction that represents a three-way comparison operator. + */ +class SpaceshipInstruction extends BinaryInstruction { + SpaceshipInstruction() { this.getOpcode() instanceof Opcode::Spaceship } +} + /** * An instruction that branches to one of multiple successor instructions based on the value of an * integer operand. @@ -2293,3 +2300,26 @@ class NextVarArgInstruction extends UnaryInstruction { class NewObjInstruction extends Instruction { NewObjInstruction() { this.getOpcode() instanceof Opcode::NewObj } } + +/** + * An instruction that returns the type info for its operand. + */ +class TypeidInstruction extends Instruction { + TypeidInstruction() { this.getOpcode() instanceof Opcode::Typeid } +} + +/** + * An instruction that returns the type info for its operand, where the + * operand occurs as an expression in the AST. + */ +class TypeidExprInstruction extends TypeidInstruction, UnaryInstruction { + TypeidExprInstruction() { this.getOpcode() instanceof Opcode::TypeidExpr } +} + +/** + * An instruction that returns the type info for its operand, where the + * operand occurs as a type in the AST. + */ +class TypeidTypeInstruction extends TypeidInstruction { + TypeidTypeInstruction() { this.getOpcode() instanceof Opcode::TypeidType } +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index dea86499e7ca..a7e85fe9b1a5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -1808,6 +1808,11 @@ private Opcode comparisonOpcode(ComparisonOperation expr) { expr instanceof GEExpr and result instanceof Opcode::CompareGE } +private Opcode spaceShipOpcode(SpaceshipExpr expr) { + exists(expr) and + result instanceof Opcode::Spaceship +} + /** * IR translation of a simple binary operation. */ @@ -1867,7 +1872,8 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr { override Opcode getOpcode() { result = binaryArithmeticOpcode(expr) or result = binaryBitwiseOpcode(expr) or - result = comparisonOpcode(expr) + result = comparisonOpcode(expr) or + result = spaceShipOpcode(expr) } override Type getExprType() { @@ -4185,3 +4191,52 @@ class TranslatedAssumeExpr extends TranslatedSingleInstructionExpr { none() } } + +class TranslatedTypeidExpr extends TranslatedSingleInstructionExpr { + override TypeidOperator expr; + + final override Opcode getOpcode() { + exists(this.getOperand()) and + result instanceof Opcode::TypeidExpr + or + not exists(this.getOperand()) and + result instanceof Opcode::TypeidType + } + + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getOperand().getFirstInstruction(kind) + or + not exists(this.getOperand()) and + result = this.getInstruction(OnlyInstructionTag()) and + kind instanceof GotoEdge + } + + override Instruction getALastInstructionInternal() { + result = this.getInstruction(OnlyInstructionTag()) + } + + final override TranslatedElement getChildInternal(int id) { + id = 0 and result = this.getOperand() + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + tag = OnlyInstructionTag() and + result = this.getParent().getChildSuccessor(this, kind) + } + + final override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + child = this.getOperand() and + result = this.getInstruction(OnlyInstructionTag()) and + kind instanceof GotoEdge + } + + final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = OnlyInstructionTag() and + result = this.getOperand().getResult() and + operandTag instanceof UnaryOperandTag + } + + private TranslatedExpr getOperand() { + result = getTranslatedExpr(expr.getExpr().getFullyConverted()) + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 96c18a04ff7b..a564508e16b4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -1604,6 +1604,13 @@ class CompareGEInstruction extends RelationalInstruction { override predicate isStrict() { none() } } +/** + * An instruction that represents a three-way comparison operator. + */ +class SpaceshipInstruction extends BinaryInstruction { + SpaceshipInstruction() { this.getOpcode() instanceof Opcode::Spaceship } +} + /** * An instruction that branches to one of multiple successor instructions based on the value of an * integer operand. @@ -2293,3 +2300,26 @@ class NextVarArgInstruction extends UnaryInstruction { class NewObjInstruction extends Instruction { NewObjInstruction() { this.getOpcode() instanceof Opcode::NewObj } } + +/** + * An instruction that returns the type info for its operand. + */ +class TypeidInstruction extends Instruction { + TypeidInstruction() { this.getOpcode() instanceof Opcode::Typeid } +} + +/** + * An instruction that returns the type info for its operand, where the + * operand occurs as an expression in the AST. + */ +class TypeidExprInstruction extends TypeidInstruction, UnaryInstruction { + TypeidExprInstruction() { this.getOpcode() instanceof Opcode::TypeidExpr } +} + +/** + * An instruction that returns the type info for its operand, where the + * operand occurs as a type in the AST. + */ +class TypeidTypeInstruction extends TypeidInstruction { + TypeidTypeInstruction() { this.getOpcode() instanceof Opcode::TypeidType } +} diff --git a/cpp/ql/lib/semmle/code/cpp/security/FunctionWithWrappers.qll b/cpp/ql/lib/semmle/code/cpp/security/FunctionWithWrappers.qll index b7a7a95a4271..b66731678475 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/FunctionWithWrappers.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/FunctionWithWrappers.qll @@ -17,7 +17,6 @@ import cpp import PrintfLike -private import semmle.code.cpp.ir.dataflow.ResolveCall bindingset[index] private string toCause(Function func, int index) { @@ -37,9 +36,9 @@ private predicate wrapperFunctionStep( not target.isVirtual() and not source.isVirtual() and source.hasDefinition() and - exists(Call call, Expr arg, Parameter sourceParam | + exists(FunctionCall call, Expr arg, Parameter sourceParam | // there is a 'call' to 'target' with argument 'arg' at index 'targetParamIndex' - target = resolveCall(call) and + target = call.getTarget() and arg = call.getArgument(targetParamIndex) and // 'call' is enclosed in 'source' source = call.getEnclosingFunction() and @@ -154,8 +153,8 @@ abstract class FunctionWithWrappers extends Function { * Whether 'arg' is an argument in a call to an outermost wrapper function of 'this' function. */ predicate outermostWrapperFunctionCall(Expr arg, string callChain) { - exists(Function targetFunc, Call call, int argIndex | - targetFunc = resolveCall(call) and + exists(Function targetFunc, FunctionCall call, int argIndex | + targetFunc = call.getTarget() and this.wrapperFunction(targetFunc, argIndex, callChain) and ( exists(Function sourceFunc | sourceFunc = call.getEnclosingFunction() | diff --git a/cpp/ql/lib/semmle/code/cpp/security/InvalidPointerDereference/AllocationToInvalidPointer.qll b/cpp/ql/lib/semmle/code/cpp/security/InvalidPointerDereference/AllocationToInvalidPointer.qll index 223d0abf1d4e..2fea5327720a 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/InvalidPointerDereference/AllocationToInvalidPointer.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/InvalidPointerDereference/AllocationToInvalidPointer.qll @@ -53,44 +53,12 @@ private import cpp private import semmle.code.cpp.ir.dataflow.internal.ProductFlow +private import semmle.code.cpp.security.ProductFlowUtils.ProductFlowUtils private import semmle.code.cpp.ir.ValueNumbering private import semmle.code.cpp.controlflow.IRGuards private import codeql.util.Unit private import semmle.code.cpp.rangeanalysis.new.RangeAnalysisUtil -private VariableAccess getAVariableAccess(Expr e) { e.getAChild*() = result } - -/** - * Gets a (sub)expression that may be the result of evaluating `size`. - * - * For example, `getASizeCandidate(a ? b : c)` gives `a ? b : c`, `b` and `c`. - */ -bindingset[size] -pragma[inline_late] -private Expr getASizeCandidate(Expr size) { - result = size - or - result = [size.(ConditionalExpr).getThen(), size.(ConditionalExpr).getElse()] -} - -/** - * Holds if the `(n, state)` pair represents the source of flow for the size - * expression associated with `alloc`. - */ -predicate hasSize(HeuristicAllocationExpr alloc, DataFlow::Node n, int state) { - exists(VariableAccess va, Expr size, int delta, Expr s | - size = alloc.getSizeExpr() and - s = getASizeCandidate(size) and - // Get the unique variable in a size expression like `x` in `malloc(x + 1)`. - va = unique( | | getAVariableAccess(s)) and - // Compute `delta` as the constant difference between `x` and `x + 1`. - bounded1(any(Instruction instr | instr.getUnconvertedResultExpression() = s), - any(LoadInstruction load | load.getUnconvertedResultExpression() = va), delta) and - n.asExpr() = va and - state = delta - ) -} - /** * Gets the virtual dispatch branching limit when calculating field flow while searching * for flow from an allocation to the construction of an out-of-bounds pointer. @@ -100,125 +68,6 @@ predicate hasSize(HeuristicAllocationExpr alloc, DataFlow::Node n, int state) { */ int allocationToInvalidPointerFieldFlowBranchLimit() { result = 0 } -/** - * A module that encapsulates a barrier guard to remove false positives from flow like: - * ```cpp - * char *p = new char[size]; - * // ... - * unsigned n = size; - * // ... - * if(n < size) { - * use(*p[n]); - * } - * ``` - * In this case, the sink pair identified by the product flow library (without any additional barriers) - * would be `(p, n)` (where `n` is the `n` in `p[n]`), because there exists a pointer-arithmetic - * instruction `pai = a + b` such that: - * 1. the allocation flows to `a`, and - * 2. `b <= n` where `n` is the `n` in `p[n]` - * but because there's a strict comparison that compares `n` against the size of the allocation this - * snippet is fine. - */ -private module SizeBarrier { - private module SizeBarrierConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { - // The sources is the same as in the sources for the second - // projection in the `AllocToInvalidPointerConfig` module. - hasSize(_, source, _) and - InterestingPointerAddInstruction::isInterestingSize(source) - } - - int fieldFlowBranchLimit() { result = allocationToInvalidPointerFieldFlowBranchLimit() } - - /** - * Holds if `small <= large + k` holds if `g` evaluates to `testIsTrue`. - */ - additional predicate isSink( - DataFlow::Node small, DataFlow::Node large, IRGuardCondition g, int k, boolean testIsTrue - ) { - // The sink is any "large" side of a relational comparison. i.e., the `large` expression - // in a guard such as `small <= large + k`. - g.comparesLt(small.asOperand(), large.asOperand(), k + 1, true, testIsTrue) - } - - predicate isSink(DataFlow::Node sink) { isSink(_, sink, _, _, _) } - } - - module SizeBarrierFlow = DataFlow::Global; - - private int getASizeAddend(DataFlow::Node node) { - exists(DataFlow::Node source | - SizeBarrierFlow::flow(source, node) and - hasSize(_, source, result) - ) - } - - /** - * Holds if `small <= large + k` holds if `g` evaluates to `edge`. - */ - private predicate operandGuardChecks( - IRGuardCondition g, Operand small, DataFlow::Node large, int k, boolean edge - ) { - SizeBarrierFlow::flowTo(large) and - SizeBarrierConfig::isSink(DataFlow::operandNode(small), large, g, k, edge) - } - - /** - * Gets an instruction `instr` that is guarded by a check such as `instr <= small + delta` where - * `small <= _ + k` and `small` is the "small side" of of a relational comparison that checks - * whether `small <= size` where `size` is the size of an allocation. - */ - Instruction getABarrierInstruction0(int delta, int k) { - exists( - IRGuardCondition g, ValueNumber value, Operand small, boolean edge, DataFlow::Node large - | - // We know: - // 1. result <= value + delta (by `bounded`) - // 2. value <= large + k (by `operandGuardChecks`). - // So: - // result <= value + delta (by 1.) - // <= large + k + delta (by 2.) - small = value.getAUse() and - operandGuardChecks(pragma[only_bind_into](g), pragma[only_bind_into](small), large, - pragma[only_bind_into](k), pragma[only_bind_into](edge)) and - bounded(result, value.getAnInstruction(), delta) and - g.controls(result.getBlock(), edge) and - k < getASizeAddend(large) - ) - } - - /** - * Gets an instruction that is guarded by a guard condition which ensures that - * the value of the instruction is upper-bounded by size of some allocation. - */ - bindingset[state] - pragma[inline_late] - Instruction getABarrierInstruction(int state) { - exists(int delta, int k | - state > k + delta and - // result <= "size of allocation" + delta + k - // < "size of allocation" + state - result = getABarrierInstruction0(delta, k) - ) - } - - /** - * Gets a `DataFlow::Node` that is guarded by a guard condition which ensures that - * the value of the node is upper-bounded by size of some allocation. - */ - DataFlow::Node getABarrierNode(int state) { - exists(DataFlow::Node source, int delta, int k | - SizeBarrierFlow::flow(source, result) and - hasSize(_, source, state) and - result.asInstruction() = SizeBarrier::getABarrierInstruction0(delta, k) and - state > k + delta - // so now we have: - // result <= "size of allocation" + delta + k - // < "size of allocation" + state - ) - } -} - private module InterestingPointerAddInstruction { private module PointerAddInstructionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { @@ -227,7 +76,7 @@ private module InterestingPointerAddInstruction { hasSize(source.asExpr(), _, _) } - int fieldFlowBranchLimit() { result = allocationToInvalidPointerFieldFlowBranchLimit() } + predicate fieldFlowBranchLimit = allocationToInvalidPointerFieldFlowBranchLimit/0; predicate isSink(DataFlow::Node sink) { sink.asInstruction() = any(PointerAddInstruction pai).getLeft() @@ -263,6 +112,17 @@ private module InterestingPointerAddInstruction { } } +private module SizeBarrierInput implements SizeBarrierInputSig { + predicate fieldFlowBranchLimit = allocationToInvalidPointerFieldFlowBranchLimit/0; + + predicate isSource(DataFlow::Node source) { + // The sources is the same as in the sources for the second + // projection in the `AllocToInvalidPointerConfig` module. + hasSize(_, source, _) and + InterestingPointerAddInstruction::isInterestingSize(source) + } +} + /** * A product-flow configuration for flow from an `(allocation, size)` pair to a * pointer-arithmetic operation `pai` such that `pai <= allocation + size`. @@ -301,7 +161,7 @@ private module Config implements ProductFlow::StateConfigSig { private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate predicate isBarrier2(DataFlow::Node node, FlowState2 state) { - node = SizeBarrier::getABarrierNode(state) + node = SizeBarrier::getABarrierNode(state) } predicate isBarrier2(DataFlow::Node node) { @@ -357,8 +217,8 @@ private predicate pointerAddInstructionHasBounds0( sizeInstr = sizeSink.asInstruction() and // pai.getRight() <= sizeSink + delta bounded1(right, sizeInstr, delta) and - not right = SizeBarrier::getABarrierInstruction(delta) and - not sizeInstr = SizeBarrier::getABarrierInstruction(delta) + not right = SizeBarrier::getABarrierInstruction(delta) and + not sizeInstr = SizeBarrier::getABarrierInstruction(delta) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/security/ProductFlowUtils/ProductFlowUtils.qll b/cpp/ql/lib/semmle/code/cpp/security/ProductFlowUtils/ProductFlowUtils.qll new file mode 100644 index 000000000000..151c5d1ae22a --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/security/ProductFlowUtils/ProductFlowUtils.qll @@ -0,0 +1,167 @@ +/** + * This file provides the `SizeBarrier` module which provides barriers for + * both the `cpp/invalid-pointer-deref` query and the `cpp/overrun-write` + * query. + */ + +private import cpp +private import semmle.code.cpp.dataflow.new.DataFlow +private import semmle.code.cpp.ir.ValueNumbering +private import semmle.code.cpp.controlflow.IRGuards +private import semmle.code.cpp.rangeanalysis.new.RangeAnalysisUtil + +private VariableAccess getAVariableAccess(Expr e) { e.getAChild*() = result } + +/** + * Gets a (sub)expression that may be the result of evaluating `size`. + * + * For example, `getASizeCandidate(a ? b : c)` gives `a ? b : c`, `b` and `c`. + */ +bindingset[size] +pragma[inline_late] +private Expr getASizeCandidate(Expr size) { + result = size + or + result = [size.(ConditionalExpr).getThen(), size.(ConditionalExpr).getElse()] +} + +/** + * Holds if the `(n, state)` pair represents the source of flow for the size + * expression associated with `alloc`. + */ +predicate hasSize(HeuristicAllocationExpr alloc, DataFlow::Node n, int state) { + exists(VariableAccess va, Expr size, int delta, Expr s | + size = alloc.getSizeExpr() and + s = getASizeCandidate(size) and + // Get the unique variable in a size expression like `x` in `malloc(x + 1)`. + va = unique( | | getAVariableAccess(s)) and + // Compute `delta` as the constant difference between `x` and `x + 1`. + bounded1(any(Instruction instr | instr.getUnconvertedResultExpression() = s), + any(LoadInstruction load | load.getUnconvertedResultExpression() = va), delta) and + n.asExpr() = va and + state = delta + ) +} + +/** Provides the input specification of the `SizeBarrier` module. */ +signature module SizeBarrierInputSig { + /** Gets the virtual dispatch branching limit when calculating field flow. */ + int fieldFlowBranchLimit(); + + /** Holds if `source` is a relevant data flow source. */ + predicate isSource(DataFlow::Node source); +} + +/** + * A module that encapsulates a barrier guard to remove false positives from flow like: + * ```cpp + * char *p = new char[size]; + * // ... + * unsigned n = size; + * // ... + * if(n < size) { + * use(*p[n]); + * } + * ``` + * In this case, the sink pair identified by the product flow library (without any additional barriers) + * would be `(p, n)` (where `n` is the `n` in `p[n]`), because there exists a pointer-arithmetic + * instruction `pai = a + b` such that: + * 1. the allocation flows to `a`, and + * 2. `b <= n` where `n` is the `n` in `p[n]` + * but because there's a strict comparison that compares `n` against the size of the allocation this + * snippet is fine. + */ +module SizeBarrier { + private module SizeBarrierConfig implements DataFlow::ConfigSig { + predicate isSource = Input::isSource/1; + + predicate fieldFlowBranchLimit = Input::fieldFlowBranchLimit/0; + + /** + * Holds if `small <= large + k` holds if `g` evaluates to `testIsTrue`. + */ + additional predicate isSink( + DataFlow::Node small, DataFlow::Node large, IRGuardCondition g, int k, boolean testIsTrue + ) { + // The sink is any "large" side of a relational comparison. i.e., the `large` expression + // in a guard such as `small <= large + k`. + g.comparesLt(small.asOperand(), large.asOperand(), k + 1, true, testIsTrue) + } + + predicate isSink(DataFlow::Node sink) { isSink(_, sink, _, _, _) } + } + + private module SizeBarrierFlow = DataFlow::Global; + + private int getASizeAddend(DataFlow::Node node) { + exists(DataFlow::Node source | + SizeBarrierFlow::flow(source, node) and + hasSize(_, source, result) + ) + } + + /** + * Holds if `small <= large + k` holds if `g` evaluates to `edge`. + */ + private predicate operandGuardChecks( + IRGuardCondition g, Operand small, DataFlow::Node large, int k, boolean edge + ) { + SizeBarrierFlow::flowTo(large) and + SizeBarrierConfig::isSink(DataFlow::operandNode(small), large, g, k, edge) + } + + /** + * Gets an instruction `instr` that is guarded by a check such as `instr <= small + delta` where + * `small <= _ + k` and `small` is the "small side" of a relational comparison that checks + * whether `small <= size` where `size` is the size of an allocation. + */ + private Instruction getABarrierInstruction0(int delta, int k) { + exists( + IRGuardCondition g, ValueNumber value, Operand small, boolean edge, DataFlow::Node large + | + // We know: + // 1. result <= value + delta (by `bounded`) + // 2. value <= large + k (by `operandGuardChecks`). + // So: + // result <= value + delta (by 1.) + // <= large + k + delta (by 2.) + small = value.getAUse() and + operandGuardChecks(pragma[only_bind_into](g), pragma[only_bind_into](small), large, + pragma[only_bind_into](k), pragma[only_bind_into](edge)) and + bounded(result, value.getAnInstruction(), delta) and + g.controls(result.getBlock(), edge) and + k < getASizeAddend(large) + ) + } + + /** + * Gets an instruction that is guarded by a guard condition which ensures that + * the value of the instruction is upper-bounded by size of some allocation. + */ + bindingset[state] + pragma[inline_late] + Instruction getABarrierInstruction(int state) { + exists(int delta, int k | + state > k + delta and + // result <= "size of allocation" + delta + k + // < "size of allocation" + state + result = getABarrierInstruction0(delta, k) + ) + } + + /** + * Gets a `DataFlow::Node` that is guarded by a guard condition which ensures that + * the value of the node is upper-bounded by size of some allocation. + */ + DataFlow::Node getABarrierNode(int state) { + exists(DataFlow::Node source, int delta, int k | + SizeBarrierFlow::flow(source, result) and + hasSize(_, source, state) and + result.asInstruction() = getABarrierInstruction0(delta, k) and + state > k + delta + // so now we have: + // result <= "size of allocation" + delta + k + // < "size of allocation" + state + ) + } +} diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 8fd203bea4f2..589dfb68e1ef 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,8 +1,18 @@ +## 1.4.5 + +### Minor Analysis Improvements + +* The "Initialization code not run" query (`cpp/initialization-not-run`) no longer reports an alert on static global variables that have no dereference. + ## 1.4.4 ### Minor Analysis Improvements +* Due to changes in the `FunctionWithWrappers` library (`semmle.code.cpp.security.FunctionWithWrappers`) the primary alert location generated by the queries `cpp/path-injection`, `cpp/sql-injection`, `cpp/tainted-format-string`, and `cpp/command-line-injection` may have changed. * Added flow models for the Win32 API functions `CreateThread`, `CreateRemoteThread`, and `CreateRemoteThreadEx`. +* Improved support for dataflow through function objects and lambda expressions. +* Added flow models for `pthread_create` and `std::thread`. +* The `cpp/incorrect-string-type-conversion` query no longer alerts on incorrect type conversions that occur in unreachable code. * Added flow models for the GNU C Library. * Fixed a number of false positives and false negatives in `cpp/global-use-before-init`. Note that this query is not part of any of the default query suites. * The query `cpp/sql-injection` now can be extended using the `sql-injection` Models as Data (MaD) sink kind. diff --git a/cpp/ql/src/Critical/InitialisationNotRun.ql b/cpp/ql/src/Critical/InitialisationNotRun.ql index ba575c55921b..0b97b30fbd69 100644 --- a/cpp/ql/src/Critical/InitialisationNotRun.ql +++ b/cpp/ql/src/Critical/InitialisationNotRun.ql @@ -32,9 +32,18 @@ predicate called(Function f) { exists(FunctionAccess fa | fa.getTarget() = f) } +predicate staticWithoutDereference(GlobalVariable v) { + v.isStatic() and + not exists(VariableAccess va | + va = v.getAnAccess() and + dereferenced(va) + ) +} + from GlobalVariable v where global(v) and + not staticWithoutDereference(v) and not exists(VariableAccess lval | v.getAnAccess() = lval and lval.isUsedAsLValue() and diff --git a/cpp/ql/src/Metrics/Classes/CNumberOfFunctions.qhelp b/cpp/ql/src/Metrics/Classes/CNumberOfFunctions.qhelp index cc62cb50f498..8ef045c70923 100644 --- a/cpp/ql/src/Metrics/Classes/CNumberOfFunctions.qhelp +++ b/cpp/ql/src/Metrics/Classes/CNumberOfFunctions.qhelp @@ -49,21 +49,16 @@ need to be part of the class. (A classic example of this is the observes, there are at least two key problems with this approach: -
    -
  • -It may be possible to generalize some of the utility functions beyond the +1. It may be possible to generalize some of the utility functions beyond the narrow context of the class in question -- by bundling them with the class, the class author reduces the scope for functionality reuse. -
  • -
  • -It's usually impossible for the class author to know every possible +2. It's usually impossible for the class author to know every possible operation that the user might want to perform on the class, so the public interface will inherently be incomplete. New utility functions will end up having a different syntax to the privileged public functions in the class, negatively impacting on code consistency. -
  • -
+ To refactor a class like this, simply move its utility functions elsewhere, paring its public interface down to the bare minimum. diff --git a/cpp/ql/src/Metrics/Classes/CSizeOfAPI.qhelp b/cpp/ql/src/Metrics/Classes/CSizeOfAPI.qhelp index 0d560f920aa6..70c4c862fb61 100644 --- a/cpp/ql/src/Metrics/Classes/CSizeOfAPI.qhelp +++ b/cpp/ql/src/Metrics/Classes/CSizeOfAPI.qhelp @@ -46,21 +46,17 @@ need to be part of the class. (A classic example of this is the std::string class in the C++ Standard Library.) As [Sutter] observes, there are at least two key problems with this approach: -
    -
  • -It may be possible to generalize some of the utility functions beyond the + +1. It may be possible to generalize some of the utility functions beyond the narrow context of the class in question -- by bundling them with the class, the class author reduces the scope for functionality reuse. -
  • -
  • -It's usually impossible for the class author to know every possible +2. It's usually impossible for the class author to know every possible operation that the user might want to perform on the class, so the public interface will inherently be incomplete. New utility functions will end up having a different syntax to the privileged public functions in the class, negatively impacting on code consistency. -
  • -
+ To refactor a class like this, simply move its utility functions elsewhere, paring its public interface down to the bare minimum. diff --git a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql index aedb21da5167..7d2513d25e33 100644 --- a/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql +++ b/cpp/ql/src/Security/CWE/CWE-114/UncontrolledProcessOperation.ql @@ -23,7 +23,7 @@ predicate isProcessOperationExplanation(DataFlow::Node arg, string processOperat exists(int processOperationArg, FunctionCall call | isProcessOperationArgument(processOperation, processOperationArg) and call.getTarget().getName() = processOperation and - call.getArgument(processOperationArg) = [arg.asExpr(), arg.asIndirectExpr()] + call.getArgument(processOperationArg) = arg.asIndirectExpr() ) } diff --git a/cpp/ql/src/Security/CWE/CWE-119/OverrunWriteProductFlow.ql b/cpp/ql/src/Security/CWE/CWE-119/OverrunWriteProductFlow.ql index b193b846b5a8..c2ebb4879a99 100644 --- a/cpp/ql/src/Security/CWE/CWE-119/OverrunWriteProductFlow.ql +++ b/cpp/ql/src/Security/CWE/CWE-119/OverrunWriteProductFlow.ql @@ -20,6 +20,7 @@ import semmle.code.cpp.models.interfaces.Allocation import semmle.code.cpp.models.interfaces.ArrayFunction import semmle.code.cpp.rangeanalysis.new.internal.semantic.analysis.RangeAnalysis import semmle.code.cpp.rangeanalysis.new.internal.semantic.SemanticExprSpecific +import semmle.code.cpp.security.ProductFlowUtils.ProductFlowUtils import semmle.code.cpp.rangeanalysis.new.RangeAnalysisUtil import StringSizeFlow::PathGraph1 import codeql.util.Unit @@ -43,20 +44,28 @@ predicate hasSize(HeuristicAllocationExpr alloc, DataFlow::Node n, int state) { ) } -predicate isSinkPairImpl( - CallInstruction c, DataFlow::Node bufSink, DataFlow::Node sizeSink, int delta, Expr eBuf +/** + * Holds if `c` a call to an `ArrayFunction` with buffer argument `bufSink`, + * and a size argument `sizeInstr` which satisfies `sizeInstr <= sizeBound + delta`. + * + * Furthermore, the `sizeSink` node is the dataflow node corresponding to + * `sizeBound`, and the expression `eBuf` is the expression corresponding + * to `bufInstr`. + */ +predicate isSinkPairImpl0( + CallInstruction c, DataFlow::Node bufSink, DataFlow::Node sizeSink, int delta, Expr eBuf, + Instruction sizeBound, Instruction sizeInstr ) { - exists( - int bufIndex, int sizeIndex, Instruction sizeInstr, Instruction bufInstr, ArrayFunction func - | + exists(int bufIndex, int sizeIndex, Instruction bufInstr, ArrayFunction func | bufInstr = bufSink.asInstruction() and c.getArgument(bufIndex) = bufInstr and - sizeInstr = sizeSink.asInstruction() and + sizeBound = sizeSink.asInstruction() and + c.getArgument(sizeIndex) = sizeInstr and c.getStaticCallTarget() = func and pragma[only_bind_into](func) .hasArrayWithVariableSize(pragma[only_bind_into](bufIndex), pragma[only_bind_into](sizeIndex)) and - bounded(c.getArgument(sizeIndex), sizeInstr, delta) and + bounded(sizeInstr, sizeBound, delta) and eBuf = bufInstr.getUnconvertedResultExpression() ) } @@ -86,99 +95,39 @@ module ValidState { private module ValidStateConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { hasSize(_, source, _) } - predicate isSink(DataFlow::Node sink) { isSinkPairImpl(_, _, sink, _, _) } - - predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - isAdditionalFlowStep2(node1, node2, _) - } + predicate isSink(DataFlow::Node sink) { isSinkPairImpl0(_, _, sink, _, _, _, _) } - predicate includeHiddenNodes() { any() } + predicate isBarrierOut(DataFlow::Node node) { DataFlow::flowsToBackEdge(node) } } private import DataFlow::Global - private predicate inLoop(PathNode n) { n.getASuccessor+() = n } - - /** - * Holds if `value` is a possible offset for `n`. - * - * To ensure termination, we limit `value` to be in the - * range `[-2, 2]` if the node is part of a loop. Without - * this restriction we wouldn't terminate on an example like: - * ```cpp - * while(unknown()) { size++; } - * ``` - */ - private predicate validStateImpl(PathNode n, int value) { - // If the dataflow node depends recursively on itself we restrict the range. - (inLoop(n) implies value = [-2 .. 2]) and - ( - // For the dataflow source we have an allocation such as `malloc(size + k)`, - // and the value of the flow-state is then `k`. - hasSize(_, n.getNode(), value) - or - // For a dataflow sink any `value` that is strictly smaller than the delta - // needs to be a valid flow-state. That is, for a snippet like: - // ``` - // p = b ? new char[size] : new char[size + 1]; - // memset(p, 0, size + 2); - // ``` - // the valid flow-states at the `memset` must include the set `{0, 1}` since the - // flow-state at `new char[size]` is `0`, and the flow-state at `new char[size + 1]` - // is `1`. - // - // So we find a valid flow-state at the sink's predecessor, and use the definition - // of our sink predicate to compute the valid flow-states at the sink. - exists(int delta, PathNode n0 | - n0.getASuccessor() = n and - validStateImpl(n0, value) and - isSinkPairImpl(_, _, n.getNode(), delta, _) and - delta > value - ) - or - // For a non-source and non-sink node there is two cases to consider. - // 1. A node where we have to update the flow-state, or - // 2. A node that doesn't update the flow-state. - // - // For case 1, we compute the new flow-state by adding the constant operand of the - // `AddInstruction` to the flow-state of any predecessor node. - // For case 2 we simply propagate the valid flow-states from the predecessor node to - // the next one. - exists(PathNode n0, DataFlow::Node node0, DataFlow::Node node, int value0 | - n0.getASuccessor() = n and - validStateImpl(n0, value0) and - node = n.getNode() and - node0 = n0.getNode() - | - exists(int delta | - isAdditionalFlowStep2(node0, node, delta) and - value0 = value + delta - ) - or - not isAdditionalFlowStep2(node0, node, _) and - value = value0 - ) - ) - } - - predicate validState(DataFlow::Node n, int value) { - validStateImpl(any(PathNode pn | pn.getNode() = n), value) + predicate validState(DataFlow::Node source, DataFlow::Node sink, int value) { + hasSize(_, source, value) and + flow(source, sink) } } import ValidState -/** - * Holds if `node2` is a dataflow node that represents an addition of two operands `op1` - * and `op2` such that: - * 1. `node1` is the dataflow node that represents `op1`, and - * 2. the value of `op2` can be upper bounded by `delta.` - */ -predicate isAdditionalFlowStep2(DataFlow::Node node1, DataFlow::Node node2, int delta) { - exists(AddInstruction add, Operand op | - add.hasOperands(node1.asOperand(), op) and - semBounded(getSemanticExpr(op.getDef()), any(SemZeroBound zero), delta, true, _) and - node2.asInstruction() = add +module SizeBarrierInput implements SizeBarrierInputSig { + int fieldFlowBranchLimit() { result = 2 } + + predicate isSource(DataFlow::Node source) { + exists(int state | + hasSize(_, source, state) and + validState(source, _, state) + ) + } +} + +predicate isSinkPairImpl( + CallInstruction c, DataFlow::Node bufSink, DataFlow::Node sizeSink, int delta, Expr eBuf +) { + exists(Instruction sizeBound, Instruction sizeInstr | + isSinkPairImpl0(c, bufSink, sizeSink, delta, eBuf, sizeBound, sizeInstr) and + not sizeBound = SizeBarrier::getABarrierInstruction(delta) and + not sizeInstr = SizeBarrier::getABarrierInstruction(delta) ) } @@ -198,14 +147,14 @@ module StringSizeConfig implements ProductFlow::StateConfigSig { // to the size of the allocation. This state is then checked in `isSinkPair`. exists(state1) and hasSize(bufSource.asExpr(), sizeSource, state2) and - validState(sizeSource, state2) + validState(sizeSource, _, state2) } predicate isSinkPair( DataFlow::Node bufSink, FlowState1 state1, DataFlow::Node sizeSink, FlowState2 state2 ) { exists(state1) and - validState(sizeSink, state2) and + validState(_, sizeSink, state2) and exists(int delta | isSinkPairImpl(_, bufSink, sizeSink, delta, _) and delta > state2 @@ -214,14 +163,8 @@ module StringSizeConfig implements ProductFlow::StateConfigSig { predicate isBarrierOut2(DataFlow::Node node) { DataFlow::flowsToBackEdge(node) } - predicate isAdditionalFlowStep2( - DataFlow::Node node1, FlowState2 state1, DataFlow::Node node2, FlowState2 state2 - ) { - validState(node2, state2) and - exists(int delta | - isAdditionalFlowStep2(node1, node2, delta) and - state1 = state2 + delta - ) + predicate isBarrier2(DataFlow::Node node, FlowState2 state) { + node = SizeBarrier::getABarrierNode(state) } } diff --git a/cpp/ql/src/change-notes/2025-07-10-pthread-and-std-thread.md b/cpp/ql/src/change-notes/2025-07-10-pthread-and-std-thread.md deleted file mode 100644 index 8e8d0659fa62..000000000000 --- a/cpp/ql/src/change-notes/2025-07-10-pthread-and-std-thread.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow models for `pthread_create` and `std::thread`. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2025-07-10-wchar-fp.md b/cpp/ql/src/change-notes/2025-07-10-wchar-fp.md deleted file mode 100644 index db940f182861..000000000000 --- a/cpp/ql/src/change-notes/2025-07-10-wchar-fp.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cpp/incorrect-string-type-conversion` query no longer alerts on incorrect type conversions that occur in unreachable code. diff --git a/cpp/ql/src/change-notes/2025-07-11-function-objects.md b/cpp/ql/src/change-notes/2025-07-11-function-objects.md deleted file mode 100644 index 48bc71f27ca8..000000000000 --- a/cpp/ql/src/change-notes/2025-07-11-function-objects.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Improved support for dataflow through function objects and lambda expressions. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/released/1.4.4.md b/cpp/ql/src/change-notes/released/1.4.4.md index 819e8dcd7284..87e1b909fbb9 100644 --- a/cpp/ql/src/change-notes/released/1.4.4.md +++ b/cpp/ql/src/change-notes/released/1.4.4.md @@ -2,7 +2,11 @@ ### Minor Analysis Improvements +* Due to changes in the `FunctionWithWrappers` library (`semmle.code.cpp.security.FunctionWithWrappers`) the primary alert location generated by the queries `cpp/path-injection`, `cpp/sql-injection`, `cpp/tainted-format-string`, and `cpp/command-line-injection` may have changed. * Added flow models for the Win32 API functions `CreateThread`, `CreateRemoteThread`, and `CreateRemoteThreadEx`. +* Improved support for dataflow through function objects and lambda expressions. +* Added flow models for `pthread_create` and `std::thread`. +* The `cpp/incorrect-string-type-conversion` query no longer alerts on incorrect type conversions that occur in unreachable code. * Added flow models for the GNU C Library. * Fixed a number of false positives and false negatives in `cpp/global-use-before-init`. Note that this query is not part of any of the default query suites. * The query `cpp/sql-injection` now can be extended using the `sql-injection` Models as Data (MaD) sink kind. diff --git a/cpp/ql/src/change-notes/released/1.4.5.md b/cpp/ql/src/change-notes/released/1.4.5.md new file mode 100644 index 000000000000..2b606677eba6 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.4.5.md @@ -0,0 +1,5 @@ +## 1.4.5 + +### Minor Analysis Improvements + +* The "Initialization code not run" query (`cpp/initialization-not-run`) no longer reports an alert on static global variables that have no dereference. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 1dfca6daa3b1..a74b6b08d860 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.4 +lastReleaseVersion: 1.4.5 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 9fe6ea9f5489..ad3dc6c91f9e 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.4.5-dev +version: 1.4.6-dev groups: - cpp - queries diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index bf9a4ed28d01..b1f984680ad6 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -21,14 +21,22 @@ models | 20 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | | 21 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | | 22 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 23 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 24 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 25 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 26 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 27 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 28 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 23 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 24 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 25 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 26 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 27 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 28 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 29 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 30 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 31 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 32 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 33 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 34 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 35 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 36 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:28 | +| asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:36 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:17 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | *recv_buffer | provenance | Src:MaD:17 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | @@ -37,10 +45,10 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | *send_buffer | provenance | Sink:MaD:2 | | asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | provenance | | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:28 | -| test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | test.cpp:4:5:4:17 | [summary] to write: ReturnValue in ymlStepManual | provenance | MaD:26 | -| test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | test.cpp:5:5:5:20 | [summary] to write: ReturnValue in ymlStepGenerated | provenance | MaD:25 | -| test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | provenance | MaD:27 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:36 | +| test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | test.cpp:4:5:4:17 | [summary] to write: ReturnValue in ymlStepManual | provenance | MaD:34 | +| test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | test.cpp:5:5:5:20 | [summary] to write: ReturnValue in ymlStepGenerated | provenance | MaD:33 | +| test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | provenance | MaD:35 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:16 | @@ -52,15 +60,15 @@ edges | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | | test.cpp:17:24:17:24 | x | test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | provenance | | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:26 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:34 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | | test.cpp:21:27:21:27 | x | test.cpp:5:5:5:20 | [summary param] 0 in ymlStepGenerated | provenance | | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:25 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:33 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | | test.cpp:25:35:25:35 | x | test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | provenance | | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:27 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:35 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | @@ -68,16 +76,16 @@ edges | test.cpp:46:30:46:32 | *arg [x] | test.cpp:47:12:47:19 | *arg [x] | provenance | | | test.cpp:47:12:47:19 | *arg [x] | test.cpp:48:13:48:13 | *s [x] | provenance | | | test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | -| test.cpp:52:5:52:18 | [summary param] *3 in pthread_create [x] | test.cpp:52:5:52:18 | [summary] to write: Argument[2].Parameter[*0] in pthread_create [x] | provenance | MaD:24 | +| test.cpp:52:5:52:18 | [summary param] *3 in pthread_create [x] | test.cpp:52:5:52:18 | [summary] to write: Argument[2].Parameter[*0] in pthread_create [x] | provenance | MaD:32 | | test.cpp:52:5:52:18 | [summary] to write: Argument[2].Parameter[*0] in pthread_create [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | | test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:16 | | test.cpp:59:55:59:64 | *& ... [x] | test.cpp:52:5:52:18 | [summary param] *3 in pthread_create [x] | provenance | | -| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:23 | -| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:23 | -| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:23 | -| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:23 | +| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:31 | +| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:31 | +| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:31 | +| test.cpp:63:6:63:21 | [summary param] 1 in callWithArgument | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | provenance | MaD:31 | | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | test.cpp:68:22:68:22 | y | provenance | | | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | test.cpp:74:22:74:22 | y | provenance | | | test.cpp:63:6:63:21 | [summary] to write: Argument[0].Parameter[0] in callWithArgument | test.cpp:82:22:82:22 | y | provenance | | @@ -180,6 +188,59 @@ edges | windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:349:8:349:19 | [summary param] *3 in CreateThread [x] | provenance | | | windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:357:8:357:25 | [summary param] *4 in CreateRemoteThread [x] | provenance | | | windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:387:8:387:27 | [summary param] *4 in CreateRemoteThreadEx [x] | provenance | | +| windows.cpp:473:17:473:37 | [summary param] *1 in RtlCopyVolatileMemory | windows.cpp:473:17:473:37 | [summary param] *0 in RtlCopyVolatileMemory [Return] | provenance | MaD:27 | +| windows.cpp:479:17:479:35 | [summary param] *1 in RtlCopyDeviceMemory | windows.cpp:479:17:479:35 | [summary param] *0 in RtlCopyDeviceMemory [Return] | provenance | MaD:23 | +| windows.cpp:485:6:485:18 | [summary param] *1 in RtlCopyMemory | windows.cpp:485:6:485:18 | [summary param] *0 in RtlCopyMemory [Return] | provenance | MaD:24 | +| windows.cpp:493:6:493:29 | [summary param] *1 in RtlCopyMemoryNonTemporal | windows.cpp:493:6:493:29 | [summary param] *0 in RtlCopyMemoryNonTemporal [Return] | provenance | MaD:25 | +| windows.cpp:510:6:510:25 | [summary param] *1 in RtlCopyUnicodeString [*Buffer] | windows.cpp:510:6:510:25 | [summary] read: Argument[*1].Field[*Buffer] in RtlCopyUnicodeString | provenance | | +| windows.cpp:510:6:510:25 | [summary] read: Argument[*1].Field[*Buffer] in RtlCopyUnicodeString | windows.cpp:510:6:510:25 | [summary] to write: Argument[*0].Field[*Buffer] in RtlCopyUnicodeString | provenance | MaD:26 | +| windows.cpp:510:6:510:25 | [summary] to write: Argument[*0] in RtlCopyUnicodeString [*Buffer] | windows.cpp:510:6:510:25 | [summary param] *0 in RtlCopyUnicodeString [Return] [*Buffer] | provenance | | +| windows.cpp:510:6:510:25 | [summary] to write: Argument[*0].Field[*Buffer] in RtlCopyUnicodeString | windows.cpp:510:6:510:25 | [summary] to write: Argument[*0] in RtlCopyUnicodeString [*Buffer] | provenance | | +| windows.cpp:515:6:515:18 | [summary param] *1 in RtlMoveMemory | windows.cpp:515:6:515:18 | [summary param] *0 in RtlMoveMemory [Return] | provenance | MaD:29 | +| windows.cpp:521:17:521:37 | [summary param] *1 in RtlMoveVolatileMemory | windows.cpp:521:17:521:37 | [summary param] *0 in RtlMoveVolatileMemory [Return] | provenance | MaD:30 | +| windows.cpp:527:6:527:25 | [summary param] *1 in RtlInitUnicodeString | windows.cpp:527:6:527:25 | [summary] to write: Argument[*0].Field[*Buffer] in RtlInitUnicodeString | provenance | MaD:28 | +| windows.cpp:527:6:527:25 | [summary] to write: Argument[*0] in RtlInitUnicodeString [*Buffer] | windows.cpp:527:6:527:25 | [summary param] *0 in RtlInitUnicodeString [Return] [*Buffer] | provenance | | +| windows.cpp:527:6:527:25 | [summary] to write: Argument[*0].Field[*Buffer] in RtlInitUnicodeString | windows.cpp:527:6:527:25 | [summary] to write: Argument[*0] in RtlInitUnicodeString [*Buffer] | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:547:32:547:33 | *& ... | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:552:43:552:44 | *& ... | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | +| windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | +| windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:473:17:473:37 | [summary param] *1 in RtlCopyVolatileMemory | provenance | | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:27 | +| windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:479:17:479:35 | [summary param] *1 in RtlCopyDeviceMemory | provenance | | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:23 | +| windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:485:6:485:18 | [summary param] *1 in RtlCopyMemory | provenance | | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:24 | +| windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:493:6:493:29 | [summary param] *1 in RtlCopyMemoryNonTemporal | provenance | | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:25 | +| windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | +| windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | +| windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | +| windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:527:6:527:25 | [summary param] *1 in RtlInitUnicodeString | provenance | | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:28 | +| windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | +| windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | +| windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | +| windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:510:6:510:25 | [summary param] *1 in RtlCopyUnicodeString [*Buffer] | provenance | | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:26 | +| windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | +| windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | +| windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | +| windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:515:6:515:18 | [summary param] *1 in RtlMoveMemory | provenance | | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:29 | +| windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:521:17:521:37 | [summary param] *1 in RtlMoveVolatileMemory | provenance | | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:30 | nodes | asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | semmle.label | [summary param] *0 in buffer | | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | semmle.label | [summary] to write: ReturnValue in buffer | @@ -352,6 +413,59 @@ nodes | windows.cpp:439:7:439:8 | *& ... [x] | semmle.label | *& ... [x] | | windows.cpp:451:7:451:8 | *& ... [x] | semmle.label | *& ... [x] | | windows.cpp:464:7:464:8 | *& ... [x] | semmle.label | *& ... [x] | +| windows.cpp:473:17:473:37 | [summary param] *0 in RtlCopyVolatileMemory [Return] | semmle.label | [summary param] *0 in RtlCopyVolatileMemory [Return] | +| windows.cpp:473:17:473:37 | [summary param] *1 in RtlCopyVolatileMemory | semmle.label | [summary param] *1 in RtlCopyVolatileMemory | +| windows.cpp:479:17:479:35 | [summary param] *0 in RtlCopyDeviceMemory [Return] | semmle.label | [summary param] *0 in RtlCopyDeviceMemory [Return] | +| windows.cpp:479:17:479:35 | [summary param] *1 in RtlCopyDeviceMemory | semmle.label | [summary param] *1 in RtlCopyDeviceMemory | +| windows.cpp:485:6:485:18 | [summary param] *0 in RtlCopyMemory [Return] | semmle.label | [summary param] *0 in RtlCopyMemory [Return] | +| windows.cpp:485:6:485:18 | [summary param] *1 in RtlCopyMemory | semmle.label | [summary param] *1 in RtlCopyMemory | +| windows.cpp:493:6:493:29 | [summary param] *0 in RtlCopyMemoryNonTemporal [Return] | semmle.label | [summary param] *0 in RtlCopyMemoryNonTemporal [Return] | +| windows.cpp:493:6:493:29 | [summary param] *1 in RtlCopyMemoryNonTemporal | semmle.label | [summary param] *1 in RtlCopyMemoryNonTemporal | +| windows.cpp:510:6:510:25 | [summary param] *0 in RtlCopyUnicodeString [Return] [*Buffer] | semmle.label | [summary param] *0 in RtlCopyUnicodeString [Return] [*Buffer] | +| windows.cpp:510:6:510:25 | [summary param] *1 in RtlCopyUnicodeString [*Buffer] | semmle.label | [summary param] *1 in RtlCopyUnicodeString [*Buffer] | +| windows.cpp:510:6:510:25 | [summary] read: Argument[*1].Field[*Buffer] in RtlCopyUnicodeString | semmle.label | [summary] read: Argument[*1].Field[*Buffer] in RtlCopyUnicodeString | +| windows.cpp:510:6:510:25 | [summary] to write: Argument[*0] in RtlCopyUnicodeString [*Buffer] | semmle.label | [summary] to write: Argument[*0] in RtlCopyUnicodeString [*Buffer] | +| windows.cpp:510:6:510:25 | [summary] to write: Argument[*0].Field[*Buffer] in RtlCopyUnicodeString | semmle.label | [summary] to write: Argument[*0].Field[*Buffer] in RtlCopyUnicodeString | +| windows.cpp:515:6:515:18 | [summary param] *0 in RtlMoveMemory [Return] | semmle.label | [summary param] *0 in RtlMoveMemory [Return] | +| windows.cpp:515:6:515:18 | [summary param] *1 in RtlMoveMemory | semmle.label | [summary param] *1 in RtlMoveMemory | +| windows.cpp:521:17:521:37 | [summary param] *0 in RtlMoveVolatileMemory [Return] | semmle.label | [summary param] *0 in RtlMoveVolatileMemory [Return] | +| windows.cpp:521:17:521:37 | [summary param] *1 in RtlMoveVolatileMemory | semmle.label | [summary param] *1 in RtlMoveVolatileMemory | +| windows.cpp:527:6:527:25 | [summary param] *0 in RtlInitUnicodeString [Return] [*Buffer] | semmle.label | [summary param] *0 in RtlInitUnicodeString [Return] [*Buffer] | +| windows.cpp:527:6:527:25 | [summary param] *1 in RtlInitUnicodeString | semmle.label | [summary param] *1 in RtlInitUnicodeString | +| windows.cpp:527:6:527:25 | [summary] to write: Argument[*0] in RtlInitUnicodeString [*Buffer] | semmle.label | [summary] to write: Argument[*0] in RtlInitUnicodeString [*Buffer] | +| windows.cpp:527:6:527:25 | [summary] to write: Argument[*0].Field[*Buffer] in RtlInitUnicodeString | semmle.label | [summary] to write: Argument[*0].Field[*Buffer] in RtlInitUnicodeString | +| windows.cpp:533:11:533:16 | call to source | semmle.label | call to source | +| windows.cpp:533:11:533:16 | call to source | semmle.label | call to source | +| windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | semmle.label | RtlCopyVolatileMemory output argument | +| windows.cpp:537:40:537:41 | *& ... | semmle.label | *& ... | +| windows.cpp:538:10:538:23 | access to array | semmle.label | access to array | +| windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | semmle.label | RtlCopyDeviceMemory output argument | +| windows.cpp:542:38:542:39 | *& ... | semmle.label | *& ... | +| windows.cpp:543:10:543:23 | access to array | semmle.label | access to array | +| windows.cpp:547:19:547:29 | RtlCopyMemory output argument | semmle.label | RtlCopyMemory output argument | +| windows.cpp:547:32:547:33 | *& ... | semmle.label | *& ... | +| windows.cpp:548:10:548:23 | access to array | semmle.label | access to array | +| windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | semmle.label | RtlCopyMemoryNonTemporal output argument | +| windows.cpp:552:43:552:44 | *& ... | semmle.label | *& ... | +| windows.cpp:553:10:553:23 | access to array | semmle.label | access to array | +| windows.cpp:559:5:559:24 | ... = ... | semmle.label | ... = ... | +| windows.cpp:559:17:559:24 | call to source | semmle.label | call to source | +| windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | semmle.label | RtlInitUnicodeString output argument [*Buffer] | +| windows.cpp:561:39:561:44 | *buffer | semmle.label | *buffer | +| windows.cpp:562:10:562:19 | *src_string [*Buffer] | semmle.label | *src_string [*Buffer] | +| windows.cpp:562:10:562:29 | access to array | semmle.label | access to array | +| windows.cpp:562:21:562:26 | *Buffer | semmle.label | *Buffer | +| windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | semmle.label | RtlCopyUnicodeString output argument [*Buffer] | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | semmle.label | *& ... [*Buffer] | +| windows.cpp:564:10:564:20 | *dest_string [*Buffer] | semmle.label | *dest_string [*Buffer] | +| windows.cpp:564:10:564:30 | access to array | semmle.label | access to array | +| windows.cpp:564:22:564:27 | *Buffer | semmle.label | *Buffer | +| windows.cpp:568:19:568:29 | RtlMoveMemory output argument | semmle.label | RtlMoveMemory output argument | +| windows.cpp:568:32:568:33 | *& ... | semmle.label | *& ... | +| windows.cpp:569:10:569:23 | access to array | semmle.label | access to array | +| windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | semmle.label | RtlMoveVolatileMemory output argument | +| windows.cpp:573:40:573:41 | *& ... | semmle.label | *& ... | +| windows.cpp:574:10:574:23 | access to array | semmle.label | access to array | subpaths | asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | asio_streams.cpp:100:44:100:62 | call to buffer | | test.cpp:17:24:17:24 | x | test.cpp:4:5:4:17 | [summary param] 0 in ymlStepManual | test.cpp:4:5:4:17 | [summary] to write: ReturnValue in ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | @@ -359,4 +473,12 @@ subpaths | test.cpp:25:35:25:35 | x | test.cpp:6:5:6:27 | [summary param] 0 in ymlStepManual_with_body | test.cpp:6:5:6:27 | [summary] to write: ReturnValue in ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | | windows.cpp:27:36:27:38 | *cmd | windows.cpp:17:8:17:25 | [summary param] *0 in CommandLineToArgvA | windows.cpp:17:8:17:25 | [summary] to write: ReturnValue[**] in CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:473:17:473:37 | [summary param] *1 in RtlCopyVolatileMemory | windows.cpp:473:17:473:37 | [summary param] *0 in RtlCopyVolatileMemory [Return] | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:479:17:479:35 | [summary param] *1 in RtlCopyDeviceMemory | windows.cpp:479:17:479:35 | [summary param] *0 in RtlCopyDeviceMemory [Return] | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:485:6:485:18 | [summary param] *1 in RtlCopyMemory | windows.cpp:485:6:485:18 | [summary param] *0 in RtlCopyMemory [Return] | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:493:6:493:29 | [summary param] *1 in RtlCopyMemoryNonTemporal | windows.cpp:493:6:493:29 | [summary param] *0 in RtlCopyMemoryNonTemporal [Return] | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:527:6:527:25 | [summary param] *1 in RtlInitUnicodeString | windows.cpp:527:6:527:25 | [summary param] *0 in RtlInitUnicodeString [Return] [*Buffer] | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:510:6:510:25 | [summary param] *1 in RtlCopyUnicodeString [*Buffer] | windows.cpp:510:6:510:25 | [summary param] *0 in RtlCopyUnicodeString [Return] [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:515:6:515:18 | [summary param] *1 in RtlMoveMemory | windows.cpp:515:6:515:18 | [summary param] *0 in RtlMoveMemory [Return] | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:521:17:521:37 | [summary param] *1 in RtlMoveVolatileMemory | windows.cpp:521:17:521:37 | [summary param] *0 in RtlMoveVolatileMemory [Return] | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | testFailures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected index 6fdbe067e171..aeb2362ef339 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected @@ -5556,12 +5556,24 @@ | Dubious signature "(z_streamp,int *)" in summary model. | | Dubious signature "(z_streamp,unsigned int *,int *)" in summary model. | | Dubious signature "(z_streamp,unsigned int)" in summary model. | +| Unrecognized input specification "Argument[***0]" in summary model. | +| Unrecognized input specification "Argument[***1]" in summary model. | | Unrecognized input specification "Argument[***3]" in summary model. | | Unrecognized input specification "Argument[***4]" in summary model. | +| Unrecognized input specification "Argument[****0]" in summary model. | +| Unrecognized input specification "Argument[****1]" in summary model. | | Unrecognized input specification "Argument[****3]" in summary model. | | Unrecognized input specification "Argument[****4]" in summary model. | +| Unrecognized input specification "Argument[*****0]" in summary model. | +| Unrecognized input specification "Argument[*****1]" in summary model. | | Unrecognized input specification "Field[****hEvent]" in summary model. | | Unrecognized input specification "Field[***hEvent]" in summary model. | +| Unrecognized output specification "Argument[***0]" in summary model. | +| Unrecognized output specification "Argument[***1]" in summary model. | +| Unrecognized output specification "Argument[****0]" in summary model. | +| Unrecognized output specification "Argument[****1]" in summary model. | +| Unrecognized output specification "Argument[*****0]" in summary model. | +| Unrecognized output specification "Argument[*****1]" in summary model. | | Unrecognized output specification "Field[****hEvent]" in summary model. | | Unrecognized output specification "Field[***hEvent]" in summary model. | | Unrecognized output specification "Parameter[***0]" in summary model. | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp b/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp index 2554dc9fd46c..3e03c1a69a5b 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp @@ -466,4 +466,111 @@ void test_create_thread() &attrList, &threadId); } +} + +using size_t = decltype(sizeof(0)); + +volatile void * RtlCopyVolatileMemory( + volatile void *Destination, + volatile const void *Source, + size_t Length +); + +volatile void * RtlCopyDeviceMemory( + volatile void *Destination, + volatile const void *Source, + size_t Length +); + +void RtlCopyMemory( + void* Destination, + const void* Source, + size_t Length +); + +using VOID = void; + +VOID RtlCopyMemoryNonTemporal( + VOID *Destination, + const VOID *Source, + SIZE_T Length +); + +using USHORT = unsigned short; +using PWSTR = wchar_t*; +using PCWSTR = const wchar_t*; +using PCUNICODE_STRING = const struct _UNICODE_STRING*; + +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; + +VOID RtlCopyUnicodeString( + PUNICODE_STRING DestinationString, + PCUNICODE_STRING SourceString +); + +void RtlMoveMemory( + void* Destination, + const void* Source, + size_t Length +); + +volatile void * RtlMoveVolatileMemory( + volatile void *Destination, + volatile const void *Source, + size_t Length +); + +void RtlInitUnicodeString( + PUNICODE_STRING DestinationString, + PCWSTR SourceString +); + +void test_copy_and_move_memory() { + int x = source(); + + { + char dest_buffer[1024]; + RtlCopyVolatileMemory(dest_buffer, &x, sizeof(x)); + sink(dest_buffer[0]); // $ ir + } + { + char dest_buffer[1024]; + RtlCopyDeviceMemory(dest_buffer, &x, sizeof(x)); + sink(dest_buffer[0]); // $ ir + } + { + char dest_buffer[1024]; + RtlCopyMemory(dest_buffer, &x, sizeof(x)); + sink(dest_buffer[0]); // $ ir + } + { + char dest_buffer[1024]; + RtlCopyMemoryNonTemporal(dest_buffer, &x, sizeof(x)); + sink(dest_buffer[0]); // $ ir + } + { + UNICODE_STRING dest_string; + UNICODE_STRING src_string; + wchar_t buffer[1024]; + buffer[0] = source(); + + RtlInitUnicodeString(&src_string, buffer); + sink(src_string.Buffer[0]); // $ ir + RtlCopyUnicodeString(&dest_string, &src_string); + sink(dest_string.Buffer[0]); // $ ir + } + { + char dest_buffer[1024]; + RtlMoveMemory(dest_buffer, &x, sizeof(x)); + sink(dest_buffer[0]); // $ ir + } + { + volatile char dest_buffer[1024]; + RtlMoveVolatileMemory(dest_buffer, &x, sizeof(x)); + sink(dest_buffer[0]); // $ ir + } } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 346ace60e2fe..a3ee6b46bd53 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -24436,6 +24436,107 @@ ir.cpp: # 2742| Type = [IntType] int # 2742| ValueCategory = prvalue # 2743| getStmt(14): [ReturnStmt] return ... +# 2747| [CopyAssignmentOperator] std::strong_ordering& std::strong_ordering::operator=(std::strong_ordering const&) +# 2747| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const strong_ordering & +# 2747| [MoveAssignmentOperator] std::strong_ordering& std::strong_ordering::operator=(std::strong_ordering&&) +# 2747| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] strong_ordering && +# 2747| [CopyConstructor] void std::strong_ordering::strong_ordering(std::strong_ordering const&) +# 2747| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const strong_ordering & +# 2747| [MoveConstructor] void std::strong_ordering::strong_ordering(std::strong_ordering&&) +# 2747| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] strong_ordering && +# 2747| : +# 2747| getEntryPoint(): [BlockStmt] { ... } +# 2747| getStmt(0): [ReturnStmt] return ... +# 2748| [Constructor] void std::strong_ordering::strong_ordering(std::_Order) +# 2748| : +# 2748| getParameter(0): [Parameter] v +# 2748| Type = [ScopedEnum] _Order +# 2748| : +# 2748| getEntryPoint(): [BlockStmt] { ... } +# 2748| getStmt(0): [ReturnStmt] return ... +# 2763| [CopyAssignmentOperator] ThreeWay& ThreeWay::operator=(ThreeWay const&) +# 2763| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const ThreeWay & +# 2763| [MoveAssignmentOperator] ThreeWay& ThreeWay::operator=(ThreeWay&&) +# 2763| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] ThreeWay && +# 2763| [Constructor] void ThreeWay::ThreeWay() +# 2763| : +# 2766| [MemberFunction] std::strong_ordering ThreeWay::operator<=>(ThreeWay&) +# 2766| : +# 2766| getParameter(0): [Parameter] y +# 2766| Type = [LValueReferenceType] ThreeWay & +# 2766| getEntryPoint(): [BlockStmt] { ... } +# 2766| getStmt(0): [ReturnStmt] return ... +# 2766| getExpr(): [SpaceshipExpr] ... <=> ... +# 2766| Type = [Class] strong_ordering +# 2766| ValueCategory = prvalue +# 2766| getChild(0): [PointerFieldAccess] x +# 2766| Type = [IntType] int +# 2766| ValueCategory = prvalue(load) +# 2766| getQualifier(): [ThisExpr] this +# 2766| Type = [PointerType] ThreeWay * +# 2766| ValueCategory = prvalue(load) +# 2766| getChild(1): [ReferenceFieldAccess] x +# 2766| Type = [IntType] int +# 2766| ValueCategory = prvalue(load) +# 2766| getQualifier(): [VariableAccess] y +# 2766| Type = [LValueReferenceType] ThreeWay & +# 2766| ValueCategory = prvalue(load) +# 2766| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2766| Type = [Class] ThreeWay +# 2766| ValueCategory = lvalue +# 2769| [TopLevelFunction] void test_three_way(int, int, ThreeWay, ThreeWay) +# 2769| : +# 2769| getParameter(0): [Parameter] a +# 2769| Type = [IntType] int +# 2769| getParameter(1): [Parameter] b +# 2769| Type = [IntType] int +# 2769| getParameter(2): [Parameter] c +# 2769| Type = [Class] ThreeWay +# 2769| getParameter(3): [Parameter] d +# 2769| Type = [Class] ThreeWay +# 2769| getEntryPoint(): [BlockStmt] { ... } +# 2770| getStmt(0): [DeclStmt] declaration +# 2770| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2770| Type = [Class] strong_ordering +# 2770| getVariable().getInitializer(): [Initializer] initializer for x +# 2770| getExpr(): [SpaceshipExpr] ... <=> ... +# 2770| Type = [Class] strong_ordering +# 2770| ValueCategory = prvalue +# 2770| getChild(0): [VariableAccess] a +# 2770| Type = [IntType] int +# 2770| ValueCategory = prvalue(load) +# 2770| getChild(1): [VariableAccess] b +# 2770| Type = [IntType] int +# 2770| ValueCategory = prvalue(load) +# 2771| getStmt(1): [DeclStmt] declaration +# 2771| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2771| Type = [Class] strong_ordering +# 2771| getVariable().getInitializer(): [Initializer] initializer for y +# 2771| getExpr(): [FunctionCall] call to operator<=> +# 2771| Type = [Class] strong_ordering +# 2771| ValueCategory = prvalue +# 2771| getQualifier(): [VariableAccess] c +# 2771| Type = [Class] ThreeWay +# 2771| ValueCategory = lvalue +# 2771| getArgument(0): [VariableAccess] d +# 2771| Type = [Class] ThreeWay +# 2771| ValueCategory = lvalue +# 2771| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 2771| Type = [LValueReferenceType] ThreeWay & +# 2771| ValueCategory = prvalue +# 2772| getStmt(2): [ReturnStmt] return ... ir23.cpp: # 1| [TopLevelFunction] bool consteval_1() # 1| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 38f0a0a4f4f7..6d58656b55ff 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -20273,6 +20273,119 @@ ir.cpp: # 2728| v2728_14(void) = AliasedUse : ~m2728_9 # 2728| v2728_15(void) = ExitFunction : +# 2747| void std::strong_ordering::strong_ordering(std::strong_ordering&&) +# 2747| Block 0 +# 2747| v2747_1(void) = EnterFunction : +# 2747| m2747_2(unknown) = AliasedDefinition : +# 2747| m2747_3(unknown) = InitializeNonLocal : +# 2747| m2747_4(unknown) = Chi : total:m2747_2, partial:m2747_3 +# 2747| r2747_5(glval) = VariableAddress[#this] : +# 2747| m2747_6(glval) = InitializeParameter[#this] : &:r2747_5 +# 2747| r2747_7(glval) = Load[#this] : &:r2747_5, m2747_6 +# 2747| m2747_8(strong_ordering) = InitializeIndirection[#this] : &:r2747_7 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| m0_2(strong_ordering &&) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(strong_ordering &&) = Load[(unnamed parameter 0)] : &:r0_1, m0_2 +#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 2747| v2747_9(void) = NoOp : +# 2747| v2747_10(void) = ReturnIndirection[#this] : &:r2747_7, m2747_8 +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4 +# 2747| v2747_11(void) = ReturnVoid : +# 2747| v2747_12(void) = AliasedUse : m2747_3 +# 2747| v2747_13(void) = ExitFunction : + +# 2748| void std::strong_ordering::strong_ordering(std::_Order) +# 2748| Block 0 +# 2748| v2748_1(void) = EnterFunction : +# 2748| m2748_2(unknown) = AliasedDefinition : +# 2748| m2748_3(unknown) = InitializeNonLocal : +# 2748| m2748_4(unknown) = Chi : total:m2748_2, partial:m2748_3 +# 2748| r2748_5(glval) = VariableAddress[#this] : +# 2748| m2748_6(glval) = InitializeParameter[#this] : &:r2748_5 +# 2748| r2748_7(glval) = Load[#this] : &:r2748_5, m2748_6 +# 2748| m2748_8(strong_ordering) = InitializeIndirection[#this] : &:r2748_7 +# 2748| r2748_9(glval<_Order>) = VariableAddress[v] : +# 2748| m2748_10(_Order) = InitializeParameter[v] : &:r2748_9 +# 2748| v2748_11(void) = NoOp : +# 2748| v2748_12(void) = ReturnIndirection[#this] : &:r2748_7, m2748_8 +# 2748| v2748_13(void) = ReturnVoid : +# 2748| v2748_14(void) = AliasedUse : m2748_3 +# 2748| v2748_15(void) = ExitFunction : + +# 2766| std::strong_ordering ThreeWay::operator<=>(ThreeWay&) +# 2766| Block 0 +# 2766| v2766_1(void) = EnterFunction : +# 2766| m2766_2(unknown) = AliasedDefinition : +# 2766| m2766_3(unknown) = InitializeNonLocal : +# 2766| m2766_4(unknown) = Chi : total:m2766_2, partial:m2766_3 +# 2766| r2766_5(glval) = VariableAddress[#this] : +# 2766| m2766_6(glval) = InitializeParameter[#this] : &:r2766_5 +# 2766| r2766_7(glval) = Load[#this] : &:r2766_5, m2766_6 +# 2766| m2766_8(ThreeWay) = InitializeIndirection[#this] : &:r2766_7 +# 2766| r2766_9(glval) = VariableAddress[y] : +# 2766| m2766_10(ThreeWay &) = InitializeParameter[y] : &:r2766_9 +# 2766| r2766_11(ThreeWay &) = Load[y] : &:r2766_9, m2766_10 +# 2766| m2766_12(unknown) = InitializeIndirection[y] : &:r2766_11 +# 2766| r2766_13(glval) = VariableAddress[#return] : +# 2766| r2766_14(glval) = VariableAddress[#this] : +# 2766| r2766_15(ThreeWay *) = Load[#this] : &:r2766_14, m2766_6 +# 2766| r2766_16(glval) = FieldAddress[x] : r2766_15 +# 2766| r2766_17(int) = Load[?] : &:r2766_16, ~m2766_8 +# 2766| r2766_18(glval) = VariableAddress[y] : +# 2766| r2766_19(ThreeWay &) = Load[y] : &:r2766_18, m2766_10 +# 2766| r2766_20(glval) = CopyValue : r2766_19 +# 2766| r2766_21(glval) = FieldAddress[x] : r2766_20 +# 2766| r2766_22(int) = Load[?] : &:r2766_21, ~m2766_12 +# 2766| r2766_23(strong_ordering) = Spaceship : r2766_17, r2766_22 +# 2766| m2766_24(strong_ordering) = Store[#return] : &:r2766_13, r2766_23 +# 2766| v2766_25(void) = ReturnIndirection[#this] : &:r2766_7, m2766_8 +# 2766| v2766_26(void) = ReturnIndirection[y] : &:r2766_11, m2766_12 +# 2766| r2766_27(glval) = VariableAddress[#return] : +# 2766| v2766_28(void) = ReturnValue : &:r2766_27, m2766_24 +# 2766| v2766_29(void) = AliasedUse : m2766_3 +# 2766| v2766_30(void) = ExitFunction : + +# 2769| void test_three_way(int, int, ThreeWay, ThreeWay) +# 2769| Block 0 +# 2769| v2769_1(void) = EnterFunction : +# 2769| m2769_2(unknown) = AliasedDefinition : +# 2769| m2769_3(unknown) = InitializeNonLocal : +# 2769| m2769_4(unknown) = Chi : total:m2769_2, partial:m2769_3 +# 2769| r2769_5(glval) = VariableAddress[a] : +# 2769| m2769_6(int) = InitializeParameter[a] : &:r2769_5 +# 2769| r2769_7(glval) = VariableAddress[b] : +# 2769| m2769_8(int) = InitializeParameter[b] : &:r2769_7 +# 2769| r2769_9(glval) = VariableAddress[c] : +# 2769| m2769_10(ThreeWay) = InitializeParameter[c] : &:r2769_9 +# 2769| r2769_11(glval) = VariableAddress[d] : +# 2769| m2769_12(ThreeWay) = InitializeParameter[d] : &:r2769_11 +# 2770| r2770_1(glval) = VariableAddress[x] : +# 2770| r2770_2(glval) = VariableAddress[a] : +# 2770| r2770_3(int) = Load[a] : &:r2770_2, m2769_6 +# 2770| r2770_4(glval) = VariableAddress[b] : +# 2770| r2770_5(int) = Load[b] : &:r2770_4, m2769_8 +# 2770| r2770_6(strong_ordering) = Spaceship : r2770_3, r2770_5 +# 2770| m2770_7(strong_ordering) = Store[x] : &:r2770_1, r2770_6 +# 2771| r2771_1(glval) = VariableAddress[y] : +# 2771| r2771_2(glval) = VariableAddress[c] : +# 2771| r2771_3(glval) = FunctionAddress[operator<=>] : +# 2771| r2771_4(glval) = VariableAddress[d] : +# 2771| r2771_5(ThreeWay &) = CopyValue : r2771_4 +# 2771| r2771_6(strong_ordering) = Call[operator<=>] : func:r2771_3, this:r2771_2, 0:r2771_5 +# 2771| m2771_7(unknown) = ^CallSideEffect : ~m2769_4 +# 2771| m2771_8(unknown) = Chi : total:m2769_4, partial:m2771_7 +# 2771| v2771_9(void) = ^IndirectReadSideEffect[-1] : &:r2771_2, m2769_10 +# 2771| v2771_10(void) = ^BufferReadSideEffect[0] : &:r2771_5, ~m2769_12 +# 2771| m2771_11(ThreeWay) = ^IndirectMayWriteSideEffect[-1] : &:r2771_2 +# 2771| m2771_12(ThreeWay) = Chi : total:m2769_10, partial:m2771_11 +# 2771| m2771_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r2771_5 +# 2771| m2771_14(ThreeWay) = Chi : total:m2769_12, partial:m2771_13 +# 2771| m2771_15(strong_ordering) = Store[y] : &:r2771_1, r2771_6 +# 2772| v2772_1(void) = NoOp : +# 2769| v2769_13(void) = ReturnVoid : +# 2769| v2769_14(void) = AliasedUse : ~m2771_8 +# 2769| v2769_15(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 @@ -39983,4 +40096,17 @@ type_info_test.cpp: # 3| m3_4(unknown) = Chi : total:m3_2, partial:m3_3 # 3| r3_5(glval) = VariableAddress[x] : # 3| m3_6(int) = InitializeParameter[x] : &:r3_5 +# 3| m3_7(unknown) = Chi : total:m3_4, partial:m3_6 # 4| r4_1(glval) = VariableAddress[t1] : +# 4| r4_2(glval) = VariableAddress[x] : +# 4| r4_3(glval) = TypeidExpr : r4_2 +# 4| r4_4(type_info &) = CopyValue : r4_3 +# 4| m4_5(type_info &) = Store[t1] : &:r4_1, r4_4 +# 5| r5_1(glval) = VariableAddress[t2] : +# 5| r5_2(glval) = TypeidType : +# 5| r5_3(type_info &) = CopyValue : r5_2 +# 5| m5_4(type_info &) = Store[t2] : &:r5_1, r5_3 +# 6| v6_1(void) = NoOp : +# 3| v3_8(void) = ReturnVoid : +# 3| v3_9(void) = AliasedUse : m3_3 +# 3| v3_10(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 137b2aee2665..b83d9ea47e38 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| type_info_test.cpp:4:25:4:26 | VariableAddress: definition of t1 | Instruction 'VariableAddress: definition of t1' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 137b2aee2665..b83d9ea47e38 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| type_info_test.cpp:4:25:4:26 | VariableAddress: definition of t1 | Instruction 'VariableAddress: definition of t1' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 92566968e6ea..74c41c7e916b 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2742,4 +2742,33 @@ void test_postfix_crement(int *p, int q) { int q2 = (int)(q++); } +namespace std { + enum class _Order : signed char { __less = -1, __equiv = 0, __greater = 1 }; + class strong_ordering { + explicit constexpr strong_ordering(_Order v) {} + + public: + static const strong_ordering less; + static const strong_ordering equal; + static const strong_ordering equivalent; + static const strong_ordering greater; + }; + + inline constexpr strong_ordering strong_ordering::less(_Order::__less); + inline constexpr strong_ordering strong_ordering::equal(_Order::__equiv); + inline constexpr strong_ordering strong_ordering::equivalent(_Order::__equiv); + inline constexpr strong_ordering strong_ordering::greater(_Order::__greater); +} + +class ThreeWay { + int x; +public: + std::strong_ordering operator<=>(ThreeWay &y) { return this->x <=> y.x; } +}; + +void test_three_way(int a, int b, ThreeWay c, ThreeWay d) { + auto x = a <=> b; + auto y = c <=> d; +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 9cdfdd2dcd5e..e30106d35204 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,6 +1,4 @@ missingOperand -| type_info_test.cpp:4:30:4:38 | CopyValue: (reference to) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | -| type_info_test.cpp:5:30:5:40 | CopyValue: (reference to) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,9 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| type_info_test.cpp:4:25:4:26 | VariableAddress: definition of t1 | Instruction 'VariableAddress: definition of t1' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | -| type_info_test.cpp:4:37:4:37 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | -| type_info_test.cpp:5:25:5:26 | VariableAddress: definition of t2 | Instruction 'VariableAddress: definition of t2' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -26,8 +21,6 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| type_info_test.cpp:4:25:4:26 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | -| type_info_test.cpp:5:25:5:26 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index c9158233914d..8cdb5e8c351f 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -18432,6 +18432,112 @@ ir.cpp: # 2728| v2728_12(void) = AliasedUse : ~m? # 2728| v2728_13(void) = ExitFunction : +# 2747| void std::strong_ordering::strong_ordering(std::strong_ordering&&) +# 2747| Block 0 +# 2747| v2747_1(void) = EnterFunction : +# 2747| mu2747_2(unknown) = AliasedDefinition : +# 2747| mu2747_3(unknown) = InitializeNonLocal : +# 2747| r2747_4(glval) = VariableAddress[#this] : +# 2747| mu2747_5(glval) = InitializeParameter[#this] : &:r2747_4 +# 2747| r2747_6(glval) = Load[#this] : &:r2747_4, ~m? +# 2747| mu2747_7(strong_ordering) = InitializeIndirection[#this] : &:r2747_6 +#-----| r0_1(glval) = VariableAddress[(unnamed parameter 0)] : +#-----| mu0_2(strong_ordering &&) = InitializeParameter[(unnamed parameter 0)] : &:r0_1 +#-----| r0_3(strong_ordering &&) = Load[(unnamed parameter 0)] : &:r0_1, ~m? +#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3 +# 2747| v2747_8(void) = NoOp : +# 2747| v2747_9(void) = ReturnIndirection[#this] : &:r2747_6, ~m? +#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? +# 2747| v2747_10(void) = ReturnVoid : +# 2747| v2747_11(void) = AliasedUse : ~m? +# 2747| v2747_12(void) = ExitFunction : + +# 2748| void std::strong_ordering::strong_ordering(std::_Order) +# 2748| Block 0 +# 2748| v2748_1(void) = EnterFunction : +# 2748| mu2748_2(unknown) = AliasedDefinition : +# 2748| mu2748_3(unknown) = InitializeNonLocal : +# 2748| r2748_4(glval) = VariableAddress[#this] : +# 2748| mu2748_5(glval) = InitializeParameter[#this] : &:r2748_4 +# 2748| r2748_6(glval) = Load[#this] : &:r2748_4, ~m? +# 2748| mu2748_7(strong_ordering) = InitializeIndirection[#this] : &:r2748_6 +# 2748| r2748_8(glval<_Order>) = VariableAddress[v] : +# 2748| mu2748_9(_Order) = InitializeParameter[v] : &:r2748_8 +# 2748| v2748_10(void) = NoOp : +# 2748| v2748_11(void) = ReturnIndirection[#this] : &:r2748_6, ~m? +# 2748| v2748_12(void) = ReturnVoid : +# 2748| v2748_13(void) = AliasedUse : ~m? +# 2748| v2748_14(void) = ExitFunction : + +# 2766| std::strong_ordering ThreeWay::operator<=>(ThreeWay&) +# 2766| Block 0 +# 2766| v2766_1(void) = EnterFunction : +# 2766| mu2766_2(unknown) = AliasedDefinition : +# 2766| mu2766_3(unknown) = InitializeNonLocal : +# 2766| r2766_4(glval) = VariableAddress[#this] : +# 2766| mu2766_5(glval) = InitializeParameter[#this] : &:r2766_4 +# 2766| r2766_6(glval) = Load[#this] : &:r2766_4, ~m? +# 2766| mu2766_7(ThreeWay) = InitializeIndirection[#this] : &:r2766_6 +# 2766| r2766_8(glval) = VariableAddress[y] : +# 2766| mu2766_9(ThreeWay &) = InitializeParameter[y] : &:r2766_8 +# 2766| r2766_10(ThreeWay &) = Load[y] : &:r2766_8, ~m? +# 2766| mu2766_11(unknown) = InitializeIndirection[y] : &:r2766_10 +# 2766| r2766_12(glval) = VariableAddress[#return] : +# 2766| r2766_13(glval) = VariableAddress[#this] : +# 2766| r2766_14(ThreeWay *) = Load[#this] : &:r2766_13, ~m? +# 2766| r2766_15(glval) = FieldAddress[x] : r2766_14 +# 2766| r2766_16(int) = Load[?] : &:r2766_15, ~m? +# 2766| r2766_17(glval) = VariableAddress[y] : +# 2766| r2766_18(ThreeWay &) = Load[y] : &:r2766_17, ~m? +# 2766| r2766_19(glval) = CopyValue : r2766_18 +# 2766| r2766_20(glval) = FieldAddress[x] : r2766_19 +# 2766| r2766_21(int) = Load[?] : &:r2766_20, ~m? +# 2766| r2766_22(strong_ordering) = Spaceship : r2766_16, r2766_21 +# 2766| mu2766_23(strong_ordering) = Store[#return] : &:r2766_12, r2766_22 +# 2766| v2766_24(void) = ReturnIndirection[#this] : &:r2766_6, ~m? +# 2766| v2766_25(void) = ReturnIndirection[y] : &:r2766_10, ~m? +# 2766| r2766_26(glval) = VariableAddress[#return] : +# 2766| v2766_27(void) = ReturnValue : &:r2766_26, ~m? +# 2766| v2766_28(void) = AliasedUse : ~m? +# 2766| v2766_29(void) = ExitFunction : + +# 2769| void test_three_way(int, int, ThreeWay, ThreeWay) +# 2769| Block 0 +# 2769| v2769_1(void) = EnterFunction : +# 2769| mu2769_2(unknown) = AliasedDefinition : +# 2769| mu2769_3(unknown) = InitializeNonLocal : +# 2769| r2769_4(glval) = VariableAddress[a] : +# 2769| mu2769_5(int) = InitializeParameter[a] : &:r2769_4 +# 2769| r2769_6(glval) = VariableAddress[b] : +# 2769| mu2769_7(int) = InitializeParameter[b] : &:r2769_6 +# 2769| r2769_8(glval) = VariableAddress[c] : +# 2769| mu2769_9(ThreeWay) = InitializeParameter[c] : &:r2769_8 +# 2769| r2769_10(glval) = VariableAddress[d] : +# 2769| mu2769_11(ThreeWay) = InitializeParameter[d] : &:r2769_10 +# 2770| r2770_1(glval) = VariableAddress[x] : +# 2770| r2770_2(glval) = VariableAddress[a] : +# 2770| r2770_3(int) = Load[a] : &:r2770_2, ~m? +# 2770| r2770_4(glval) = VariableAddress[b] : +# 2770| r2770_5(int) = Load[b] : &:r2770_4, ~m? +# 2770| r2770_6(strong_ordering) = Spaceship : r2770_3, r2770_5 +# 2770| mu2770_7(strong_ordering) = Store[x] : &:r2770_1, r2770_6 +# 2771| r2771_1(glval) = VariableAddress[y] : +# 2771| r2771_2(glval) = VariableAddress[c] : +# 2771| r2771_3(glval) = FunctionAddress[operator<=>] : +# 2771| r2771_4(glval) = VariableAddress[d] : +# 2771| r2771_5(ThreeWay &) = CopyValue : r2771_4 +# 2771| r2771_6(strong_ordering) = Call[operator<=>] : func:r2771_3, this:r2771_2, 0:r2771_5 +# 2771| mu2771_7(unknown) = ^CallSideEffect : ~m? +# 2771| v2771_8(void) = ^IndirectReadSideEffect[-1] : &:r2771_2, ~m? +# 2771| v2771_9(void) = ^BufferReadSideEffect[0] : &:r2771_5, ~m? +# 2771| mu2771_10(ThreeWay) = ^IndirectMayWriteSideEffect[-1] : &:r2771_2 +# 2771| mu2771_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r2771_5 +# 2771| mu2771_12(strong_ordering) = Store[y] : &:r2771_1, r2771_6 +# 2772| v2772_1(void) = NoOp : +# 2769| v2769_12(void) = ReturnVoid : +# 2769| v2769_13(void) = AliasedUse : ~m? +# 2769| v2769_14(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 @@ -38112,19 +38218,15 @@ type_info_test.cpp: # 3| r3_4(glval) = VariableAddress[x] : # 3| mu3_5(int) = InitializeParameter[x] : &:r3_4 # 4| r4_1(glval) = VariableAddress[t1] : - -# 4| Block 1 -# 4| r4_2(glval) = VariableAddress[x] : - -# 4| Block 2 -# 4| r4_3(type_info &) = CopyValue : -# 4| mu4_4(type_info &) = Store[t1] : &:r4_1, r4_3 -# 5| r5_1(glval) = VariableAddress[t2] : - -# 5| Block 3 -# 5| r5_2(type_info &) = CopyValue : -# 5| mu5_3(type_info &) = Store[t2] : &:r5_1, r5_2 -# 6| v6_1(void) = NoOp : -# 3| v3_6(void) = ReturnVoid : -# 3| v3_7(void) = AliasedUse : ~m? -# 3| v3_8(void) = ExitFunction : +# 4| r4_2(glval) = VariableAddress[x] : +# 4| r4_3(glval) = TypeidExpr : r4_2 +# 4| r4_4(type_info &) = CopyValue : r4_3 +# 4| mu4_5(type_info &) = Store[t1] : &:r4_1, r4_4 +# 5| r5_1(glval) = VariableAddress[t2] : +# 5| r5_2(glval) = TypeidType : +# 5| r5_3(type_info &) = CopyValue : r5_2 +# 5| mu5_4(type_info &) = Store[t2] : &:r5_1, r5_3 +# 6| v6_1(void) = NoOp : +# 3| v3_6(void) = ReturnVoid : +# 3| v3_7(void) = AliasedUse : ~m? +# 3| v3_8(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 137b2aee2665..b83d9ea47e38 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| type_info_test.cpp:4:25:4:26 | VariableAddress: definition of t1 | Instruction 'VariableAddress: definition of t1' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 137b2aee2665..b83d9ea47e38 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| type_info_test.cpp:4:25:4:26 | VariableAddress: definition of t1 | Instruction 'VariableAddress: definition of t1' has no successors in function '$@'. | type_info_test.cpp:3:6:3:19 | void type_info_test(int) | void type_info_test(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/query-tests/Critical/InitialisationNotRun/InitialisationNotRun.expected b/cpp/ql/test/query-tests/Critical/InitialisationNotRun/InitialisationNotRun.expected new file mode 100644 index 000000000000..fdb53a2a4689 --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/InitialisationNotRun/InitialisationNotRun.expected @@ -0,0 +1,2 @@ +| test.cpp:12:16:12:17 | g1 | Initialization code for 'g1' is never run. | +| test.cpp:14:23:14:24 | g3 | Initialization code for 'g3' is never run. | diff --git a/cpp/ql/test/query-tests/Critical/InitialisationNotRun/InitialisationNotRun.qlref b/cpp/ql/test/query-tests/Critical/InitialisationNotRun/InitialisationNotRun.qlref new file mode 100644 index 000000000000..7012169e8945 --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/InitialisationNotRun/InitialisationNotRun.qlref @@ -0,0 +1 @@ +Critical/InitialisationNotRun.ql diff --git a/cpp/ql/test/query-tests/Critical/InitialisationNotRun/test.cpp b/cpp/ql/test/query-tests/Critical/InitialisationNotRun/test.cpp new file mode 100644 index 000000000000..ee0d070df088 --- /dev/null +++ b/cpp/ql/test/query-tests/Critical/InitialisationNotRun/test.cpp @@ -0,0 +1,36 @@ +// --- stubs --- + +char *strcpy(char *dest, const char *src); + +// --- tests --- + +class GlobalStorage { +public: + char name[1000]; +}; + +GlobalStorage *g1; // BAD +static GlobalStorage g2; // GOOD +static GlobalStorage *g3; // BAD +// static variables are initialized by compilers +static int a; // GOOD +static int b = 0; // GOOD + +void init() { //initializes g_storage, but is never run from main + g1 = new GlobalStorage(); + g3 = new GlobalStorage(); +} + +void init2(int b) { + for (int i = 0; i < b; ++i) + a *= -1; +} + +int main(int argc, char *argv[]) { + //init not called + strcpy(g1->name, argv[1]); // g1 is used before init() is called + strcpy(g2.name, argv[1]); // g2 is initialised by compiler + strcpy(g3->name, argv[1]); + b++; + return 0; +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected index 2f24a9a27cb5..3a2b7372831d 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/OverrunWriteProductFlow.expected @@ -12,19 +12,6 @@ edges | test.cpp:42:13:42:15 | *str [string] | test.cpp:42:18:42:23 | string | provenance | | | test.cpp:72:17:72:19 | *str [string] | test.cpp:72:22:72:27 | string | provenance | | | test.cpp:80:17:80:19 | *str [string] | test.cpp:80:22:80:27 | string | provenance | | -| test.cpp:88:11:88:30 | **mk_string_t_plus_one [string] | test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | provenance | | -| test.cpp:90:5:90:7 | *str [post update] [string] | test.cpp:91:5:91:7 | *str [string] | provenance | | -| test.cpp:90:5:90:34 | ... = ... | test.cpp:90:5:90:7 | *str [post update] [string] | provenance | | -| test.cpp:90:19:90:24 | call to malloc | test.cpp:90:5:90:34 | ... = ... | provenance | | -| test.cpp:91:5:91:7 | *str [string] | test.cpp:92:12:92:14 | *str [string] | provenance | | -| test.cpp:92:12:92:14 | *str [string] | test.cpp:88:11:88:30 | **mk_string_t_plus_one [string] | provenance | | -| test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | provenance | | -| test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | test.cpp:99:13:99:15 | *str [string] | provenance | | -| test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | test.cpp:129:17:129:19 | *str [string] | provenance | | -| test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | test.cpp:137:17:137:19 | *str [string] | provenance | | -| test.cpp:99:13:99:15 | *str [string] | test.cpp:99:18:99:23 | string | provenance | | -| test.cpp:129:17:129:19 | *str [string] | test.cpp:129:22:129:27 | string | provenance | | -| test.cpp:137:17:137:19 | *str [string] | test.cpp:137:22:137:27 | string | provenance | | | test.cpp:147:5:147:7 | *str [post update] [string] | test.cpp:148:5:148:7 | *str [string] | provenance | | | test.cpp:147:5:147:34 | ... = ... | test.cpp:147:5:147:7 | *str [post update] [string] | provenance | | | test.cpp:147:19:147:24 | call to malloc | test.cpp:147:5:147:34 | ... = ... | provenance | | @@ -46,12 +33,6 @@ edges | test.cpp:199:17:199:19 | *str [string] | test.cpp:199:22:199:27 | string | provenance | | | test.cpp:203:17:203:19 | *str [string] | test.cpp:203:22:203:27 | string | provenance | | | test.cpp:207:17:207:19 | *str [string] | test.cpp:207:22:207:27 | string | provenance | | -| test.cpp:214:24:214:24 | p | test.cpp:216:10:216:10 | p | provenance | | -| test.cpp:220:27:220:54 | call to malloc | test.cpp:220:27:220:54 | call to malloc | provenance | | -| test.cpp:220:27:220:54 | call to malloc | test.cpp:222:15:222:20 | buffer | provenance | | -| test.cpp:222:15:222:20 | buffer | test.cpp:214:24:214:24 | p | provenance | | -| test.cpp:228:27:228:54 | call to malloc | test.cpp:228:27:228:54 | call to malloc | provenance | | -| test.cpp:228:27:228:54 | call to malloc | test.cpp:232:10:232:15 | buffer | provenance | | | test.cpp:235:40:235:45 | buffer | test.cpp:236:5:236:26 | ... = ... | provenance | | | test.cpp:236:5:236:9 | *p_str [post update] [string] | test.cpp:235:27:235:31 | *p_str [Return] [string] | provenance | | | test.cpp:236:5:236:9 | *p_str [post update] [string] | test.cpp:235:27:235:31 | *p_str [string] | provenance | | @@ -64,8 +45,6 @@ edges | test.cpp:243:12:243:14 | *str [string] | test.cpp:243:12:243:21 | string | provenance | | | test.cpp:249:14:249:33 | call to my_alloc | test.cpp:249:14:249:33 | call to my_alloc | provenance | | | test.cpp:249:14:249:33 | call to my_alloc | test.cpp:250:12:250:12 | p | provenance | | -| test.cpp:256:5:256:25 | ... = ... | test.cpp:257:12:257:12 | p | provenance | | -| test.cpp:256:9:256:25 | call to malloc | test.cpp:256:5:256:25 | ... = ... | provenance | | | test.cpp:262:15:262:30 | call to malloc | test.cpp:262:15:262:30 | call to malloc | provenance | | | test.cpp:262:15:262:30 | call to malloc | test.cpp:266:12:266:12 | p | provenance | | | test.cpp:264:9:264:30 | ... = ... | test.cpp:266:12:266:12 | p | provenance | | @@ -85,20 +64,6 @@ nodes | test.cpp:72:22:72:27 | string | semmle.label | string | | test.cpp:80:17:80:19 | *str [string] | semmle.label | *str [string] | | test.cpp:80:22:80:27 | string | semmle.label | string | -| test.cpp:88:11:88:30 | **mk_string_t_plus_one [string] | semmle.label | **mk_string_t_plus_one [string] | -| test.cpp:90:5:90:7 | *str [post update] [string] | semmle.label | *str [post update] [string] | -| test.cpp:90:5:90:34 | ... = ... | semmle.label | ... = ... | -| test.cpp:90:19:90:24 | call to malloc | semmle.label | call to malloc | -| test.cpp:91:5:91:7 | *str [string] | semmle.label | *str [string] | -| test.cpp:92:12:92:14 | *str [string] | semmle.label | *str [string] | -| test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | semmle.label | *call to mk_string_t_plus_one [string] | -| test.cpp:96:21:96:40 | *call to mk_string_t_plus_one [string] | semmle.label | *call to mk_string_t_plus_one [string] | -| test.cpp:99:13:99:15 | *str [string] | semmle.label | *str [string] | -| test.cpp:99:18:99:23 | string | semmle.label | string | -| test.cpp:129:17:129:19 | *str [string] | semmle.label | *str [string] | -| test.cpp:129:22:129:27 | string | semmle.label | string | -| test.cpp:137:17:137:19 | *str [string] | semmle.label | *str [string] | -| test.cpp:137:22:137:27 | string | semmle.label | string | | test.cpp:147:5:147:7 | *str [post update] [string] | semmle.label | *str [post update] [string] | | test.cpp:147:5:147:34 | ... = ... | semmle.label | ... = ... | | test.cpp:147:19:147:24 | call to malloc | semmle.label | call to malloc | @@ -121,14 +86,6 @@ nodes | test.cpp:203:22:203:27 | string | semmle.label | string | | test.cpp:207:17:207:19 | *str [string] | semmle.label | *str [string] | | test.cpp:207:22:207:27 | string | semmle.label | string | -| test.cpp:214:24:214:24 | p | semmle.label | p | -| test.cpp:216:10:216:10 | p | semmle.label | p | -| test.cpp:220:27:220:54 | call to malloc | semmle.label | call to malloc | -| test.cpp:220:27:220:54 | call to malloc | semmle.label | call to malloc | -| test.cpp:222:15:222:20 | buffer | semmle.label | buffer | -| test.cpp:228:27:228:54 | call to malloc | semmle.label | call to malloc | -| test.cpp:228:27:228:54 | call to malloc | semmle.label | call to malloc | -| test.cpp:232:10:232:15 | buffer | semmle.label | buffer | | test.cpp:235:27:235:31 | *p_str [Return] [string] | semmle.label | *p_str [Return] [string] | | test.cpp:235:27:235:31 | *p_str [string] | semmle.label | *p_str [string] | | test.cpp:235:40:235:45 | buffer | semmle.label | buffer | @@ -143,9 +100,6 @@ nodes | test.cpp:249:14:249:33 | call to my_alloc | semmle.label | call to my_alloc | | test.cpp:249:14:249:33 | call to my_alloc | semmle.label | call to my_alloc | | test.cpp:250:12:250:12 | p | semmle.label | p | -| test.cpp:256:5:256:25 | ... = ... | semmle.label | ... = ... | -| test.cpp:256:9:256:25 | call to malloc | semmle.label | call to malloc | -| test.cpp:257:12:257:12 | p | semmle.label | p | | test.cpp:262:15:262:30 | call to malloc | semmle.label | call to malloc | | test.cpp:262:15:262:30 | call to malloc | semmle.label | call to malloc | | test.cpp:264:9:264:30 | ... = ... | semmle.label | ... = ... | @@ -158,9 +112,6 @@ subpaths | test.cpp:42:5:42:11 | call to strncpy | test.cpp:18:19:18:24 | call to malloc | test.cpp:42:18:42:23 | string | This write may overflow $@ by 1 element. | test.cpp:42:18:42:23 | string | string | | test.cpp:72:9:72:15 | call to strncpy | test.cpp:18:19:18:24 | call to malloc | test.cpp:72:22:72:27 | string | This write may overflow $@ by 1 element. | test.cpp:72:22:72:27 | string | string | | test.cpp:80:9:80:15 | call to strncpy | test.cpp:18:19:18:24 | call to malloc | test.cpp:80:22:80:27 | string | This write may overflow $@ by 2 elements. | test.cpp:80:22:80:27 | string | string | -| test.cpp:99:5:99:11 | call to strncpy | test.cpp:90:19:90:24 | call to malloc | test.cpp:99:18:99:23 | string | This write may overflow $@ by 1 element. | test.cpp:99:18:99:23 | string | string | -| test.cpp:129:9:129:15 | call to strncpy | test.cpp:90:19:90:24 | call to malloc | test.cpp:129:22:129:27 | string | This write may overflow $@ by 1 element. | test.cpp:129:22:129:27 | string | string | -| test.cpp:137:9:137:15 | call to strncpy | test.cpp:90:19:90:24 | call to malloc | test.cpp:137:22:137:27 | string | This write may overflow $@ by 2 elements. | test.cpp:137:22:137:27 | string | string | | test.cpp:152:5:152:11 | call to strncpy | test.cpp:147:19:147:24 | call to malloc | test.cpp:152:18:152:23 | string | This write may overflow $@ by 1 element. | test.cpp:152:18:152:23 | string | string | | test.cpp:154:5:154:11 | call to strncpy | test.cpp:147:19:147:24 | call to malloc | test.cpp:154:18:154:23 | string | This write may overflow $@ by 1 element. | test.cpp:154:18:154:23 | string | string | | test.cpp:156:5:156:11 | call to strncpy | test.cpp:147:19:147:24 | call to malloc | test.cpp:156:18:156:23 | string | This write may overflow $@ by 2 elements. | test.cpp:156:18:156:23 | string | string | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/test.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/test.cpp index 253ac4fe2925..ca6ca9a5c5a8 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/test.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/SAMATE/test.cpp @@ -264,4 +264,15 @@ void test7(unsigned n) { p = (char*)malloc(++n); } memset(p, 0, n); // GOOD [FALSE POSITIVE] +} + +void test8(unsigned size, unsigned src_pos) +{ + char *xs = new char[size]; + if (src_pos > size) { + src_pos = size; + } + if (src_pos < size - 1) { + memset(xs, 0, src_pos + 1); // GOOD + } } \ No newline at end of file diff --git a/csharp/documentation/library-coverage/coverage.csv b/csharp/documentation/library-coverage/coverage.csv index ea5961f0c4ee..72c46c89934a 100644 --- a/csharp/documentation/library-coverage/coverage.csv +++ b/csharp/documentation/library-coverage/coverage.csv @@ -43,5 +43,5 @@ MySql.Data.MySqlClient,48,,,,,,,,,,,,48,,,,,,,,,, Newtonsoft.Json,,,91,,,,,,,,,,,,,,,,,,,73,18 ServiceStack,194,,7,27,,,,,75,,,,92,,,,,,,,,7, SourceGenerators,,,5,,,,,,,,,,,,,,,,,,,,5 -System,54,47,12139,,6,5,5,,,4,1,,33,2,,6,15,17,4,3,,5903,6236 +System,54,47,12165,,6,5,5,,,4,1,,33,2,,6,15,17,4,3,,5929,6236 Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,,,,,,,, diff --git a/csharp/documentation/library-coverage/coverage.rst b/csharp/documentation/library-coverage/coverage.rst index 6ab5a55b3e68..c1c3f927fd7d 100644 --- a/csharp/documentation/library-coverage/coverage.rst +++ b/csharp/documentation/library-coverage/coverage.rst @@ -8,7 +8,7 @@ C# framework & library support Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE-079` :sub:`Cross-site scripting` `ServiceStack `_,"``ServiceStack.*``, ``ServiceStack``",,7,194, - System,"``System.*``, ``System``",47,12139,54,5 + System,"``System.*``, ``System``",47,12165,54,5 Others,"``Amazon.Lambda.APIGatewayEvents``, ``Amazon.Lambda.Core``, ``Dapper``, ``ILCompiler``, ``ILLink.RoslynAnalyzer``, ``ILLink.Shared``, ``ILLink.Tasks``, ``Internal.IL``, ``Internal.Pgo``, ``Internal.TypeSystem``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.AspNetCore.Components``, ``Microsoft.AspNetCore.Http``, ``Microsoft.AspNetCore.Mvc``, ``Microsoft.AspNetCore.WebUtilities``, ``Microsoft.CSharp``, ``Microsoft.Data.SqlClient``, ``Microsoft.Diagnostics.Tools.Pgo``, ``Microsoft.DotNet.Build.Tasks``, ``Microsoft.DotNet.PlatformAbstractions``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.Diagnostics.Metrics``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.JSInterop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``Mono.Linker``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``, ``SourceGenerators``, ``Windows.Security.Cryptography.Core``",60,2257,159,4 - Totals,,107,14403,407,9 + Totals,,107,14429,407,9 diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index f46a19790d63..1b3c69fd4d05 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.45 + +No user-facing changes. + ## 1.7.44 No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/4.1.10.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.45.md similarity index 71% rename from ruby/ql/lib/change-notes/released/4.1.10.md rename to csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.45.md index abac078d4e2a..3e891d822fb9 100644 --- a/ruby/ql/lib/change-notes/released/4.1.10.md +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.45.md @@ -1,3 +1,3 @@ -## 4.1.10 +## 1.7.45 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index a392bdc2592e..5a84df101839 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.44 +lastReleaseVersion: 1.7.45 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 9f064506c032..c6e17a64adcd 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.45-dev +version: 1.7.46-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index f46a19790d63..1b3c69fd4d05 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.45 + +No user-facing changes. + ## 1.7.44 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.45.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.45.md new file mode 100644 index 000000000000..3e891d822fb9 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.45.md @@ -0,0 +1,3 @@ +## 1.7.45 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index a392bdc2592e..5a84df101839 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.44 +lastReleaseVersion: 1.7.45 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 29f22535c2ef..529cd400b6c3 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.45-dev +version: 1.7.46-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 108a37248ce3..1bce7a7f8031 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,7 +1,13 @@ -## 5.1.10 +## 5.2.1 No user-facing changes. +## 5.2.0 + +### New Features + +* Added a new predicate, `getASuperType()`, to get a direct supertype of this type. + ## 5.1.9 No user-facing changes. diff --git a/csharp/ql/lib/change-notes/released/5.2.0.md b/csharp/ql/lib/change-notes/released/5.2.0.md new file mode 100644 index 000000000000..5408c0d44bde --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.2.0.md @@ -0,0 +1,5 @@ +## 5.2.0 + +### New Features + +* Added a new predicate, `getASuperType()`, to get a direct supertype of this type. diff --git a/csharp/ql/lib/change-notes/released/5.2.1.md b/csharp/ql/lib/change-notes/released/5.2.1.md new file mode 100644 index 000000000000..8d65db4e16d0 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.2.1.md @@ -0,0 +1,3 @@ +## 5.2.1 + +No user-facing changes. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 9198af0dd6c7..1684d0e72a28 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.1.10 +lastReleaseVersion: 5.2.1 diff --git a/csharp/ql/lib/ext/System.IO.model.yml b/csharp/ql/lib/ext/System.IO.model.yml index dcc9c70551b0..0b8b52d9e8a5 100644 --- a/csharp/ql/lib/ext/System.IO.model.yml +++ b/csharp/ql/lib/ext/System.IO.model.yml @@ -47,7 +47,7 @@ extensions: - ["System.IO", "FileStream", False, "FileStream", "(System.String,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.Int32)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["System.IO", "FileStream", False, "FileStream", "(System.String,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.Int32,System.Boolean)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["System.IO", "FileStream", False, "FileStream", "(System.String,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare,System.Int32,System.IO.FileOptions)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["System.IO", "MemoryStream", False, "MemoryStream", "(System.Byte[])", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["System.IO", "MemoryStream", False, "MemoryStream", "(System.Byte[])", "", "Argument[0].Element", "Argument[this]", "taint", "manual"] - ["System.IO", "MemoryStream", False, "MemoryStream", "(System.Byte[],System.Boolean)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"] - ["System.IO", "MemoryStream", False, "MemoryStream", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"] - ["System.IO", "MemoryStream", False, "MemoryStream", "(System.Byte[],System.Int32,System.Int32,System.Boolean)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"] diff --git a/csharp/ql/lib/ext/System.Runtime.Serialization.model.yml b/csharp/ql/lib/ext/System.Runtime.Serialization.model.yml new file mode 100644 index 000000000000..628d06b33b8d --- /dev/null +++ b/csharp/ql/lib/ext/System.Runtime.Serialization.model.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["System.Runtime.Serialization", "SerializationInfo", False, "AddValue", "(System.String,System.Object)", "", "Argument[1]", "Argument[this]", "taint", "manual"] + - ["System.Runtime.Serialization", "SerializationInfo", False, "AddValue", "(System.String,System.Object,System.Type)", "", "Argument[1]", "Argument[this]", "taint", "manual"] + - ["System.Runtime.Serialization", "SerializationInfo", False, "GetEnumerator", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["System.Runtime.Serialization", "SerializationInfo", False, "GetString", "(System.String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["System.Runtime.Serialization", "SerializationInfo", False, "GetValue", "(System.String,System.Type)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + # Note that SerializationEntry hasn't been modeled yet, so the model below for get_Current will not in itself provide more flow. + - ["System.Runtime.Serialization", "SerializationInfoEnumerator", False, "get_Current", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["System.Runtime.Serialization", "SerializationInfoEnumerator", False, "get_Value", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/csharp/ql/lib/ext/System.Text.model.yml b/csharp/ql/lib/ext/System.Text.model.yml index 4a94b61109f9..0067b8b000cf 100644 --- a/csharp/ql/lib/ext/System.Text.model.yml +++ b/csharp/ql/lib/ext/System.Text.model.yml @@ -3,18 +3,18 @@ extensions: pack: codeql/csharp-all extensible: summaryModel data: - - ["System.Text", "Encoding", True, "GetBytes", "(System.Char*,System.Int32,System.Byte*,System.Int32)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetBytes", "(System.Char*,System.Int32,System.Byte*,System.Int32)", "", "Argument[0].Element", "Argument[2]", "taint", "manual"] - ["System.Text", "Encoding", True, "GetBytes", "(System.Char[])", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - ["System.Text", "Encoding", True, "GetBytes", "(System.Char[],System.Int32,System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - - ["System.Text", "Encoding", True, "GetBytes", "(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - - ["System.Text", "Encoding", True, "GetBytes", "(System.ReadOnlySpan,System.Span)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetBytes", "(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32)", "", "Argument[0].Element", "Argument[3]", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetBytes", "(System.ReadOnlySpan,System.Span)", "", "Argument[0].Element", "Argument[1]", "taint", "manual"] - ["System.Text", "Encoding", True, "GetBytes", "(System.String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["System.Text", "Encoding", False, "GetBytes", "(System.String,System.Int32,System.Int32)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["System.Text", "Encoding", True, "GetBytes", "(System.String,System.Int32,System.Int32,System.Byte[],System.Int32)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["System.Text", "Encoding", True, "GetChars", "(System.Byte*,System.Int32,System.Char*,System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetBytes", "(System.String,System.Int32,System.Int32)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetBytes", "(System.String,System.Int32,System.Int32,System.Byte[],System.Int32)", "", "Argument[0]", "Argument[3]", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetChars", "(System.Byte*,System.Int32,System.Char*,System.Int32)", "", "Argument[0].Element", "Argument[2]", "taint", "manual"] - ["System.Text", "Encoding", True, "GetChars", "(System.Byte[])", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - ["System.Text", "Encoding", True, "GetChars", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - - ["System.Text", "Encoding", True, "GetChars", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] + - ["System.Text", "Encoding", True, "GetChars", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32)", "", "Argument[0].Element", "Argument[3]", "taint", "manual"] - ["System.Text", "Encoding", True, "GetChars", "(System.ReadOnlySpan,System.Span)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - ["System.Text", "Encoding", False, "GetString", "(System.Byte*,System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - ["System.Text", "Encoding", True, "GetString", "(System.Byte[])", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] diff --git a/csharp/ql/lib/ext/System.Xml.model.yml b/csharp/ql/lib/ext/System.Xml.model.yml index 55825304a145..efea34b40dbe 100644 --- a/csharp/ql/lib/ext/System.Xml.model.yml +++ b/csharp/ql/lib/ext/System.Xml.model.yml @@ -4,6 +4,25 @@ extensions: extensible: summaryModel data: - ["System.Xml", "XmlAttributeCollection", False, "CopyTo", "(System.Xml.XmlAttribute[],System.Int32)", "", "Argument[this].Element", "Argument[0].Element", "value", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0].Element", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[3]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession)", "", "Argument[0].Element", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession)", "", "Argument[3]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession)", "", "Argument[5]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[3]", "ReturnValue", "taint", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[5]", "ReturnValue", "taint", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0].Element", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.Byte[],System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0].Element", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[1]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession)", "", "Argument[0]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession)", "", "Argument[1]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession)", "", "Argument[3]", "ReturnValue", "taint", "df-manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[3]", "ReturnValue", "taint", "manual"] + - ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0]", "ReturnValue", "taint", "df-manual"] - ["System.Xml", "XmlDocument", False, "Load", "(System.IO.Stream)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["System.Xml", "XmlDocument", False, "Load", "(System.IO.TextReader)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["System.Xml", "XmlDocument", False, "Load", "(System.String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index cc94ae1c2a59..b99e5b5be642 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 5.1.11-dev +version: 5.2.2-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/asp/WebConfig.qll b/csharp/ql/lib/semmle/code/asp/WebConfig.qll index f9106bcd1afd..384c3a013c3b 100644 --- a/csharp/ql/lib/semmle/code/asp/WebConfig.qll +++ b/csharp/ql/lib/semmle/code/asp/WebConfig.qll @@ -8,14 +8,14 @@ import csharp * A `Web.config` file. */ class WebConfigXml extends XmlFile { - WebConfigXml() { this.getName().matches("%Web.config") } + WebConfigXml() { this.getName().toLowerCase().matches("%web.config") } } /** * A `Web.config` transformation file. */ class WebConfigReleaseTransformXml extends XmlFile { - WebConfigReleaseTransformXml() { this.getName().matches("%Web.Release.config") } + WebConfigReleaseTransformXml() { this.getName().toLowerCase().matches("%web.release.config") } } /** A `` tag in an ASP.NET configuration file. */ diff --git a/csharp/ql/lib/semmle/code/csharp/Type.qll b/csharp/ql/lib/semmle/code/csharp/Type.qll index 9283bb3002a1..e417f393b94a 100644 --- a/csharp/ql/lib/semmle/code/csharp/Type.qll +++ b/csharp/ql/lib/semmle/code/csharp/Type.qll @@ -138,6 +138,9 @@ class ValueOrRefType extends Type, Attributable, @value_or_ref_type { /** Gets an immediate subtype of this type, if any. */ ValueOrRefType getASubType() { result.getABaseType() = this } + /** Gets an immediate supertype of this type, if any. */ + ValueOrRefType getASuperType() { this.getABaseType() = result } + /** Gets a member of this type, if any. */ Member getAMember() { result.getDeclaringType() = this } @@ -198,7 +201,7 @@ class ValueOrRefType extends Type, Attributable, @value_or_ref_type { */ pragma[inline] predicate hasCallable(Callable c) { - this.hasMethod(c) + this.hasMember(c) or this.hasMember(c.(Accessor).getDeclaration()) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll index 6d59c0579860..d1490c849163 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -975,7 +975,8 @@ private module Cached { cached // nothing is actually cached module BarrierGuard { private predicate guardChecksAdjTypes( - DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, boolean branch + DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, + DataFlowIntegrationInput::GuardValue branch ) { exists(Guards::AbstractValues::BooleanValue v | guardChecks(g, e.getAstNode(), v) and @@ -1016,6 +1017,7 @@ string getToStringPrefix(Definition def) { private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInputSig { private import csharp as Cs private import semmle.code.csharp.controlflow.BasicBlocks + private import codeql.util.Boolean class Expr extends ControlFlow::Node { predicate hasCfgNode(ControlFlow::BasicBlock bb, int i) { this = bb.getNode(i) } @@ -1042,12 +1044,14 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu ) } + class GuardValue = Boolean; + class Guard extends Guards::Guard { /** * Holds if the evaluation of this guard to `branch` corresponds to the edge * from `bb1` to `bb2`. */ - predicate hasBranchEdge(BasicBlock bb1, BasicBlock bb2, boolean branch) { + predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { exists(ControlFlow::SuccessorTypes::ConditionalSuccessor s | this.getAControlFlowNode() = bb1.getLastNode() and bb2 = bb1.getASuccessorByType(s) and @@ -1060,13 +1064,13 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * branch edge from `bb1` to `bb2`. That is, following the edge from * `bb1` to `bb2` implies that this guard evaluated to `branch`. */ - predicate controlsBranchEdge(BasicBlock bb1, BasicBlock bb2, boolean branch) { - this.hasBranchEdge(bb1, bb2, branch) + predicate valueControlsBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { + this.hasValueBranchEdge(bb1, bb2, branch) } } /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ - predicate guardDirectlyControlsBlock(Guard guard, ControlFlow::BasicBlock bb, boolean branch) { + predicate guardDirectlyControlsBlock(Guard guard, ControlFlow::BasicBlock bb, GuardValue branch) { exists(ConditionBlock conditionBlock, ControlFlow::SuccessorTypes::ConditionalSuccessor s | guard.getAControlFlowNode() = conditionBlock.getLastNode() and s.getValue() = branch and diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 67a3deb278bf..7209d4cfb81e 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,9 +1,18 @@ +## 1.3.2 + +No user-facing changes. + ## 1.3.1 ### Minor Analysis Improvements +* Explicitly added summary models for all overloads of `System.Xml.XmlDictionaryReader.CreateBinaryReader`. Added models for some of the methods and properties in `System.Runtime.Serialization.SerializationInfo` and `System.Runtime.Serialization.SerializationInfoEnumerator`. Updated models for `System.Text.Encoding.GetBytes`, `System.Text.Encoding.GetChars` and the constructor for `System.IO.MemoryStream`. This generally improves the library modelling and thus reduces the number of false negatives. * Added explicit SQL injection Models as Data models for `Microsoft.Data.SqlClient.SqlCommand` and `Microsoft.Data.SqlClient.SqlDataAdapter`. This reduces false negatives for the query `cs/sql-injection`. +### Bug Fixes + +* `web.config` and `web.release.config` files are now recognized regardless of case. This means queries `cs/web/debug-binary` and `cs/web/missing-x-frame-options` may produce more results than before. + ## 1.3.0 ### Query Metadata Changes diff --git a/csharp/ql/src/change-notes/released/1.3.1.md b/csharp/ql/src/change-notes/released/1.3.1.md index 389a7a4d6a67..4576c8116873 100644 --- a/csharp/ql/src/change-notes/released/1.3.1.md +++ b/csharp/ql/src/change-notes/released/1.3.1.md @@ -2,4 +2,9 @@ ### Minor Analysis Improvements +* Explicitly added summary models for all overloads of `System.Xml.XmlDictionaryReader.CreateBinaryReader`. Added models for some of the methods and properties in `System.Runtime.Serialization.SerializationInfo` and `System.Runtime.Serialization.SerializationInfoEnumerator`. Updated models for `System.Text.Encoding.GetBytes`, `System.Text.Encoding.GetChars` and the constructor for `System.IO.MemoryStream`. This generally improves the library modelling and thus reduces the number of false negatives. * Added explicit SQL injection Models as Data models for `Microsoft.Data.SqlClient.SqlCommand` and `Microsoft.Data.SqlClient.SqlDataAdapter`. This reduces false negatives for the query `cs/sql-injection`. + +### Bug Fixes + +* `web.config` and `web.release.config` files are now recognized regardless of case. This means queries `cs/web/debug-binary` and `cs/web/missing-x-frame-options` may produce more results than before. diff --git a/csharp/ql/src/change-notes/released/1.3.2.md b/csharp/ql/src/change-notes/released/1.3.2.md new file mode 100644 index 000000000000..14f14807ef51 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.3.2.md @@ -0,0 +1,3 @@ +## 1.3.2 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index e71b6d081f15..86a9cb32d86b 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.1 +lastReleaseVersion: 1.3.2 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 62db73042efe..ec0fab1f1114 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.3.2-dev +version: 1.3.3-dev groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected index c3eb0402922c..ff615d531152 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected @@ -12371,7 +12371,7 @@ summary | System.IO;MemoryStream;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);Argument[this];Argument[0];taint;manual | | System.IO;MemoryStream;FlushAsync;(System.Threading.CancellationToken);Argument[this];ReturnValue.SyntheticField[System.Threading.Tasks.Task.m_stateObject];value;dfc-generated | | System.IO;MemoryStream;GetBuffer;();Argument[this];ReturnValue;taint;df-generated | -| System.IO;MemoryStream;MemoryStream;(System.Byte[]);Argument[0];Argument[this];taint;manual | +| System.IO;MemoryStream;MemoryStream;(System.Byte[]);Argument[0].Element;Argument[this];taint;manual | | System.IO;MemoryStream;MemoryStream;(System.Byte[],System.Boolean);Argument[0].Element;Argument[this];taint;manual | | System.IO;MemoryStream;MemoryStream;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;Argument[this];taint;manual | | System.IO;MemoryStream;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);Argument[0].Element;Argument[this];taint;manual | @@ -17277,30 +17277,20 @@ summary | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Int16);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Int32);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Int64);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object);Argument[1];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object,System.Type);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object,System.Type);Argument[1];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;value;dfc-generated | +| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object);Argument[1];Argument[this];taint;manual | +| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object,System.Type);Argument[1];Argument[this];taint;manual | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.SByte);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Single);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.UInt16);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.UInt32);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.UInt64);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetEnumerator;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names];ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetEnumerator;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values];ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetString;(System.String);Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;ReturnValue;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetValue;(System.String,System.Type);Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;ReturnValue;value;dfc-generated | +| System.Runtime.Serialization;SerializationInfo;GetEnumerator;();Argument[this];ReturnValue;taint;manual | +| System.Runtime.Serialization;SerializationInfo;GetString;(System.String);Argument[this];ReturnValue;taint;manual | +| System.Runtime.Serialization;SerializationInfo;GetValue;(System.String,System.Type);Argument[this];ReturnValue;taint;manual | | System.Runtime.Serialization;SerializationInfo;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);Argument[1];Argument[this];taint;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].Property[System.Runtime.Serialization.SerializationInfoEnumerator.Current];ReturnValue;value;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].Property[System.Runtime.Serialization.SerializationInfoEnumerator.Current];ReturnValue;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._value];value;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._value];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._name];value;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._name];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this];ReturnValue;taint;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this];ReturnValue;taint;dfc-generated | +| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this];ReturnValue;taint;manual | | System.Runtime.Serialization;SerializationInfoEnumerator;get_Name;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members].Element;ReturnValue;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Value;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data].Element;ReturnValue;value;dfc-generated | +| System.Runtime.Serialization;SerializationInfoEnumerator;get_Value;();Argument[this];ReturnValue;taint;manual | | System.Runtime.Serialization;SerializationObjectManager;SerializationObjectManager;(System.Runtime.Serialization.StreamingContext);Argument[0];Argument[this];taint;df-generated | | System.Runtime.Serialization;StreamingContext;StreamingContext;(System.Runtime.Serialization.StreamingContextStates,System.Object);Argument[1];Argument[this].SyntheticField[System.Runtime.Serialization.StreamingContext._additionalContext];value;dfc-generated | | System.Runtime.Serialization;StreamingContext;get_Context;();Argument[this].SyntheticField[System.Runtime.Serialization.StreamingContext._additionalContext];ReturnValue;value;dfc-generated | @@ -18467,12 +18457,12 @@ summary | System.Text.Unicode;Utf8+TryWriteInterpolatedStringHandler;TryWriteInterpolatedStringHandler;(System.Int32,System.Int32,System.Span,System.Boolean);Argument[2];Argument[this];taint;df-generated | | System.Text.Unicode;Utf8+TryWriteInterpolatedStringHandler;TryWriteInterpolatedStringHandler;(System.Int32,System.Int32,System.Span,System.IFormatProvider,System.Boolean);Argument[2];Argument[this];taint;df-generated | | System.Text.Unicode;Utf8+TryWriteInterpolatedStringHandler;TryWriteInterpolatedStringHandler;(System.Int32,System.Int32,System.Span,System.IFormatProvider,System.Boolean);Argument[3];Argument[this];taint;df-generated | -| System.Text;ASCIIEncoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;ASCIIEncoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;ASCIIEncoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0];ReturnValue;taint;manual | -| System.Text;ASCIIEncoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;ASCIIEncoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;ASCIIEncoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;ASCIIEncoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;ASCIIEncoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;ASCIIEncoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0].Element;Argument[1];taint;manual | +| System.Text;ASCIIEncoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;ASCIIEncoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;ASCIIEncoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;ASCIIEncoding;GetChars;(System.ReadOnlySpan,System.Span);Argument[0].Element;ReturnValue;taint;manual | | System.Text;ASCIIEncoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;ASCIIEncoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | @@ -18501,18 +18491,18 @@ summary | System.Text;Encoding;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);Argument[2];ReturnValue;taint;df-generated | | System.Text;Encoding;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);Argument[1];Argument[this];taint;df-generated | | System.Text;Encoding;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);Argument[2];Argument[this];taint;df-generated | -| System.Text;Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | +| System.Text;Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | | System.Text;Encoding;GetBytes;(System.Char[]);Argument[0].Element;ReturnValue;taint;manual | | System.Text;Encoding;GetBytes;(System.Char[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;Encoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0];ReturnValue;taint;manual | +| System.Text;Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;Encoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0].Element;Argument[1];taint;manual | | System.Text;Encoding;GetBytes;(System.String);Argument[0];ReturnValue;taint;manual | | System.Text;Encoding;GetBytes;(System.String,System.Int32,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | | System.Text;Encoding;GetChars;(System.Byte[]);Argument[0].Element;ReturnValue;taint;manual | | System.Text;Encoding;GetChars;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;Encoding;GetChars;(System.ReadOnlySpan,System.Span);Argument[0].Element;ReturnValue;taint;manual | | System.Text;Encoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;Encoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | @@ -18703,37 +18693,37 @@ summary | System.Text;StringRuneEnumerator;GetEnumerator;();Argument[this].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value;manual | | System.Text;StringRuneEnumerator;GetEnumerator;();Argument[this];ReturnValue;value;dfc-generated | | System.Text;StringRuneEnumerator;get_Current;();Argument[this];ReturnValue;taint;df-generated | -| System.Text;UTF7Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF7Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF7Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF7Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF7Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;UTF7Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UTF7Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;UTF7Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;UTF7Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UTF7Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;UTF7Encoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UTF7Encoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UTF7Encoding;GetString;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF8Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF8Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF8Encoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF8Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF8Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF8Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;UTF8Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UTF8Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;UTF8Encoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0].Element;Argument[1];taint;manual | +| System.Text;UTF8Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;UTF8Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UTF8Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;UTF8Encoding;GetChars;(System.ReadOnlySpan,System.Span);Argument[0].Element;ReturnValue;taint;manual | | System.Text;UTF8Encoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UTF8Encoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UTF8Encoding;GetString;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF32Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF32Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF32Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UTF32Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UTF32Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;UTF32Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UTF32Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;UTF32Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;UTF32Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UTF32Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;UTF32Encoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UTF32Encoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UTF32Encoding;GetString;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UnicodeEncoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UnicodeEncoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UnicodeEncoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;UnicodeEncoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;UnicodeEncoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;UnicodeEncoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UnicodeEncoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;UnicodeEncoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;UnicodeEncoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | +| System.Text;UnicodeEncoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;UnicodeEncoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UnicodeEncoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;UnicodeEncoding;GetString;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | @@ -20868,21 +20858,27 @@ summary | System.Xml;XmlDictionary;TryLookup;(System.Int32,System.Xml.XmlDictionaryString);Argument[this];Argument[1];taint;df-generated | | System.Xml;XmlDictionary;TryLookup;(System.String,System.Xml.XmlDictionaryString);Argument[this];Argument[1];taint;df-generated | | System.Xml;XmlDictionary;TryLookup;(System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString);Argument[0];Argument[1];value;dfc-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[3];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[5];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[6];Argument[6].Parameter[delegate-self];value;hq-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[1];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[1];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[4];Argument[4].Parameter[delegate-self];value;hq-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-generated | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[3];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[5];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[0].Element;ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[3];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[5];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[6];Argument[6].Parameter[delegate-self];value;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[1];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[1];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[0];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[1];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[3];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[4];Argument[4].Parameter[delegate-self];value;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-manual | | System.Xml;XmlDictionaryReader;CreateDictionaryReader;(System.Xml.XmlReader);Argument[0];ReturnValue;value;dfc-generated | | System.Xml;XmlDictionaryReader;CreateMtomReader;(System.Byte[],System.Int32,System.Int32,System.Text.Encoding[],System.String,System.Xml.XmlDictionaryReaderQuotas,System.Int32,System.Xml.OnXmlDictionaryReaderClose);Argument[7];Argument[7].Parameter[delegate-self];value;hq-generated | | System.Xml;XmlDictionaryReader;CreateMtomReader;(System.IO.Stream,System.Text.Encoding[],System.String,System.Xml.XmlDictionaryReaderQuotas,System.Int32,System.Xml.OnXmlDictionaryReaderClose);Argument[5];Argument[5].Parameter[delegate-self];value;hq-generated | diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected index 8c0a26ee4039..faf716f4d7be 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected @@ -9208,7 +9208,7 @@ | System.IO;FileSystemWatcher;remove_Error;(System.IO.ErrorEventHandler);Argument[0];Argument[0].Parameter[delegate-self];value;hq-generated | | System.IO;FileSystemWatcher;remove_Renamed;(System.IO.RenamedEventHandler);Argument[0];Argument[0].Parameter[delegate-self];value;hq-generated | | System.IO;MemoryStream;GetBuffer;();Argument[this];ReturnValue;taint;df-generated | -| System.IO;MemoryStream;MemoryStream;(System.Byte[]);Argument[0];Argument[this];taint;manual | +| System.IO;MemoryStream;MemoryStream;(System.Byte[]);Argument[0].Element;Argument[this];taint;manual | | System.IO;MemoryStream;MemoryStream;(System.Byte[],System.Boolean);Argument[0].Element;Argument[this];taint;manual | | System.IO;MemoryStream;MemoryStream;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;Argument[this];taint;manual | | System.IO;MemoryStream;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);Argument[0].Element;Argument[this];taint;manual | @@ -13222,28 +13222,20 @@ | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Int16);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Int32);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Int64);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object);Argument[1];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object,System.Type);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object,System.Type);Argument[1];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;value;dfc-generated | +| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object);Argument[1];Argument[this];taint;manual | +| System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Object,System.Type);Argument[1];Argument[this];taint;manual | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.SByte);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.Single);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.UInt16);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.UInt32);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | | System.Runtime.Serialization;SerializationInfo;AddValue;(System.String,System.UInt64);Argument[0];Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names].Element;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetEnumerator;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._names];ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetEnumerator;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values];ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetString;(System.String);Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;ReturnValue;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfo;GetValue;(System.String,System.Type);Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfo._values].Element;ReturnValue;value;dfc-generated | +| System.Runtime.Serialization;SerializationInfo;GetEnumerator;();Argument[this];ReturnValue;taint;manual | +| System.Runtime.Serialization;SerializationInfo;GetString;(System.String);Argument[this];ReturnValue;taint;manual | +| System.Runtime.Serialization;SerializationInfo;GetValue;(System.String,System.Type);Argument[this];ReturnValue;taint;manual | | System.Runtime.Serialization;SerializationInfo;SerializationInfo;(System.Type,System.Runtime.Serialization.IFormatterConverter);Argument[1];Argument[this];taint;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].Property[System.Runtime.Serialization.SerializationInfoEnumerator.Current];ReturnValue;value;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].Property[System.Runtime.Serialization.SerializationInfoEnumerator.Current];ReturnValue;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._value];value;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._value];value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._name];value;df-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members].Element;ReturnValue.SyntheticField[System.Runtime.Serialization.SerializationEntry._name];value;dfc-generated | +| System.Runtime.Serialization;SerializationInfoEnumerator;get_Current;();Argument[this];ReturnValue;taint;manual | | System.Runtime.Serialization;SerializationInfoEnumerator;get_Name;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._members].Element;ReturnValue;value;dfc-generated | -| System.Runtime.Serialization;SerializationInfoEnumerator;get_Value;();Argument[this].SyntheticField[System.Runtime.Serialization.SerializationInfoEnumerator._data].Element;ReturnValue;value;dfc-generated | +| System.Runtime.Serialization;SerializationInfoEnumerator;get_Value;();Argument[this];ReturnValue;taint;manual | | System.Runtime.Serialization;SerializationObjectManager;SerializationObjectManager;(System.Runtime.Serialization.StreamingContext);Argument[0];Argument[this];taint;df-generated | | System.Runtime.Serialization;StreamingContext;StreamingContext;(System.Runtime.Serialization.StreamingContextStates,System.Object);Argument[1];Argument[this].SyntheticField[System.Runtime.Serialization.StreamingContext._additionalContext];value;dfc-generated | | System.Runtime.Serialization;StreamingContext;get_Context;();Argument[this].SyntheticField[System.Runtime.Serialization.StreamingContext._additionalContext];ReturnValue;value;dfc-generated | @@ -14074,18 +14066,18 @@ | System.Text;Encoding;CreateTranscodingStream;(System.IO.Stream,System.Text.Encoding,System.Text.Encoding,System.Boolean);Argument[2];ReturnValue;taint;df-generated | | System.Text;Encoding;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);Argument[1];Argument[this];taint;df-generated | | System.Text;Encoding;Encoding;(System.Int32,System.Text.EncoderFallback,System.Text.DecoderFallback);Argument[2];Argument[this];taint;df-generated | -| System.Text;Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0];ReturnValue;taint;manual | +| System.Text;Encoding;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);Argument[0].Element;Argument[2];taint;manual | | System.Text;Encoding;GetBytes;(System.Char[]);Argument[0].Element;ReturnValue;taint;manual | | System.Text;Encoding;GetBytes;(System.Char[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;Encoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0];ReturnValue;taint;manual | +| System.Text;Encoding;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0].Element;Argument[3];taint;manual | +| System.Text;Encoding;GetBytes;(System.ReadOnlySpan,System.Span);Argument[0].Element;Argument[1];taint;manual | | System.Text;Encoding;GetBytes;(System.String);Argument[0];ReturnValue;taint;manual | | System.Text;Encoding;GetBytes;(System.String,System.Int32,System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];ReturnValue;taint;manual | -| System.Text;Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;Encoding;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);Argument[0];Argument[3];taint;manual | +| System.Text;Encoding;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);Argument[0].Element;Argument[2];taint;manual | | System.Text;Encoding;GetChars;(System.Byte[]);Argument[0].Element;ReturnValue;taint;manual | | System.Text;Encoding;GetChars;(System.Byte[],System.Int32,System.Int32);Argument[0].Element;ReturnValue;taint;manual | -| System.Text;Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;ReturnValue;taint;manual | +| System.Text;Encoding;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);Argument[0].Element;Argument[3];taint;manual | | System.Text;Encoding;GetChars;(System.ReadOnlySpan,System.Span);Argument[0].Element;ReturnValue;taint;manual | | System.Text;Encoding;GetDecoder;();Argument[this];ReturnValue;taint;df-generated | | System.Text;Encoding;GetEncoder;();Argument[this];ReturnValue;taint;df-generated | @@ -16194,21 +16186,27 @@ | System.Xml;XmlDeclaration;XmlDeclaration;(System.String,System.String,System.String,System.Xml.XmlDocument);Argument[2];Argument[this];taint;df-generated | | System.Xml;XmlDictionary;Add;(System.String);Argument[0];ReturnValue.SyntheticField[System.Xml.XmlDictionaryString._value];value;dfc-generated | | System.Xml;XmlDictionary;Add;(System.String);Argument[this];ReturnValue.SyntheticField[System.Xml.XmlDictionaryString._dictionary];value;dfc-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[3];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[5];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[6];Argument[6].Parameter[delegate-self];value;hq-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[1];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[1];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[4];Argument[4].Parameter[delegate-self];value;hq-generated | -| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-generated | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[3];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[5];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[0].Element;ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[3];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[5];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[6];Argument[6].Parameter[delegate-self];value;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.Byte[],System.Xml.XmlDictionaryReaderQuotas);Argument[0].Element;ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas);Argument[1];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[0];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[1];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession);Argument[3];ReturnValue;taint;df-manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[0];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[1];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[3];ReturnValue;taint;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose);Argument[4];Argument[4].Parameter[delegate-self];value;manual | +| System.Xml;XmlDictionaryReader;CreateBinaryReader;(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas);Argument[0];ReturnValue;taint;df-manual | | System.Xml;XmlDictionaryReader;CreateDictionaryReader;(System.Xml.XmlReader);Argument[0];ReturnValue;value;dfc-generated | | System.Xml;XmlDictionaryReader;CreateMtomReader;(System.Byte[],System.Int32,System.Int32,System.Text.Encoding[],System.String,System.Xml.XmlDictionaryReaderQuotas,System.Int32,System.Xml.OnXmlDictionaryReaderClose);Argument[7];Argument[7].Parameter[delegate-self];value;hq-generated | | System.Xml;XmlDictionaryReader;CreateMtomReader;(System.IO.Stream,System.Text.Encoding[],System.String,System.Xml.XmlDictionaryReaderQuotas,System.Int32,System.Xml.OnXmlDictionaryReaderClose);Argument[5];Argument[5].Parameter[delegate-self];value;hq-generated | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.cs index 93dede10b15d..a2d0c24ff4c4 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.cs @@ -11,11 +11,11 @@ public static void M(FileStream fs) { var formatter = new BinaryFormatter(); // BAD - var a = (Func)formatter.Deserialize(fs); + var a = (Func)formatter.Deserialize(fs); // $ Alert[cs/deserialized-delegate] // BAD - var b = (Expression>)formatter.Deserialize(fs); + var b = (Expression>)formatter.Deserialize(fs); // $ Alert[cs/deserialized-delegate] // BAD - var c = (D)formatter.Deserialize(fs); + var c = (D)formatter.Deserialize(fs); // $ Alert[cs/deserialized-delegate] // GOOD var d = (int)formatter.Deserialize(fs); } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.qlref b/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.qlref index 913c61338c47..dbfd493cef5b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegate.qlref @@ -1 +1,4 @@ -Security Features/CWE-502/DeserializedDelegate.ql \ No newline at end of file +query: Security Features/CWE-502/DeserializedDelegate.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegateBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegateBad.cs index 12b2dc76987d..48c2ed2b4140 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegateBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/DeserializedDelegate/DeserializedDelegateBad.cs @@ -8,7 +8,7 @@ public static int InvokeSerialized(FileStream fs) { var formatter = new BinaryFormatter(); // BAD - var f = (Func)formatter.Deserialize(fs); + var f = (Func)formatter.Deserialize(fs); // $ Alert[cs/deserialized-delegate] return f(); } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs index 1170a37ad3b9..7fbe5499dbb7 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs @@ -7,6 +7,6 @@ public static object Deserialize(Stream s) { var ds = new BinaryFormatter(); // BAD - return ds.Deserialize(s); + return ds.Deserialize(s); // $ Alert[cs/unsafe-deserialization] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs index 1256428176c5..2e2b80cc25ae 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs @@ -8,6 +8,6 @@ public static object Deserialize(Type type, Stream s) { var ds = new DataContractJsonSerializer(type); // BAD - return ds.ReadObject(s); + return ds.ReadObject(s); // $ Alert[cs/unsafe-deserialization] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs index 35cff0b45f1d..e98bd0c0aa0b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs @@ -8,6 +8,6 @@ public static object Deserialize(Type type, Stream s) { var ds = new DataContractSerializer(type); // BAD - return ds.ReadObject(s); + return ds.ReadObject(s); // $ Alert[cs/unsafe-deserialization] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs index 2da5dc1aa6a5..e39a87769900 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs @@ -6,11 +6,11 @@ class BadResourceReader { public static void Deserialize(Stream s) { - var ds = new ResourceReader(s); + var ds = new ResourceReader(s); // $ Alert[cs/unsafe-deserialization] // BAD var dict = ds.GetEnumerator(); while (dict.MoveNext()) - Console.WriteLine(" {0}: '{1}' (Type {2})", + Console.WriteLine(" {0}: '{1}' (Type {2})", dict.Key, dict.Value, dict.Value.GetType().Name); ds.Close(); } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.qlref b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.qlref index 78efa2399c0b..25a133ff8a71 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.qlref @@ -1 +1,4 @@ -Security Features/CWE-502/UnsafeDeserialization.ql \ No newline at end of file +query: Security Features/CWE-502/UnsafeDeserialization.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserializationBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserializationBad.cs index 385e700a0bf9..ce178961b9b6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserializationBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserializationBad.cs @@ -6,6 +6,6 @@ public static object Deserialize(string s) { JavaScriptSerializer sr = new JavaScriptSerializer(new SimpleTypeResolver()); // BAD - return sr.DeserializeObject(s); + return sr.DeserializeObject(s); // $ Alert[cs/unsafe-deserialization] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs index 4096934da0ba..a8e1bc42e2fc 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs @@ -8,6 +8,6 @@ public static object Deserialize(Type type, Stream s) { XmlObjectSerializer ds = new DataContractSerializer(type); // BAD - return ds.ReadObject(s); + return ds.ReadObject(s); // $ Alert[cs/unsafe-deserialization] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs index 4d32bae9c082..a5f3287cd55d 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs @@ -8,6 +8,6 @@ public static object Deserialize(Type type, Stream s) { var ds = new XmlSerializer(type); // BAD - return ds.Deserialize(s); + return ds.Deserialize(s); // $ Alert[cs/unsafe-deserialization] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs index 73c6c35413bc..8f19580b68a8 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs @@ -1,14 +1,25 @@ -using System.Web.UI.WebControls; -using System.Runtime.Serialization.Formatters.Binary; +using System; using System.IO; +using System.Runtime.Serialization.Formatters.Binary; using System.Text; +using System.Web.UI.WebControls; -class BadBinaryFormatter +class BadBinaryFormatter1 { public static object Deserialize(TextBox textBox) { var ds = new BinaryFormatter(); // BAD - return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(textBox.Text))); + return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(textBox.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] + } +} + +class BadBinaryFormatter2 +{ + public static object Deserialize(TextBox type, TextBox data) + { + var ds = new BinaryFormatter(); + // BAD + return ds.Deserialize(new MemoryStream(Convert.FromBase64String(data.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs index 2d3efe3ae269..e1e389c0a67f 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs @@ -10,6 +10,6 @@ public static object Deserialize(TextBox type, TextBox data) { var ds = new DataContractJsonSerializer(Type.GetType(type.Text)); // BAD - return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); + return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs index f4f266ed3e00..2e979b2387d6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs @@ -10,6 +10,6 @@ public static object Deserialize(TextBox type, TextBox data) { var ds = new DataContractSerializer(Type.GetType(type.Text)); // BAD - return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); + return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs index cd5468afc2d2..33ca758ac9cf 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs @@ -8,11 +8,11 @@ class BadResourceReader { public static void Deserialize(TextBox data) { - var ds = new ResourceReader(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); + var ds = new ResourceReader(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] // BAD var dict = ds.GetEnumerator(); while (dict.MoveNext()) - Console.WriteLine(" {0}: '{1}' (Type {2})", + Console.WriteLine(" {0}: '{1}' (Type {2})", dict.Key, dict.Value, dict.Value.GetType().Name); ds.Close(); } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected index 37cba1c28bff..c3377fcb04f0 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected @@ -1,5 +1,6 @@ #select -| BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | User-provided data | +| BinaryFormatterUntrustedInputBad.cs:13:31:13:84 | object creation of type MemoryStream | BinaryFormatterUntrustedInputBad.cs:13:71:13:77 | access to parameter textBox : TextBox | BinaryFormatterUntrustedInputBad.cs:13:31:13:84 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | BinaryFormatterUntrustedInputBad.cs:13:71:13:77 | access to parameter textBox : TextBox | User-provided data | +| BinaryFormatterUntrustedInputBad.cs:23:31:23:83 | object creation of type MemoryStream | BinaryFormatterUntrustedInputBad.cs:23:73:23:76 | access to parameter data : TextBox | BinaryFormatterUntrustedInputBad.cs:23:31:23:83 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | BinaryFormatterUntrustedInputBad.cs:23:73:23:76 | access to parameter data : TextBox | User-provided data | | DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | User-provided data | | DataContractSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | DataContractSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | DataContractSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | User-provided data | | ResourceReaderUntrustedInputBad.cs:11:37:11:87 | object creation of type MemoryStream | ResourceReaderUntrustedInputBad.cs:11:77:11:80 | access to parameter data : TextBox | ResourceReaderUntrustedInputBad.cs:11:37:11:87 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | ResourceReaderUntrustedInputBad.cs:11:77:11:80 | access to parameter data : TextBox | User-provided data | @@ -7,9 +8,12 @@ | XmlObjectSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | XmlObjectSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | XmlObjectSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | XmlObjectSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | User-provided data | | XmlSerializerUntrustedInputBad.cs:13:31:13:81 | object creation of type MemoryStream | XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | XmlSerializerUntrustedInputBad.cs:13:31:13:81 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | User-provided data | edges -| BinaryFormatterUntrustedInputBad.cs:12:48:12:83 | call to method GetBytes : Byte[] | BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | provenance | MaD:1 | -| BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | BinaryFormatterUntrustedInputBad.cs:12:71:12:82 | access to property Text : String | provenance | MaD:3 | -| BinaryFormatterUntrustedInputBad.cs:12:71:12:82 | access to property Text : String | BinaryFormatterUntrustedInputBad.cs:12:48:12:83 | call to method GetBytes : Byte[] | provenance | MaD:2 | +| BinaryFormatterUntrustedInputBad.cs:13:48:13:83 | call to method GetBytes : Byte[] | BinaryFormatterUntrustedInputBad.cs:13:31:13:84 | object creation of type MemoryStream | provenance | MaD:1 | +| BinaryFormatterUntrustedInputBad.cs:13:71:13:77 | access to parameter textBox : TextBox | BinaryFormatterUntrustedInputBad.cs:13:71:13:82 | access to property Text : String | provenance | MaD:3 | +| BinaryFormatterUntrustedInputBad.cs:13:71:13:82 | access to property Text : String | BinaryFormatterUntrustedInputBad.cs:13:48:13:83 | call to method GetBytes : Byte[] | provenance | MaD:2 | +| BinaryFormatterUntrustedInputBad.cs:23:48:23:82 | call to method FromBase64String : Byte[] [element] : Object | BinaryFormatterUntrustedInputBad.cs:23:31:23:83 | object creation of type MemoryStream | provenance | MaD:1 | +| BinaryFormatterUntrustedInputBad.cs:23:73:23:76 | access to parameter data : TextBox | BinaryFormatterUntrustedInputBad.cs:23:73:23:81 | access to property Text : String | provenance | MaD:3 | +| BinaryFormatterUntrustedInputBad.cs:23:73:23:81 | access to property Text : String | BinaryFormatterUntrustedInputBad.cs:23:48:23:82 | call to method FromBase64String : Byte[] [element] : Object | provenance | MaD:4 | | DataContractJsonSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | provenance | MaD:1 | | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | provenance | MaD:3 | | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | DataContractJsonSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | provenance | MaD:2 | @@ -27,14 +31,19 @@ edges | XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | XmlSerializerUntrustedInputBad.cs:13:71:13:79 | access to property Text : String | provenance | MaD:3 | | XmlSerializerUntrustedInputBad.cs:13:71:13:79 | access to property Text : String | XmlSerializerUntrustedInputBad.cs:13:48:13:80 | call to method GetBytes : Byte[] | provenance | MaD:2 | models -| 1 | Summary: System.IO; MemoryStream; false; MemoryStream; (System.Byte[]); ; Argument[0]; Argument[this]; taint; manual | +| 1 | Summary: System.IO; MemoryStream; false; MemoryStream; (System.Byte[]); ; Argument[0].Element; Argument[this]; taint; manual | | 2 | Summary: System.Text; Encoding; true; GetBytes; (System.String); ; Argument[0]; ReturnValue; taint; manual | | 3 | Summary: System.Web.UI.WebControls; TextBox; false; get_Text; (); ; Argument[this]; ReturnValue; taint; manual | +| 4 | Summary: System; Convert; false; FromBase64String; (System.String); ; Argument[0]; ReturnValue.Element; taint; manual | nodes -| BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream | -| BinaryFormatterUntrustedInputBad.cs:12:48:12:83 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | -| BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | semmle.label | access to parameter textBox : TextBox | -| BinaryFormatterUntrustedInputBad.cs:12:71:12:82 | access to property Text : String | semmle.label | access to property Text : String | +| BinaryFormatterUntrustedInputBad.cs:13:31:13:84 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream | +| BinaryFormatterUntrustedInputBad.cs:13:48:13:83 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | +| BinaryFormatterUntrustedInputBad.cs:13:71:13:77 | access to parameter textBox : TextBox | semmle.label | access to parameter textBox : TextBox | +| BinaryFormatterUntrustedInputBad.cs:13:71:13:82 | access to property Text : String | semmle.label | access to property Text : String | +| BinaryFormatterUntrustedInputBad.cs:23:31:23:83 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream | +| BinaryFormatterUntrustedInputBad.cs:23:48:23:82 | call to method FromBase64String : Byte[] [element] : Object | semmle.label | call to method FromBase64String : Byte[] [element] : Object | +| BinaryFormatterUntrustedInputBad.cs:23:73:23:76 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox | +| BinaryFormatterUntrustedInputBad.cs:23:73:23:81 | access to property Text : String | semmle.label | access to property Text : String | | DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream | | DataContractJsonSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] | | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.qlref b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.qlref index a1ffb72bf108..195452ad5675 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.qlref @@ -1,2 +1,4 @@ query: Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql -postprocess: utils/test/PrettyPrintModels.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputBad.cs index db2b25097bac..6af634af09c5 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputBad.cs @@ -7,6 +7,6 @@ public static object Deserialize(TextBox textBox) { JavaScriptSerializer sr = new JavaScriptSerializer(new SimpleTypeResolver()); // BAD - return sr.DeserializeObject(textBox.Text); + return sr.DeserializeObject(textBox.Text); // $ Alert[cs/unsafe-deserialization-untrusted-input] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs index b525dd28692b..c7a0d94cb45b 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs @@ -10,6 +10,6 @@ public static object Deserialize(TextBox type, TextBox data) { XmlObjectSerializer ds = new DataContractSerializer(Type.GetType(type.Text)); // BAD - return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); + return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs index f658f2a9e1a7..b5299c01f3f4 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs @@ -10,6 +10,6 @@ public static object Deserialize(TextBox type, TextBox data) { var ds = new XmlSerializer(Type.GetType(type.Text)); // BAD - return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); + return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(data.Text))); // $ Alert[cs/unsafe-deserialization-untrusted-input] } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/Test.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/Test.cs index c8c5cbb00988..90bdeef83368 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/Test.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/Test.cs @@ -14,9 +14,9 @@ public static object Deserialize1(TextBox data) public static object Deserialize2(TextBox data) { - return JsonConvert.DeserializeObject(data.Text, new JsonSerializerSettings + return JsonConvert.DeserializeObject(data.Text, new JsonSerializerSettings // $ Alert[cs/unsafe-deserialization-untrusted-input] { - TypeNameHandling = TypeNameHandling.Auto // BAD + TypeNameHandling = TypeNameHandling.Auto }); } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/UnsafeDeserializationUntrustedInput.qlref b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/UnsafeDeserializationUntrustedInput.qlref index a1ffb72bf108..195452ad5675 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/UnsafeDeserializationUntrustedInput.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInputNewtonsoftJson/UnsafeDeserializationUntrustedInput.qlref @@ -1,2 +1,4 @@ query: Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql -postprocess: utils/test/PrettyPrintModels.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 904a60b71cbd..78641764660b 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -21,7 +21,7 @@ Java,"Java 7 to 24 [6]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [7]_",``.java`` - Kotlin,"Kotlin 1.6.0 to 2.2.0\ *x*","kotlinc",``.kt`` + Kotlin,"Kotlin 1.6.0 to 2.2.2\ *x*","kotlinc",``.kt`` JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [8]_" Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13",Not applicable,``.py`` Ruby [10]_,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" diff --git a/docs/query-metadata-style-guide.md b/docs/query-metadata-style-guide.md index 18fa5d1880f5..f6cc6f883fc1 100644 --- a/docs/query-metadata-style-guide.md +++ b/docs/query-metadata-style-guide.md @@ -157,7 +157,7 @@ Each code quality related query should have **one** of these two "top-level" cat * `@tags maintainability`–for queries that detect patterns that make it harder for developers to make changes to the code. * `@tags reliability`–for queries that detect issues that affect whether the code will perform as expected during execution. -In addition to the "top-level" categories, we will also add sub-categories to further group code quality related queries: +In addition to the "top-level" categories, we may also add sub-categories to further group code quality related queries: * `@tags maintainability`–for queries that detect patterns that make it harder for developers to make changes to the code. * `@tags readability`–for queries that detect confusing patterns that make it harder for developers to read the code. @@ -171,6 +171,7 @@ In addition to the "top-level" categories, we will also add sub-categories to fu * `@tags concurrency`-for queries that detect concurrency related issues such as race conditions, deadlocks, thread safety, etc * `@tags error-handling`-for queries that detect issues related to unsafe error handling such as uncaught exceptions, etc +You may use sub-categories from both top-level categories on the same query. However, if you only use sub-categories from a single top-level category, then you must also tag the query with that top-level category. There are also more specific `@tags` that can be added. See, the following pages for examples of the low-level tags: diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 7b90353d01a8..6e50e04a5141 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.28.md b/go/ql/consistency-queries/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 821033dff0e8..706e295580eb 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.28-dev +version: 1.0.29-dev groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 48c938830d6b..b047f838925b 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.3.1 + +No user-facing changes. + ## 4.3.0 ### Deprecated APIs @@ -7,6 +11,7 @@ ### Minor Analysis Improvements +* Added models for the `Head` function and the `Client.Head` method, from the `net/http` package, to the `Http::ClientRequest` class. This means that they will be recognized as sinks for the query `go/request-forgery` and the experimental query `go/ssrf`. * Previously, `DefinedType.getBaseType` gave the underlying type. It now gives the right hand side of the type declaration, as the documentation indicated that it should. ## 4.2.8 diff --git a/go/ql/lib/change-notes/2025-07-08-request-forgery-sinks.md b/go/ql/lib/change-notes/2025-07-08-request-forgery-sinks.md deleted file mode 100644 index 6204749d9d62..000000000000 --- a/go/ql/lib/change-notes/2025-07-08-request-forgery-sinks.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added models for the `Head` function and the `Client.Head` method, from the `net/http` package, to the `Http::ClientRequest` class. This means that they will be recognized as sinks for the query `go/request-forgery` and the experimental query `go/ssrf`. diff --git a/go/ql/lib/change-notes/released/4.3.0.md b/go/ql/lib/change-notes/released/4.3.0.md index 1b7d48fbe568..2b2369b2d690 100644 --- a/go/ql/lib/change-notes/released/4.3.0.md +++ b/go/ql/lib/change-notes/released/4.3.0.md @@ -7,4 +7,5 @@ ### Minor Analysis Improvements +* Added models for the `Head` function and the `Client.Head` method, from the `net/http` package, to the `Http::ClientRequest` class. This means that they will be recognized as sinks for the query `go/request-forgery` and the experimental query `go/ssrf`. * Previously, `DefinedType.getBaseType` gave the underlying type. It now gives the right hand side of the type declaration, as the documentation indicated that it should. diff --git a/go/ql/lib/change-notes/released/4.3.1.md b/go/ql/lib/change-notes/released/4.3.1.md new file mode 100644 index 000000000000..dbc6b39e3ecf --- /dev/null +++ b/go/ql/lib/change-notes/released/4.3.1.md @@ -0,0 +1,3 @@ +## 4.3.1 + +No user-facing changes. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index c46c103a0bd7..70ac3707fcda 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.3.0 +lastReleaseVersion: 4.3.1 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 42bb03d9fe34..391245fa6895 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 4.3.1-dev +version: 4.3.2-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll index 58b849858416..aa9c9da1bd13 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplConsistency.qll @@ -4,11 +4,11 @@ */ private import go -private import DataFlowImplSpecific +private import DataFlowImplSpecific as Impl private import TaintTrackingImplSpecific private import codeql.dataflow.internal.DataFlowImplConsistency private import semmle.go.dataflow.internal.DataFlowNodes -private module Input implements InputSig { } +private module Input implements InputSig { } -module Consistency = MakeConsistency; +module Consistency = MakeConsistency; diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index cc2a0b46f7fb..eb21b53b4f79 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,7 +1,13 @@ -## 1.4.1 +## 1.4.2 No user-facing changes. +## 1.4.1 + +### Minor Analysis Improvements + +* `filepath.IsLocal` is now recognized as a sanitizer against path-traversal and related vulnerabilities. + ## 1.4.0 ### Query Metadata Changes diff --git a/go/ql/src/change-notes/2025-07-15-islocal-sanitizer.md b/go/ql/src/change-notes/2025-07-15-islocal-sanitizer.md deleted file mode 100644 index 35f04aacb582..000000000000 --- a/go/ql/src/change-notes/2025-07-15-islocal-sanitizer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* `filepath.IsLocal` is now recognised as a sanitizer against path-traversal and related vulnerabilities. diff --git a/go/ql/src/change-notes/released/1.4.1.md b/go/ql/src/change-notes/released/1.4.1.md index 38987aa49cd0..8d054d1eb688 100644 --- a/go/ql/src/change-notes/released/1.4.1.md +++ b/go/ql/src/change-notes/released/1.4.1.md @@ -1,3 +1,5 @@ ## 1.4.1 -No user-facing changes. +### Minor Analysis Improvements + +* `filepath.IsLocal` is now recognized as a sanitizer against path-traversal and related vulnerabilities. diff --git a/go/ql/src/change-notes/released/1.4.2.md b/go/ql/src/change-notes/released/1.4.2.md new file mode 100644 index 000000000000..37be01f40d98 --- /dev/null +++ b/go/ql/src/change-notes/released/1.4.2.md @@ -0,0 +1,3 @@ +## 1.4.2 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 43ccf4467bed..a76cacdf7997 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.1 +lastReleaseVersion: 1.4.2 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 2e46e90c1f24..d3c411a74f79 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.4.2-dev +version: 1.4.3-dev groups: - go - queries diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index fc3620ca4bc6..7ec0b4c5f0fc 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -1,284 +1,292 @@ -package,sink,source,summary,sink:bean-validation,sink:command-injection,sink:credentials-key,sink:credentials-password,sink:credentials-username,sink:encryption-iv,sink:encryption-salt,sink:environment-injection,sink:file-content-store,sink:fragment-injection,sink:groovy-injection,sink:hostname-verification,sink:html-injection,sink:information-leak,sink:intent-redirection,sink:jexl-injection,sink:jndi-injection,sink:js-injection,sink:ldap-injection,sink:log-injection,sink:mvel-injection,sink:notification,sink:ognl-injection,sink:path-injection,sink:pending-intents,sink:regex-use,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:request-forgery,sink:response-splitting,sink:sql-injection,sink:template-injection,sink:trust-boundary-violation,sink:url-forward,sink:url-redirection,sink:xpath-injection,sink:xslt-injection,source:android-external-storage-dir,source:contentprovider,source:database,source:environment,source:file,source:remote,summary:taint,summary:value -actions.osgi,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, -android.app,77,,103,,,,,,,,,,11,,,,,7,,,,,,,42,,,17,,,,,,,,,,,,,,,,,,,,,,,18,85 -android.content,24,31,154,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,8,,,,,,,4,27,,,,,63,91 -android.database,59,,41,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,,41, -android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15 -android.os,1,2,122,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,2,,,,,,41,81 -android.support.v4.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -android.util,6,16,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,16,, -android.webkit,3,2,,,,,,,,,,,,,,2,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, -android.widget,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1, -androidx.core.app,47,,95,,,,,,,,,,,,,,,,,,,,,,41,,,6,,,,,,,,,,,,,,,,,,,,,,,12,83 -androidx.fragment.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -androidx.slice,2,5,88,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,5,,,,,27,61 -antlr,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -ch.ethz.ssh2,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -cn.hutool.core.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.alibaba.druid.sql,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,1, -com.alibaba.fastjson2,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.amazonaws.auth,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.auth0.jwt.algorithms,6,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.azure.identity,3,,,,,1,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -com.fasterxml.jackson.databind,2,,8,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,8, -com.google.common.base,4,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,,,63,24 -com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17 -com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551 -com.google.common.flogger,29,,,,,,,,,,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.google.common.io,10,,73,,,,,,,,,1,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,,72,1 -com.google.gson,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,14 -com.hubspot.jinjava,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,, -com.jcraft.jsch,5,,1,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,1, -com.microsoft.sqlserver.jdbc,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.mitchellbosecke.pebble,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,, -com.mongodb,10,,,,,,4,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.opensymphony.xwork2,56,,961,,,,,,,,,,,,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,,,,,,,867,94 -com.rabbitmq.client,,21,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,7, -com.sshtools.j2ssh.authentication,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.crypto.provider,19,,,,,17,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.jndi.ldap,4,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.net.httpserver,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.net.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.rowset,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.security.auth.module,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.security.ntlm,5,,,,,,3,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.sun.security.sasl.digest,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.thoughtworks.xstream,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -com.trilead.ssh2,13,,,,,2,4,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.unboundid.ldap.sdk,17,,,,,,,,,,,,,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -com.zaxxer.hikari,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,, -flexjson,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -freemarker.cache,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,, -freemarker.template,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,, -groovy.lang,26,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -groovy.text,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -groovy.util,5,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -hudson,75,9,2648,,4,,,,,,3,2,,,,4,,,,,,,,,,,56,,,,,,,,,6,,,,,,,,,,,,,5,4,2572,76 -io.jsonwebtoken,,2,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4, -io.netty.bootstrap,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,, -io.netty.buffer,,,207,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,77 -io.netty.channel,9,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,2,, -io.netty.handler.codec,4,13,259,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,3,,,,,,,,,,,,,,13,143,116 -io.netty.handler.ssl,4,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,, -io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -io.netty.util,2,,23,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,,21,2 -io.undertow.server.handlers.resource,1,,3,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,3, -jakarta.activation,2,,2,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,,2, -jakarta.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,7,, -jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 -jakarta.persistence,2,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,1, -jakarta.servlet,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,1,, -jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -jakarta.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, -jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55 -jakarta.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, -java.applet,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11, -java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,3 -java.beans,,,177,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,82,95 -java.io,66,1,225,,,,,,,,,22,,,,,,,,,,,,,,,44,,,,,,,,,,,,,,,,,,,,,,1,,202,23 -java.lang,38,3,783,,13,,,,,,1,,,,,,,,,,,,8,,,,11,,,4,,,1,,,,,,,,,,,,,,,3,,,506,277 -java.math,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9 -java.net,23,3,347,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,,,,,,,,,,,,,,3,248,99 -java.nio,47,,499,,,,,,,,,5,,,,,,,,,,,,,,,41,,,,,,,,,1,,,,,,,,,,,,,,,302,197 -java.rmi,,,68,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,23 -java.security,21,,583,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,285,298 -java.sql,15,1,292,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,9,,,,,,,,,1,,,,274,18 -java.text,,,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,82 -java.time,,,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,104 -java.util,48,2,1339,,,,,,,,,1,,,,,,,,,,,34,,,,3,,,,5,2,,1,2,,,,,,,,,,,,,2,,,558,781 -javafx.scene.web,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -javax.accessibility,,,63,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,35 -javax.activation,2,,7,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,,7, -javax.annotation.processing,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,3 -javax.crypto,19,,114,,,12,3,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,61,53 -javax.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,7,, -javax.imageio,1,,304,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,138,166 -javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57, -javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 -javax.lang.model,,,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,217,60 -javax.management,2,,766,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,363,403 -javax.naming,7,,341,,,,,,,,,,,,,,,,,6,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,191,150 -javax.net,4,,136,,,,2,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,49 -javax.portlet,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, -javax.print,2,,133,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,102,31 -javax.rmi.ssl,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6 -javax.script,1,,50,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,14,36 -javax.security.auth,7,,147,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,50,97 -javax.security.cert,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5, -javax.security.sasl,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,42,7 -javax.servlet,10,22,3,,,,,,,,,,,,,,1,,,,,,,,,,2,,,,,,,,,,3,,,2,2,,,,,,,,,22,3, -javax.smartcardio,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,24,10 -javax.sound.midi,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,51,9 -javax.sound.sampled,,,90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,37 -javax.sql,7,,126,,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,68,58 -javax.tools,,,66,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,62,4 -javax.transaction.xa,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, -javax.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, -javax.ws.rs.core,3,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,2,,,,,,,,,94,55 -javax.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, -javax.xml.catalog,,,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,1 -javax.xml.crypto,,,269,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,172,97 -javax.xml.datatype,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,1 -javax.xml.namespace,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,10 -javax.xml.parsers,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,2 -javax.xml.stream,,,221,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,201,20 -javax.xml.transform,2,,134,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,1,,,,,,,72,62 -javax.xml.validation,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,29, -javax.xml.xpath,3,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,26, -jenkins,,,523,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,500,23 -jodd.json,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10 -kotlin,16,,1849,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,2,,,,,,,,,,,,,,,1836,13 -liquibase.database.jvm,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, -liquibase.statement.core,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, -net.lingala.zip4j,2,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,, -net.schmizz.sshj,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -net.sf.json,2,,338,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,321,17 -net.sf.saxon.s9api,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,, -ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,, -okhttp3,4,,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,23,27 -org.acegisecurity,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,49, -org.antlr.runtime,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, -org.apache.commons.collections,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783 -org.apache.commons.collections4,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783 -org.apache.commons.compress.archivers.tar,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, -org.apache.commons.exec,10,,,,6,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.httpclient.util,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.commons.io,124,,570,,,,,,,,,4,,,,,,,,,,,,,,,105,,,,,,,,,15,,,,,,,,,,,,,,,556,14 -org.apache.commons.jelly,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,, -org.apache.commons.jexl2,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.jexl3,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.lang,,,767,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,596,171 -org.apache.commons.lang3,6,,425,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,294,131 -org.apache.commons.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.net,13,12,,,,,2,2,,,,,,,,,,,,,,,,,,,3,,,,,,,,,6,,,,,,,,,,,,,,12,, -org.apache.commons.ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52 -org.apache.cxf.catalog,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -org.apache.cxf.common.classloader,3,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,2,,,,,,,,,,,,,,,, -org.apache.cxf.common.jaxb,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.common.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.configuration.jsse,2,,,,,,,,,,,,,,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.helpers,10,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,5,,,,,,,,, -org.apache.cxf.resource,9,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,5,,,,,,,,,,,,,,,, -org.apache.cxf.staxutils,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.tools.corba.utils,4,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.tools.util,10,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.cxf.transform,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,, -org.apache.directory.ldap.client.api,1,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.hadoop.fs,3,,11,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,11, -org.apache.hadoop.hive.metastore,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,, -org.apache.hadoop.hive.ql.exec,1,,1,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.hadoop.hive.ql.metadata,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.hc.client5.http.async.methods,84,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,84,,,,,,,,,,,,,,,, -org.apache.hc.client5.http.classic.methods,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,, -org.apache.hc.client5.http.fluent,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,, -org.apache.hc.core5.benchmark,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.hc.core5.http,73,2,45,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,72,,,,,,,,,,,,,,2,45, -org.apache.hc.core5.net,,,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18, -org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6 -org.apache.hive.hcatalog.templeton,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, -org.apache.http,48,3,95,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,46,,,,,,,,,,,,,,3,86,9 -org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,57, -org.apache.ibatis.mapping,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.log4j,11,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.logging.log4j,359,,8,,,,,,,,,,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 -org.apache.shiro.authc,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, -org.apache.shiro.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.shiro.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.shiro.mgt,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.sshd.client.session,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.struts.beanvalidation.validation.interceptor,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, -org.apache.struts2,14,,3873,,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,3,,,,,,,,,,,3839,34 -org.apache.tools.ant,14,,,,1,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,, -org.apache.tools.zip,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.apache.velocity.app,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,, -org.apache.velocity.runtime,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,, -org.codehaus.cargo.container.installer,3,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,1,,,,,,,,,,,,,,,, -org.codehaus.groovy.control,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,, -org.eclipse.jetty.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,, -org.fusesource.leveldbjni,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.geogebra.web.full.main,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, -org.gradle.api.file,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -org.hibernate,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,,, -org.influxdb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -org.jboss.logging,324,,,,,,,,,,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.jboss.vfs,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.jdbi.v3.core,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,, -org.jenkins.ui.icon,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48,1 -org.jenkins.ui.symbol,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,8 -org.jooq,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, -org.json,,,236,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,198,38 -org.keycloak.models.map.storage,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, -org.kohsuke.stapler,20,24,363,,,,,,,,,,,,,2,,,,,,,,,,,9,,,,,,,,,3,,,,,1,5,,,,,,,,24,352,11 -org.lastaflute.web,,1,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,4, -org.mvel2,16,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.openjdk.jmh.runner.options,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,, -org.owasp.esapi,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.pac4j.jwt.config.encryption,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.pac4j.jwt.config.signature,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.scijava.log,13,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.slf4j,55,,6,,,,,,,,,,,,,,,,,,,,55,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4 -org.springframework.beans,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30 -org.springframework.boot.jdbc,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,, -org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13 -org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -org.springframework.core.io,17,,6,,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,1,,,,,,,,,,,,,,,6, -org.springframework.data.repository,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -org.springframework.http,14,,77,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,67,10 -org.springframework.jdbc.core,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,, -org.springframework.jdbc.datasource,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,, -org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,, -org.springframework.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.ldap,47,,,,,,,,,,,,,,,,,,,33,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.security.core.userdetails,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,, -org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32 -org.springframework.util,10,,142,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,90,52 -org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13, -org.springframework.web.client,13,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,3,, -org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, -org.springframework.web.multipart,,12,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,12, -org.springframework.web.portlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,, -org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,, -org.springframework.web.servlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,, -org.springframework.web.util,,9,157,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,132,25 -org.thymeleaf,2,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,2, -org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,, -org.yaml.snakeyaml,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -play.libs.ws,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,, -play.mvc,1,13,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,13,24, -ratpack.core.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -ratpack.core.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, -ratpack.core.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, -ratpack.exec,,,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48 -ratpack.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, -ratpack.func,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 -ratpack.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, -ratpack.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, -ratpack.util,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 -retrofit2,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,1, -software.amazon.awssdk.transfer.s3.model,8,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,, -sun.jvmstat.perfdata.monitor.protocol.local,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.jvmstat.perfdata.monitor.protocol.rmi,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.misc,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.net.ftp,5,,,,,,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.net.www.protocol.http,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.acl,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.jgss.krb5,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.krb5,9,,,,,3,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.pkcs,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.pkcs11,3,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.provider,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.security.x509,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -sun.tools.jconsole,28,,,,,,13,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +package,sink,source,summary,sink:bean-validation,sink:command-injection,sink:credentials-key,sink:credentials-password,sink:credentials-username,sink:encryption-iv,sink:encryption-salt,sink:environment-injection,sink:file-content-store,sink:fragment-injection,sink:groovy-injection,sink:hostname-verification,sink:html-injection,sink:information-leak,sink:intent-redirection,sink:jexl-injection,sink:jndi-injection,sink:js-injection,sink:ldap-injection,sink:log-injection,sink:mvel-injection,sink:notification,sink:ognl-injection,sink:path-injection,sink:pending-intents,sink:regex-use,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:request-forgery,sink:response-splitting,sink:sql-injection,sink:template-injection,sink:trust-boundary-violation,sink:unsafe-deserialization,sink:url-forward,sink:url-redirection,sink:xpath-injection,sink:xslt-injection,source:android-external-storage-dir,source:contentprovider,source:database,source:environment,source:file,source:remote,summary:taint,summary:value +actions.osgi,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, +android.app,77,,103,,,,,,,,,,11,,,,,7,,,,,,,42,,,17,,,,,,,,,,,,,,,,,,,,,,,,18,85 +android.content,24,31,154,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,8,,,,,,,,4,27,,,,,63,91 +android.database,59,,41,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,,,41, +android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15 +android.os,1,2,122,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,2,,,,,,41,81 +android.support.v4.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +android.util,6,16,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,16,, +android.webkit,3,2,,,,,,,,,,,,,,2,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, +android.widget,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,1, +androidx.core.app,47,,95,,,,,,,,,,,,,,,,,,,,,,41,,,6,,,,,,,,,,,,,,,,,,,,,,,,12,83 +androidx.fragment.app,11,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +androidx.slice,2,5,88,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,5,,,,,27,61 +antlr,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +ch.ethz.ssh2,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +cn.hutool.core.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.alibaba.com.caucho.hessian.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, +com.alibaba.druid.sql,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,1, +com.alibaba.fastjson2,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.amazonaws.auth,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.auth0.jwt.algorithms,6,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.azure.identity,3,,,,,1,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.caucho.burlap.io,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +com.caucho.hessian.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, +com.cedarsoftware.util.io,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,, +com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.esotericsoftware.yamlbeans,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +com.fasterxml.jackson.databind,2,,8,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,8, +com.google.common.base,4,,87,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,,,,63,24 +com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17 +com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551 +com.google.common.flogger,29,,,,,,,,,,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.google.common.io,10,,73,,,,,,,,,1,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,,,72,1 +com.google.gson,,,52,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,38,14 +com.hubspot.jinjava,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,, +com.jcraft.jsch,5,,1,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,1, +com.microsoft.sqlserver.jdbc,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.mitchellbosecke.pebble,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,, +com.mongodb,10,,,,,,4,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.opensymphony.xwork2,56,,961,,,,,,,,,,,,,,,,,,,,,,,56,,,,,,,,,,,,,,,,,,,,,,,,,,867,94 +com.rabbitmq.client,,21,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,7, +com.sshtools.j2ssh.authentication,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.crypto.provider,19,,,,,17,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.jndi.ldap,4,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.net.httpserver,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.net.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.rowset,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.security.auth.module,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.security.ntlm,5,,,,,,3,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.sun.security.sasl.digest,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.thoughtworks.xstream,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +com.trilead.ssh2,13,,,,,2,4,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.unboundid.ldap.sdk,17,,,,,,,,,,,,,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +com.zaxxer.hikari,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, +flexjson,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 +freemarker.cache,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,, +freemarker.template,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,,, +groovy.lang,26,,,,,,,,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +groovy.text,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +groovy.util,5,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +hudson,75,9,2648,,4,,,,,,3,2,,,,4,,,,,,,,,,,56,,,,,,,,,6,,,,,,,,,,,,,,5,4,2572,76 +io.jsonwebtoken,,2,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4, +io.netty.bootstrap,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,, +io.netty.buffer,,,207,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,77 +io.netty.channel,9,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,2,, +io.netty.handler.codec,4,13,259,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,3,,,,,,,,,,,,,,,13,143,116 +io.netty.handler.ssl,4,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +io.netty.util,2,,23,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,,,21,2 +io.undertow.server.handlers.resource,1,,3,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,3, +jakarta.activation,2,,2,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,,,2, +jakarta.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,7,, +jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 +jakarta.persistence,2,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,1, +jakarta.servlet,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,1,, +jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +jakarta.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, +jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55 +jakarta.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, +java.applet,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11, +java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,3 +java.beans,1,,177,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,82,95 +java.io,66,1,225,,,,,,,,,22,,,,,,,,,,,,,,,44,,,,,,,,,,,,,,,,,,,,,,,1,,202,23 +java.lang,38,3,783,,13,,,,,,1,,,,,,,,,,,,8,,,,11,,,4,,,1,,,,,,,,,,,,,,,,3,,,506,277 +java.math,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9 +java.net,23,3,347,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,,,,,,,,,,,,,,,3,248,99 +java.nio,47,,499,,,,,,,,,5,,,,,,,,,,,,,,,41,,,,,,,,,1,,,,,,,,,,,,,,,,302,197 +java.rmi,,,68,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,23 +java.security,21,,583,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,285,298 +java.sql,15,1,292,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,9,,,,,,,,,,1,,,,274,18 +java.text,,,154,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,72,82 +java.time,,,131,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,27,104 +java.util,48,2,1339,,,,,,,,,1,,,,,,,,,,,34,,,,3,,,,5,2,,1,2,,,,,,,,,,,,,,2,,,558,781 +javafx.scene.web,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +javax.accessibility,,,63,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,28,35 +javax.activation,2,,7,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,1,,,,,,,,,,,,,,,,7, +javax.annotation.processing,,,28,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,3 +javax.crypto,19,,114,,,12,3,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,61,53 +javax.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,7,, +javax.imageio,1,,304,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,138,166 +javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57, +javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 +javax.lang.model,,,277,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,217,60 +javax.management,2,,766,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,363,403 +javax.naming,7,,341,,,,,,,,,,,,,,,,,6,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,191,150 +javax.net,4,,136,,,,2,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,49 +javax.portlet,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, +javax.print,2,,133,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,102,31 +javax.rmi.ssl,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6 +javax.script,1,,50,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,36 +javax.security.auth,7,,147,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,50,97 +javax.security.cert,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5, +javax.security.sasl,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,42,7 +javax.servlet,10,22,3,,,,,,,,,,,,,,1,,,,,,,,,,2,,,,,,,,,,3,,,2,,2,,,,,,,,,22,3, +javax.smartcardio,,,34,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,24,10 +javax.sound.midi,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,51,9 +javax.sound.sampled,,,90,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,53,37 +javax.sql,7,,126,,,,4,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,68,58 +javax.tools,,,66,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,62,4 +javax.transaction.xa,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, +javax.ws.rs.client,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, +javax.ws.rs.core,3,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,2,,,,,,,,,94,55 +javax.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,, +javax.xml.catalog,,,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11,1 +javax.xml.crypto,,,269,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,172,97 +javax.xml.datatype,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,1 +javax.xml.namespace,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,10 +javax.xml.parsers,,,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35,2 +javax.xml.stream,,,221,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,201,20 +javax.xml.transform,2,,134,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,1,,,,,,,72,62 +javax.xml.validation,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,29, +javax.xml.xpath,3,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,26, +jenkins,,,523,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,500,23 +jodd.json,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10 +kotlin,16,,1849,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,2,,,,,,,,,,,,,,,,1836,13 +liquibase.database.jvm,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, +liquibase.statement.core,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, +net.lingala.zip4j,2,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,, +net.schmizz.sshj,4,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +net.sf.json,2,,338,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,321,17 +net.sf.saxon.s9api,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,, +ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,, +okhttp3,4,,50,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,23,27 +org.acegisecurity,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,49, +org.antlr.runtime,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, +org.apache.commons.collections,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783 +org.apache.commons.collections4,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783 +org.apache.commons.compress.archivers.tar,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, +org.apache.commons.exec,10,,,,6,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.httpclient.util,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.commons.io,124,,570,,,,,,,,,4,,,,,,,,,,,,,,,105,,,,,,,,,15,,,,,,,,,,,,,,,,556,14 +org.apache.commons.jelly,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,, +org.apache.commons.jexl2,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.jexl3,15,,,,,,,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.lang,1,,767,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,596,171 +org.apache.commons.lang3,7,,425,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,1,,,,,,,,,,,294,131 +org.apache.commons.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.net,13,12,,,,,2,2,,,,,,,,,,,,,,,,,,,3,,,,,,,,,6,,,,,,,,,,,,,,,12,, +org.apache.commons.ognl,6,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52 +org.apache.cxf.catalog,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +org.apache.cxf.common.classloader,3,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,2,,,,,,,,,,,,,,,,, +org.apache.cxf.common.jaxb,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.common.logging,6,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.configuration.jsse,2,,,,,,,,,,,,,,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.helpers,10,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,5,,,,,,,,, +org.apache.cxf.resource,9,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,5,,,,,,,,,,,,,,,,, +org.apache.cxf.staxutils,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.tools.corba.utils,4,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.tools.util,10,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.cxf.transform,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,, +org.apache.directory.ldap.client.api,1,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hadoop.fs,3,,11,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,11, +org.apache.hadoop.hive.metastore,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,, +org.apache.hadoop.hive.ql.exec,1,,1,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.hadoop.hive.ql.metadata,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.async.methods,84,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,84,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.classic.methods,37,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,37,,,,,,,,,,,,,,,,, +org.apache.hc.client5.http.fluent,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,,,, +org.apache.hc.core5.benchmark,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.hc.core5.http,73,2,45,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,72,,,,,,,,,,,,,,,2,45, +org.apache.hc.core5.net,,,18,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18, +org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6 +org.apache.hive.hcatalog.templeton,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, +org.apache.http,48,3,95,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,46,,,,,,,,,,,,,,,3,86,9 +org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,57, +org.apache.ibatis.mapping,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.log4j,11,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.logging.log4j,359,,8,,,,,,,,,,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,4 +org.apache.shiro.authc,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, +org.apache.shiro.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.shiro.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.shiro.mgt,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.sshd.client.session,3,,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.struts.beanvalidation.validation.interceptor,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4, +org.apache.struts2,14,,3873,,,,,,,,,,,,,,,,,,,,,,,11,,,,,,,,,,,,,,3,,,,,,,,,,,,3839,34 +org.apache.tools.ant,14,,,,1,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,, +org.apache.tools.zip,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.apache.velocity.app,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,, +org.apache.velocity.runtime,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,, +org.codehaus.cargo.container.installer,3,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,1,,,,,,,,,,,,,,,,, +org.codehaus.groovy.control,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,, +org.eclipse.jetty.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, +org.exolab.castor.xml,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +org.fusesource.leveldbjni,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.geogebra.web.full.main,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, +org.gradle.api.file,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +org.hibernate,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,,,, +org.ho.yaml,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,, +org.influxdb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +org.jabsorb,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +org.jboss.logging,324,,,,,,,,,,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.jboss.vfs,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.jdbi.v3.core,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,, +org.jenkins.ui.icon,,,49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48,1 +org.jenkins.ui.symbol,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,8 +org.jooq,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, +org.json,,,236,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,198,38 +org.keycloak.models.map.storage,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,, +org.kohsuke.stapler,20,24,363,,,,,,,,,,,,,2,,,,,,,,,,,9,,,,,,,,,3,,,,,,1,5,,,,,,,,24,352,11 +org.lastaflute.web,,1,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,4, +org.mvel2,16,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.openjdk.jmh.runner.options,1,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, +org.owasp.esapi,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.pac4j.jwt.config.encryption,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.pac4j.jwt.config.signature,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.scijava.log,13,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.slf4j,55,,6,,,,,,,,,,,,,,,,,,,,55,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4 +org.springframework.beans,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30 +org.springframework.boot.jdbc,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,, +org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13 +org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +org.springframework.core.io,17,,6,,,,,,,,,,,,,,,,,,,,,,,,16,,,,,,,,,1,,,,,,,,,,,,,,,,6, +org.springframework.data.repository,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 +org.springframework.http,14,,77,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,67,10 +org.springframework.jdbc.core,19,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,,, +org.springframework.jdbc.datasource,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,,,,,,, +org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,, +org.springframework.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.ldap,47,,,,,,,,,,,,,,,,,,,33,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.security.core.userdetails,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,, +org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32 +org.springframework.util,10,,142,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,,,,,,,90,52 +org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13, +org.springframework.web.client,13,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,3,, +org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, +org.springframework.web.multipart,,12,12,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,12, +org.springframework.web.portlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,, +org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, +org.springframework.web.servlet,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,, +org.springframework.web.util,,9,157,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,132,25 +org.thymeleaf,2,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,2, +org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,, +org.yaml.snakeyaml,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +play.libs.ws,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,, +play.mvc,1,13,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,13,24, +ratpack.core.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +ratpack.core.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, +ratpack.core.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, +ratpack.exec,,,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48 +ratpack.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, +ratpack.func,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 +ratpack.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4, +ratpack.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10, +ratpack.util,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35 +retrofit2,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,1, +software.amazon.awssdk.transfer.s3.model,8,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.jvmstat.perfdata.monitor.protocol.local,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.jvmstat.perfdata.monitor.protocol.rmi,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.misc,3,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.net.ftp,5,,,,,,2,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.net.www.protocol.http,3,,,,,,2,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.acl,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.jgss.krb5,2,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.krb5,9,,,,,3,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.pkcs,4,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.pkcs11,3,,,,,1,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.provider,2,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.ssl,3,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.security.x509,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +sun.tools.jconsole,28,,,,,,13,15,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 3851cb041664..aa6a3f2c1713 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -11,17 +11,17 @@ Java framework & library support Android extensions,``androidx.*``,5,183,60,,,,,, `Apache Commons Collections `_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,1600,,,,,,, `Apache Commons IO `_,``org.apache.commons.io``,,570,124,105,,,,,15 - `Apache Commons Lang `_,``org.apache.commons.lang3``,,425,6,,,,,, + `Apache Commons Lang `_,``org.apache.commons.lang3``,,425,7,,,,,, `Apache Commons Text `_,``org.apache.commons.text``,,272,,,,,,, `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,183,122,,3,,,,119 `Apache Log4j 2 `_,``org.apache.logging.log4j``,,8,359,,,,,, `Google Guava `_,``com.google.common.*``,,730,43,9,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,, `JSON-java `_,``org.json``,,236,,,,,,, - Java Standard Library,``java.*``,10,4621,259,99,,9,,,26 + Java Standard Library,``java.*``,10,4621,260,99,,9,,,26 Java extensions,"``javax.*``, ``jakarta.*``",69,4159,90,10,4,2,1,1,4 Kotlin Standard Library,``kotlin*``,,1849,16,14,,,,,2 `Spring `_,``org.springframework.*``,38,486,143,26,,28,14,,35 - Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.google.gson``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.mongodb``, ``com.opensymphony.xwork2``, ``com.rabbitmq.client``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.text``, ``groovy.util``, ``hudson``, ``io.jsonwebtoken``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.struts.beanvalidation.validation.interceptor``, ``org.apache.struts2``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.hibernate``, ``org.influxdb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.jooq``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``org.yaml.snakeyaml``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",133,10525,908,140,6,22,18,,208 - Totals,,312,26328,2635,404,16,128,33,1,409 + Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.google.gson``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.mongodb``, ``com.opensymphony.xwork2``, ``com.rabbitmq.client``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.text``, ``groovy.util``, ``hudson``, ``io.jsonwebtoken``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.struts.beanvalidation.validation.interceptor``, ``org.apache.struts2``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.hibernate``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.jooq``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``org.yaml.snakeyaml``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",133,10525,927,140,6,22,18,,208 + Totals,,312,26328,2656,404,16,128,33,1,409 diff --git a/java/kotlin-extractor/BUILD.bazel b/java/kotlin-extractor/BUILD.bazel index 575b9788e8c5..a714e06d4111 100644 --- a/java/kotlin-extractor/BUILD.bazel +++ b/java/kotlin-extractor/BUILD.bazel @@ -83,7 +83,7 @@ kt_javac_options( "kotlin.RequiresOptIn", "org.jetbrains.kotlin.ir.symbols.%s" % ("IrSymbolInternals" if version_less(v, "2.0.0") else "UnsafeDuringIrConstructionAPI"), - ], + ] + ([] if version_less(v, "2.2.20") else ["org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi"]), x_suppress_version_warnings = True, ), # * extractor.name is different for each version, so we need to put it in different output dirs diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.2.20-Beta2.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.2.20-Beta2.jar new file mode 100644 index 000000000000..8e720a86a1d4 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-2.2.20-Beta2.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7f4befaac8055b86f648e82c13b86e2775d7ace4eb896e2d7a5b8669a0f29a7 +size 58317000 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.2.20-Beta2.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.2.20-Beta2.jar new file mode 100644 index 000000000000..db9a090c35be --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.2.20-Beta2.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6017df3eca219e1c970468631f81333bfd8739482a5de4d33688949b5a1af376 +size 56885422 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.2.20-Beta2.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.2.20-Beta2.jar new file mode 100644 index 000000000000..a6b812f7cea2 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-stdlib-2.2.20-Beta2.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d01259e6090de3ff8e938144970980978eb4e764d755a70d4cd077552315a39c +size 1761449 diff --git a/java/kotlin-extractor/dev/wrapper.py b/java/kotlin-extractor/dev/wrapper.py index 08969528c926..aeef81e5c1d2 100755 --- a/java/kotlin-extractor/dev/wrapper.py +++ b/java/kotlin-extractor/dev/wrapper.py @@ -27,7 +27,7 @@ import io import os -DEFAULT_VERSION = "2.1.20" +DEFAULT_VERSION = "2.2.0" def options(): diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt index 56deb81da012..2f87c77f8ee1 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinUsesExtractor.kt @@ -37,7 +37,6 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.sources.JavaSourceElement import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.typeEnhancement.hasEnhancedNullability -import org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.NameUtils import org.jetbrains.kotlin.name.SpecialNames diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_6_0/getJvmModuleNameForDeserializedDescriptor.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_6_0/getJvmModuleNameForDeserializedDescriptor.kt new file mode 100644 index 000000000000..003be521ce0e --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_6_0/getJvmModuleNameForDeserializedDescriptor.kt @@ -0,0 +1,9 @@ +package com.github.codeql.utils.versions + +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor + +fun getJvmModuleNameForDeserializedDescriptor(descriptor: CallableMemberDescriptor): String? { + return org.jetbrains.kotlin.load.kotlin.getJvmModuleNameForDeserializedDescriptor(descriptor) +} + diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_2_20-Beta2/getJvmModuleNameForDeserializedDescriptor.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_2_20-Beta2/getJvmModuleNameForDeserializedDescriptor.kt new file mode 100644 index 000000000000..7a29d2dd4fc3 --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_2_20-Beta2/getJvmModuleNameForDeserializedDescriptor.kt @@ -0,0 +1,32 @@ +package com.github.codeql.utils.versions + +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource +import org.jetbrains.kotlin.metadata.deserialization.* +import org.jetbrains.kotlin.metadata.jvm.deserialization.* +import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf +import org.jetbrains.kotlin.resolve.DescriptorUtils.* +import org.jetbrains.kotlin.serialization.deserialization.descriptors.* + +fun getJvmModuleNameForDeserializedDescriptor(descriptor: CallableMemberDescriptor): String? { + val parent = getParentOfType(descriptor, ClassOrPackageFragmentDescriptor::class.java, false) + + when { + parent is DeserializedClassDescriptor -> { + val classProto = parent.classProto + val nameResolver = parent.c.nameResolver + return classProto.getExtensionOrNull(JvmProtoBuf.classModuleName) + ?.let(nameResolver::getString) + ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME + } + descriptor is DeserializedMemberDescriptor -> { + val source = descriptor.containerSource + if (source is JvmPackagePartSource) { + return source.moduleName + } + } + } + + return null +} + diff --git a/java/kotlin-extractor/versions.bzl b/java/kotlin-extractor/versions.bzl index e389bfd9514d..95897f49cc81 100644 --- a/java/kotlin-extractor/versions.bzl +++ b/java/kotlin-extractor/versions.bzl @@ -12,6 +12,7 @@ VERSIONS = [ "2.1.0-Beta1", "2.1.20-Beta1", "2.2.0-Beta1", + "2.2.20-Beta2", ] def _version_to_tuple(v): diff --git a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected index 39e1f6e6b984..50cbd2609f26 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected +++ b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected @@ -1,5 +1,5 @@ { - "markdownMessage": "The Kotlin version installed (`999.999.999`) is too recent for this version of CodeQL. Install a version lower than 2.2.10.", + "markdownMessage": "The Kotlin version installed (`999.999.999`) is too recent for this version of CodeQL. Install a version lower than 2.2.30.", "severity": "error", "source": { "extractorName": "java", diff --git a/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin1/ExtractorInformation.ext.yml b/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin1/ExtractorInformation.ext.yml index 3b6ffa4a3771..e4f5148ee404 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin1/ExtractorInformation.ext.yml +++ b/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin1/ExtractorInformation.ext.yml @@ -1,6 +1,6 @@ extensions: - addsTo: - pack: codeql/java-queries + pack: codeql/java-all extensible: extractorInformationSkipKey data: # These will have unstable values, as they are dependent on the diff --git a/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin2/ExtractorInformation.ext.yml b/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin2/ExtractorInformation.ext.yml index be02d9554f81..6d95b68726ae 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin2/ExtractorInformation.ext.yml +++ b/java/ql/integration-tests/kotlin/all-platforms/extractor_information_kotlin2/ExtractorInformation.ext.yml @@ -1,6 +1,6 @@ extensions: - addsTo: - pack: codeql/java-queries + pack: codeql/java-all extensible: extractorInformationSkipKey data: # These will have unstable values, as they are dependent on the diff --git a/java/ql/integration-tests/kotlin/linux/custom_plugin/test.py b/java/ql/integration-tests/kotlin/linux/custom_plugin/test.py-disabled similarity index 91% rename from java/ql/integration-tests/kotlin/linux/custom_plugin/test.py rename to java/ql/integration-tests/kotlin/linux/custom_plugin/test.py-disabled index f9da92683868..2b3a104ed0b1 100644 --- a/java/ql/integration-tests/kotlin/linux/custom_plugin/test.py +++ b/java/ql/integration-tests/kotlin/linux/custom_plugin/test.py-disabled @@ -3,6 +3,8 @@ import commands +# This test is temporarily disabled until it is updated to work with Kotlin 2.2 + @runs_on.linux def test(codeql, java_full, cwd, semmle_code_dir, test_dir): build_dir = cwd / "build" diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 47c1234d8422..e15d695efea6 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,6 +1,26 @@ -## 7.3.3 +## 7.5.0 -No user-facing changes. +### New Features + +* Kotlin versions up to 2.2.2\ *x* are now supported. + +## 7.4.0 + +### Deprecated APIs + +* The module `semmle.code.java.frameworks.Castor` has been deprecated and will be removed in a future release. +* The module `semmle.code.java.frameworks.JYaml` has been deprecated and will be removed in a future release. +* The classes `UnsafeHessianInputReadObjectMethod` and `BurlapInputReadObjectMethod` in the module `semmle.code.java.frameworks.HessianBurlap` have been deprecated and will be removed in a future release. +* The class `YamlBeansReaderReadMethod` in the module `semmle.code.java.frameworks.YamlBeans` has been deprecated and will be removed in a future release. +* The class `MethodApacheSerializationUtilsDeserialize` in the module `semmle.code.java.frameworks.apache.Lang` has been deprecated and will be removed in a future release. + +### New Features + +* You can now add sinks for the query "Deserialization of user-controlled data" (`java/unsafe-deserialization`) using [data extensions](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-java-and-kotlin/#extensible-predicates-used-to-create-custom-models-in-java-and-kotlin) by extending `sinkModel` and using the kind "unsafe-deserialization". The existing sinks that do not require extra logic to determine if they are unsafe are now defined in this way. + +### Minor Analysis Improvements + +* The qualifiers of a calls to `readObject` on any classes that implement `java.io.ObjectInput` are now recognised as sinks for `java/unsafe-deserialization`. Previously this was only the case for classes which extend `java.io.ObjectInputStream`. ## 7.3.2 diff --git a/java/ql/lib/change-notes/2025-07-11-unsafe-deserialization-extra-sink.md b/java/ql/lib/change-notes/2025-07-11-unsafe-deserialization-extra-sink.md deleted file mode 100644 index 26f745a2bb72..000000000000 --- a/java/ql/lib/change-notes/2025-07-11-unsafe-deserialization-extra-sink.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The qualifiers of a calls to `readObject` on any classes that implement `java.io.ObjectInput` are now recognised as sinks for `java/unsafe-deserialization`. Previously this was only the case for classes which extend `java.io.ObjectInputStream`. diff --git a/java/ql/lib/change-notes/2025-07-28-guardwrappers.md b/java/ql/lib/change-notes/2025-07-28-guardwrappers.md new file mode 100644 index 000000000000..cf976fe77896 --- /dev/null +++ b/java/ql/lib/change-notes/2025-07-28-guardwrappers.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Guard implication logic involving wrapper methods has been improved. In particular, this means fewer false positives for `java/dereferenced-value-may-be-null`. diff --git a/java/ql/lib/change-notes/released/7.4.0.md b/java/ql/lib/change-notes/released/7.4.0.md new file mode 100644 index 000000000000..103b19767a04 --- /dev/null +++ b/java/ql/lib/change-notes/released/7.4.0.md @@ -0,0 +1,17 @@ +## 7.4.0 + +### Deprecated APIs + +* The module `semmle.code.java.frameworks.Castor` has been deprecated and will be removed in a future release. +* The module `semmle.code.java.frameworks.JYaml` has been deprecated and will be removed in a future release. +* The classes `UnsafeHessianInputReadObjectMethod` and `BurlapInputReadObjectMethod` in the module `semmle.code.java.frameworks.HessianBurlap` have been deprecated and will be removed in a future release. +* The class `YamlBeansReaderReadMethod` in the module `semmle.code.java.frameworks.YamlBeans` has been deprecated and will be removed in a future release. +* The class `MethodApacheSerializationUtilsDeserialize` in the module `semmle.code.java.frameworks.apache.Lang` has been deprecated and will be removed in a future release. + +### New Features + +* You can now add sinks for the query "Deserialization of user-controlled data" (`java/unsafe-deserialization`) using [data extensions](https://codeql.github.com/docs/codeql-language-guides/customizing-library-models-for-java-and-kotlin/#extensible-predicates-used-to-create-custom-models-in-java-and-kotlin) by extending `sinkModel` and using the kind "unsafe-deserialization". The existing sinks that do not require extra logic to determine if they are unsafe are now defined in this way. + +### Minor Analysis Improvements + +* The qualifiers of a calls to `readObject` on any classes that implement `java.io.ObjectInput` are now recognised as sinks for `java/unsafe-deserialization`. Previously this was only the case for classes which extend `java.io.ObjectInputStream`. diff --git a/java/ql/lib/change-notes/released/7.5.0.md b/java/ql/lib/change-notes/released/7.5.0.md new file mode 100644 index 000000000000..415dab5dfe4f --- /dev/null +++ b/java/ql/lib/change-notes/released/7.5.0.md @@ -0,0 +1,5 @@ +## 7.5.0 + +### New Features + +* Kotlin versions up to 2.2.2\ *x* are now supported. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 8175ad157401..7ed5cb290ca0 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.3.3 +lastReleaseVersion: 7.5.0 diff --git a/java/ql/lib/ext/com.alibaba.com.caucho.hessian.io.model.yml b/java/ql/lib/ext/com.alibaba.com.caucho.hessian.io.model.yml new file mode 100644 index 000000000000..af8824aae0c1 --- /dev/null +++ b/java/ql/lib/ext/com.alibaba.com.caucho.hessian.io.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["com.alibaba.com.caucho.hessian.io", "AbstractHessianInput", True, "readObject", "", "", "Argument[this]", "unsafe-deserialization", "manual"] + - ["com.alibaba.com.caucho.hessian.io", "Hessian2StreamingInput", True, "readObject", "", "", "Argument[this]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/com.caucho.burlap.io.model.yml b/java/ql/lib/ext/com.caucho.burlap.io.model.yml new file mode 100644 index 000000000000..862804438ca4 --- /dev/null +++ b/java/ql/lib/ext/com.caucho.burlap.io.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["com.caucho.burlap.io", "BurlapInput", True, "readObject", "", "", "Argument[this]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/com.caucho.hessian.io.model.yml b/java/ql/lib/ext/com.caucho.hessian.io.model.yml new file mode 100644 index 000000000000..73c3ddebf451 --- /dev/null +++ b/java/ql/lib/ext/com.caucho.hessian.io.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["com.caucho.hessian.io", "AbstractHessianInput", True, "readObject", "", "", "Argument[this]", "unsafe-deserialization", "manual"] + - ["com.caucho.hessian.io", "Hessian2StreamingInput", True, "readObject", "", "", "Argument[this]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/com.cedarsoftware.util.io.model.yml b/java/ql/lib/ext/com.cedarsoftware.util.io.model.yml new file mode 100644 index 000000000000..926a86238114 --- /dev/null +++ b/java/ql/lib/ext/com.cedarsoftware.util.io.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["com.cedarsoftware.util.io", "JsonReader", False, "jsonToJava", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["com.cedarsoftware.util.io", "JsonReader", True, "readObject", "", "", "Argument[this]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/com.esotericsoftware.yamlbeans.model.yml b/java/ql/lib/ext/com.esotericsoftware.yamlbeans.model.yml new file mode 100644 index 000000000000..944222c420b6 --- /dev/null +++ b/java/ql/lib/ext/com.esotericsoftware.yamlbeans.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["com.esotericsoftware.yamlbeans", "YamlReader", True, "read", "", "", "Argument[this]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/java.beans.model.yml b/java/ql/lib/ext/java.beans.model.yml index 30667ec69615..07291296612d 100644 --- a/java/ql/lib/ext/java.beans.model.yml +++ b/java/ql/lib/ext/java.beans.model.yml @@ -13,3 +13,8 @@ extensions: - ["java.beans", "PropertyEditor", "getValue", "()", "summary", "df-manual"] # needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs - ["java.beans", "PropertyEditor", "setAsText", "()", "summary", "df-manual"] # needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs - ["java.beans", "PropertyEditor", "setValue", "()", "summary", "df-manual"] # needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["java.beans", "XMLDecoder", True, "readObject", "()", "", "Argument[this]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/org.apache.commons.lang.model.yml b/java/ql/lib/ext/org.apache.commons.lang.model.yml index 8dd3fd003f9d..0d38b845c9ca 100644 --- a/java/ql/lib/ext/org.apache.commons.lang.model.yml +++ b/java/ql/lib/ext/org.apache.commons.lang.model.yml @@ -5,3 +5,8 @@ extensions: data: - ["org.apache.commons.lang", "StringEscapeUtils", true, "escapeHtml", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["org.apache.commons.lang", "StringEscapeUtils", true, "escapeHtml", "(Writer,String)", "", "Argument[1]", "Argument[0]", "taint", "manual"] + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.apache.commons.lang", "SerializationUtils", False, "deserialize", "", "", "Argument[0]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/org.apache.commons.lang3.model.yml b/java/ql/lib/ext/org.apache.commons.lang3.model.yml index 541db005f0b6..7c455d780b13 100644 --- a/java/ql/lib/ext/org.apache.commons.lang3.model.yml +++ b/java/ql/lib/ext/org.apache.commons.lang3.model.yml @@ -3,6 +3,7 @@ extensions: pack: codeql/java-all extensible: sinkModel data: + - ["org.apache.commons.lang3", "SerializationUtils", False, "deserialize", "", "", "Argument[0]", "unsafe-deserialization", "manual"] # Note these sinks do not use the sink kind `regex-use[0]` because the regex injection query needs to select them separately from # other `regex-use[0]` sinks in order to avoid FPs. As a result, these sinks are currently not used in the polynomial ReDoS query. # TODO: refactor the `regex-use%` sink kind so that the polynomial ReDoS query can also use these sinks. diff --git a/java/ql/lib/ext/org.exolab.castor.xml.model.yml b/java/ql/lib/ext/org.exolab.castor.xml.model.yml new file mode 100644 index 000000000000..7113a9ab94a7 --- /dev/null +++ b/java/ql/lib/ext/org.exolab.castor.xml.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.exolab.castor.xml", "Unmarshaller", True, "unmarshal", "", "", "Argument[0..1]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/org.ho.yaml.model.yml b/java/ql/lib/ext/org.ho.yaml.model.yml new file mode 100644 index 000000000000..fd6e0e363563 --- /dev/null +++ b/java/ql/lib/ext/org.ho.yaml.model.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.ho.yaml", "Yaml", False, "load", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "Yaml", False, "loadStream", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "Yaml", False, "loadStreamOfType", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "Yaml", False, "loadType", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "YamlConfig", False, "load", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "YamlConfig", False, "loadStream", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "YamlConfig", False, "loadStreamOfType", "", "", "Argument[0]", "unsafe-deserialization", "manual"] + - ["org.ho.yaml", "YamlConfig", False, "loadType", "", "", "Argument[0]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/ext/org.jabsorb.model.yml b/java/ql/lib/ext/org.jabsorb.model.yml new file mode 100644 index 000000000000..5c50178e9937 --- /dev/null +++ b/java/ql/lib/ext/org.jabsorb.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.jabsorb", "JSONSerializer", True, "fromJSON", "", "", "Argument[0]", "unsafe-deserialization", "manual"] diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index c7a6a045451e..0e69cc38681c 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 7.3.4-dev +version: 7.5.1-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java @@ -23,3 +23,4 @@ dataExtensions: - ext/generated/*.model.yml - ext/experimental/*.model.yml warnOnImplicitThis: true +compileForOverlayEval: true diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index 33b7a6c0a9fc..612bca35a600 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -82,6 +82,7 @@ module; */ import java +private import codeql.util.Boolean private import Completion private import controlflow.internal.Preconditions private import controlflow.internal.SwitchCases @@ -102,6 +103,7 @@ module ControlFlow { private newtype TNode = TExprNode(Expr e) { hasControlFlow(e) } or TStmtNode(Stmt s) or + TAnnotatedExitNode(Callable c, Boolean normal) { exists(c.getBody()) } or TExitNode(Callable c) { exists(c.getBody()) } or TAssertThrowNode(AssertStmt s) @@ -191,6 +193,38 @@ module ControlFlow { override Location getLocation() { result = s.getLocation() } } + /** A control flow node indicating the normal or exceptional termination of a callable. */ + class AnnotatedExitNode extends Node, TAnnotatedExitNode { + Callable c; + boolean normal; + + AnnotatedExitNode() { this = TAnnotatedExitNode(c, normal) } + + override Callable getEnclosingCallable() { result = c } + + override ExprParent getAstNode() { result = c } + + /** Gets a textual representation of this element. */ + override string toString() { + normal = true and result = "Normal Exit" + or + normal = false and result = "Exceptional Exit" + } + + /** Gets the source location for this element. */ + override Location getLocation() { result = c.getLocation() } + } + + /** A control flow node indicating normal termination of a callable. */ + class NormalExitNode extends AnnotatedExitNode { + NormalExitNode() { this = TAnnotatedExitNode(_, true) } + } + + /** A control flow node indicating exceptional termination of a callable. */ + class ExceptionalExitNode extends AnnotatedExitNode { + ExceptionalExitNode() { this = TAnnotatedExitNode(_, false) } + } + /** A control flow node indicating the termination of a callable. */ class ExitNode extends Node, TExitNode { Callable c; @@ -1266,11 +1300,17 @@ private module ControlFlowGraphImpl { */ cached Node succ(Node n, Completion completion) { - // After executing the callable body, the final node is the exit node. + // After executing the callable body, the final nodes are first the + // annotated exit node and then the final exit node. exists(Callable c | last(c.getBody(), n, completion) | - result.(ExitNode).getEnclosingCallable() = c + if completion instanceof ThrowCompletion + then result.(ExceptionalExitNode).getEnclosingCallable() = c + else result.(NormalExitNode).getEnclosingCallable() = c ) or + completion = NormalCompletion() and + n.(AnnotatedExitNode).getEnclosingCallable() = result.(ExitNode).getEnclosingCallable() + or // Logic expressions and conditional expressions execute in AST pre-order. completion = NormalCompletion() and ( @@ -1581,7 +1621,8 @@ private module ControlFlowGraphImpl { result.(AssertThrowNode).getAstNode() = assertstmt ) or - last(assertstmt.getMessage(), n, NormalCompletion()) and + last(assertstmt.getMessage(), n, completion) and + completion = NormalCompletion() and result.(AssertThrowNode).getAstNode() = assertstmt ) or diff --git a/java/ql/lib/semmle/code/java/Diagnostics.qll b/java/ql/lib/semmle/code/java/Diagnostics.qll index c93e6850b3de..8a4b543aa4a1 100644 --- a/java/ql/lib/semmle/code/java/Diagnostics.qll +++ b/java/ql/lib/semmle/code/java/Diagnostics.qll @@ -61,3 +61,9 @@ class Diagnostic extends @diagnostic { /** Gets a textual representation of this diagnostic. */ string toString() { result = this.getMessage() } } + +/** + * Holds for extraction information keys that should be skipped from telemetry reports. + * This predicate can be extended by other packs to filter out specific telemetry keys. + */ +extensible predicate extractorInformationSkipKey(string key); diff --git a/java/ql/lib/semmle/code/java/Generics.qll b/java/ql/lib/semmle/code/java/Generics.qll index e0204b1beace..fbd979a03694 100644 --- a/java/ql/lib/semmle/code/java/Generics.qll +++ b/java/ql/lib/semmle/code/java/Generics.qll @@ -521,7 +521,13 @@ private predicate unificationTargets(RefType t1, Type t2) { t2 = a2.getComponentType() ) or - exists(ParameterizedType pt1, ParameterizedType pt2, int pos | + unificationTargetsParameterized(_, _, t1, t2) +} + +private predicate unificationTargetsParameterized( + ParameterizedType pt1, ParameterizedType pt2, RefType t1, RefType t2 +) { + exists(int pos | unificationTargets(pt1, pt2) and t1 = pt1.getTypeArgument(pos) and t2 = pt2.getTypeArgument(pos) @@ -565,10 +571,12 @@ private predicate hasParameterSubstitution( GenericType g1, ParameterizedType pt1, GenericType g2, ParameterizedType pt2, TypeVariable v, RefType subst ) { - unificationTargets(pt1, pt2) and - exists(int pos | hasSubstitution(pt1.getTypeArgument(pos), pt2.getTypeArgument(pos), v, subst)) and - g1 = pt1.getGenericType() and - g2 = pt2.getGenericType() + exists(RefType t1, RefType t2 | + unificationTargetsParameterized(pt1, pt2, t1, t2) and + hasSubstitution(t1, t2, v, subst) and + g1 = pt1.getGenericType() and + g2 = pt2.getGenericType() + ) } /** diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index aa1cc5fdc7f7..dd646e74285c 100644 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -1261,14 +1261,21 @@ private Type erase(Type t) { * * For the definition of the notion of *erasure* see JLS v8, section 4.6 (Type Erasure). */ +bindingset[t1, t2] overlay[caller?] -pragma[inline] +pragma[inline_late] predicate haveIntersection(RefType t1, RefType t2) { exists(RefType e1, RefType e2 | e1 = erase(t1) and e2 = erase(t2) | - erasedHaveIntersection(e1, e2) + erasedHaveIntersectionFilter(e1, e2) ) } +bindingset[t1, t2] +pragma[inline_late] +private predicate erasedHaveIntersectionFilter(RefType t1, RefType t2) { + erasedHaveIntersection(t1, t2) +} + /** * Holds if there is no common (reflexive, transitive) subtype of the erasures * of types `t1` and `t2`. diff --git a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll index 844371da36b8..e974f711ec45 100644 --- a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll +++ b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll @@ -57,7 +57,7 @@ private module Input implements BB::InputSig { * Holds if `node` represents an exit node to be used when calculating * post dominance. */ - predicate nodeIsPostDominanceExit(Node node) { node instanceof ControlFlow::ExitNode } + predicate nodeIsPostDominanceExit(Node node) { node instanceof ControlFlow::NormalExitNode } } private module BbImpl = BB::Make; diff --git a/java/ql/lib/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll index 8cead5b666bb..c33658cb67b6 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Guards.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Guards.qll @@ -146,6 +146,8 @@ private module GuardsInput implements SharedGuards::InputSig { class ControlFlowNode = J::ControlFlowNode; + class NormalExitNode = ControlFlow::NormalExitNode; + class BasicBlock = J::BasicBlock; predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { J::dominatingEdge(bb1, bb2) } @@ -322,6 +324,55 @@ private module GuardsInput implements SharedGuards::InputSig { Expr getElse() { result = super.getFalseExpr() } } + + class Parameter = J::Parameter; + + private int parameterPosition() { result in [-1, any(Parameter p).getPosition()] } + + /** A parameter position represented by an integer. */ + class ParameterPosition extends int { + ParameterPosition() { this = parameterPosition() } + } + + /** An argument position represented by an integer. */ + class ArgumentPosition extends int { + ArgumentPosition() { this = parameterPosition() } + } + + /** Holds if arguments at position `apos` match parameters at position `ppos`. */ + overlay[caller?] + pragma[inline] + predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos } + + final private class FinalMethod = Method; + + class NonOverridableMethod extends FinalMethod { + NonOverridableMethod() { not super.isOverridable() } + + Parameter getParameter(ParameterPosition ppos) { + super.getParameter(ppos) = result and + not result.isVarargs() + } + + GuardsInput::Expr getAReturnExpr() { + exists(ReturnStmt ret | + this = ret.getEnclosingCallable() and + ret.getResult() = result + ) + } + } + + private predicate nonOverridableMethodCall(MethodCall call, NonOverridableMethod m) { + call.getMethod().getSourceDeclaration() = m + } + + class NonOverridableMethodCall extends GuardsInput::Expr instanceof MethodCall { + NonOverridableMethodCall() { nonOverridableMethodCall(this, _) } + + NonOverridableMethod getMethod() { nonOverridableMethodCall(this, result) } + + GuardsInput::Expr getArgument(ArgumentPosition apos) { result = super.getArgument(apos) } + } } private module GuardsImpl = SharedGuards::Make; @@ -340,6 +391,17 @@ private module LogicInputCommon { NullGuards::nullCheckMethod(call.getMethod(), val.asBooleanValue(), isNull) ) } + + predicate additionalImpliesStep( + GuardsImpl::PreGuard g1, GuardValue v1, GuardsImpl::PreGuard g2, GuardValue v2 + ) { + exists(MethodCall check, int argIndex | + g1 = check and + v1.getDualValue().isThrowsException() and + conditionCheckArgument(check, argIndex, v2.asBooleanValue()) and + g2 = check.getArgument(argIndex) + ) + } } private module LogicInput_v1 implements GuardsImpl::LogicInputSig { @@ -364,18 +426,13 @@ private module LogicInput_v1 implements GuardsImpl::LogicInputSig { } } + predicate parameterDefinition(Parameter p, SsaDefinition def) { + def.(BaseSsaImplicitInit).isParameterDefinition(p) + } + predicate additionalNullCheck = LogicInputCommon::additionalNullCheck/4; - predicate additionalImpliesStep( - GuardsImpl::PreGuard g1, GuardValue v1, GuardsImpl::PreGuard g2, GuardValue v2 - ) { - exists(MethodCall check, int argIndex | - g1 = check and - v1.getDualValue().isThrowsException() and - conditionCheckArgument(check, argIndex, v2.asBooleanValue()) and - g2 = check.getArgument(argIndex) - ) - } + predicate additionalImpliesStep = LogicInputCommon::additionalImpliesStep/4; } private module LogicInput_v2 implements GuardsImpl::LogicInputSig { @@ -400,15 +457,13 @@ private module LogicInput_v2 implements GuardsImpl::LogicInputSig { } } + predicate parameterDefinition(Parameter p, SsaDefinition def) { + def.(SSA::SsaImplicitInit).isParameterDefinition(p) + } + predicate additionalNullCheck = LogicInputCommon::additionalNullCheck/4; - predicate additionalImpliesStep( - GuardsImpl::PreGuard g1, GuardValue v1, GuardsImpl::PreGuard g2, GuardValue v2 - ) { - LogicInput_v1::additionalImpliesStep(g1, v1, g2, v2) - or - CustomGuard::additionalImpliesStep(g1, v1, g2, v2) - } + predicate additionalImpliesStep = LogicInputCommon::additionalImpliesStep/4; } private module LogicInput_v3 implements GuardsImpl::LogicInputSig { @@ -421,70 +476,11 @@ private module LogicInput_v3 implements GuardsImpl::LogicInputSig { predicate additionalNullCheck = LogicInputCommon::additionalNullCheck/4; - predicate additionalImpliesStep = LogicInput_v2::additionalImpliesStep/4; -} - -private module CustomGuardInput implements Guards_v2::CustomGuardInputSig { - private import semmle.code.java.dataflow.SSA - - private int parameterPosition() { result in [-1, any(Parameter p).getPosition()] } - - /** A parameter position represented by an integer. */ - class ParameterPosition extends int { - ParameterPosition() { this = parameterPosition() } - } - - /** An argument position represented by an integer. */ - class ArgumentPosition extends int { - ArgumentPosition() { this = parameterPosition() } - } - - /** Holds if arguments at position `apos` match parameters at position `ppos`. */ - overlay[caller?] - pragma[inline] - predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos } - - final private class FinalMethod = Method; - - class BooleanMethod extends FinalMethod { - BooleanMethod() { - super.getReturnType().(PrimitiveType).hasName("boolean") and - not super.isOverridable() - } - - LogicInput_v2::SsaDefinition getParameter(ParameterPosition ppos) { - exists(Parameter p | - super.getParameter(ppos) = p and - not p.isVarargs() and - result.(SsaImplicitInit).isParameterDefinition(p) - ) - } - - GuardsInput::Expr getAReturnExpr() { - exists(ReturnStmt ret | - this = ret.getEnclosingCallable() and - ret.getResult() = result - ) - } - } - - private predicate booleanMethodCall(MethodCall call, BooleanMethod m) { - call.getMethod().getSourceDeclaration() = m - } - - class BooleanMethodCall extends GuardsInput::Expr instanceof MethodCall { - BooleanMethodCall() { booleanMethodCall(this, _) } - - BooleanMethod getMethod() { booleanMethodCall(this, result) } - - GuardsInput::Expr getArgument(ArgumentPosition apos) { result = super.getArgument(apos) } - } + predicate additionalImpliesStep = LogicInputCommon::additionalImpliesStep/4; } class GuardValue = GuardsImpl::GuardValue; -private module CustomGuard = Guards_v2::CustomGuard; - /** INTERNAL: Don't use. */ module Guards_v1 = GuardsImpl::Logic; diff --git a/java/ql/lib/semmle/code/java/controlflow/Paths.qll b/java/ql/lib/semmle/code/java/controlflow/Paths.qll index fb14c226484d..abc56e32b5ca 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Paths.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Paths.qll @@ -66,6 +66,10 @@ private class JoinBlock extends BasicBlock { JoinBlock() { 2 <= strictcount(this.getAPredecessor()) } } +private class ReachableBlock extends BasicBlock { + ReachableBlock() { hasDominanceInformation(this) } +} + /** * Holds if `bb` is a block that is collectively dominated by a set of one or * more actions that individually does not dominate the exit. @@ -74,7 +78,7 @@ private predicate postActionBlock(BasicBlock bb, ActionConfiguration conf) { bb = nonDominatingActionBlock(conf) or if bb instanceof JoinBlock - then forall(BasicBlock pred | pred = bb.getAPredecessor() | postActionBlock(pred, conf)) + then forall(ReachableBlock pred | pred = bb.getAPredecessor() | postActionBlock(pred, conf)) else postActionBlock(bb.getAPredecessor(), conf) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll index 164e2d8aa262..8b9087ecbdc5 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll @@ -348,6 +348,16 @@ predicate expectsContent(Node n, ContentSet c) { FlowSummaryImpl::Private::Steps::summaryExpectsContent(n.(FlowSummaryNode).getSummaryNode(), c) } +pragma[nomagic] +private predicate numericRepresentative(RefType t) { + t.(BoxedType).getPrimitiveType().getName() = "double" +} + +pragma[nomagic] +private predicate booleanRepresentative(RefType t) { + t.(BoxedType).getPrimitiveType().getName() = "boolean" +} + /** * Gets a representative (boxed) type for `t` for the purpose of pruning * possible flow. A single type is used for all numeric types to account for @@ -356,10 +366,10 @@ predicate expectsContent(Node n, ContentSet c) { RefType getErasedRepr(Type t) { exists(Type e | e = t.getErasure() | if e instanceof NumericOrCharType - then result.(BoxedType).getPrimitiveType().getName() = "double" + then numericRepresentative(result) else if e instanceof BooleanType - then result.(BoxedType).getPrimitiveType().getName() = "boolean" + then booleanRepresentative(result) else result = e ) or diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll index 45ad9d0a73b7..5a6c5ff6339b 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll @@ -563,9 +563,9 @@ private module Cached { cached // nothing is actually cached module BarrierGuard { private predicate guardChecksAdjTypes( - DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, boolean branch + DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, Guards::GuardValue val ) { - guardChecks(g, e, branch) + guardChecks(g, e, val.asBooleanValue()) } private Node getABarrierNodeImpl() { @@ -657,16 +657,18 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu def instanceof SsaUncertainImplicitUpdate } + class GuardValue = Guards::GuardValue; + class Guard = Guards::Guard; - /** Holds if the guard `guard` directly controls block `bb` upon evaluating to `branch`. */ - predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, boolean branch) { - guard.directlyControls(bb, branch) + /** Holds if the guard `guard` directly controls block `bb` upon evaluating to `val`. */ + predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { + guard.directlyValueControls(bb, val) } - /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ - predicate guardControlsBlock(Guard guard, BasicBlock bb, boolean branch) { - guard.controls(bb, branch) + /** Holds if the guard `guard` controls block `bb` upon evaluating to `val`. */ + predicate guardControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { + guard.valueControls(bb, val) } predicate includeWriteDefsInFlowStep() { none() } diff --git a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll index 12fe1cba5e99..86915f802743 100644 --- a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll @@ -214,24 +214,35 @@ private predicate relevantNode(ObjNode n) { exists(ObjNode mid | relevantNode(mid) and objStep(mid, n) and relevantNodeBack(n)) } -pragma[noinline] -private predicate objStepPruned(ObjNode n1, ObjNode n2) { - objStep(n1, n2) and relevantNode(n1) and relevantNode(n2) +private newtype TObjFlowNode = + TObjNode(ObjNode n) { relevantNode(n) } or + TObjType(RefType t) { source(t, _) } + +private predicate objStepPruned(TObjFlowNode node1, TObjFlowNode node2) { + exists(ObjNode n1, ObjNode n2 | + node1 = TObjNode(n1) and + node2 = TObjNode(n2) and + objStep(n1, n2) + ) + or + exists(RefType t, ObjNode n | + node1 = TObjType(t) and + node2 = TObjNode(n) and + source(t, n) + ) } -private predicate stepPlus(Node n1, Node n2) = fastTC(objStepPruned/2)(n1, n2) +private predicate flowSrc(TObjFlowNode src) { src instanceof TObjType } + +private predicate flowSink(TObjFlowNode sink) { exists(ObjNode n | sink = TObjNode(n) and sink(n)) } + +private predicate stepPlus(TObjFlowNode n1, TObjFlowNode n2) = + doublyBoundedFastTC(objStepPruned/2, flowSrc/1, flowSink/1)(n1, n2) /** * Holds if the qualifier `n` of an `Object.toString()` call might have type `t`. */ -pragma[noopt] -private predicate objType(ObjNode n, RefType t) { - exists(ObjNode n2 | - sink(n) and - (stepPlus(n2, n) or n2 = n) and - source(t, n2) - ) -} +private predicate objType(ObjNode n, RefType t) { stepPlus(TObjType(t), TObjNode(n)) } private VirtualMethodCall objectToString(ObjNode n) { result.getQualifier() = n.asExpr() and sink(n) diff --git a/java/ql/lib/semmle/code/java/frameworks/Castor.qll b/java/ql/lib/semmle/code/java/frameworks/Castor.qll index 2becb2fbf178..5be64575bc2a 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Castor.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Castor.qll @@ -1,8 +1,10 @@ /** + * DEPRECATED: Now modeled using data extensions instead. + * * Provides classes and predicates for working with the Castor framework. */ overlay[local?] -module; +deprecated module; import java @@ -13,7 +15,9 @@ class CastorUnmarshaller extends RefType { CastorUnmarshaller() { this.hasQualifiedName("org.exolab.castor.xml", "Unmarshaller") } } -/** A method with the name `unmarshal` declared in `org.exolab.castor.xml.Unmarshaller`. */ +/** + * A method with the name `unmarshal` declared in `org.exolab.castor.xml.Unmarshaller`. + */ class CastorUnmarshalMethod extends Method { CastorUnmarshalMethod() { this.getDeclaringType() instanceof CastorUnmarshaller and diff --git a/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll b/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll index 3a10b75a2a69..25449b351abd 100644 --- a/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll +++ b/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll @@ -17,10 +17,12 @@ class UnsafeHessianInput extends RefType { } /** + * DEPRECATED: Now modeled using data extensions instead. + * * A AbstractHessianInput or Hessian2StreamingInput subclass readObject method. * This is either `AbstractHessianInput.readObject` or `Hessian2StreamingInput.readObject`. */ -class UnsafeHessianInputReadObjectMethod extends Method { +deprecated class UnsafeHessianInputReadObjectMethod extends Method { UnsafeHessianInputReadObjectMethod() { this.getDeclaringType().getAnAncestor() instanceof UnsafeHessianInput and this.getName() = "readObject" @@ -34,8 +36,12 @@ class BurlapInput extends RefType { BurlapInput() { this.hasQualifiedName("com.caucho.burlap.io", "BurlapInput") } } -/** A method with the name `readObject` declared in `com.caucho.burlap.io.BurlapInput`. */ -class BurlapInputReadObjectMethod extends Method { +/** + * DEPRECATED: Now modeled using data extensions instead. + * + * A method with the name `readObject` declared in `com.caucho.burlap.io.BurlapInput`. + */ +deprecated class BurlapInputReadObjectMethod extends Method { BurlapInputReadObjectMethod() { this.getDeclaringType() instanceof BurlapInput and this.getName() = "readObject" diff --git a/java/ql/lib/semmle/code/java/frameworks/JYaml.qll b/java/ql/lib/semmle/code/java/frameworks/JYaml.qll index cd9414521c4e..4f39c8cd23fc 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JYaml.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JYaml.qll @@ -1,8 +1,10 @@ /** + * DEPRECATED: Now modeled using data extensions instead. + * * Provides classes and predicates for working with the JYaml framework. */ overlay[local?] -module; +deprecated module; import java diff --git a/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll b/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll index e8bb82f156fe..1997fd74f645 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll @@ -19,8 +19,12 @@ class JabsorbUnmarshallMethod extends Method { } } -/** The deserialization method `fromJSON`. */ -class JabsorbFromJsonMethod extends Method { +/** + * DEPRECATED: Now modeled using data extensions instead. + * + * The deserialization method `fromJSON`. + */ +deprecated class JabsorbFromJsonMethod extends Method { JabsorbFromJsonMethod() { this.getDeclaringType().getAnAncestor() instanceof JabsorbSerializer and this.getName() = "fromJSON" diff --git a/java/ql/lib/semmle/code/java/frameworks/YamlBeans.qll b/java/ql/lib/semmle/code/java/frameworks/YamlBeans.qll index 040ae60fc710..55ff862d3410 100644 --- a/java/ql/lib/semmle/code/java/frameworks/YamlBeans.qll +++ b/java/ql/lib/semmle/code/java/frameworks/YamlBeans.qll @@ -13,8 +13,12 @@ class YamlBeansReader extends RefType { YamlBeansReader() { this.hasQualifiedName("com.esotericsoftware.yamlbeans", "YamlReader") } } -/** A method with the name `read` declared in `com.esotericsoftware.yamlbeans.YamlReader`. */ -class YamlBeansReaderReadMethod extends Method { +/** + * DEPRECATED: Now modeled using data extensions instead. + * + * A method with the name `read` declared in `com.esotericsoftware.yamlbeans.YamlReader`. + */ +deprecated class YamlBeansReaderReadMethod extends Method { YamlBeansReaderReadMethod() { this.getDeclaringType() instanceof YamlBeansReader and this.getName() = "read" diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/Lang.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Lang.qll index 27c7f9530ad1..a58500eb20df 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/Lang.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/Lang.qll @@ -16,10 +16,12 @@ class TypeApacheRandomStringUtils extends Class { } /** + * DEPRECATED: Now modeled using data extensions instead. + * * The method `deserialize` in either `org.apache.commons.lang.SerializationUtils` * or `org.apache.commons.lang3.SerializationUtils`. */ -class MethodApacheSerializationUtilsDeserialize extends Method { +deprecated class MethodApacheSerializationUtilsDeserialize extends Method { MethodApacheSerializationUtilsDeserialize() { this.getDeclaringType() .hasQualifiedName(["org.apache.commons.lang", "org.apache.commons.lang3"], diff --git a/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll index 2ba13c06feb8..9aa60e391dc4 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll @@ -149,6 +149,8 @@ module SensitiveCommunicationConfig implements DataFlow::ConfigSig { predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { isSink(node) and exists(c) } + + predicate observeDiffInformedIncrementalMode() { any() } } /** diff --git a/java/ql/lib/semmle/code/java/security/ArithmeticTaintedQuery.qll b/java/ql/lib/semmle/code/java/security/ArithmeticTaintedQuery.qll index 51d6c284e1ca..fbb8509f48f9 100644 --- a/java/ql/lib/semmle/code/java/security/ArithmeticTaintedQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ArithmeticTaintedQuery.qll @@ -13,6 +13,14 @@ module ArithmeticOverflowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { overflowBarrier(n) } predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + + predicate observeDiffInformedIncrementalMode() { + any() // merged with ArithmeticUnderflow in ArithmeticTainted.ql + } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(ArithExpr exp | result = exp.getLocation() | overflowSink(exp, sink.asExpr())) + } } /** @@ -29,6 +37,14 @@ module ArithmeticUnderflowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) } predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + + predicate observeDiffInformedIncrementalMode() { + any() // merged with ArithmeticOverflow in ArithmeticTainted.ql + } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(ArithExpr exp | result = exp.getLocation() | underflowSink(exp, sink.asExpr())) + } } /** diff --git a/java/ql/lib/semmle/code/java/security/ArithmeticUncontrolledQuery.qll b/java/ql/lib/semmle/code/java/security/ArithmeticUncontrolledQuery.qll index a5fa0d3ee4b1..6b7b337ad656 100644 --- a/java/ql/lib/semmle/code/java/security/ArithmeticUncontrolledQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ArithmeticUncontrolledQuery.qll @@ -19,6 +19,14 @@ module ArithmeticUncontrolledOverflowConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { overflowSink(_, sink.asExpr()) } predicate isBarrier(DataFlow::Node n) { overflowBarrier(n) } + + predicate observeDiffInformedIncrementalMode() { + any() // merged with ArithmeticUncontrolledUnderflow in ArithmeticUncontrolled.ql + } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(ArithExpr exp | result = exp.getLocation() | overflowSink(exp, sink.asExpr())) + } } /** Taint-tracking flow to reason about overflow from arithmetic with uncontrolled values. */ @@ -32,6 +40,14 @@ module ArithmeticUncontrolledUnderflowConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { underflowSink(_, sink.asExpr()) } predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) } + + predicate observeDiffInformedIncrementalMode() { + any() // merged with ArithmeticUncontrolledOverflow in ArithmeticUncontrolled.ql + } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(ArithExpr exp | result = exp.getLocation() | underflowSink(exp, sink.asExpr())) + } } /** Taint-tracking flow to reason about underflow from arithmetic with uncontrolled values. */ diff --git a/java/ql/lib/semmle/code/java/security/ConditionalBypassQuery.qll b/java/ql/lib/semmle/code/java/security/ConditionalBypassQuery.qll index 03ba8d461979..314570369377 100644 --- a/java/ql/lib/semmle/code/java/security/ConditionalBypassQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ConditionalBypassQuery.qll @@ -47,6 +47,15 @@ module ConditionalBypassFlowConfig implements DataFlow::ConfigSig { predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { endsWithStep(node1, node2) } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(MethodCall m, Expr e | result = [m, e].getLocation() | + conditionControlsMethod(m, e) and + sink.asExpr() = e + ) + } } /** diff --git a/java/ql/lib/semmle/code/java/security/CsrfUnprotectedRequestTypeQuery.qll b/java/ql/lib/semmle/code/java/security/CsrfUnprotectedRequestTypeQuery.qll index 42d6db246c0e..80d100d3d9e1 100644 --- a/java/ql/lib/semmle/code/java/security/CsrfUnprotectedRequestTypeQuery.qll +++ b/java/ql/lib/semmle/code/java/security/CsrfUnprotectedRequestTypeQuery.qll @@ -237,12 +237,35 @@ private predicate sink(CallPathNode sinkMethodCall) { ) } +private predicate fwdFlow(CallPathNode n) { + source(n) + or + exists(CallPathNode mid | fwdFlow(mid) and CallGraph::edges(mid, n)) +} + +private predicate revFlow(CallPathNode n) { + fwdFlow(n) and + ( + sink(n) + or + exists(CallPathNode mid | revFlow(mid) and CallGraph::edges(n, mid)) + ) +} + +/** + * Holds if `pred` has a successor node `succ` and this edge is in an + * `unprotectedStateChange` path. + */ +predicate relevantEdge(CallPathNode pred, CallPathNode succ) { + CallGraph::edges(pred, succ) and revFlow(pred) and revFlow(succ) +} + /** * Holds if `sourceMethod` is an unprotected request handler that reaches a * `sinkMethodCall` that updates a database. */ private predicate unprotectedDatabaseUpdate(CallPathNode sourceMethod, CallPathNode sinkMethodCall) = - doublyBoundedFastTC(CallGraph::edges/2, source/1, sink/1)(sourceMethod, sinkMethodCall) + doublyBoundedFastTC(relevantEdge/2, source/1, sink/1)(sourceMethod, sinkMethodCall) /** * Holds if `sourceMethod` is an unprotected request handler that appears to diff --git a/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll b/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll index 809f45aa45a3..df941be97448 100644 --- a/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll +++ b/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll @@ -101,6 +101,10 @@ module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource } predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } + + predicate observeDiffInformedIncrementalMode() { + any() // Simple use in UntrustedDataToExternalAPI.ql; also used through ExternalApiUsedWithUntrustedData in ExternalAPIsUsedWithUntrustedData.ql + } } /** diff --git a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionCodeSpecifiedQuery.qll b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionCodeSpecifiedQuery.qll index a6f10913da58..e952971c389f 100644 --- a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionCodeSpecifiedQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionCodeSpecifiedQuery.qll @@ -17,6 +17,15 @@ module BoundedFlowSourceConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess | + result = [arrayCreation, arrayAccess.getIndexExpr()].getLocation() and + arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), arrayCreation) + ) + } } /** diff --git a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionQuery.qll b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionQuery.qll index 2af9396a119e..913d50b3159d 100644 --- a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayConstructionQuery.qll @@ -14,6 +14,15 @@ module ImproperValidationOfArrayConstructionConfig implements DataFlow::ConfigSi predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess | + result = [arrayCreation, arrayAccess.getIndexExpr()].getLocation() and + arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), arrayCreation) + ) + } } /** diff --git a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexCodeSpecifiedQuery.qll b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexCodeSpecifiedQuery.qll index 2ae9eb2c696f..01a924de78e4 100644 --- a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexCodeSpecifiedQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexCodeSpecifiedQuery.qll @@ -14,6 +14,8 @@ module BoundedFlowSourceConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { exists(CheckableArrayAccess arrayAccess | arrayAccess.canThrowOutOfBounds(sink.asExpr())) } + + predicate observeDiffInformedIncrementalMode() { any() } } /** diff --git a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexQuery.qll b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexQuery.qll index 6d11962f2f45..7cb3d1724830 100644 --- a/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ImproperValidationOfArrayIndexQuery.qll @@ -18,6 +18,8 @@ module ImproperValidationOfArrayIndexConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node.getType() instanceof BooleanType } predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + + predicate observeDiffInformedIncrementalMode() { any() } } /** diff --git a/java/ql/lib/semmle/code/java/security/InsecureCookieQuery.qll b/java/ql/lib/semmle/code/java/security/InsecureCookieQuery.qll index e8c3052acdfb..eda07658866c 100644 --- a/java/ql/lib/semmle/code/java/security/InsecureCookieQuery.qll +++ b/java/ql/lib/semmle/code/java/security/InsecureCookieQuery.qll @@ -35,6 +35,10 @@ module SecureCookieConfig implements DataFlow::ConfigSig { sink.asExpr() = any(MethodCall add | add.getMethod() instanceof ResponseAddCookieMethod).getArgument(0) } + + predicate observeDiffInformedIncrementalMode() { + none() // only used negatively in InsecureCookie.ql + } } /** Data flow to reason about the failure to use secure cookies. */ diff --git a/java/ql/lib/semmle/code/java/security/InsecureLdapAuthQuery.qll b/java/ql/lib/semmle/code/java/security/InsecureLdapAuthQuery.qll index 94d80b9b37b0..a4cbf474dded 100644 --- a/java/ql/lib/semmle/code/java/security/InsecureLdapAuthQuery.qll +++ b/java/ql/lib/semmle/code/java/security/InsecureLdapAuthQuery.qll @@ -40,6 +40,10 @@ private module BasicAuthConfig implements DataFlow::ConfigSig { } predicate isSink(DataFlow::Node sink) { sink instanceof InsecureLdapUrlSink } + + predicate observeDiffInformedIncrementalMode() { + none() // used as secondary flow to InsecureLdapUrlFlow in InsecureLdapAuth.ql + } } module BasicAuthFlow = DataFlow::Global; @@ -56,6 +60,10 @@ private module RequiresSslConfig implements DataFlow::ConfigSig { } predicate isSink(DataFlow::Node sink) { sink instanceof InsecureLdapUrlSink } + + predicate observeDiffInformedIncrementalMode() { + none() // only used negatively in InsecureLdapAuth.ql + } } module RequiresSslFlow = DataFlow::Global; diff --git a/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll index 64d59993b3da..c34ba0e48499 100644 --- a/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll @@ -19,6 +19,10 @@ module LogInjectionConfig implements DataFlow::ConfigSig { } predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + + predicate observeDiffInformedIncrementalMode() { + none() // straightforward case; but the large test source is causing OOMs under `--check-diff-informed`. + } } /** diff --git a/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll b/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll index 060a30f87e6a..57622b367f31 100644 --- a/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll +++ b/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll @@ -77,6 +77,12 @@ module InsecureCryptoConfig implements DataFlow::ConfigSig { objectToString(n.asExpr()) or n.getType().getErasure() instanceof TypeObject } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(CryptoAlgoSpec c | result = c.getLocation() | sink.asExpr() = c.getAlgoSpec()) + } } /** diff --git a/java/ql/lib/semmle/code/java/security/PathSanitizer.qll b/java/ql/lib/semmle/code/java/security/PathSanitizer.qll index ed0761f6869e..e789d3c47785 100644 --- a/java/ql/lib/semmle/code/java/security/PathSanitizer.qll +++ b/java/ql/lib/semmle/code/java/security/PathSanitizer.qll @@ -31,20 +31,10 @@ private module ValidationMethod { * Holds if `m` validates its `arg`th parameter by using `validationGuard`. */ private predicate validationMethod(Method m, int arg) { - exists( - Guard g, SsaImplicitInit var, ControlFlow::ExitNode exit, ControlFlowNode normexit, - boolean branch - | + exists(Guard g, SsaImplicitInit var, ControlFlow::NormalExitNode normexit, boolean branch | validationGuard(g, var.getAUse(), branch) and var.isParameterDefinition(m.getParameter(arg)) and - exit.getEnclosingCallable() = m and - normexit.getANormalSuccessor() = exit and - 1 = strictcount(ControlFlowNode n | n.getANormalSuccessor() = exit) - | - exists(ConditionNode conditionNode | - g = conditionNode.getCondition() and conditionNode.getABranchSuccessor(branch) = exit - ) - or + normexit.getEnclosingCallable() = m and g.controls(normexit.getBasicBlock(), branch) ) } diff --git a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll index 201b347e014c..25454d80c717 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll @@ -53,6 +53,8 @@ module SensitiveLoggerConfig implements DataFlow::ConfigSig { } predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + + predicate observeDiffInformedIncrementalMode() { any() } } module SensitiveLoggerFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/SqlConcatenatedQuery.qll b/java/ql/lib/semmle/code/java/security/SqlConcatenatedQuery.qll index fe6e31900e1f..7cfea41a8d77 100644 --- a/java/ql/lib/semmle/code/java/security/SqlConcatenatedQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SqlConcatenatedQuery.qll @@ -24,6 +24,15 @@ module UncontrolledStringBuilderSourceFlowConfig implements DataFlow::ConfigSig predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSourceLocation(DataFlow::Node source) { + exists(Expr uncontrolled, StringBuilderVar sbv | result = uncontrolled.getLocation() | + uncontrolledStringBuilderQuery(sbv, uncontrolled) and + source = DataFlow::exprNode(sbv.getToStringCall()) + ) + } } /** diff --git a/java/ql/lib/semmle/code/java/security/TaintedEnvironmentVariableQuery.qll b/java/ql/lib/semmle/code/java/security/TaintedEnvironmentVariableQuery.qll index 597c05b04541..d972b59986a6 100644 --- a/java/ql/lib/semmle/code/java/security/TaintedEnvironmentVariableQuery.qll +++ b/java/ql/lib/semmle/code/java/security/TaintedEnvironmentVariableQuery.qll @@ -38,6 +38,10 @@ module ExecTaintedEnvironmentConfig implements DataFlow::ConfigSig { ProcessBuilderEnvironmentFlow::flowToExpr(mm.getQualifier()) ) } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSourceLocation(DataFlow::Node source) { none() } } /** diff --git a/java/ql/lib/semmle/code/java/security/TempDirLocalInformationDisclosureQuery.qll b/java/ql/lib/semmle/code/java/security/TempDirLocalInformationDisclosureQuery.qll index 1caadd3f8acd..098362f2bd53 100644 --- a/java/ql/lib/semmle/code/java/security/TempDirLocalInformationDisclosureQuery.qll +++ b/java/ql/lib/semmle/code/java/security/TempDirLocalInformationDisclosureQuery.qll @@ -145,6 +145,10 @@ module TempDirSystemGetPropertyToCreateConfig implements DataFlow::ConfigSig { or sanitizer instanceof WindowsOsSanitizer } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { none() } } /** diff --git a/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll b/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll index f70542486dee..b2f49834b5ab 100644 --- a/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/TrustBoundaryViolationQuery.qll @@ -62,6 +62,8 @@ module TrustBoundaryConfig implements DataFlow::ConfigSig { } predicate isSink(DataFlow::Node sink) { sink instanceof TrustBoundaryViolationSink } + + predicate observeDiffInformedIncrementalMode() { any() } } /** diff --git a/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll index 803e3836ab0e..b395692804cf 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll @@ -14,6 +14,10 @@ module SslEndpointIdentificationFlowConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof SslConnectionCreation } predicate isBarrier(DataFlow::Node sanitizer) { sanitizer instanceof SslUnsafeCertTrustSanitizer } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSourceLocation(DataFlow::Node source) { none() } } /** diff --git a/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll index 7489fbd00ef9..ce0f649eff35 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll @@ -3,17 +3,16 @@ */ import semmle.code.java.dataflow.FlowSources +private import semmle.code.java.dataflow.ExternalFlow private import semmle.code.java.dataflow.FlowSinks private import semmle.code.java.dispatch.VirtualDispatch private import semmle.code.java.frameworks.Kryo private import semmle.code.java.frameworks.XStream private import semmle.code.java.frameworks.SnakeYaml private import semmle.code.java.frameworks.FastJson -private import semmle.code.java.frameworks.JYaml private import semmle.code.java.frameworks.JsonIo private import semmle.code.java.frameworks.YamlBeans private import semmle.code.java.frameworks.HessianBurlap -private import semmle.code.java.frameworks.Castor private import semmle.code.java.frameworks.Jackson private import semmle.code.java.frameworks.Jabsorb private import semmle.code.java.frameworks.Jms @@ -51,13 +50,6 @@ private class SafeObjectInputStreamType extends RefType { } } -private class XmlDecoderReadObjectMethod extends Method { - XmlDecoderReadObjectMethod() { - this.getDeclaringType().hasQualifiedName("java.beans", "XMLDecoder") and - this.hasName("readObject") - } -} - private module SafeXStreamConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node src) { any(XStreamEnableWhiteListing ma).getQualifier().(VarAccess).getVariable().getAnAccess() = @@ -149,8 +141,15 @@ private module SafeKryoConfig implements DataFlow::ConfigSig { private module SafeKryoFlow = DataFlow::Global; +private class DefaultUnsafeDeserializationSink extends DataFlow::Node { + DefaultUnsafeDeserializationSink() { sinkNode(this, "unsafe-deserialization") } +} + /** * Holds if `ma` is a call that deserializes data from `sink`. + * + * Note that this does not include deserialization methods that have been + * specified using models-as-data. */ predicate unsafeDeserialization(MethodCall ma, Expr sink) { exists(Method m | m = ma.getMethod() | @@ -162,9 +161,6 @@ predicate unsafeDeserialization(MethodCall ma, Expr sink) { sink = ma.getQualifier() and not DataFlow::exprNode(sink).getTypeBound() instanceof SafeObjectInputStreamType or - m instanceof XmlDecoderReadObjectMethod and - sink = ma.getQualifier() - or m instanceof XStreamReadObjectMethod and sink = ma.getAnArgument() and not SafeXStreamFlow::flowToExpr(ma.getQualifier()) @@ -173,9 +169,6 @@ predicate unsafeDeserialization(MethodCall ma, Expr sink) { sink = ma.getAnArgument() and not SafeKryoFlow::flowToExpr(ma.getQualifier()) or - m instanceof MethodApacheSerializationUtilsDeserialize and - sink = ma.getArgument(0) - or ma instanceof UnsafeSnakeYamlParse and sink = ma.getArgument(0) or @@ -183,23 +176,6 @@ predicate unsafeDeserialization(MethodCall ma, Expr sink) { not fastJsonLooksSafe() and sink = ma.getArgument(0) or - ma.getMethod() instanceof JYamlLoaderUnsafeLoadMethod and - sink = ma.getArgument(0) - or - ma.getMethod() instanceof JsonIoJsonToJavaMethod and - sink = ma.getArgument(0) - or - ma.getMethod() instanceof JsonIoReadObjectMethod and - sink = ma.getQualifier() - or - ma.getMethod() instanceof YamlBeansReaderReadMethod and sink = ma.getQualifier() - or - ma.getMethod() instanceof UnsafeHessianInputReadObjectMethod and sink = ma.getQualifier() - or - ma.getMethod() instanceof CastorUnmarshalMethod and sink = ma.getAnArgument() - or - ma.getMethod() instanceof BurlapInputReadObjectMethod and sink = ma.getQualifier() - or ma.getMethod() instanceof ObjectMapperReadMethod and sink = ma.getArgument(0) and ( @@ -215,9 +191,6 @@ predicate unsafeDeserialization(MethodCall ma, Expr sink) { sink = ma.getArgument(2) and UnsafeTypeFlow::flowToExpr(ma.getArgument(1)) or - m instanceof JabsorbFromJsonMethod and - sink = ma.getArgument(0) - or m instanceof JoddJsonParseMethod and sink = ma.getArgument(0) and ( @@ -244,10 +217,17 @@ predicate unsafeDeserialization(MethodCall ma, Expr sink) { /** A sink for unsafe deserialization. */ class UnsafeDeserializationSink extends ApiSinkNode, DataFlow::ExprNode { - UnsafeDeserializationSink() { unsafeDeserialization(_, this.getExpr()) } + MethodCall mc; + + UnsafeDeserializationSink() { + unsafeDeserialization(mc, this.getExpr()) + or + this instanceof DefaultUnsafeDeserializationSink and + this.getExpr() = [mc.getQualifier(), mc.getAnArgument()] + } /** Gets a call that triggers unsafe deserialization. */ - MethodCall getMethodCall() { unsafeDeserialization(result, this.getExpr()) } + MethodCall getMethodCall() { result = mc } } /** Holds if `node` is a sanitizer for unsafe deserialization */ diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 50afa2ea9bfb..9d630f16f4bd 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.2 + +No user-facing changes. + ## 1.6.1 ### Minor Analysis Improvements diff --git a/java/ql/src/Language Abuse/TypeVariableHidesType.ql b/java/ql/src/Language Abuse/TypeVariableHidesType.ql index 81da0e9703e6..42d0a7bea2bf 100644 --- a/java/ql/src/Language Abuse/TypeVariableHidesType.ql +++ b/java/ql/src/Language Abuse/TypeVariableHidesType.ql @@ -6,10 +6,10 @@ * @problem.severity warning * @precision medium * @id java/type-variable-hides-type - * @tags reliability + * @tags quality + * maintainability * readability * types - * quality */ import java diff --git a/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql b/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql index ecd83e39719b..845aae01a3e8 100644 --- a/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql +++ b/java/ql/src/Likely Bugs/Collections/ArrayIndexOutOfBounds.ql @@ -18,6 +18,15 @@ import semmle.code.java.dataflow.SSA import semmle.code.java.dataflow.RangeUtils import semmle.code.java.dataflow.RangeAnalysis +pragma[nomagic] +predicate ssaArrayLengthBound(SsaVariable arr, Bound b) { + exists(FieldAccess len | + len.getField() instanceof ArrayLengthField and + len.getQualifier() = arr.getAUse() and + b.getExpr() = len + ) +} + /** * Holds if the index expression of `aa` is less than or equal to the array length plus `k`. */ @@ -27,12 +36,8 @@ predicate boundedArrayAccess(ArrayAccess aa, int k) { aa.getArray() = arr.getAUse() and bounded(index, b, delta, true, _) | - exists(FieldAccess len | - len.getField() instanceof ArrayLengthField and - len.getQualifier() = arr.getAUse() and - b.getExpr() = len and - k = delta - ) + ssaArrayLengthBound(arr, b) and + k = delta or exists(ArrayCreationExpr arraycreation | arraycreation = getArrayDef(arr) | k = delta and diff --git a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql index d1a398d1322c..497aa10cb4de 100644 --- a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql +++ b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql @@ -103,8 +103,8 @@ class MismatchedContainerAccess extends MethodCall { | this.getCallee() .getDeclaringType() - .getASourceSupertype*() .getSourceDeclaration() + .getASourceSupertype*() .hasQualifiedName(package, type) and this.getCallee().getParameter(i).getType() instanceof TypeObject ) @@ -119,7 +119,7 @@ class MismatchedContainerAccess extends MethodCall { containerAccess(package, type, p, this.getCallee().getSignature(), i) | t = this.getCallee().getDeclaringType() and - t.getASourceSupertype*().getSourceDeclaration() = g and + t.getSourceDeclaration().getASourceSupertype*() = g and g.hasQualifiedName(package, type) and indirectlyInstantiates(t, g, p, result) ) diff --git a/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll b/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll index 41239f249a27..aca95c9bc1f5 100644 --- a/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll +++ b/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll @@ -212,33 +212,35 @@ private LocalVariableDecl getCloseableVariable(CloseableInitExpr cie) { /** * A variable on which a "close" method is called, implicitly or explicitly, directly or indirectly. */ -private predicate closeCalled(Variable v) { +private predicate closeCalled(LocalScopeVariable v) { // `close()` is implicitly called on variables declared or referenced // in the resources clause of try-with-resource statements. exists(TryStmt try | try.getAResourceVariable() = v) or // Otherwise, there should be an explicit call to a method whose name contains "close". exists(MethodCall e | - v = getCloseableVariable(_) or v instanceof Parameter or v instanceof LocalVariableDecl - | e.getMethod().getName().toLowerCase().matches("%close%") and exists(VarAccess va | va = v.getAnAccess() | e.getQualifier() = va or e.getAnArgument() = va ) - or - // The "close" call could happen indirectly inside a helper method of unknown name. - exists(int i | e.getArgument(i) = v.getAnAccess() | - exists(Parameter p, int j | p.getPosition() = j and p.getCallable() = e.getMethod() | - closeCalled(p) and i = j - or - // The helper method could be iterating over a varargs parameter. - exists(EnhancedForStmt for | for.getExpr() = p.getAnAccess() | - closeCalled(for.getVariable().getVariable()) - ) and - p.isVarargs() and - j <= i - ) + ) + or + // The "close" call could happen indirectly inside a helper method of unknown name. + exists(Parameter p | + closeCalled(p) and p.getAnArgument() = v.getAnAccess() and p.getCallable() instanceof Method + ) + or + exists(MethodCall e, int i | e.getArgument(i) = v.getAnAccess() | + exists(Parameter p, int j | + p.getPosition() = j and p.getCallable() = e.getMethod().getSourceDeclaration() + | + // The helper method could be iterating over a varargs parameter. + exists(EnhancedForStmt for | for.getExpr() = p.getAnAccess() | + closeCalled(for.getVariable().getVariable()) + ) and + p.isVarargs() and + j <= i ) ) } diff --git a/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql b/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql index eb5c2d380c65..b9a0229b60ff 100644 --- a/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql +++ b/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql @@ -15,14 +15,34 @@ import java +pragma[nomagic] +predicate mayThrow(Stmt s, RefType rt) { + s.(ThrowStmt).getExpr().getType() = rt + or + exists(Call call | + call.getEnclosingStmt() = s and + call.getCallee().getAnException().getType() = rt + ) +} + +pragma[nomagic] +predicate caughtBy(TryStmt try, Stmt s, RefType rt) { + mayThrow(s, rt) and + s.getEnclosingStmt+() = try.getBlock() and + caughtType(try, _).hasSubtype*(rt) +} + +pragma[nomagic] +predicate nestedTry(TryStmt outer, TryStmt inner) { inner.getEnclosingStmt+() = outer.getBlock() } + /** * Exceptions of type `rt` thrown from within statement `s` are caught by an inner try block * and are therefore not propagated to the outer try block `t`. */ private predicate caughtInside(TryStmt t, Stmt s, RefType rt) { - exists(TryStmt innerTry | innerTry.getEnclosingStmt+() = t.getBlock() | - s.getEnclosingStmt+() = innerTry.getBlock() and - caughtType(innerTry, _).hasSubtype*(rt) + exists(TryStmt innerTry | + nestedTry(t, innerTry) and + caughtBy(innerTry, s, rt) ) } diff --git a/java/ql/src/Metrics/RefTypes/TInheritanceDepth.qhelp b/java/ql/src/Metrics/RefTypes/TInheritanceDepth.qhelp index 7d78490985bf..970b1c4e19e2 100644 --- a/java/ql/src/Metrics/RefTypes/TInheritanceDepth.qhelp +++ b/java/ql/src/Metrics/RefTypes/TInheritanceDepth.qhelp @@ -29,14 +29,13 @@ that something is amiss, but further investigation will be needed to clarify the cause of the problem. Here are two possibilities:

-
    - -
  • -A class and its superclass represent fundamentally the same abstraction. +

    +1. A class and its superclass represent fundamentally the same abstraction. In this case, they should generally be merged together (see the 'Collapse Hierarchy' refactoring on pp.279-80 of [Fowler]). For example, suppose that in the following class hierarchy both A and C represent fundamentally the same thing, then they should be merged together as shown: +

    @@ -48,11 +47,9 @@ the same thing, then they should be merged together as shown:
    After
    -
  • -
  • -The class hierarchy is trying to represent variation in more than one +2. The class hierarchy is trying to represent variation in more than one dimension using single inheritance. This can lead to an unnecessarily deep class hierarchy with lots of code duplication. For example, consider the following: @@ -81,9 +78,6 @@ amount of code duplication that will be necessary. For readers who are interested in this sort of approach, a good reference is [West].

    -
  • - -
diff --git a/java/ql/src/Metrics/RefTypes/TNumberOfCallables.qhelp b/java/ql/src/Metrics/RefTypes/TNumberOfCallables.qhelp index 49827592849d..4f9452789a89 100644 --- a/java/ql/src/Metrics/RefTypes/TNumberOfCallables.qhelp +++ b/java/ql/src/Metrics/RefTypes/TNumberOfCallables.qhelp @@ -49,21 +49,17 @@ need to be part of the class. (A classic example of this is the std::string class in the C++ Standard Library.) As [Sutter] observes, there are at least two key problems with this approach: -
    -
  • -It may be possible to generalize some of the utility methods beyond the + +1. It may be possible to generalize some of the utility methods beyond the narrow context of the class in question -- by bundling them with the class, the class author reduces the scope for functionality reuse. -
  • -
  • -It's usually impossible for the class author to know every possible +2. It's usually impossible for the class author to know every possible operation that the user might want to perform on the class, so the public interface will inherently be incomplete. New utility methods will end up having a different syntax to the privileged public methods in the class, negatively impacting on code consistency. -
  • -
+ To refactor a class like this, simply move its utility methods elsewhere, paring its public interface down to the bare minimum. diff --git a/java/ql/src/Metrics/RefTypes/TNumberOfFields.qhelp b/java/ql/src/Metrics/RefTypes/TNumberOfFields.qhelp index befc6409449e..2934ba958b52 100644 --- a/java/ql/src/Metrics/RefTypes/TNumberOfFields.qhelp +++ b/java/ql/src/Metrics/RefTypes/TNumberOfFields.qhelp @@ -25,11 +25,9 @@ If the class is too big, you should split it into multiple smaller classes.
  • -

    If several of the fields are part of the same abstraction, you should group them into a separate class, using the 'Extract Class' refactoring described in [Fowler]. -

  • diff --git a/java/ql/src/Metrics/RefTypes/TSizeOfAPI.qhelp b/java/ql/src/Metrics/RefTypes/TSizeOfAPI.qhelp index 3095d82049a6..eda183a287c2 100644 --- a/java/ql/src/Metrics/RefTypes/TSizeOfAPI.qhelp +++ b/java/ql/src/Metrics/RefTypes/TSizeOfAPI.qhelp @@ -46,21 +46,17 @@ need to be part of the class. (A classic example of this is the std::string class in the C++ Standard Library.) As [Sutter] observes, there are at least two key problems with this approach: -
      -
    • -It may be possible to generalize some of the utility methods beyond the + +1. It may be possible to generalize some of the utility methods beyond the narrow context of the class in question -- by bundling them with the class, the class author reduces the scope for functionality reuse. -
    • -
    • -It's usually impossible for the class author to know every possible +2. It's usually impossible for the class author to know every possible operation that the user might want to perform on the class, so the public interface will inherently be incomplete. New utility methods will end up having a different syntax to the privileged public methods in the class, negatively impacting on code consistency. -
    • -
    + To refactor a class like this, simply move its utility methods elsewhere, paring its public interface down to the bare minimum. diff --git a/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql b/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql index bd5cc2a5b76f..45767185dfd2 100644 --- a/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql +++ b/java/ql/src/Security/CWE/CWE-200/AndroidWebViewSettingsAllowsContentAccess.ql @@ -97,6 +97,10 @@ module WebViewDisallowContentAccessConfig implements DataFlow::StateConfigSig { state instanceof IsSettings and node instanceof WebSettingsDisallowContentAccessSink } + + predicate observeDiffInformedIncrementalMode() { + none() // only used negatively + } } module WebViewDisallowContentAccessFlow = diff --git a/java/ql/src/Security/CWE/CWE-352/CsrfUnprotectedRequestType.ql b/java/ql/src/Security/CWE/CWE-352/CsrfUnprotectedRequestType.ql index e338cb84c005..cf5c0b385ccf 100644 --- a/java/ql/src/Security/CWE/CWE-352/CsrfUnprotectedRequestType.ql +++ b/java/ql/src/Security/CWE/CWE-352/CsrfUnprotectedRequestType.ql @@ -15,7 +15,7 @@ import java import semmle.code.java.security.CsrfUnprotectedRequestTypeQuery -query predicate edges(CallPathNode pred, CallPathNode succ) { CallGraph::edges(pred, succ) } +query predicate edges(CallPathNode pred, CallPathNode succ) { relevantEdge(pred, succ) } from CallPathNode source, CallPathNode sink where unprotectedStateChange(source, sink) diff --git a/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp b/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp index 087a873dfc77..bf7205d535ff 100644 --- a/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp +++ b/java/ql/src/Security/CWE/CWE-502/UnsafeDeserialization.qhelp @@ -64,8 +64,8 @@ Recommendations specific to particular frameworks supported by this query:

    SnakeYAML - org.yaml:snakeyaml

      -
    • Secure by Default: No
    • -
    • Recommendation: Pass an instance of org.yaml.snakeyaml.constructor.SafeConstructor to org.yaml.snakeyaml.Yaml's constructor before using it to deserialize untrusted data.
    • +
    • Secure by Default: As of version 2.0.
    • +
    • Recommendation: For versions before 2.0, pass an instance of org.yaml.snakeyaml.constructor.SafeConstructor to org.yaml.snakeyaml.Yaml's constructor before using it to deserialize untrusted data.

    XML Decoder - Standard Java Library

    @@ -121,7 +121,7 @@ Alvaro Muñoz & Christian Schneider, RSAConference 2016:
  • SnakeYaml documentation on deserialization: -SnakeYaml deserialization. +SnakeYaml deserialization (not updated for new behaviour in version 2.0).
  • Hessian deserialization and related gadget chains: diff --git a/java/ql/src/Telemetry/ExtractorInformation.ql b/java/ql/src/Telemetry/ExtractorInformation.ql index ea6d6fc2d41e..f5bc8b426972 100644 --- a/java/ql/src/Telemetry/ExtractorInformation.ql +++ b/java/ql/src/Telemetry/ExtractorInformation.ql @@ -10,8 +10,6 @@ import java import semmle.code.java.Diagnostics import DatabaseQuality -extensible predicate extractorInformationSkipKey(string key); - predicate compilationInfo(string key, int value) { exists(Compilation c, string infoKey | key = infoKey + ": " + c.getInfo(infoKey) and diff --git a/java/ql/src/Telemetry/ExtractorInformation.yml b/java/ql/src/Telemetry/ExtractorInformation.yml index 74a7f99520b7..18e691a79e99 100644 --- a/java/ql/src/Telemetry/ExtractorInformation.yml +++ b/java/ql/src/Telemetry/ExtractorInformation.yml @@ -1,5 +1,5 @@ extensions: - addsTo: - pack: codeql/java-queries + pack: codeql/java-all extensible: extractorInformationSkipKey data: [] diff --git a/java/ql/src/change-notes/released/1.6.2.md b/java/ql/src/change-notes/released/1.6.2.md new file mode 100644 index 000000000000..bbe3747556fb --- /dev/null +++ b/java/ql/src/change-notes/released/1.6.2.md @@ -0,0 +1,3 @@ +## 1.6.2 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index ef7a789e0cf1..5f5beb68311a 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.1 +lastReleaseVersion: 1.6.2 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 6dd07b9c631c..aa899419ad90 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.6.2-dev +version: 1.6.3-dev groups: - java - queries diff --git a/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.expected index 8fe0abd91c0e..116bde45f980 100644 --- a/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.expected +++ b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStmts.expected @@ -1,8 +1,12 @@ +| Test.kt:3:8:80:1 | Exceptional Exit | 0 | Test.kt:3:8:80:1 | Exceptional Exit | +| Test.kt:3:8:80:1 | Exit | 0 | Test.kt:3:8:80:1 | Exit | | Test.kt:3:8:80:1 | { ... } | 0 | Test.kt:3:8:80:1 | { ... } | | Test.kt:3:8:80:1 | { ... } | 1 | Test.kt:3:1:80:1 | super(...) | | Test.kt:3:8:80:1 | { ... } | 2 | Test.kt:3:8:80:1 | { ... } | -| Test.kt:3:8:80:1 | { ... } | 3 | Test.kt:3:8:80:1 | Exit | +| Test.kt:3:8:80:1 | { ... } | 3 | Test.kt:3:8:80:1 | Normal Exit | +| Test.kt:4:2:79:2 | Exceptional Exit | 0 | Test.kt:4:2:79:2 | Exceptional Exit | | Test.kt:4:2:79:2 | Exit | 0 | Test.kt:4:2:79:2 | Exit | +| Test.kt:4:2:79:2 | Normal Exit | 0 | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:4:13:79:2 | { ... } | 0 | Test.kt:4:13:79:2 | { ... } | | Test.kt:4:13:79:2 | { ... } | 1 | Test.kt:5:7:5:7 | var ...; | | Test.kt:4:13:79:2 | { ... } | 2 | Test.kt:5:16:5:16 | 0 | @@ -102,7 +106,9 @@ | Test.kt:43:3:43:3 | ; | 8 | Test.kt:77:3:77:8 | ...=... | | Test.kt:43:3:43:3 | ; | 9 | Test.kt:78:3:78:8 | INSTANCE | | Test.kt:43:3:43:3 | ; | 10 | Test.kt:78:3:78:8 | return ... | +| Test.kt:82:1:89:1 | Exceptional Exit | 0 | Test.kt:82:1:89:1 | Exceptional Exit | | Test.kt:82:1:89:1 | Exit | 0 | Test.kt:82:1:89:1 | Exit | +| Test.kt:82:1:89:1 | Normal Exit | 0 | Test.kt:82:1:89:1 | Normal Exit | | Test.kt:82:21:89:1 | { ... } | 0 | Test.kt:82:21:89:1 | { ... } | | Test.kt:82:21:89:1 | { ... } | 1 | Test.kt:83:2:88:2 | try ... | | Test.kt:82:21:89:1 | { ... } | 2 | Test.kt:83:6:86:2 | { ... } | @@ -117,7 +123,9 @@ | Test.kt:86:4:88:2 | catch (...) | 2 | Test.kt:86:34:88:2 | { ... } | | Test.kt:86:4:88:2 | catch (...) | 3 | Test.kt:87:10:87:10 | 2 | | Test.kt:86:4:88:2 | catch (...) | 4 | Test.kt:87:3:87:10 | return ... | +| Test.kt:91:1:98:1 | Exceptional Exit | 0 | Test.kt:91:1:98:1 | Exceptional Exit | | Test.kt:91:1:98:1 | Exit | 0 | Test.kt:91:1:98:1 | Exit | +| Test.kt:91:1:98:1 | Normal Exit | 0 | Test.kt:91:1:98:1 | Normal Exit | | Test.kt:91:22:98:1 | { ... } | 0 | Test.kt:91:22:98:1 | { ... } | | Test.kt:91:22:98:1 | { ... } | 1 | Test.kt:92:2:97:2 | try ... | | Test.kt:91:22:98:1 | { ... } | 2 | Test.kt:92:6:95:2 | { ... } | @@ -133,6 +141,7 @@ | Test.kt:95:4:97:2 | catch (...) | 3 | Test.kt:96:10:96:10 | 2 | | Test.kt:95:4:97:2 | catch (...) | 4 | Test.kt:96:3:96:10 | return ... | | Test.kt:100:1:110:1 | Exit | 0 | Test.kt:100:1:110:1 | Exit | +| Test.kt:100:1:110:1 | Normal Exit | 0 | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:100:25:110:1 | { ... } | 0 | Test.kt:100:25:110:1 | { ... } | | Test.kt:100:25:110:1 | { ... } | 1 | Test.kt:101:5:103:5 | ; | | Test.kt:100:25:110:1 | { ... } | 2 | Test.kt:101:5:103:5 | when ... | @@ -147,6 +156,7 @@ | Test.kt:101:33:103:5 | { ... } | 0 | Test.kt:101:33:103:5 | { ... } | | Test.kt:101:33:103:5 | { ... } | 1 | Test.kt:102:15:102:25 | new Exception(...) | | Test.kt:101:33:103:5 | { ... } | 2 | Test.kt:102:9:102:25 | throw ... | +| Test.kt:101:33:103:5 | { ... } | 3 | Test.kt:100:1:110:1 | Exceptional Exit | | Test.kt:105:5:109:5 | ; | 0 | Test.kt:105:5:109:5 | ; | | Test.kt:105:5:109:5 | ; | 1 | Test.kt:105:5:109:5 | when ... | | Test.kt:105:5:109:5 | ; | 2 | Test.kt:105:9:107:5 | ... -> ... | @@ -165,7 +175,9 @@ | Test.kt:107:27:109:5 | { ... } | 1 | Test.kt:108:9:108:29 | ; | | Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:17:108:28 | "y not null" | | Test.kt:107:27:109:5 | { ... } | 3 | Test.kt:108:9:108:29 | println(...) | +| Test.kt:112:1:116:1 | Exceptional Exit | 0 | Test.kt:112:1:116:1 | Exceptional Exit | | Test.kt:112:1:116:1 | Exit | 0 | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:1:116:1 | Normal Exit | 0 | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:112:32:116:1 | { ... } | 0 | Test.kt:112:32:116:1 | { ... } | | Test.kt:112:32:116:1 | { ... } | 1 | Test.kt:113:5:115:5 | ; | | Test.kt:112:32:116:1 | { ... } | 2 | Test.kt:113:5:115:5 | when ... | @@ -174,7 +186,9 @@ | Test.kt:112:32:116:1 | { ... } | 5 | Test.kt:113:9:113:9 | x | | Test.kt:113:14:113:14 | y | 0 | Test.kt:113:14:113:14 | y | | Test.kt:113:17:115:5 | { ... } | 0 | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:1:124:1 | Exceptional Exit | 0 | Test.kt:118:1:124:1 | Exceptional Exit | | Test.kt:118:1:124:1 | Exit | 0 | Test.kt:118:1:124:1 | Exit | +| Test.kt:118:1:124:1 | Normal Exit | 0 | Test.kt:118:1:124:1 | Normal Exit | | Test.kt:118:37:124:1 | { ... } | 0 | Test.kt:118:37:124:1 | { ... } | | Test.kt:118:37:124:1 | { ... } | 1 | Test.kt:119:2:123:12 | ; | | Test.kt:118:37:124:1 | { ... } | 2 | Test.kt:119:2:123:12 | when ... | diff --git a/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.expected index fa358b39a35e..6d0cb2bab712 100644 --- a/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.expected +++ b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbStrictDominance.expected @@ -1,4 +1,7 @@ +| Test.kt:3:8:80:1 | { ... } | Test.kt:3:8:80:1 | Exit | +| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit | | Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Exit | +| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... | | Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | | Test.kt:4:13:79:2 | { ... } | Test.kt:18:3:18:3 | ; | @@ -10,6 +13,7 @@ | Test.kt:4:13:79:2 | { ... } | Test.kt:38:16:41:3 | { ... } | | Test.kt:4:13:79:2 | { ... } | Test.kt:43:3:43:3 | ; | | Test.kt:18:3:18:3 | ; | Test.kt:4:2:79:2 | Exit | +| Test.kt:18:3:18:3 | ; | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ... -> ... | | Test.kt:18:3:18:3 | ; | Test.kt:22:4:22:4 | ; | | Test.kt:18:3:18:3 | ; | Test.kt:30:15:33:3 | { ... } | @@ -27,13 +31,18 @@ | Test.kt:35:3:35:3 | ; | Test.kt:43:3:43:3 | ; | | Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } | | Test.kt:38:9:38:9 | x | Test.kt:43:3:43:3 | ; | +| Test.kt:82:1:89:1 | Normal Exit | Test.kt:82:1:89:1 | Exit | | Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Exit | +| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit | | Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x | | Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit | | Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit | +| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit | | Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x | | Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | | Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit | +| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y | | Test.kt:100:25:110:1 | { ... } | Test.kt:101:33:103:5 | { ... } | | Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | @@ -41,15 +50,20 @@ | Test.kt:100:25:110:1 | { ... } | Test.kt:107:16:109:5 | ... -> ... | | Test.kt:100:25:110:1 | { ... } | Test.kt:107:27:109:5 | { ... } | | Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | | Test.kt:105:5:109:5 | ; | Test.kt:107:16:109:5 | ... -> ... | | Test.kt:105:5:109:5 | ; | Test.kt:107:27:109:5 | { ... } | | Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit | | Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y | | Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } | | Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit | | Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Exit | +| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Normal Exit | | Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | | Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | | Test.kt:118:37:124:1 | { ... } | Test.kt:123:8:123:10 | { ... } | diff --git a/java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.expected index 3768db75d7e8..cf5da7c83b77 100644 --- a/java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.expected +++ b/java/ql/test-kotlin1/library-tests/controlflow/basic/bbSuccessor.expected @@ -1,10 +1,14 @@ +| Test.kt:3:8:80:1 | Exceptional Exit | Test.kt:3:8:80:1 | Exit | +| Test.kt:3:8:80:1 | { ... } | Test.kt:3:8:80:1 | Exit | +| Test.kt:4:2:79:2 | Exceptional Exit | Test.kt:4:2:79:2 | Exit | +| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit | | Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... | | Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | | Test.kt:11:3:16:3 | ... -> ... | Test.kt:18:3:18:3 | ; | | Test.kt:11:14:14:3 | { ... } | Test.kt:18:3:18:3 | ; | | Test.kt:18:3:18:3 | ; | Test.kt:21:3:24:9 | ... -> ... | | Test.kt:18:3:18:3 | ; | Test.kt:22:4:22:4 | ; | -| Test.kt:21:3:24:9 | ... -> ... | Test.kt:4:2:79:2 | Exit | +| Test.kt:21:3:24:9 | ... -> ... | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:22:4:22:4 | ; | Test.kt:30:15:33:3 | { ... } | | Test.kt:22:4:22:4 | ; | Test.kt:35:3:35:3 | ; | | Test.kt:30:15:33:3 | { ... } | Test.kt:35:3:35:3 | ; | @@ -12,15 +16,20 @@ | Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } | | Test.kt:38:9:38:9 | x | Test.kt:43:3:43:3 | ; | | Test.kt:38:16:41:3 | { ... } | Test.kt:38:9:38:9 | x | -| Test.kt:43:3:43:3 | ; | Test.kt:4:2:79:2 | Exit | +| Test.kt:43:3:43:3 | ; | Test.kt:4:2:79:2 | Normal Exit | +| Test.kt:82:1:89:1 | Exceptional Exit | Test.kt:82:1:89:1 | Exit | +| Test.kt:82:1:89:1 | Normal Exit | Test.kt:82:1:89:1 | Exit | | Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x | | Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | -| Test.kt:84:7:84:7 | x | Test.kt:82:1:89:1 | Exit | -| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exit | +| Test.kt:84:7:84:7 | x | Test.kt:82:1:89:1 | Normal Exit | +| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Normal Exit | +| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit | +| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit | | Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x | | Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | -| Test.kt:93:7:93:7 | x | Test.kt:91:1:98:1 | Exit | -| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exit | +| Test.kt:93:7:93:7 | x | Test.kt:91:1:98:1 | Normal Exit | +| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Normal Exit | +| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit | | Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y | | Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | | Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } | @@ -28,18 +37,22 @@ | Test.kt:101:33:103:5 | { ... } | Test.kt:100:1:110:1 | Exit | | Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | | Test.kt:105:5:109:5 | ; | Test.kt:107:16:109:5 | ... -> ... | -| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | Exit | -| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | Exit | +| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit | +| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } | -| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | Exit | -| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Exit | +| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit | +| Test.kt:112:1:116:1 | Exceptional Exit | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y | -| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | Exit | +| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } | -| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | Exit | +| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | Normal Exit | +| Test.kt:118:1:124:1 | Exceptional Exit | Test.kt:118:1:124:1 | Exit | +| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit | | Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | | Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | -| Test.kt:121:9:121:9 | ; | Test.kt:118:1:124:1 | Exit | +| Test.kt:121:9:121:9 | ; | Test.kt:118:1:124:1 | Normal Exit | | Test.kt:121:9:121:9 | ; | Test.kt:123:8:123:10 | { ... } | -| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | Exit | -| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | Exit | +| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | Normal Exit | +| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | Normal Exit | diff --git a/java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.expected index 81142abc1df8..1d07b13c9d75 100644 --- a/java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.expected +++ b/java/ql/test-kotlin1/library-tests/controlflow/basic/getASuccessor.expected @@ -1,9 +1,13 @@ #select | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | Test.kt:3:8:80:1 | { ... } | BlockStmt | +| Test.kt:3:8:80:1 | Exceptional Exit | Constructor | Test.kt:3:8:80:1 | Exit | Constructor | | Test.kt:3:8:80:1 | Exit | Constructor | file://:0:0:0:0 | | | +| Test.kt:3:8:80:1 | Normal Exit | Constructor | Test.kt:3:8:80:1 | Exit | Constructor | | Test.kt:3:8:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | -| Test.kt:3:8:80:1 | { ... } | BlockStmt | Test.kt:3:8:80:1 | Exit | Constructor | +| Test.kt:3:8:80:1 | { ... } | BlockStmt | Test.kt:3:8:80:1 | Normal Exit | Constructor | +| Test.kt:4:2:79:2 | Exceptional Exit | Method | Test.kt:4:2:79:2 | Exit | Method | | Test.kt:4:2:79:2 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:4:2:79:2 | Normal Exit | Method | Test.kt:4:2:79:2 | Exit | Method | | Test.kt:4:13:79:2 | { ... } | BlockStmt | Test.kt:5:7:5:7 | var ...; | LocalVariableDeclStmt | | Test.kt:5:7:5:7 | var ...; | LocalVariableDeclStmt | Test.kt:5:16:5:16 | 0 | IntegerLiteral | | Test.kt:5:7:5:7 | x | LocalVariableDeclExpr | Test.kt:6:7:6:7 | var ...; | LocalVariableDeclStmt | @@ -53,7 +57,7 @@ | Test.kt:22:4:22:9 | ...=... | AssignExpr | Test.kt:27:3:27:3 | ; | ExprStmt | | Test.kt:22:8:22:9 | 40 | LongLiteral | Test.kt:22:4:22:9 | ...=... | AssignExpr | | Test.kt:24:4:24:9 | INSTANCE | VarAccess | Test.kt:24:4:24:9 | return ... | ReturnStmt | -| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Exit | Method | +| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method | | Test.kt:27:3:27:3 | ; | ExprStmt | Test.kt:27:7:27:8 | 10 | IntegerLiteral | | Test.kt:27:3:27:8 | ...=... | AssignExpr | Test.kt:30:3:33:3 | ; | ExprStmt | | Test.kt:27:7:27:8 | 10 | IntegerLiteral | Test.kt:27:3:27:8 | ...=... | AssignExpr | @@ -106,8 +110,10 @@ | Test.kt:77:3:77:8 | ...=... | AssignExpr | Test.kt:78:3:78:8 | INSTANCE | VarAccess | | Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:8 | ...=... | AssignExpr | | Test.kt:78:3:78:8 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt | -| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Exit | Method | +| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method | +| Test.kt:82:1:89:1 | Exceptional Exit | Method | Test.kt:82:1:89:1 | Exit | Method | | Test.kt:82:1:89:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:82:1:89:1 | Normal Exit | Method | Test.kt:82:1:89:1 | Exit | Method | | Test.kt:82:21:89:1 | { ... } | BlockStmt | Test.kt:83:2:88:2 | try ... | TryStmt | | Test.kt:83:2:88:2 | try ... | TryStmt | Test.kt:83:6:86:2 | { ... } | BlockStmt | | Test.kt:83:6:86:2 | { ... } | BlockStmt | Test.kt:84:7:84:7 | var ...; | LocalVariableDeclStmt | @@ -116,14 +122,16 @@ | Test.kt:84:11:84:11 | o | VarAccess | Test.kt:84:11:84:18 | (...)... | CastExpr | | Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:84:7:84:7 | x | LocalVariableDeclExpr | | Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause | -| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Exit | Method | +| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method | | Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt | | Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt | | Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral | -| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Exit | Method | +| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method | | Test.kt:87:10:87:10 | 2 | IntegerLiteral | Test.kt:87:3:87:10 | return ... | ReturnStmt | +| Test.kt:91:1:98:1 | Exceptional Exit | Method | Test.kt:91:1:98:1 | Exit | Method | | Test.kt:91:1:98:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:91:1:98:1 | Normal Exit | Method | Test.kt:91:1:98:1 | Exit | Method | | Test.kt:91:22:98:1 | { ... } | BlockStmt | Test.kt:92:2:97:2 | try ... | TryStmt | | Test.kt:92:2:97:2 | try ... | TryStmt | Test.kt:92:6:95:2 | { ... } | BlockStmt | | Test.kt:92:6:95:2 | { ... } | BlockStmt | Test.kt:93:7:93:7 | var ...; | LocalVariableDeclStmt | @@ -132,14 +140,16 @@ | Test.kt:93:11:93:11 | o | VarAccess | Test.kt:93:12:93:13 | ...!! | NotNullExpr | | Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:93:7:93:7 | x | LocalVariableDeclExpr | | Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause | -| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Exit | Method | +| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method | | Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt | | Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt | | Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral | -| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Exit | Method | +| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method | | Test.kt:96:10:96:10 | 2 | IntegerLiteral | Test.kt:96:3:96:10 | return ... | ReturnStmt | +| Test.kt:100:1:110:1 | Exceptional Exit | Method | Test.kt:100:1:110:1 | Exit | Method | | Test.kt:100:1:110:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:100:1:110:1 | Normal Exit | Method | Test.kt:100:1:110:1 | Exit | Method | | Test.kt:100:25:110:1 | { ... } | BlockStmt | Test.kt:101:5:103:5 | ; | ExprStmt | | Test.kt:101:5:103:5 | ... -> ... | WhenBranch | Test.kt:101:9:101:30 | ... && ... | AndLogicalExpr | | Test.kt:101:5:103:5 | ; | ExprStmt | Test.kt:101:5:103:5 | when ... | WhenExpr | @@ -154,7 +164,7 @@ | Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | Test.kt:105:5:109:5 | ; | ExprStmt | | Test.kt:101:27:101:30 | null | NullLiteral | Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | | Test.kt:101:33:103:5 | { ... } | BlockStmt | Test.kt:102:15:102:25 | new Exception(...) | ClassInstanceExpr | -| Test.kt:102:9:102:25 | throw ... | ThrowStmt | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:102:9:102:25 | throw ... | ThrowStmt | Test.kt:100:1:110:1 | Exceptional Exit | Method | | Test.kt:102:15:102:25 | new Exception(...) | ClassInstanceExpr | Test.kt:102:9:102:25 | throw ... | ThrowStmt | | Test.kt:105:5:109:5 | ; | ExprStmt | Test.kt:105:5:109:5 | when ... | WhenExpr | | Test.kt:105:5:109:5 | when ... | WhenExpr | Test.kt:105:9:107:5 | ... -> ... | WhenBranch | @@ -165,29 +175,33 @@ | Test.kt:105:14:105:17 | null | NullLiteral | Test.kt:105:9:105:17 | ... (value not-equals) ... | ValueNEExpr | | Test.kt:105:20:107:5 | { ... } | BlockStmt | Test.kt:106:9:106:29 | ; | ExprStmt | | Test.kt:106:9:106:29 | ; | ExprStmt | Test.kt:106:17:106:28 | "x not null" | StringLiteral | -| Test.kt:106:9:106:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:106:9:106:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Normal Exit | Method | | Test.kt:106:17:106:28 | "x not null" | StringLiteral | Test.kt:106:9:106:29 | println(...) | MethodCall | | Test.kt:107:16:107:16 | y | VarAccess | Test.kt:107:21:107:24 | null | NullLiteral | -| Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:100:1:110:1 | Normal Exit | Method | | Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:107:27:109:5 | { ... } | BlockStmt | | Test.kt:107:16:109:5 | ... -> ... | WhenBranch | Test.kt:107:16:107:16 | y | VarAccess | | Test.kt:107:21:107:24 | null | NullLiteral | Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | | Test.kt:107:27:109:5 | { ... } | BlockStmt | Test.kt:108:9:108:29 | ; | ExprStmt | | Test.kt:108:9:108:29 | ; | ExprStmt | Test.kt:108:17:108:28 | "y not null" | StringLiteral | -| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Normal Exit | Method | | Test.kt:108:17:108:28 | "y not null" | StringLiteral | Test.kt:108:9:108:29 | println(...) | MethodCall | +| Test.kt:112:1:116:1 | Exceptional Exit | Method | Test.kt:112:1:116:1 | Exit | Method | | Test.kt:112:1:116:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:112:1:116:1 | Normal Exit | Method | Test.kt:112:1:116:1 | Exit | Method | | Test.kt:112:32:116:1 | { ... } | BlockStmt | Test.kt:113:5:115:5 | ; | ExprStmt | | Test.kt:113:5:115:5 | ... -> ... | WhenBranch | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | | Test.kt:113:5:115:5 | ; | ExprStmt | Test.kt:113:5:115:5 | when ... | WhenExpr | | Test.kt:113:5:115:5 | when ... | WhenExpr | Test.kt:113:5:115:5 | ... -> ... | WhenBranch | -| Test.kt:113:9:113:9 | x | VarAccess | Test.kt:112:1:116:1 | Exit | Method | +| Test.kt:113:9:113:9 | x | VarAccess | Test.kt:112:1:116:1 | Normal Exit | Method | | Test.kt:113:9:113:9 | x | VarAccess | Test.kt:113:14:113:14 | y | VarAccess | | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | Test.kt:113:9:113:9 | x | VarAccess | -| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | Exit | Method | +| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | Normal Exit | Method | | Test.kt:113:14:113:14 | y | VarAccess | Test.kt:113:17:115:5 | { ... } | BlockStmt | -| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | Exit | Method | +| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | Normal Exit | Method | +| Test.kt:118:1:124:1 | Exceptional Exit | Method | Test.kt:118:1:124:1 | Exit | Method | | Test.kt:118:1:124:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:118:1:124:1 | Normal Exit | Method | Test.kt:118:1:124:1 | Exit | Method | | Test.kt:118:37:124:1 | { ... } | BlockStmt | Test.kt:119:2:123:12 | ; | ExprStmt | | Test.kt:119:2:123:12 | ; | ExprStmt | Test.kt:119:2:123:12 | when ... | WhenExpr | | Test.kt:119:2:123:12 | when ... | WhenExpr | Test.kt:120:3:123:10 | ... -> ... | WhenBranch | @@ -197,11 +211,11 @@ | Test.kt:121:4:121:4 | x | VarAccess | Test.kt:122:12:122:16 | ... -> ... | WhenBranch | | Test.kt:121:4:121:9 | ... -> ... | WhenBranch | Test.kt:121:4:121:4 | x | VarAccess | | Test.kt:121:9:121:9 | ; | ExprStmt | Test.kt:121:9:121:9 | y | VarAccess | -| Test.kt:121:9:121:9 | y | VarAccess | Test.kt:118:1:124:1 | Exit | Method | +| Test.kt:121:9:121:9 | y | VarAccess | Test.kt:118:1:124:1 | Normal Exit | Method | | Test.kt:121:9:121:9 | y | VarAccess | Test.kt:123:8:123:10 | { ... } | BlockStmt | | Test.kt:122:12:122:16 | ... -> ... | WhenBranch | Test.kt:122:12:122:16 | true | BooleanLiteral | | Test.kt:122:12:122:16 | ; | ExprStmt | Test.kt:122:12:122:16 | false | BooleanLiteral | -| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | Exit | Method | +| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | Normal Exit | Method | | Test.kt:122:12:122:16 | true | BooleanLiteral | Test.kt:122:12:122:16 | ; | ExprStmt | -| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | Exit | Method | +| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | Normal Exit | Method | missingSuccessor diff --git a/java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.expected b/java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.expected index 9971f41a3be2..625fde1c41e5 100644 --- a/java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.expected +++ b/java/ql/test-kotlin1/library-tests/controlflow/basic/strictPostDominance.expected @@ -208,6 +208,12 @@ | Test.kt:101:5:103:5 | ... -> ... | Test.kt:101:5:103:5 | ; | | Test.kt:101:5:103:5 | ; | Test.kt:100:25:110:1 | { ... } | | Test.kt:102:9:102:25 | throw ... | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:100:25:110:1 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:101:5:103:5 | ... -> ... | +| Test.kt:105:5:109:5 | ; | Test.kt:101:5:103:5 | ; | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:100:25:110:1 | { ... } | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:101:5:103:5 | ... -> ... | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:101:5:103:5 | ; | | Test.kt:105:9:107:5 | ... -> ... | Test.kt:105:5:109:5 | ; | | Test.kt:106:9:106:29 | ; | Test.kt:105:20:107:5 | { ... } | | Test.kt:108:9:108:29 | ; | Test.kt:107:27:109:5 | { ... } | diff --git a/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.expected b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.expected index 3eae23451868..31da586d6307 100644 --- a/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.expected +++ b/java/ql/test-kotlin1/library-tests/controlflow/dominance/dominator.expected @@ -44,7 +44,7 @@ | Test.kt:21:3:24:11 | true | Test.kt:24:11:24:11 | z | | Test.kt:21:3:24:11 | when ... | Test.kt:21:3:24:11 | ... -> ... | | Test.kt:21:7:21:7 | x | Test.kt:21:11:21:11 | 0 | -| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | Exit | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | Normal Exit | | Test.kt:21:7:21:11 | ... < ... | Test.kt:21:3:24:11 | ... -> ... | | Test.kt:21:7:21:11 | ... < ... | Test.kt:22:4:22:4 | ; | | Test.kt:21:11:21:11 | 0 | Test.kt:21:7:21:11 | ... < ... | @@ -142,7 +142,7 @@ | Test.kt:92:4:93:9 | ; | Test.kt:92:4:93:9 | when ... | | Test.kt:92:4:93:9 | when ... | Test.kt:92:4:93:9 | ... -> ... | | Test.kt:92:8:92:8 | a | Test.kt:92:13:92:14 | 10 | -| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | Exit | +| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | Normal Exit | | Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:93:5:93:9 | break | | Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:94:4:95:12 | ; | | Test.kt:92:13:92:14 | 10 | Test.kt:92:8:92:14 | ... (value equals) ... | diff --git a/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected b/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected index dfec79078ce8..1153b13c3bf9 100644 --- a/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected +++ b/java/ql/test-kotlin2/library-tests/annotation_classes/PrintAst.expected @@ -169,7 +169,18 @@ def.kt: # 33| 0: [SuperConstructorInvocationStmt] super(...) # 33| 1: [BlockStmt] { ... } # 34| 5: [Class] Y -# 34| 2: [Constructor] Y +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Y +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Y +#-----| 4: (Parameters) +# 34| 0: [Parameter] value +# 34| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Y[] +# 0| 0: [TypeAccess] Y +# 34| 5: [Constructor] Y # 34| 5: [BlockStmt] { ... } # 34| 0: [ExprStmt] ; # 34| 0: [ClassInstanceExpr] new Enum(...) @@ -178,17 +189,6 @@ def.kt: # 34| 0: [NullLiteral] null # 34| 1: [IntegerLiteral] 0 # 34| 1: [BlockStmt] { ... } -# 34| 3: [Method] getEntries -# 34| 3: [TypeAccess] EnumEntries -# 34| 0: [TypeAccess] Y -# 34| 4: [Method] valueOf -# 34| 3: [TypeAccess] Y -#-----| 4: (Parameters) -# 34| 0: [Parameter] value -# 34| 0: [TypeAccess] String -# 34| 5: [Method] values -# 34| 3: [TypeAccess] Y[] -# 34| 0: [TypeAccess] Y # 35| 6: [FieldDeclaration] Y A; # 35| -1: [TypeAccess] Y # 35| 0: [ClassInstanceExpr] new Y(...) diff --git a/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected b/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected index 4abfda927996..6fe2874402f8 100644 --- a/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected +++ b/java/ql/test-kotlin2/library-tests/classes/PrintAst.expected @@ -160,7 +160,18 @@ classes.kt: # 42| -1: [TypeAccess] int # 42| 0: [IntegerLiteral] 3 # 49| 11: [Class] Direction -# 49| 2: [Constructor] Direction +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Direction +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Direction +#-----| 4: (Parameters) +# 49| 0: [Parameter] value +# 49| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Direction[] +# 0| 0: [TypeAccess] Direction +# 49| 5: [Constructor] Direction # 49| 5: [BlockStmt] { ... } # 49| 0: [ExprStmt] ; # 49| 0: [ClassInstanceExpr] new Enum(...) @@ -169,17 +180,6 @@ classes.kt: # 49| 0: [NullLiteral] null # 49| 1: [IntegerLiteral] 0 # 49| 1: [BlockStmt] { ... } -# 49| 3: [Method] getEntries -# 49| 3: [TypeAccess] EnumEntries -# 49| 0: [TypeAccess] Direction -# 49| 4: [Method] valueOf -# 49| 3: [TypeAccess] Direction -#-----| 4: (Parameters) -# 49| 0: [Parameter] value -# 49| 0: [TypeAccess] String -# 49| 5: [Method] values -# 49| 3: [TypeAccess] Direction[] -# 49| 0: [TypeAccess] Direction # 50| 6: [FieldDeclaration] Direction NORTH; # 50| -1: [TypeAccess] Direction # 50| 0: [ClassInstanceExpr] new Direction(...) @@ -197,17 +197,17 @@ classes.kt: # 50| 0: [ClassInstanceExpr] new Direction(...) # 50| -3: [TypeAccess] Direction # 53| 12: [Class] Color -# 53| 2: [Method] getEntries -# 53| 3: [TypeAccess] EnumEntries -# 53| 0: [TypeAccess] Color -# 53| 3: [Method] valueOf -# 53| 3: [TypeAccess] Color +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Color +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Color #-----| 4: (Parameters) # 53| 0: [Parameter] value # 53| 0: [TypeAccess] String -# 53| 4: [Method] values -# 53| 3: [TypeAccess] Color[] -# 53| 0: [TypeAccess] Color +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Color[] +# 0| 0: [TypeAccess] Color # 53| 5: [Constructor] Color #-----| 4: (Parameters) # 53| 0: [Parameter] rgb diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected index c0f86a6ec9be..c66d50a722d1 100644 --- a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStmts.expected @@ -1,8 +1,12 @@ +| Test.kt:3:1:80:1 | Exceptional Exit | 0 | Test.kt:3:1:80:1 | Exceptional Exit | +| Test.kt:3:1:80:1 | Exit | 0 | Test.kt:3:1:80:1 | Exit | | Test.kt:3:1:80:1 | { ... } | 0 | Test.kt:3:1:80:1 | { ... } | | Test.kt:3:1:80:1 | { ... } | 1 | Test.kt:3:1:80:1 | super(...) | | Test.kt:3:1:80:1 | { ... } | 2 | Test.kt:3:1:80:1 | { ... } | -| Test.kt:3:1:80:1 | { ... } | 3 | Test.kt:3:1:80:1 | Exit | +| Test.kt:3:1:80:1 | { ... } | 3 | Test.kt:3:1:80:1 | Normal Exit | +| Test.kt:4:2:79:2 | Exceptional Exit | 0 | Test.kt:4:2:79:2 | Exceptional Exit | | Test.kt:4:2:79:2 | Exit | 0 | Test.kt:4:2:79:2 | Exit | +| Test.kt:4:2:79:2 | Normal Exit | 0 | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:4:13:79:2 | { ... } | 0 | Test.kt:4:13:79:2 | { ... } | | Test.kt:4:13:79:2 | { ... } | 1 | Test.kt:5:3:5:16 | var ...; | | Test.kt:4:13:79:2 | { ... } | 2 | Test.kt:5:16:5:16 | 0 | @@ -102,7 +106,9 @@ | Test.kt:43:3:43:8 | ; | 8 | Test.kt:77:3:77:8 | ...=... | | Test.kt:43:3:43:8 | ; | 9 | Test.kt:78:9:78:9 | INSTANCE | | Test.kt:43:3:43:8 | ; | 10 | Test.kt:78:3:78:8 | return ... | +| Test.kt:82:1:89:1 | Exceptional Exit | 0 | Test.kt:82:1:89:1 | Exceptional Exit | | Test.kt:82:1:89:1 | Exit | 0 | Test.kt:82:1:89:1 | Exit | +| Test.kt:82:1:89:1 | Normal Exit | 0 | Test.kt:82:1:89:1 | Normal Exit | | Test.kt:82:21:89:1 | { ... } | 0 | Test.kt:82:21:89:1 | { ... } | | Test.kt:82:21:89:1 | { ... } | 1 | Test.kt:83:2:88:2 | try ... | | Test.kt:82:21:89:1 | { ... } | 2 | Test.kt:83:6:86:2 | { ... } | @@ -117,7 +123,9 @@ | Test.kt:86:4:88:2 | catch (...) | 2 | Test.kt:86:34:88:2 | { ... } | | Test.kt:86:4:88:2 | catch (...) | 3 | Test.kt:87:10:87:10 | 2 | | Test.kt:86:4:88:2 | catch (...) | 4 | Test.kt:87:3:87:10 | return ... | +| Test.kt:91:1:98:1 | Exceptional Exit | 0 | Test.kt:91:1:98:1 | Exceptional Exit | | Test.kt:91:1:98:1 | Exit | 0 | Test.kt:91:1:98:1 | Exit | +| Test.kt:91:1:98:1 | Normal Exit | 0 | Test.kt:91:1:98:1 | Normal Exit | | Test.kt:91:22:98:1 | { ... } | 0 | Test.kt:91:22:98:1 | { ... } | | Test.kt:91:22:98:1 | { ... } | 1 | Test.kt:92:2:97:2 | try ... | | Test.kt:91:22:98:1 | { ... } | 2 | Test.kt:92:6:95:2 | { ... } | @@ -133,6 +141,7 @@ | Test.kt:95:4:97:2 | catch (...) | 3 | Test.kt:96:10:96:10 | 2 | | Test.kt:95:4:97:2 | catch (...) | 4 | Test.kt:96:3:96:10 | return ... | | Test.kt:100:1:110:1 | Exit | 0 | Test.kt:100:1:110:1 | Exit | +| Test.kt:100:1:110:1 | Normal Exit | 0 | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:100:25:110:1 | { ... } | 0 | Test.kt:100:25:110:1 | { ... } | | Test.kt:100:25:110:1 | { ... } | 1 | Test.kt:101:5:103:5 | ; | | Test.kt:100:25:110:1 | { ... } | 2 | Test.kt:101:5:103:5 | when ... | @@ -147,6 +156,7 @@ | Test.kt:101:33:103:5 | { ... } | 0 | Test.kt:101:33:103:5 | { ... } | | Test.kt:101:33:103:5 | { ... } | 1 | Test.kt:102:15:102:25 | new Exception(...) | | Test.kt:101:33:103:5 | { ... } | 2 | Test.kt:102:9:102:25 | throw ... | +| Test.kt:101:33:103:5 | { ... } | 3 | Test.kt:100:1:110:1 | Exceptional Exit | | Test.kt:105:5:109:5 | ; | 0 | Test.kt:105:5:109:5 | ; | | Test.kt:105:5:109:5 | ; | 1 | Test.kt:105:5:109:5 | when ... | | Test.kt:105:5:109:5 | ; | 2 | Test.kt:105:9:107:5 | ... -> ... | @@ -165,7 +175,9 @@ | Test.kt:107:27:109:5 | { ... } | 1 | Test.kt:108:9:108:29 | ; | | Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:17:108:28 | "y not null" | | Test.kt:107:27:109:5 | { ... } | 3 | Test.kt:108:9:108:29 | println(...) | +| Test.kt:112:1:116:1 | Exceptional Exit | 0 | Test.kt:112:1:116:1 | Exceptional Exit | | Test.kt:112:1:116:1 | Exit | 0 | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:1:116:1 | Normal Exit | 0 | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:112:32:116:1 | { ... } | 0 | Test.kt:112:32:116:1 | { ... } | | Test.kt:112:32:116:1 | { ... } | 1 | Test.kt:113:5:115:5 | ; | | Test.kt:112:32:116:1 | { ... } | 2 | Test.kt:113:5:115:5 | when ... | @@ -174,7 +186,9 @@ | Test.kt:112:32:116:1 | { ... } | 5 | Test.kt:113:9:113:9 | x | | Test.kt:113:14:113:14 | y | 0 | Test.kt:113:14:113:14 | y | | Test.kt:113:17:115:5 | { ... } | 0 | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:1:124:1 | Exceptional Exit | 0 | Test.kt:118:1:124:1 | Exceptional Exit | | Test.kt:118:1:124:1 | Exit | 0 | Test.kt:118:1:124:1 | Exit | +| Test.kt:118:1:124:1 | Normal Exit | 0 | Test.kt:118:1:124:1 | Normal Exit | | Test.kt:118:37:124:1 | { ... } | 0 | Test.kt:118:37:124:1 | { ... } | | Test.kt:118:37:124:1 | { ... } | 1 | Test.kt:119:2:123:12 | ; | | Test.kt:118:37:124:1 | { ... } | 2 | Test.kt:119:2:123:12 | when ... | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected index aa23696bd555..c7e225ecc6f4 100644 --- a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbStrictDominance.expected @@ -1,4 +1,7 @@ +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | Exit | +| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit | | Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Exit | +| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | | Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... | | Test.kt:4:13:79:2 | { ... } | Test.kt:18:3:18:7 | ; | @@ -10,6 +13,7 @@ | Test.kt:4:13:79:2 | { ... } | Test.kt:38:16:41:3 | { ... } | | Test.kt:4:13:79:2 | { ... } | Test.kt:43:3:43:8 | ; | | Test.kt:18:3:18:7 | ; | Test.kt:4:2:79:2 | Exit | +| Test.kt:18:3:18:7 | ; | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:18:3:18:7 | ; | Test.kt:22:4:22:9 | ; | | Test.kt:18:3:18:7 | ; | Test.kt:24:4:24:9 | ... -> ... | | Test.kt:18:3:18:7 | ; | Test.kt:30:15:33:3 | { ... } | @@ -27,13 +31,18 @@ | Test.kt:35:3:35:8 | ; | Test.kt:43:3:43:8 | ; | | Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } | | Test.kt:38:9:38:9 | x | Test.kt:43:3:43:8 | ; | +| Test.kt:82:1:89:1 | Normal Exit | Test.kt:82:1:89:1 | Exit | | Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Exit | +| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit | | Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x | | Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | +| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit | | Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit | +| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit | | Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x | | Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | | Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit | +| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y | | Test.kt:100:25:110:1 | { ... } | Test.kt:101:33:103:5 | { ... } | | Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | @@ -41,15 +50,20 @@ | Test.kt:100:25:110:1 | { ... } | Test.kt:107:16:109:5 | ... -> ... | | Test.kt:100:25:110:1 | { ... } | Test.kt:107:27:109:5 | { ... } | | Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | | Test.kt:105:5:109:5 | ; | Test.kt:107:16:109:5 | ... -> ... | | Test.kt:105:5:109:5 | ; | Test.kt:107:27:109:5 | { ... } | | Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } | +| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit | | Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y | | Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } | | Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } | +| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit | | Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Exit | +| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Normal Exit | | Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | | Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | | Test.kt:118:37:124:1 | { ... } | Test.kt:123:8:123:10 | { ... } | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected index 006bd71a6bac..219779e73dc7 100644 --- a/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/bbSuccessor.expected @@ -1,3 +1,7 @@ +| Test.kt:3:1:80:1 | Exceptional Exit | Test.kt:3:1:80:1 | Exit | +| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | Exit | +| Test.kt:4:2:79:2 | Exceptional Exit | Test.kt:4:2:79:2 | Exit | +| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit | | Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } | | Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... | | Test.kt:11:14:14:3 | { ... } | Test.kt:18:3:18:7 | ; | @@ -6,21 +10,26 @@ | Test.kt:18:3:18:7 | ; | Test.kt:24:4:24:9 | ... -> ... | | Test.kt:22:4:22:9 | ; | Test.kt:30:15:33:3 | { ... } | | Test.kt:22:4:22:9 | ; | Test.kt:35:3:35:8 | ; | -| Test.kt:24:4:24:9 | ... -> ... | Test.kt:4:2:79:2 | Exit | +| Test.kt:24:4:24:9 | ... -> ... | Test.kt:4:2:79:2 | Normal Exit | | Test.kt:30:15:33:3 | { ... } | Test.kt:35:3:35:8 | ; | | Test.kt:35:3:35:8 | ; | Test.kt:38:9:38:9 | x | | Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } | | Test.kt:38:9:38:9 | x | Test.kt:43:3:43:8 | ; | | Test.kt:38:16:41:3 | { ... } | Test.kt:38:9:38:9 | x | -| Test.kt:43:3:43:8 | ; | Test.kt:4:2:79:2 | Exit | +| Test.kt:43:3:43:8 | ; | Test.kt:4:2:79:2 | Normal Exit | +| Test.kt:82:1:89:1 | Exceptional Exit | Test.kt:82:1:89:1 | Exit | +| Test.kt:82:1:89:1 | Normal Exit | Test.kt:82:1:89:1 | Exit | | Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x | | Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) | -| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | Exit | -| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exit | +| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | Normal Exit | +| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Normal Exit | +| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit | +| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit | | Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x | | Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) | -| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | Exit | -| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exit | +| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | Normal Exit | +| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Normal Exit | +| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit | | Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y | | Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | ; | | Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } | @@ -28,18 +37,22 @@ | Test.kt:101:33:103:5 | { ... } | Test.kt:100:1:110:1 | Exit | | Test.kt:105:5:109:5 | ; | Test.kt:105:20:107:5 | { ... } | | Test.kt:105:5:109:5 | ; | Test.kt:107:16:109:5 | ... -> ... | -| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | Exit | -| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | Exit | +| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit | +| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | Normal Exit | | Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } | -| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | Exit | -| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Exit | +| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit | +| Test.kt:112:1:116:1 | Exceptional Exit | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit | +| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y | -| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | Exit | +| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | Normal Exit | | Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } | -| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | Exit | +| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | Normal Exit | +| Test.kt:118:1:124:1 | Exceptional Exit | Test.kt:118:1:124:1 | Exit | +| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit | | Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | ; | | Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... | -| Test.kt:121:9:121:9 | ; | Test.kt:118:1:124:1 | Exit | +| Test.kt:121:9:121:9 | ; | Test.kt:118:1:124:1 | Normal Exit | | Test.kt:121:9:121:9 | ; | Test.kt:123:8:123:10 | { ... } | -| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | Exit | -| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | Exit | +| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | Normal Exit | +| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | Normal Exit | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected index 364b46d429e0..c4be613c5e99 100644 --- a/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/getASuccessor.expected @@ -1,9 +1,13 @@ #select +| Test.kt:3:1:80:1 | Exceptional Exit | Constructor | Test.kt:3:1:80:1 | Exit | Constructor | | Test.kt:3:1:80:1 | Exit | Constructor | file://:0:0:0:0 | | | +| Test.kt:3:1:80:1 | Normal Exit | Constructor | Test.kt:3:1:80:1 | Exit | Constructor | | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | Test.kt:3:1:80:1 | { ... } | BlockStmt | -| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | Exit | Constructor | +| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | Normal Exit | Constructor | | Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | +| Test.kt:4:2:79:2 | Exceptional Exit | Method | Test.kt:4:2:79:2 | Exit | Method | | Test.kt:4:2:79:2 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:4:2:79:2 | Normal Exit | Method | Test.kt:4:2:79:2 | Exit | Method | | Test.kt:4:13:79:2 | { ... } | BlockStmt | Test.kt:5:3:5:16 | var ...; | LocalVariableDeclStmt | | Test.kt:5:3:5:16 | var ...; | LocalVariableDeclStmt | Test.kt:5:16:5:16 | 0 | IntegerLiteral | | Test.kt:5:3:5:16 | x | LocalVariableDeclExpr | Test.kt:6:3:6:18 | var ...; | LocalVariableDeclStmt | @@ -51,7 +55,7 @@ | Test.kt:22:4:22:9 | ; | ExprStmt | Test.kt:22:8:22:9 | 40 | LongLiteral | | Test.kt:22:8:22:9 | 40 | LongLiteral | Test.kt:22:4:22:9 | ...=... | AssignExpr | | Test.kt:24:4:24:9 | ... -> ... | WhenBranch | Test.kt:24:4:24:9 | true | BooleanLiteral | -| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Exit | Method | +| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method | | Test.kt:24:4:24:9 | true | BooleanLiteral | Test.kt:24:10:24:10 | INSTANCE | VarAccess | | Test.kt:24:10:24:10 | INSTANCE | VarAccess | Test.kt:24:4:24:9 | return ... | ReturnStmt | | Test.kt:27:3:27:8 | ...=... | AssignExpr | Test.kt:30:3:33:3 | ; | ExprStmt | @@ -105,9 +109,11 @@ | Test.kt:77:3:77:8 | ...=... | AssignExpr | Test.kt:78:9:78:9 | INSTANCE | VarAccess | | Test.kt:77:3:77:8 | ; | ExprStmt | Test.kt:77:7:77:8 | 40 | IntegerLiteral | | Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:8 | ...=... | AssignExpr | -| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Exit | Method | +| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method | | Test.kt:78:9:78:9 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt | +| Test.kt:82:1:89:1 | Exceptional Exit | Method | Test.kt:82:1:89:1 | Exit | Method | | Test.kt:82:1:89:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:82:1:89:1 | Normal Exit | Method | Test.kt:82:1:89:1 | Exit | Method | | Test.kt:82:21:89:1 | { ... } | BlockStmt | Test.kt:83:2:88:2 | try ... | TryStmt | | Test.kt:83:2:88:2 | try ... | TryStmt | Test.kt:83:6:86:2 | { ... } | BlockStmt | | Test.kt:83:6:86:2 | { ... } | BlockStmt | Test.kt:84:3:84:18 | var ...; | LocalVariableDeclStmt | @@ -116,14 +122,16 @@ | Test.kt:84:11:84:11 | o | VarAccess | Test.kt:84:11:84:18 | (...)... | CastExpr | | Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:84:3:84:18 | x | LocalVariableDeclExpr | | Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause | -| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Exit | Method | +| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method | | Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt | | Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt | | Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral | -| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Exit | Method | +| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method | | Test.kt:87:10:87:10 | 2 | IntegerLiteral | Test.kt:87:3:87:10 | return ... | ReturnStmt | +| Test.kt:91:1:98:1 | Exceptional Exit | Method | Test.kt:91:1:98:1 | Exit | Method | | Test.kt:91:1:98:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:91:1:98:1 | Normal Exit | Method | Test.kt:91:1:98:1 | Exit | Method | | Test.kt:91:22:98:1 | { ... } | BlockStmt | Test.kt:92:2:97:2 | try ... | TryStmt | | Test.kt:92:2:97:2 | try ... | TryStmt | Test.kt:92:6:95:2 | { ... } | BlockStmt | | Test.kt:92:6:95:2 | { ... } | BlockStmt | Test.kt:93:3:93:13 | var ...; | LocalVariableDeclStmt | @@ -132,14 +140,16 @@ | Test.kt:93:11:93:11 | o | VarAccess | Test.kt:93:11:93:13 | ...!! | NotNullExpr | | Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:93:3:93:13 | x | LocalVariableDeclExpr | | Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause | -| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Exit | Method | +| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method | | Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt | | Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt | | Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral | -| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Exit | Method | +| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method | | Test.kt:96:10:96:10 | 2 | IntegerLiteral | Test.kt:96:3:96:10 | return ... | ReturnStmt | +| Test.kt:100:1:110:1 | Exceptional Exit | Method | Test.kt:100:1:110:1 | Exit | Method | | Test.kt:100:1:110:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:100:1:110:1 | Normal Exit | Method | Test.kt:100:1:110:1 | Exit | Method | | Test.kt:100:25:110:1 | { ... } | BlockStmt | Test.kt:101:5:103:5 | ; | ExprStmt | | Test.kt:101:5:103:5 | ; | ExprStmt | Test.kt:101:5:103:5 | when ... | WhenExpr | | Test.kt:101:5:103:5 | when ... | WhenExpr | Test.kt:101:9:103:5 | ... -> ... | WhenBranch | @@ -154,7 +164,7 @@ | Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | Test.kt:105:5:109:5 | ; | ExprStmt | | Test.kt:101:27:101:30 | null | NullLiteral | Test.kt:101:22:101:30 | ... (value equals) ... | ValueEQExpr | | Test.kt:101:33:103:5 | { ... } | BlockStmt | Test.kt:102:15:102:25 | new Exception(...) | ClassInstanceExpr | -| Test.kt:102:9:102:25 | throw ... | ThrowStmt | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:102:9:102:25 | throw ... | ThrowStmt | Test.kt:100:1:110:1 | Exceptional Exit | Method | | Test.kt:102:15:102:25 | new Exception(...) | ClassInstanceExpr | Test.kt:102:9:102:25 | throw ... | ThrowStmt | | Test.kt:105:5:109:5 | ; | ExprStmt | Test.kt:105:5:109:5 | when ... | WhenExpr | | Test.kt:105:5:109:5 | when ... | WhenExpr | Test.kt:105:9:107:5 | ... -> ... | WhenBranch | @@ -165,29 +175,33 @@ | Test.kt:105:14:105:17 | null | NullLiteral | Test.kt:105:9:105:17 | ... (value not-equals) ... | ValueNEExpr | | Test.kt:105:20:107:5 | { ... } | BlockStmt | Test.kt:106:9:106:29 | ; | ExprStmt | | Test.kt:106:9:106:29 | ; | ExprStmt | Test.kt:106:17:106:28 | "x not null" | StringLiteral | -| Test.kt:106:9:106:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:106:9:106:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Normal Exit | Method | | Test.kt:106:17:106:28 | "x not null" | StringLiteral | Test.kt:106:9:106:29 | println(...) | MethodCall | | Test.kt:107:16:107:16 | y | VarAccess | Test.kt:107:21:107:24 | null | NullLiteral | -| Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:100:1:110:1 | Normal Exit | Method | | Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | Test.kt:107:27:109:5 | { ... } | BlockStmt | | Test.kt:107:16:109:5 | ... -> ... | WhenBranch | Test.kt:107:16:107:16 | y | VarAccess | | Test.kt:107:21:107:24 | null | NullLiteral | Test.kt:107:16:107:24 | ... (value not-equals) ... | ValueNEExpr | | Test.kt:107:27:109:5 | { ... } | BlockStmt | Test.kt:108:9:108:29 | ; | ExprStmt | | Test.kt:108:9:108:29 | ; | ExprStmt | Test.kt:108:17:108:28 | "y not null" | StringLiteral | -| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Exit | Method | +| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Normal Exit | Method | | Test.kt:108:17:108:28 | "y not null" | StringLiteral | Test.kt:108:9:108:29 | println(...) | MethodCall | +| Test.kt:112:1:116:1 | Exceptional Exit | Method | Test.kt:112:1:116:1 | Exit | Method | | Test.kt:112:1:116:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:112:1:116:1 | Normal Exit | Method | Test.kt:112:1:116:1 | Exit | Method | | Test.kt:112:32:116:1 | { ... } | BlockStmt | Test.kt:113:5:115:5 | ; | ExprStmt | | Test.kt:113:5:115:5 | ; | ExprStmt | Test.kt:113:5:115:5 | when ... | WhenExpr | | Test.kt:113:5:115:5 | when ... | WhenExpr | Test.kt:113:9:115:5 | ... -> ... | WhenBranch | -| Test.kt:113:9:113:9 | x | VarAccess | Test.kt:112:1:116:1 | Exit | Method | +| Test.kt:113:9:113:9 | x | VarAccess | Test.kt:112:1:116:1 | Normal Exit | Method | | Test.kt:113:9:113:9 | x | VarAccess | Test.kt:113:14:113:14 | y | VarAccess | | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | Test.kt:113:9:113:9 | x | VarAccess | | Test.kt:113:9:115:5 | ... -> ... | WhenBranch | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr | -| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | Exit | Method | +| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | Normal Exit | Method | | Test.kt:113:14:113:14 | y | VarAccess | Test.kt:113:17:115:5 | { ... } | BlockStmt | -| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | Exit | Method | +| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | Normal Exit | Method | +| Test.kt:118:1:124:1 | Exceptional Exit | Method | Test.kt:118:1:124:1 | Exit | Method | | Test.kt:118:1:124:1 | Exit | Method | file://:0:0:0:0 | | | +| Test.kt:118:1:124:1 | Normal Exit | Method | Test.kt:118:1:124:1 | Exit | Method | | Test.kt:118:37:124:1 | { ... } | BlockStmt | Test.kt:119:2:123:12 | ; | ExprStmt | | Test.kt:119:2:123:12 | ; | ExprStmt | Test.kt:119:2:123:12 | when ... | WhenExpr | | Test.kt:119:2:123:12 | when ... | WhenExpr | Test.kt:120:3:123:10 | ... -> ... | WhenBranch | @@ -197,11 +211,11 @@ | Test.kt:121:4:121:4 | x | VarAccess | Test.kt:122:12:122:16 | ... -> ... | WhenBranch | | Test.kt:121:4:121:9 | ... -> ... | WhenBranch | Test.kt:121:4:121:4 | x | VarAccess | | Test.kt:121:9:121:9 | ; | ExprStmt | Test.kt:121:9:121:9 | y | VarAccess | -| Test.kt:121:9:121:9 | y | VarAccess | Test.kt:118:1:124:1 | Exit | Method | +| Test.kt:121:9:121:9 | y | VarAccess | Test.kt:118:1:124:1 | Normal Exit | Method | | Test.kt:121:9:121:9 | y | VarAccess | Test.kt:123:8:123:10 | { ... } | BlockStmt | | Test.kt:122:12:122:16 | ... -> ... | WhenBranch | Test.kt:122:12:122:16 | true | BooleanLiteral | | Test.kt:122:12:122:16 | ; | ExprStmt | Test.kt:122:12:122:16 | false | BooleanLiteral | -| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | Exit | Method | +| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | Normal Exit | Method | | Test.kt:122:12:122:16 | true | BooleanLiteral | Test.kt:122:12:122:16 | ; | ExprStmt | -| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | Exit | Method | +| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | Normal Exit | Method | missingSuccessor diff --git a/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected index 257d82fc1a7f..df70e61a9785 100644 --- a/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected +++ b/java/ql/test-kotlin2/library-tests/controlflow/basic/strictPostDominance.expected @@ -208,6 +208,12 @@ | Test.kt:101:9:103:5 | ... -> ... | Test.kt:100:25:110:1 | { ... } | | Test.kt:101:9:103:5 | ... -> ... | Test.kt:101:5:103:5 | ; | | Test.kt:102:9:102:25 | throw ... | Test.kt:101:33:103:5 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:100:25:110:1 | { ... } | +| Test.kt:105:5:109:5 | ; | Test.kt:101:5:103:5 | ; | +| Test.kt:105:5:109:5 | ; | Test.kt:101:9:103:5 | ... -> ... | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:100:25:110:1 | { ... } | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:101:5:103:5 | ; | +| Test.kt:105:9:107:5 | ... -> ... | Test.kt:101:9:103:5 | ... -> ... | | Test.kt:105:9:107:5 | ... -> ... | Test.kt:105:5:109:5 | ; | | Test.kt:106:9:106:29 | ; | Test.kt:105:20:107:5 | { ... } | | Test.kt:108:9:108:29 | ; | Test.kt:107:27:109:5 | { ... } | diff --git a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected index d5ddea7a98ba..75662bfacd49 100644 --- a/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected +++ b/java/ql/test-kotlin2/library-tests/controlflow/dominance/dominator.expected @@ -41,7 +41,7 @@ | Test.kt:21:3:24:11 | ; | Test.kt:21:3:24:11 | when ... | | Test.kt:21:3:24:11 | when ... | Test.kt:21:7:22:9 | ... -> ... | | Test.kt:21:7:21:7 | x | Test.kt:21:11:21:11 | 0 | -| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | Exit | +| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | Normal Exit | | Test.kt:21:7:21:11 | ... < ... | Test.kt:22:4:22:9 | ; | | Test.kt:21:7:21:11 | ... < ... | Test.kt:24:4:24:11 | ... -> ... | | Test.kt:21:7:22:9 | ... -> ... | Test.kt:21:7:21:7 | x | @@ -141,7 +141,7 @@ | Test.kt:92:4:93:9 | ; | Test.kt:92:4:93:9 | when ... | | Test.kt:92:4:93:9 | when ... | Test.kt:92:8:93:9 | ... -> ... | | Test.kt:92:8:92:8 | a | Test.kt:92:13:92:14 | 10 | -| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | Exit | +| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | Normal Exit | | Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:93:5:93:9 | break | | Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:94:4:95:12 | ; | | Test.kt:92:8:93:9 | ... -> ... | Test.kt:92:8:92:8 | a | diff --git a/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected index 6a4ac3cab31d..78fc858d028e 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/PrintAst.expected @@ -3340,7 +3340,18 @@ exprs.kt: # 154| 0: [SuperConstructorInvocationStmt] super(...) # 154| 1: [BlockStmt] { ... } # 174| 6: [Class] Direction -# 174| 2: [Constructor] Direction +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Direction +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Direction +#-----| 4: (Parameters) +# 174| 0: [Parameter] value +# 174| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Direction[] +# 0| 0: [TypeAccess] Direction +# 174| 5: [Constructor] Direction # 174| 5: [BlockStmt] { ... } # 174| 0: [ExprStmt] ; # 174| 0: [ClassInstanceExpr] new Enum(...) @@ -3349,17 +3360,6 @@ exprs.kt: # 174| 0: [NullLiteral] null # 174| 1: [IntegerLiteral] 0 # 174| 1: [BlockStmt] { ... } -# 174| 3: [Method] getEntries -# 174| 3: [TypeAccess] EnumEntries -# 174| 0: [TypeAccess] Direction -# 174| 4: [Method] valueOf -# 174| 3: [TypeAccess] Direction -#-----| 4: (Parameters) -# 174| 0: [Parameter] value -# 174| 0: [TypeAccess] String -# 174| 5: [Method] values -# 174| 3: [TypeAccess] Direction[] -# 174| 0: [TypeAccess] Direction # 175| 6: [FieldDeclaration] Direction NORTH; # 175| -1: [TypeAccess] Direction # 175| 0: [ClassInstanceExpr] new Direction(...) @@ -3377,17 +3377,17 @@ exprs.kt: # 175| 0: [ClassInstanceExpr] new Direction(...) # 175| -3: [TypeAccess] Direction # 178| 7: [Class] Color -# 178| 2: [Method] getEntries -# 178| 3: [TypeAccess] EnumEntries -# 178| 0: [TypeAccess] Color -# 178| 3: [Method] valueOf -# 178| 3: [TypeAccess] Color +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Color +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Color #-----| 4: (Parameters) # 178| 0: [Parameter] value # 178| 0: [TypeAccess] String -# 178| 4: [Method] values -# 178| 3: [TypeAccess] Color[] -# 178| 0: [TypeAccess] Color +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Color[] +# 0| 0: [TypeAccess] Color # 178| 5: [Constructor] Color #-----| 4: (Parameters) # 178| 0: [Parameter] rgb diff --git a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected index 0acb9c221430..001794509ffb 100644 --- a/java/ql/test-kotlin2/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/exprs/exprs.expected @@ -883,6 +883,16 @@ | delegatedProperties.kt:87:34:87:46 | this | delegatedProperties.kt:87:34:87:46 | invoke | ThisAccess | | delegatedProperties.kt:87:34:87:46 | this | delegatedProperties.kt:87:34:87:46 | invoke | ThisAccess | | delegatedProperties.kt:87:34:87:46 | this | delegatedProperties.kt:87:34:87:46 | invoke | ThisAccess | +| exprs.kt:0:0:0:0 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Color | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Color[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | Direction[] | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | EnumEntries | file://:0:0:0:0 | | TypeAccess | +| exprs.kt:0:0:0:0 | EnumEntries | file://:0:0:0:0 | | TypeAccess | | exprs.kt:4:1:142:1 | int | file://:0:0:0:0 | | TypeAccess | | exprs.kt:4:20:4:25 | int | file://:0:0:0:0 | | TypeAccess | | exprs.kt:4:28:4:33 | int | file://:0:0:0:0 | | TypeAccess | @@ -1461,12 +1471,7 @@ | exprs.kt:170:21:170:21 | 3 | exprs.kt:165:1:172:1 | foo | IntegerLiteral | | exprs.kt:174:1:176:1 | 0 | exprs.kt:174:1:176:1 | Direction | IntegerLiteral | | exprs.kt:174:1:176:1 | Direction | exprs.kt:174:1:176:1 | Direction | TypeAccess | -| exprs.kt:174:1:176:1 | Direction | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:174:1:176:1 | Direction | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:174:1:176:1 | Direction | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:174:1:176:1 | Direction[] | file://:0:0:0:0 | | TypeAccess | | exprs.kt:174:1:176:1 | Enum | exprs.kt:174:1:176:1 | Direction | TypeAccess | -| exprs.kt:174:1:176:1 | EnumEntries | file://:0:0:0:0 | | TypeAccess | | exprs.kt:174:1:176:1 | String | file://:0:0:0:0 | | TypeAccess | | exprs.kt:174:1:176:1 | new Enum(...) | exprs.kt:174:1:176:1 | Direction | ClassInstanceExpr | | exprs.kt:174:1:176:1 | null | exprs.kt:174:1:176:1 | Direction | NullLiteral | @@ -1494,11 +1499,6 @@ | exprs.kt:175:25:175:28 | Direction | file://:0:0:0:0 | | TypeAccess | | exprs.kt:175:25:175:28 | Direction.EAST | exprs.kt:0:0:0:0 | | VarAccess | | exprs.kt:175:25:175:28 | new Direction(...) | exprs.kt:0:0:0:0 | | ClassInstanceExpr | -| exprs.kt:178:1:182:1 | Color | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:178:1:182:1 | Color | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:178:1:182:1 | Color | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:178:1:182:1 | Color[] | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:178:1:182:1 | EnumEntries | file://:0:0:0:0 | | TypeAccess | | exprs.kt:178:1:182:1 | String | file://:0:0:0:0 | | TypeAccess | | exprs.kt:178:17:178:30 | 0 | exprs.kt:178:17:178:30 | Color | IntegerLiteral | | exprs.kt:178:17:178:30 | Color | exprs.kt:178:17:178:30 | Color | TypeAccess | diff --git a/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected index a9cce8a012fb..3a7af6919ed8 100644 --- a/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected +++ b/java/ql/test-kotlin2/library-tests/exprs_typeaccess/PrintAst.expected @@ -73,7 +73,18 @@ A.kt: # 20| 2: [ReturnStmt] return ... # 20| 0: [IntegerLiteral] 5 # 23| 11: [Class] Enu -# 23| 2: [Constructor] Enu +# 0| 2: [Method] getEntries +# 0| 3: [TypeAccess] EnumEntries +# 0| 0: [TypeAccess] Enu +# 0| 3: [Method] valueOf +# 0| 3: [TypeAccess] Enu +#-----| 4: (Parameters) +# 23| 0: [Parameter] value +# 23| 0: [TypeAccess] String +# 0| 4: [Method] values +# 0| 3: [TypeAccess] Enu[] +# 0| 0: [TypeAccess] Enu +# 23| 5: [Constructor] Enu # 23| 5: [BlockStmt] { ... } # 23| 0: [ExprStmt] ; # 23| 0: [ClassInstanceExpr] new Enum(...) @@ -82,17 +93,6 @@ A.kt: # 23| 0: [NullLiteral] null # 23| 1: [IntegerLiteral] 0 # 23| 1: [BlockStmt] { ... } -# 23| 3: [Method] getEntries -# 23| 3: [TypeAccess] EnumEntries -# 23| 0: [TypeAccess] Enu -# 23| 4: [Method] valueOf -# 23| 3: [TypeAccess] Enu -#-----| 4: (Parameters) -# 23| 0: [Parameter] value -# 23| 0: [TypeAccess] String -# 23| 5: [Method] values -# 23| 3: [TypeAccess] Enu[] -# 23| 0: [TypeAccess] Enu # 24| 6: [FieldDeclaration] Enu A; # 24| -1: [TypeAccess] Enu # 24| 0: [ClassInstanceExpr] new Enu(...) diff --git a/java/ql/test-kotlin2/library-tests/methods/exprs.expected b/java/ql/test-kotlin2/library-tests/methods/exprs.expected index 041ef562dfbd..accffb8beff8 100644 --- a/java/ql/test-kotlin2/library-tests/methods/exprs.expected +++ b/java/ql/test-kotlin2/library-tests/methods/exprs.expected @@ -223,11 +223,16 @@ | delegates.kt:10:23:10:25 | old | VarAccess | | delegates.kt:10:26:10:31 | ", now " | StringLiteral | | delegates.kt:10:33:10:35 | new | VarAccess | -| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess | -| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess | -| enumClass.kt:1:1:4:1 | EnumClass | TypeAccess | -| enumClass.kt:1:1:4:1 | EnumClass[] | TypeAccess | -| enumClass.kt:1:1:4:1 | EnumEntries | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumClass[] | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumEntries | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumEntries | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | +| enumClass.kt:0:0:0:0 | EnumWithFunctions[] | TypeAccess | | enumClass.kt:1:1:4:1 | String | TypeAccess | | enumClass.kt:1:21:1:32 | 0 | IntegerLiteral | | enumClass.kt:1:21:1:32 | Enum | TypeAccess | @@ -258,12 +263,7 @@ | enumClass.kt:3:11:3:11 | 1 | IntegerLiteral | | enumClass.kt:6:1:16:1 | 0 | IntegerLiteral | | enumClass.kt:6:1:16:1 | Enum | TypeAccess | -| enumClass.kt:6:1:16:1 | EnumEntries | TypeAccess | | enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess | -| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess | -| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess | -| enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess | -| enumClass.kt:6:1:16:1 | EnumWithFunctions[] | TypeAccess | | enumClass.kt:6:1:16:1 | String | TypeAccess | | enumClass.kt:6:1:16:1 | new Enum(...) | ClassInstanceExpr | | enumClass.kt:6:1:16:1 | null | NullLiteral | diff --git a/java/ql/test-kotlin2/library-tests/methods/methods.expected b/java/ql/test-kotlin2/library-tests/methods/methods.expected index 79f674e4d7c4..94c0d62e20b1 100644 --- a/java/ql/test-kotlin2/library-tests/methods/methods.expected +++ b/java/ql/test-kotlin2/library-tests/methods/methods.expected @@ -26,14 +26,14 @@ methods | delegates.kt:8:35:11:5 | new KMutableProperty1(...) { ... } | delegates.kt:8:35:11:5 | set | set(MyClass,java.lang.String) | override, public | | | delegates.kt:8:66:11:5 | new Function3,String,String,Unit>(...) { ... } | delegates.kt:8:66:11:5 | invoke | invoke(kotlin.reflect.KProperty,java.lang.String,java.lang.String) | final, override, public | | | enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | | () | static | Compiler generated | -| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:1:4:1 | getEntries | getEntries() | final, public, static | Compiler generated | -| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:1:4:1 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | -| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:1:4:1 | values | values() | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | getEntries | getEntries() | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | +| enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:0:0:0:0 | values | values() | final, public, static | Compiler generated | | enumClass.kt:1:1:4:1 | EnumClass | enumClass.kt:1:22:1:31 | getV | getV() | final, public | Compiler generated | | enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | | () | static | Compiler generated | -| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | getEntries | getEntries() | final, public, static | Compiler generated | -| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | -| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | values | values() | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | getEntries | getEntries() | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | valueOf | valueOf(java.lang.String) | final, public, static | Compiler generated | +| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:0:0:0:0 | values | values() | final, public, static | Compiler generated | | enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:13:3:13:29 | f | f(int) | abstract, public | | | enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:14:3:14:29 | g | g(int) | abstract, public | | | enumClass.kt:8:3:11:4 | VAL | enumClass.kt:9:5:9:30 | f | f(int) | override, public | | diff --git a/java/ql/test-kotlin2/library-tests/methods/parameters.expected b/java/ql/test-kotlin2/library-tests/methods/parameters.expected index f0c4ad719468..3e5485f27245 100644 --- a/java/ql/test-kotlin2/library-tests/methods/parameters.expected +++ b/java/ql/test-kotlin2/library-tests/methods/parameters.expected @@ -22,8 +22,8 @@ | delegates.kt:8:66:11:5 | invoke | delegates.kt:9:9:9:12 | prop | 0 | | delegates.kt:8:66:11:5 | invoke | delegates.kt:9:15:9:17 | old | 1 | | delegates.kt:8:66:11:5 | invoke | delegates.kt:9:20:9:22 | new | 2 | -| enumClass.kt:1:1:4:1 | valueOf | enumClass.kt:1:1:4:1 | value | 0 | -| enumClass.kt:6:1:16:1 | valueOf | enumClass.kt:6:1:16:1 | value | 0 | +| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:1:1:4:1 | value | 0 | +| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:6:1:16:1 | value | 0 | | enumClass.kt:9:5:9:30 | f | enumClass.kt:9:20:9:25 | i | 0 | | enumClass.kt:10:5:10:42 | g | enumClass.kt:10:20:10:25 | i | 0 | | enumClass.kt:13:3:13:29 | f | enumClass.kt:13:18:13:23 | i | 0 | diff --git a/java/ql/test/library-tests/controlflow/basic/bbStmts.expected b/java/ql/test/library-tests/controlflow/basic/bbStmts.expected index 0fbf3623f089..df336ce90a22 100644 --- a/java/ql/test/library-tests/controlflow/basic/bbStmts.expected +++ b/java/ql/test/library-tests/controlflow/basic/bbStmts.expected @@ -1,7 +1,11 @@ +| Test.java:3:14:3:17 | Exceptional Exit | 0 | Test.java:3:14:3:17 | Exceptional Exit | +| Test.java:3:14:3:17 | Exit | 0 | Test.java:3:14:3:17 | Exit | | Test.java:3:14:3:17 | { ... } | 0 | Test.java:3:14:3:17 | { ... } | | Test.java:3:14:3:17 | { ... } | 1 | Test.java:3:14:3:17 | super(...) | -| Test.java:3:14:3:17 | { ... } | 2 | Test.java:3:14:3:17 | Exit | +| Test.java:3:14:3:17 | { ... } | 2 | Test.java:3:14:3:17 | Normal Exit | +| Test.java:4:14:4:17 | Exceptional Exit | 0 | Test.java:4:14:4:17 | Exceptional Exit | | Test.java:4:14:4:17 | Exit | 0 | Test.java:4:14:4:17 | Exit | +| Test.java:4:14:4:17 | Normal Exit | 0 | Test.java:4:14:4:17 | Normal Exit | | Test.java:4:21:76:2 | { ... } | 0 | Test.java:4:21:76:2 | { ... } | | Test.java:4:21:76:2 | { ... } | 1 | Test.java:5:3:5:12 | var ...; | | Test.java:4:21:76:2 | { ... } | 2 | Test.java:5:11:5:11 | 0 | diff --git a/java/ql/test/library-tests/controlflow/basic/bbStrictDominance.expected b/java/ql/test/library-tests/controlflow/basic/bbStrictDominance.expected index 8440209d0a45..be658fb29158 100644 --- a/java/ql/test/library-tests/controlflow/basic/bbStrictDominance.expected +++ b/java/ql/test/library-tests/controlflow/basic/bbStrictDominance.expected @@ -1,4 +1,7 @@ +| Test.java:3:14:3:17 | { ... } | Test.java:3:14:3:17 | Exit | +| Test.java:4:14:4:17 | Normal Exit | Test.java:4:14:4:17 | Exit | | Test.java:4:21:76:2 | { ... } | Test.java:4:14:4:17 | Exit | +| Test.java:4:21:76:2 | { ... } | Test.java:4:14:4:17 | Normal Exit | | Test.java:4:21:76:2 | { ... } | Test.java:11:14:14:3 | { ... } | | Test.java:4:21:76:2 | { ... } | Test.java:14:10:16:3 | { ... } | | Test.java:4:21:76:2 | { ... } | Test.java:18:3:18:8 | ; | @@ -21,6 +24,7 @@ | Test.java:4:21:76:2 | { ... } | Test.java:63:9:66:4 | { ... } | | Test.java:4:21:76:2 | { ... } | Test.java:70:3:70:9 | ; | | Test.java:18:3:18:8 | ; | Test.java:4:14:4:17 | Exit | +| Test.java:18:3:18:8 | ; | Test.java:4:14:4:17 | Normal Exit | | Test.java:18:3:18:8 | ; | Test.java:22:4:22:10 | ; | | Test.java:18:3:18:8 | ; | Test.java:24:4:24:10 | return ... | | Test.java:18:3:18:8 | ; | Test.java:30:15:33:3 | { ... } | diff --git a/java/ql/test/library-tests/controlflow/basic/bbSuccessor.expected b/java/ql/test/library-tests/controlflow/basic/bbSuccessor.expected index 0886f784fd9a..a6e5d8430c12 100644 --- a/java/ql/test/library-tests/controlflow/basic/bbSuccessor.expected +++ b/java/ql/test/library-tests/controlflow/basic/bbSuccessor.expected @@ -1,3 +1,7 @@ +| Test.java:3:14:3:17 | Exceptional Exit | Test.java:3:14:3:17 | Exit | +| Test.java:3:14:3:17 | { ... } | Test.java:3:14:3:17 | Exit | +| Test.java:4:14:4:17 | Exceptional Exit | Test.java:4:14:4:17 | Exit | +| Test.java:4:14:4:17 | Normal Exit | Test.java:4:14:4:17 | Exit | | Test.java:4:21:76:2 | { ... } | Test.java:11:14:14:3 | { ... } | | Test.java:4:21:76:2 | { ... } | Test.java:14:10:16:3 | { ... } | | Test.java:11:14:14:3 | { ... } | Test.java:18:3:18:8 | ; | @@ -6,7 +10,7 @@ | Test.java:18:3:18:8 | ; | Test.java:24:4:24:10 | return ... | | Test.java:22:4:22:10 | ; | Test.java:30:15:33:3 | { ... } | | Test.java:22:4:22:10 | ; | Test.java:35:3:35:9 | ; | -| Test.java:24:4:24:10 | return ... | Test.java:4:14:4:17 | Exit | +| Test.java:24:4:24:10 | return ... | Test.java:4:14:4:17 | Normal Exit | | Test.java:30:15:33:3 | { ... } | Test.java:35:3:35:9 | ; | | Test.java:35:3:35:9 | ; | Test.java:38:9:38:9 | x | | Test.java:38:9:38:9 | x | Test.java:38:16:41:3 | { ... } | @@ -27,4 +31,4 @@ | Test.java:57:15:60:5 | { ... } | Test.java:70:3:70:9 | ; | | Test.java:60:12:62:5 | { ... } | Test.java:54:26:54:26 | j | | Test.java:63:9:66:4 | { ... } | Test.java:54:26:54:26 | j | -| Test.java:70:3:70:9 | ; | Test.java:4:14:4:17 | Exit | +| Test.java:70:3:70:9 | ; | Test.java:4:14:4:17 | Normal Exit | diff --git a/java/ql/test/library-tests/controlflow/dominance/dominator.expected b/java/ql/test/library-tests/controlflow/dominance/dominator.expected index de43e6721e64..1e385c4fd62f 100644 --- a/java/ql/test/library-tests/controlflow/dominance/dominator.expected +++ b/java/ql/test/library-tests/controlflow/dominance/dominator.expected @@ -27,7 +27,7 @@ | Test.java:14:18:14:18 | y | Test.java:14:14:14:18 | ... + ... | | Test.java:17:3:17:12 | if (...) | Test.java:17:7:17:7 | x | | Test.java:17:7:17:7 | x | Test.java:17:11:17:11 | 0 | -| Test.java:17:7:17:11 | ... < ... | Test.java:2:6:2:9 | Exit | +| Test.java:17:7:17:11 | ... < ... | Test.java:2:6:2:9 | Normal Exit | | Test.java:17:7:17:11 | ... < ... | Test.java:18:4:18:10 | ; | | Test.java:17:7:17:11 | ... < ... | Test.java:20:11:20:11 | z | | Test.java:17:11:17:11 | 0 | Test.java:17:7:17:11 | ... < ... | @@ -163,7 +163,7 @@ | Test.java:83:9:83:9 | c | Test.java:83:5:83:9 | ...=... | | Test.java:85:4:85:15 | if (...) | Test.java:85:8:85:8 | a | | Test.java:85:8:85:8 | a | Test.java:85:13:85:14 | 10 | -| Test.java:85:8:85:14 | ... == ... | Test.java:74:6:74:10 | Exit | +| Test.java:85:8:85:14 | ... == ... | Test.java:74:6:74:10 | Normal Exit | | Test.java:85:8:85:14 | ... == ... | Test.java:86:5:86:10 | break | | Test.java:85:8:85:14 | ... == ... | Test.java:87:4:87:15 | if (...) | | Test.java:85:13:85:14 | 10 | Test.java:85:8:85:14 | ... == ... | diff --git a/java/ql/test/library-tests/guards/Guards.java b/java/ql/test/library-tests/guards/Guards.java index b75e549d1669..aca64d6f64da 100644 --- a/java/ql/test/library-tests/guards/Guards.java +++ b/java/ql/test/library-tests/guards/Guards.java @@ -143,4 +143,73 @@ void t7(int[] a) { chk(); // $ guarded=found:true guarded='i < a.length:false' } } + + public static boolean testNotNull1(String input) { + return input != null && input.length() > 0; + } + + public static boolean testNotNull2(String input) { + if (input == null) return false; + return input.length() > 0; + } + + public static int getNumOrDefault(Integer number) { + return number == null ? 0 : number; + } + + public static String concatNonNull(String s1, String s2) { + if (s1 == null || s2 == null) return null; + return s1 + s2; + } + + public static Status testEnumWrapper(boolean flag) { + return flag ? Status.SUCCESS : Status.FAILURE; + } + + enum Status { SUCCESS, FAILURE } + + void testWrappers(String s, Integer i) { + if (testNotNull1(s)) { + chk(); // $ guarded='s:not null' guarded=testNotNull1(...):true + } else { + chk(); // $ guarded=testNotNull1(...):false + } + + if (testNotNull2(s)) { + chk(); // $ guarded='s:not null' guarded=testNotNull2(...):true + } else { + chk(); // $ guarded=testNotNull2(...):false + } + + if (0 == getNumOrDefault(i)) { + chk(); // $ guarded='0 == getNumOrDefault(...):true' guarded='getNumOrDefault(...):0' + } else { + chk(); // $ guarded='0 == getNumOrDefault(...):false' guarded='getNumOrDefault(...):not 0' guarded='i:not 0' guarded='i:not null' + } + + if (null == concatNonNull(s, "suffix")) { + chk(); // $ guarded='concatNonNull(...):null' guarded='null == concatNonNull(...):true' + } else { + chk(); // $ guarded='concatNonNull(...):not null' guarded='null == concatNonNull(...):false' guarded='s:not null' + } + + switch (testEnumWrapper(g(1))) { + case SUCCESS: + chk(); // $ guarded='testEnumWrapper(...):SUCCESS' guarded='testEnumWrapper(...):match SUCCESS' guarded=g(1):true + break; + case FAILURE: + chk(); // $ guarded='testEnumWrapper(...):FAILURE' guarded='testEnumWrapper(...):match FAILURE' guarded=g(1):false + break; + } + } + + static void ensureNotNull(Object o) throws Exception { + if (o == null) throw new Exception(); + } + + void testExceptionWrapper(String s) throws Exception { + chk(); // nothing guards here + ensureNotNull(s); + chk(); // $ guarded='ensureNotNull(...):no exception' guarded='s:not null' + } } diff --git a/java/ql/test/library-tests/guards/GuardsInline.expected b/java/ql/test/library-tests/guards/GuardsInline.expected index c45d536b7e9a..a76e2629cde0 100644 --- a/java/ql/test/library-tests/guards/GuardsInline.expected +++ b/java/ql/test/library-tests/guards/GuardsInline.expected @@ -89,3 +89,28 @@ | Guards.java:139:9:139:13 | chk(...) | found:true | | Guards.java:143:7:143:11 | chk(...) | 'i < a.length:false' | | Guards.java:143:7:143:11 | chk(...) | found:true | +| Guards.java:173:7:173:11 | chk(...) | 's:not null' | +| Guards.java:173:7:173:11 | chk(...) | testNotNull1(...):true | +| Guards.java:175:7:175:11 | chk(...) | testNotNull1(...):false | +| Guards.java:179:7:179:11 | chk(...) | 's:not null' | +| Guards.java:179:7:179:11 | chk(...) | testNotNull2(...):true | +| Guards.java:181:7:181:11 | chk(...) | testNotNull2(...):false | +| Guards.java:185:7:185:11 | chk(...) | '0 == getNumOrDefault(...):true' | +| Guards.java:185:7:185:11 | chk(...) | 'getNumOrDefault(...):0' | +| Guards.java:187:7:187:11 | chk(...) | '0 == getNumOrDefault(...):false' | +| Guards.java:187:7:187:11 | chk(...) | 'getNumOrDefault(...):not 0' | +| Guards.java:187:7:187:11 | chk(...) | 'i:not 0' | +| Guards.java:187:7:187:11 | chk(...) | 'i:not null' | +| Guards.java:191:7:191:11 | chk(...) | 'concatNonNull(...):null' | +| Guards.java:191:7:191:11 | chk(...) | 'null == concatNonNull(...):true' | +| Guards.java:193:7:193:11 | chk(...) | 'concatNonNull(...):not null' | +| Guards.java:193:7:193:11 | chk(...) | 'null == concatNonNull(...):false' | +| Guards.java:193:7:193:11 | chk(...) | 's:not null' | +| Guards.java:198:9:198:13 | chk(...) | 'testEnumWrapper(...):SUCCESS' | +| Guards.java:198:9:198:13 | chk(...) | 'testEnumWrapper(...):match SUCCESS' | +| Guards.java:198:9:198:13 | chk(...) | g(1):true | +| Guards.java:201:9:201:13 | chk(...) | 'testEnumWrapper(...):FAILURE' | +| Guards.java:201:9:201:13 | chk(...) | 'testEnumWrapper(...):match FAILURE' | +| Guards.java:201:9:201:13 | chk(...) | g(1):false | +| Guards.java:213:5:213:9 | chk(...) | 'ensureNotNull(...):no exception' | +| Guards.java:213:5:213:9 | chk(...) | 's:not null' | diff --git a/java/ql/test/library-tests/guards/guards.expected b/java/ql/test/library-tests/guards/guards.expected index 2c5bff6233ad..ffe67bc3a323 100644 --- a/java/ql/test/library-tests/guards/guards.expected +++ b/java/ql/test/library-tests/guards/guards.expected @@ -1,3 +1,4 @@ +| Test.java:5:7:5:11 | ... < ... | false | Test.java:3:7:3:10 | Normal Exit | | Test.java:5:7:5:11 | ... < ... | false | Test.java:8:3:8:12 | var ...; | | Test.java:5:7:5:11 | ... < ... | false | Test.java:9:9:9:9 | x | | Test.java:5:7:5:11 | ... < ... | false | Test.java:9:17:22:3 | { ... } | @@ -10,6 +11,7 @@ | Test.java:5:7:5:11 | ... < ... | false | Test.java:18:24:20:4 | { ... } | | Test.java:5:7:5:11 | ... < ... | false | Test.java:21:4:21:7 | ; | | Test.java:5:7:5:11 | ... < ... | true | Test.java:5:14:7:3 | { ... } | +| Test.java:9:9:9:14 | ... >= ... | false | Test.java:3:7:3:10 | Normal Exit | | Test.java:9:9:9:14 | ... >= ... | true | Test.java:9:17:22:3 | { ... } | | Test.java:9:9:9:14 | ... >= ... | true | Test.java:11:5:11:8 | ; | | Test.java:9:9:9:14 | ... >= ... | true | Test.java:12:4:12:14 | if (...) | diff --git a/java/ql/test/library-tests/guards/guardslogic.expected b/java/ql/test/library-tests/guards/guardslogic.expected index 29c11ccd153d..6bf536d3ce1c 100644 --- a/java/ql/test/library-tests/guards/guardslogic.expected +++ b/java/ql/test/library-tests/guards/guardslogic.expected @@ -46,6 +46,11 @@ | Logic.java:36:16:36:21 | g(...) | false | Logic.java:40:5:40:18 | var ...; | | Logic.java:37:9:37:14 | ... > ... | true | Logic.java:37:17:39:5 | { ... } | | Logic.java:44:10:44:10 | b | false | Logic.java:44:33:44:35 | msg | +| Logic.java:44:10:44:10 | b | true | Logic.java:43:23:43:31 | Normal Exit | +| Logic.java:48:5:48:22 | checkTrue(...) | exception | Logic.java:47:23:47:32 | Exceptional Exit | +| Logic.java:48:5:48:22 | checkTrue(...) | no exception | Logic.java:47:23:47:32 | Normal Exit | +| Logic.java:48:15:48:16 | !... | true | Logic.java:47:23:47:32 | Normal Exit | +| Logic.java:48:16:48:16 | b | false | Logic.java:47:23:47:32 | Normal Exit | | Logic.java:52:5:52:29 | checkTrue(...) | no exception | Logic.java:53:5:53:28 | ; | | Logic.java:52:5:52:29 | checkTrue(...) | no exception | Logic.java:54:5:54:15 | if (...) | | Logic.java:52:5:52:29 | checkTrue(...) | no exception | Logic.java:54:17:56:5 | { ... } | @@ -62,3 +67,8 @@ | Logic.java:53:21:53:26 | g(...) | false | Logic.java:57:5:57:18 | var ...; | | Logic.java:54:9:54:14 | ... > ... | true | Logic.java:54:17:56:5 | { ... } | | Logic.java:61:10:61:10 | b | false | Logic.java:61:33:61:35 | msg | +| Logic.java:61:10:61:10 | b | true | Logic.java:60:23:60:31 | Normal Exit | +| Logic.java:65:5:65:22 | checkTrue(...) | exception | Logic.java:64:23:64:32 | Exceptional Exit | +| Logic.java:65:5:65:22 | checkTrue(...) | no exception | Logic.java:64:23:64:32 | Normal Exit | +| Logic.java:65:15:65:16 | !... | true | Logic.java:64:23:64:32 | Normal Exit | +| Logic.java:65:16:65:16 | b | false | Logic.java:64:23:64:32 | Normal Exit | diff --git a/java/ql/test/library-tests/guards/guardspreconditions.expected b/java/ql/test/library-tests/guards/guardspreconditions.expected index 41080a5dab6e..2d4597f0282b 100644 --- a/java/ql/test/library-tests/guards/guardspreconditions.expected +++ b/java/ql/test/library-tests/guards/guardspreconditions.expected @@ -1,20 +1,44 @@ +| Preconditions.java:8:9:8:31 | assertTrue(...) | exception | Preconditions.java:7:10:7:14 | Exceptional Exit | | Preconditions.java:8:9:8:31 | assertTrue(...) | no exception | Preconditions.java:9:9:9:18 | ; | +| Preconditions.java:13:9:13:32 | assertTrue(...) | exception | Preconditions.java:12:10:12:14 | Exceptional Exit | | Preconditions.java:13:9:13:32 | assertTrue(...) | no exception | Preconditions.java:14:9:14:18 | ; | +| Preconditions.java:18:9:18:33 | assertFalse(...) | exception | Preconditions.java:17:10:17:14 | Exceptional Exit | | Preconditions.java:18:9:18:33 | assertFalse(...) | no exception | Preconditions.java:19:9:19:18 | ; | +| Preconditions.java:23:9:23:32 | assertFalse(...) | exception | Preconditions.java:22:10:22:14 | Exceptional Exit | | Preconditions.java:23:9:23:32 | assertFalse(...) | no exception | Preconditions.java:24:9:24:18 | ; | +| Preconditions.java:28:9:28:41 | assertTrue(...) | exception | Preconditions.java:27:10:27:14 | Exceptional Exit | | Preconditions.java:28:9:28:41 | assertTrue(...) | no exception | Preconditions.java:29:9:29:18 | ; | +| Preconditions.java:33:9:33:42 | assertTrue(...) | exception | Preconditions.java:32:10:32:14 | Exceptional Exit | | Preconditions.java:33:9:33:42 | assertTrue(...) | no exception | Preconditions.java:34:9:34:18 | ; | +| Preconditions.java:38:9:38:43 | assertFalse(...) | exception | Preconditions.java:37:10:37:14 | Exceptional Exit | | Preconditions.java:38:9:38:43 | assertFalse(...) | no exception | Preconditions.java:39:9:39:18 | ; | +| Preconditions.java:43:9:43:42 | assertFalse(...) | exception | Preconditions.java:42:10:42:14 | Exceptional Exit | | Preconditions.java:43:9:43:42 | assertFalse(...) | no exception | Preconditions.java:44:9:44:18 | ; | +| Preconditions.java:48:9:48:35 | assertTrue(...) | exception | Preconditions.java:47:10:47:14 | Exceptional Exit | | Preconditions.java:48:9:48:35 | assertTrue(...) | no exception | Preconditions.java:49:9:49:18 | ; | +| Preconditions.java:53:9:53:36 | assertTrue(...) | exception | Preconditions.java:52:10:52:15 | Exceptional Exit | | Preconditions.java:53:9:53:36 | assertTrue(...) | no exception | Preconditions.java:54:9:54:18 | ; | +| Preconditions.java:58:9:58:37 | assertFalse(...) | exception | Preconditions.java:57:10:57:15 | Exceptional Exit | | Preconditions.java:58:9:58:37 | assertFalse(...) | no exception | Preconditions.java:59:9:59:18 | ; | +| Preconditions.java:63:9:63:36 | assertFalse(...) | exception | Preconditions.java:62:10:62:15 | Exceptional Exit | | Preconditions.java:63:9:63:36 | assertFalse(...) | no exception | Preconditions.java:64:9:64:18 | ; | +| Preconditions.java:68:9:68:45 | assertTrue(...) | exception | Preconditions.java:67:10:67:15 | Exceptional Exit | | Preconditions.java:68:9:68:45 | assertTrue(...) | no exception | Preconditions.java:69:9:69:18 | ; | +| Preconditions.java:73:9:73:46 | assertTrue(...) | exception | Preconditions.java:72:10:72:15 | Exceptional Exit | | Preconditions.java:73:9:73:46 | assertTrue(...) | no exception | Preconditions.java:74:9:74:18 | ; | +| Preconditions.java:78:9:78:47 | assertFalse(...) | exception | Preconditions.java:77:10:77:15 | Exceptional Exit | | Preconditions.java:78:9:78:47 | assertFalse(...) | no exception | Preconditions.java:79:9:79:18 | ; | +| Preconditions.java:83:9:83:46 | assertFalse(...) | exception | Preconditions.java:82:10:82:15 | Exceptional Exit | | Preconditions.java:83:9:83:46 | assertFalse(...) | no exception | Preconditions.java:84:9:84:18 | ; | +| Preconditions.java:88:9:88:15 | t(...) | exception | Preconditions.java:87:10:87:15 | Exceptional Exit | | Preconditions.java:88:9:88:15 | t(...) | no exception | Preconditions.java:89:9:89:18 | ; | +| Preconditions.java:93:9:93:16 | t(...) | exception | Preconditions.java:92:10:92:15 | Exceptional Exit | | Preconditions.java:93:9:93:16 | t(...) | no exception | Preconditions.java:94:9:94:18 | ; | +| Preconditions.java:98:9:98:16 | f(...) | exception | Preconditions.java:97:10:97:15 | Exceptional Exit | | Preconditions.java:98:9:98:16 | f(...) | no exception | Preconditions.java:99:9:99:18 | ; | +| Preconditions.java:103:9:103:15 | f(...) | exception | Preconditions.java:102:10:102:15 | Exceptional Exit | | Preconditions.java:103:9:103:15 | f(...) | no exception | Preconditions.java:104:9:104:18 | ; | +| Preconditions.java:108:9:108:46 | assertTrue(...) | exception | Preconditions.java:107:17:107:17 | Exceptional Exit | +| Preconditions.java:108:9:108:46 | assertTrue(...) | no exception | Preconditions.java:107:17:107:17 | Normal Exit | +| Preconditions.java:112:9:112:47 | assertFalse(...) | exception | Preconditions.java:111:17:111:17 | Exceptional Exit | +| Preconditions.java:112:9:112:47 | assertFalse(...) | no exception | Preconditions.java:111:17:111:17 | Normal Exit | diff --git a/java/ql/test/library-tests/java7/MultiCatch/MultiCatchControlFlow.expected b/java/ql/test/library-tests/java7/MultiCatch/MultiCatchControlFlow.expected index a849ab5392d5..d389eb658f5e 100644 --- a/java/ql/test/library-tests/java7/MultiCatch/MultiCatchControlFlow.expected +++ b/java/ql/test/library-tests/java7/MultiCatch/MultiCatchControlFlow.expected @@ -1,4 +1,4 @@ -| MultiCatch.java:6:14:6:23 | super(...) | MultiCatch.java:6:14:6:23 | Exit | +| MultiCatch.java:6:14:6:23 | super(...) | MultiCatch.java:6:14:6:23 | Normal Exit | | MultiCatch.java:6:14:6:23 | { ... } | MultiCatch.java:6:14:6:23 | super(...) | | MultiCatch.java:8:2:20:2 | { ... } | MultiCatch.java:9:3:19:3 | try ... | | MultiCatch.java:9:3:19:3 | try ... | MultiCatch.java:10:3:15:3 | { ... } | @@ -16,7 +16,7 @@ | MultiCatch.java:17:4:17:4 | e | MultiCatch.java:17:4:17:22 | printStackTrace(...) | | MultiCatch.java:17:4:17:22 | printStackTrace(...) | MultiCatch.java:18:10:18:10 | e | | MultiCatch.java:17:4:17:23 | ; | MultiCatch.java:17:4:17:4 | e | -| MultiCatch.java:18:4:18:11 | throw ... | MultiCatch.java:7:14:7:23 | Exit | +| MultiCatch.java:18:4:18:11 | throw ... | MultiCatch.java:7:14:7:23 | Exceptional Exit | | MultiCatch.java:18:10:18:10 | e | MultiCatch.java:18:4:18:11 | throw ... | | MultiCatch.java:23:2:33:2 | { ... } | MultiCatch.java:24:3:32:4 | try ... | | MultiCatch.java:24:3:32:4 | try ... | MultiCatch.java:25:3:31:3 | { ... } | @@ -31,12 +31,12 @@ | MultiCatch.java:28:12:28:12 | c | MultiCatch.java:30:10:30:24 | new Exception(...) | | MultiCatch.java:29:5:29:29 | throw ... | MultiCatch.java:31:5:31:37 | catch (...) | | MultiCatch.java:29:11:29:28 | new SQLException(...) | MultiCatch.java:29:5:29:29 | throw ... | -| MultiCatch.java:30:4:30:25 | throw ... | MultiCatch.java:22:14:22:24 | Exit | +| MultiCatch.java:30:4:30:25 | throw ... | MultiCatch.java:22:14:22:24 | Exceptional Exit | | MultiCatch.java:30:4:30:25 | throw ... | MultiCatch.java:31:5:31:37 | catch (...) | | MultiCatch.java:30:10:30:24 | new Exception(...) | MultiCatch.java:30:4:30:25 | throw ... | | MultiCatch.java:31:5:31:37 | catch (...) | MultiCatch.java:31:36:31:36 | e | | MultiCatch.java:31:36:31:36 | e | MultiCatch.java:32:3:32:4 | { ... } | -| MultiCatch.java:32:3:32:4 | { ... } | MultiCatch.java:22:14:22:24 | Exit | +| MultiCatch.java:32:3:32:4 | { ... } | MultiCatch.java:22:14:22:24 | Normal Exit | | MultiCatch.java:36:2:42:2 | { ... } | MultiCatch.java:37:3:41:4 | try ... | | MultiCatch.java:37:3:41:4 | try ... | MultiCatch.java:38:3:40:3 | { ... } | | MultiCatch.java:38:3:40:3 | { ... } | MultiCatch.java:39:10:39:26 | new IOException(...) | @@ -45,4 +45,4 @@ | MultiCatch.java:39:10:39:26 | new IOException(...) | MultiCatch.java:40:5:40:22 | catch (...) | | MultiCatch.java:40:5:40:22 | catch (...) | MultiCatch.java:40:21:40:21 | e | | MultiCatch.java:40:21:40:21 | e | MultiCatch.java:41:3:41:4 | { ... } | -| MultiCatch.java:41:3:41:4 | { ... } | MultiCatch.java:35:14:35:26 | Exit | +| MultiCatch.java:41:3:41:4 | { ... } | MultiCatch.java:35:14:35:26 | Normal Exit | diff --git a/java/ql/test/library-tests/pattern-instanceof/cfg.expected b/java/ql/test/library-tests/pattern-instanceof/cfg.expected index b6caebd532a6..5ef73c8ac78d 100644 --- a/java/ql/test/library-tests/pattern-instanceof/cfg.expected +++ b/java/ql/test/library-tests/pattern-instanceof/cfg.expected @@ -1,5 +1,9 @@ -| Test.java:1:14:1:17 | super(...) | Test.java:1:14:1:17 | Exit | +| Test.java:1:14:1:17 | Exceptional Exit | Test.java:1:14:1:17 | Exit | +| Test.java:1:14:1:17 | Normal Exit | Test.java:1:14:1:17 | Exit | +| Test.java:1:14:1:17 | super(...) | Test.java:1:14:1:17 | Normal Exit | | Test.java:1:14:1:17 | { ... } | Test.java:1:14:1:17 | super(...) | +| Test.java:3:22:3:25 | Exceptional Exit | Test.java:3:22:3:25 | Exit | +| Test.java:3:22:3:25 | Normal Exit | Test.java:3:22:3:25 | Exit | | Test.java:3:40:20:3 | { ... } | Test.java:5:5:5:34 | var ...; | | Test.java:5:5:5:34 | var ...; | Test.java:5:26:5:33 | source(...) | | Test.java:5:12:5:33 | directTaint | Test.java:6:5:6:36 | var ...; | @@ -29,7 +33,7 @@ | Test.java:11:12:11:12 | s | Test.java:11:7:11:13 | sink(...) | | Test.java:14:5:14:92 | if (...) | Test.java:14:9:14:9 | o | | Test.java:14:9:14:9 | o | Test.java:14:9:14:91 | ...instanceof... | -| Test.java:14:9:14:91 | ...instanceof... | Test.java:3:22:3:25 | Exit | +| Test.java:14:9:14:91 | ...instanceof... | Test.java:3:22:3:25 | Normal Exit | | Test.java:14:9:14:91 | ...instanceof... | Test.java:14:41:14:47 | tainted | | Test.java:14:22:14:91 | Outer(...) | Test.java:14:94:18:5 | { ... } | | Test.java:14:28:14:67 | Inner(...) | Test.java:14:77:14:90 | alsoNotTainted | @@ -43,17 +47,23 @@ | Test.java:16:7:16:22 | sink(...) | Test.java:17:7:17:27 | ; | | Test.java:16:7:16:23 | ; | Test.java:16:12:16:21 | notTainted | | Test.java:16:12:16:21 | notTainted | Test.java:16:7:16:22 | sink(...) | -| Test.java:17:7:17:26 | sink(...) | Test.java:3:22:3:25 | Exit | +| Test.java:17:7:17:26 | sink(...) | Test.java:3:22:3:25 | Normal Exit | | Test.java:17:7:17:27 | ; | Test.java:17:12:17:25 | alsoNotTainted | | Test.java:17:12:17:25 | alsoNotTainted | Test.java:17:7:17:26 | sink(...) | +| Test.java:22:24:22:29 | Exceptional Exit | Test.java:22:24:22:29 | Exit | +| Test.java:22:24:22:29 | Normal Exit | Test.java:22:24:22:29 | Exit | | Test.java:22:33:22:53 | { ... } | Test.java:22:42:22:50 | "tainted" | -| Test.java:22:35:22:51 | return ... | Test.java:22:24:22:29 | Exit | +| Test.java:22:35:22:51 | return ... | Test.java:22:24:22:29 | Normal Exit | | Test.java:22:42:22:50 | "tainted" | Test.java:22:35:22:51 | return ... | -| Test.java:23:40:23:42 | { ... } | Test.java:23:22:23:25 | Exit | +| Test.java:23:22:23:25 | Exceptional Exit | Test.java:23:22:23:25 | Exit | +| Test.java:23:22:23:25 | Normal Exit | Test.java:23:22:23:25 | Exit | +| Test.java:23:40:23:42 | { ... } | Test.java:23:22:23:25 | Normal Exit | | Test.java:27:8:27:12 | ...=... | Test.java:27:8:27:12 | ; | -| Test.java:27:8:27:12 | ...=... | Test.java:27:8:27:12 | Exit | +| Test.java:27:8:27:12 | ...=... | Test.java:27:8:27:12 | Normal Exit | | Test.java:27:8:27:12 | ; | Test.java:27:8:27:12 | this | | Test.java:27:8:27:12 | ; | Test.java:27:8:27:12 | this | +| Test.java:27:8:27:12 | Exceptional Exit | Test.java:27:8:27:12 | Exit | +| Test.java:27:8:27:12 | Normal Exit | Test.java:27:8:27:12 | Exit | | Test.java:27:8:27:12 | i | Test.java:27:8:27:12 | ...=... | | Test.java:27:8:27:12 | otherField | Test.java:27:8:27:12 | ...=... | | Test.java:27:8:27:12 | super(...) | Test.java:27:8:27:12 | ; | @@ -61,9 +71,11 @@ | Test.java:27:8:27:12 | this | Test.java:27:8:27:12 | otherField | | Test.java:27:8:27:12 | { ... } | Test.java:27:8:27:12 | super(...) | | Test.java:28:8:28:12 | ...=... | Test.java:28:8:28:12 | ; | -| Test.java:28:8:28:12 | ...=... | Test.java:28:8:28:12 | Exit | +| Test.java:28:8:28:12 | ...=... | Test.java:28:8:28:12 | Normal Exit | | Test.java:28:8:28:12 | ; | Test.java:28:8:28:12 | this | | Test.java:28:8:28:12 | ; | Test.java:28:8:28:12 | this | +| Test.java:28:8:28:12 | Exceptional Exit | Test.java:28:8:28:12 | Exit | +| Test.java:28:8:28:12 | Normal Exit | Test.java:28:8:28:12 | Exit | | Test.java:28:8:28:12 | nonTaintedField | Test.java:28:8:28:12 | ...=... | | Test.java:28:8:28:12 | super(...) | Test.java:28:8:28:12 | ; | | Test.java:28:8:28:12 | taintedField | Test.java:28:8:28:12 | ...=... | diff --git a/java/ql/test/library-tests/pattern-switch/cfg/test.expected b/java/ql/test/library-tests/pattern-switch/cfg/test.expected index c29059faf33e..f9058bd8f4c2 100644 --- a/java/ql/test/library-tests/pattern-switch/cfg/test.expected +++ b/java/ql/test/library-tests/pattern-switch/cfg/test.expected @@ -1,6 +1,12 @@ -| Exhaustive.java:1:14:1:23 | super(...) | Exhaustive.java:1:14:1:23 | Exit | +| Exhaustive.java:1:14:1:23 | Exceptional Exit | Exhaustive.java:1:14:1:23 | Exit | +| Exhaustive.java:1:14:1:23 | Normal Exit | Exhaustive.java:1:14:1:23 | Exit | +| Exhaustive.java:1:14:1:23 | super(...) | Exhaustive.java:1:14:1:23 | Normal Exit | | Exhaustive.java:1:14:1:23 | { ... } | Exhaustive.java:1:14:1:23 | super(...) | -| Exhaustive.java:3:8:3:8 | super(...) | Exhaustive.java:3:8:3:8 | Exit | +| Exhaustive.java:3:8:3:8 | Exceptional Exit | Exhaustive.java:3:8:3:8 | Exit | +| Exhaustive.java:3:8:3:8 | Exceptional Exit | Exhaustive.java:3:8:3:8 | Exit | +| Exhaustive.java:3:8:3:8 | Normal Exit | Exhaustive.java:3:8:3:8 | Exit | +| Exhaustive.java:3:8:3:8 | Normal Exit | Exhaustive.java:3:8:3:8 | Exit | +| Exhaustive.java:3:8:3:8 | super(...) | Exhaustive.java:3:8:3:8 | Normal Exit | | Exhaustive.java:3:8:3:8 | { ... } | Exhaustive.java:3:8:3:8 | super(...) | | Exhaustive.java:3:8:3:8 | { ... } | Exhaustive.java:3:12:3:12 | ; | | Exhaustive.java:3:12:3:12 | ...=... | Exhaustive.java:3:15:3:15 | ; | @@ -9,13 +15,19 @@ | Exhaustive.java:3:15:3:15 | ...=... | Exhaustive.java:3:18:3:18 | ; | | Exhaustive.java:3:15:3:15 | ; | Exhaustive.java:3:15:3:15 | new E(...) | | Exhaustive.java:3:15:3:15 | new E(...) | Exhaustive.java:3:15:3:15 | ...=... | -| Exhaustive.java:3:18:3:18 | ...=... | Exhaustive.java:3:8:3:8 | Exit | +| Exhaustive.java:3:18:3:18 | ...=... | Exhaustive.java:3:8:3:8 | Normal Exit | | Exhaustive.java:3:18:3:18 | ; | Exhaustive.java:3:18:3:18 | new E(...) | | Exhaustive.java:3:18:3:18 | new E(...) | Exhaustive.java:3:18:3:18 | ...=... | -| Exhaustive.java:5:15:5:15 | super(...) | Exhaustive.java:5:15:5:15 | Exit | +| Exhaustive.java:5:15:5:15 | Exceptional Exit | Exhaustive.java:5:15:5:15 | Exit | +| Exhaustive.java:5:15:5:15 | Normal Exit | Exhaustive.java:5:15:5:15 | Exit | +| Exhaustive.java:5:15:5:15 | super(...) | Exhaustive.java:5:15:5:15 | Normal Exit | | Exhaustive.java:5:15:5:15 | { ... } | Exhaustive.java:5:15:5:15 | super(...) | -| Exhaustive.java:6:15:6:15 | super(...) | Exhaustive.java:6:15:6:15 | Exit | +| Exhaustive.java:6:15:6:15 | Exceptional Exit | Exhaustive.java:6:15:6:15 | Exit | +| Exhaustive.java:6:15:6:15 | Normal Exit | Exhaustive.java:6:15:6:15 | Exit | +| Exhaustive.java:6:15:6:15 | super(...) | Exhaustive.java:6:15:6:15 | Normal Exit | | Exhaustive.java:6:15:6:15 | { ... } | Exhaustive.java:6:15:6:15 | super(...) | +| Exhaustive.java:8:22:8:25 | Exceptional Exit | Exhaustive.java:8:22:8:25 | Exit | +| Exhaustive.java:8:22:8:25 | Normal Exit | Exhaustive.java:8:22:8:25 | Exit | | Exhaustive.java:8:47:35:3 | { ... } | Exhaustive.java:11:5:11:14 | switch (...) | | Exhaustive.java:11:5:11:14 | switch (...) | Exhaustive.java:11:13:11:13 | o | | Exhaustive.java:11:13:11:13 | o | Exhaustive.java:12:7:12:22 | case | @@ -50,11 +62,15 @@ | Exhaustive.java:30:13:30:13 | i | Exhaustive.java:31:7:31:15 | case | | Exhaustive.java:31:7:31:15 | case | Exhaustive.java:31:14:31:14 | | | Exhaustive.java:31:7:31:15 | case | Exhaustive.java:32:7:32:15 | case | -| Exhaustive.java:31:14:31:14 | | Exhaustive.java:8:22:8:25 | Exit | +| Exhaustive.java:31:14:31:14 | | Exhaustive.java:8:22:8:25 | Normal Exit | | Exhaustive.java:32:7:32:15 | case | Exhaustive.java:32:14:32:14 | | -| Exhaustive.java:32:14:32:14 | | Exhaustive.java:8:22:8:25 | Exit | -| Test.java:1:14:1:17 | super(...) | Test.java:1:14:1:17 | Exit | +| Exhaustive.java:32:14:32:14 | | Exhaustive.java:8:22:8:25 | Normal Exit | +| Test.java:1:14:1:17 | Exceptional Exit | Test.java:1:14:1:17 | Exit | +| Test.java:1:14:1:17 | Normal Exit | Test.java:1:14:1:17 | Exit | +| Test.java:1:14:1:17 | super(...) | Test.java:1:14:1:17 | Normal Exit | | Test.java:1:14:1:17 | { ... } | Test.java:1:14:1:17 | super(...) | +| Test.java:3:22:3:25 | Exceptional Exit | Test.java:3:22:3:25 | Exit | +| Test.java:3:22:3:25 | Normal Exit | Test.java:3:22:3:25 | Exit | | Test.java:3:41:134:3 | { ... } | Test.java:5:6:5:19 | switch (...) | | Test.java:5:6:5:19 | switch (...) | Test.java:5:14:5:18 | thing | | Test.java:5:14:5:18 | thing | Test.java:6:8:6:23 | case | @@ -380,11 +396,13 @@ | Test.java:130:8:130:21 | case | Test.java:130:20:130:20 | | | Test.java:130:8:130:21 | case | Test.java:131:8:131:15 | default | | Test.java:130:20:130:20 | | Test.java:131:8:131:15 | default | -| Test.java:131:8:131:15 | default | Test.java:3:22:3:25 | Exit | +| Test.java:131:8:131:15 | default | Test.java:3:22:3:25 | Normal Exit | | Test.java:138:8:138:8 | ...=... | Test.java:138:8:138:8 | ; | -| Test.java:138:8:138:8 | ...=... | Test.java:138:8:138:8 | Exit | +| Test.java:138:8:138:8 | ...=... | Test.java:138:8:138:8 | Normal Exit | | Test.java:138:8:138:8 | ; | Test.java:138:8:138:8 | this | | Test.java:138:8:138:8 | ; | Test.java:138:8:138:8 | this | +| Test.java:138:8:138:8 | Exceptional Exit | Test.java:138:8:138:8 | Exit | +| Test.java:138:8:138:8 | Normal Exit | Test.java:138:8:138:8 | Exit | | Test.java:138:8:138:8 | b | Test.java:138:8:138:8 | ...=... | | Test.java:138:8:138:8 | field3 | Test.java:138:8:138:8 | ...=... | | Test.java:138:8:138:8 | super(...) | Test.java:138:8:138:8 | ; | @@ -392,9 +410,11 @@ | Test.java:138:8:138:8 | this | Test.java:138:8:138:8 | field3 | | Test.java:138:8:138:8 | { ... } | Test.java:138:8:138:8 | super(...) | | Test.java:139:8:139:8 | ...=... | Test.java:139:8:139:8 | ; | -| Test.java:139:8:139:8 | ...=... | Test.java:139:8:139:8 | Exit | +| Test.java:139:8:139:8 | ...=... | Test.java:139:8:139:8 | Normal Exit | | Test.java:139:8:139:8 | ; | Test.java:139:8:139:8 | this | | Test.java:139:8:139:8 | ; | Test.java:139:8:139:8 | this | +| Test.java:139:8:139:8 | Exceptional Exit | Test.java:139:8:139:8 | Exit | +| Test.java:139:8:139:8 | Normal Exit | Test.java:139:8:139:8 | Exit | | Test.java:139:8:139:8 | field1 | Test.java:139:8:139:8 | ...=... | | Test.java:139:8:139:8 | field2 | Test.java:139:8:139:8 | ...=... | | Test.java:139:8:139:8 | super(...) | Test.java:139:8:139:8 | ; | diff --git a/java/ql/test/library-tests/successors/CloseReaderTest/TestSucc.expected b/java/ql/test/library-tests/successors/CloseReaderTest/TestSucc.expected index a6f3820334af..fc529feba134 100644 --- a/java/ql/test/library-tests/successors/CloseReaderTest/TestSucc.expected +++ b/java/ql/test/library-tests/successors/CloseReaderTest/TestSucc.expected @@ -1,5 +1,9 @@ -| CloseReaderTest.java:8:14:8:28 | super(...) | CloseReaderTest.java:8:14:8:28 | Exit | +| CloseReaderTest.java:8:14:8:28 | Exceptional Exit | CloseReaderTest.java:8:14:8:28 | Exit | +| CloseReaderTest.java:8:14:8:28 | Normal Exit | CloseReaderTest.java:8:14:8:28 | Exit | +| CloseReaderTest.java:8:14:8:28 | super(...) | CloseReaderTest.java:8:14:8:28 | Normal Exit | | CloseReaderTest.java:8:14:8:28 | { ... } | CloseReaderTest.java:8:14:8:28 | super(...) | +| CloseReaderTest.java:9:23:9:34 | Exceptional Exit | CloseReaderTest.java:9:23:9:34 | Exit | +| CloseReaderTest.java:9:23:9:34 | Normal Exit | CloseReaderTest.java:9:23:9:34 | Exit | | CloseReaderTest.java:10:2:24:2 | { ... } | CloseReaderTest.java:12:3:13:42 | ; | | CloseReaderTest.java:12:3:12:12 | System.out | CloseReaderTest.java:12:20:12:40 | "Enter password for " | | CloseReaderTest.java:12:3:13:41 | print(...) | CloseReaderTest.java:14:3:14:21 | ; | @@ -19,12 +23,12 @@ | CloseReaderTest.java:16:5:16:13 | System.in | CloseReaderTest.java:15:45:16:14 | new InputStreamReader(...) | | CloseReaderTest.java:17:3:23:3 | try ... | CloseReaderTest.java:18:3:20:3 | { ... } | | CloseReaderTest.java:18:3:20:3 | { ... } | CloseReaderTest.java:19:11:19:15 | stdin | -| CloseReaderTest.java:19:4:19:27 | return ... | CloseReaderTest.java:9:23:9:34 | Exit | +| CloseReaderTest.java:19:4:19:27 | return ... | CloseReaderTest.java:9:23:9:34 | Normal Exit | | CloseReaderTest.java:19:11:19:15 | stdin | CloseReaderTest.java:19:11:19:26 | readLine(...) | | CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:19:4:19:27 | return ... | | CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:20:5:20:26 | catch (...) | | CloseReaderTest.java:20:5:20:26 | catch (...) | CloseReaderTest.java:20:24:20:25 | ex | | CloseReaderTest.java:20:24:20:25 | ex | CloseReaderTest.java:21:3:23:3 | { ... } | | CloseReaderTest.java:21:3:23:3 | { ... } | CloseReaderTest.java:22:11:22:14 | null | -| CloseReaderTest.java:22:4:22:15 | return ... | CloseReaderTest.java:9:23:9:34 | Exit | +| CloseReaderTest.java:22:4:22:15 | return ... | CloseReaderTest.java:9:23:9:34 | Normal Exit | | CloseReaderTest.java:22:11:22:14 | null | CloseReaderTest.java:22:4:22:15 | return ... | diff --git a/java/ql/test/library-tests/successors/LoopVarReadTest/TestSucc.expected b/java/ql/test/library-tests/successors/LoopVarReadTest/TestSucc.expected index dcf2dac3cca1..3566cc8753f2 100644 --- a/java/ql/test/library-tests/successors/LoopVarReadTest/TestSucc.expected +++ b/java/ql/test/library-tests/successors/LoopVarReadTest/TestSucc.expected @@ -1,5 +1,9 @@ -| LoopVarReadTest.java:3:14:3:28 | super(...) | LoopVarReadTest.java:3:14:3:28 | Exit | +| LoopVarReadTest.java:3:14:3:28 | Exceptional Exit | LoopVarReadTest.java:3:14:3:28 | Exit | +| LoopVarReadTest.java:3:14:3:28 | Normal Exit | LoopVarReadTest.java:3:14:3:28 | Exit | +| LoopVarReadTest.java:3:14:3:28 | super(...) | LoopVarReadTest.java:3:14:3:28 | Normal Exit | | LoopVarReadTest.java:3:14:3:28 | { ... } | LoopVarReadTest.java:3:14:3:28 | super(...) | +| LoopVarReadTest.java:4:21:4:28 | Exceptional Exit | LoopVarReadTest.java:4:21:4:28 | Exit | +| LoopVarReadTest.java:4:21:4:28 | Normal Exit | LoopVarReadTest.java:4:21:4:28 | Exit | | LoopVarReadTest.java:5:2:15:2 | { ... } | LoopVarReadTest.java:6:3:6:12 | var ...; | | LoopVarReadTest.java:6:3:6:12 | var ...; | LoopVarReadTest.java:6:11:6:11 | 2 | | LoopVarReadTest.java:6:7:6:11 | x | LoopVarReadTest.java:7:3:7:33 | for (...;...;...) | @@ -23,6 +27,6 @@ | LoopVarReadTest.java:12:7:12:12 | q | LoopVarReadTest.java:14:3:14:28 | ; | | LoopVarReadTest.java:12:11:12:12 | 10 | LoopVarReadTest.java:12:7:12:12 | q | | LoopVarReadTest.java:14:3:14:12 | System.out | LoopVarReadTest.java:14:22:14:26 | "foo" | -| LoopVarReadTest.java:14:3:14:27 | println(...) | LoopVarReadTest.java:4:21:4:28 | Exit | +| LoopVarReadTest.java:14:3:14:27 | println(...) | LoopVarReadTest.java:4:21:4:28 | Normal Exit | | LoopVarReadTest.java:14:3:14:28 | ; | LoopVarReadTest.java:14:3:14:12 | System.out | | LoopVarReadTest.java:14:22:14:26 | "foo" | LoopVarReadTest.java:14:3:14:27 | println(...) | diff --git a/java/ql/test/library-tests/successors/SaveFileTest/TestSucc.expected b/java/ql/test/library-tests/successors/SaveFileTest/TestSucc.expected index 3c261f67ee15..640e731147f9 100644 --- a/java/ql/test/library-tests/successors/SaveFileTest/TestSucc.expected +++ b/java/ql/test/library-tests/successors/SaveFileTest/TestSucc.expected @@ -1,5 +1,9 @@ -| SaveFileTest.java:11:14:11:25 | super(...) | SaveFileTest.java:11:14:11:25 | Exit | +| SaveFileTest.java:11:14:11:25 | Exceptional Exit | SaveFileTest.java:11:14:11:25 | Exit | +| SaveFileTest.java:11:14:11:25 | Normal Exit | SaveFileTest.java:11:14:11:25 | Exit | +| SaveFileTest.java:11:14:11:25 | super(...) | SaveFileTest.java:11:14:11:25 | Normal Exit | | SaveFileTest.java:11:14:11:25 | { ... } | SaveFileTest.java:11:14:11:25 | super(...) | +| SaveFileTest.java:12:14:12:21 | Exceptional Exit | SaveFileTest.java:12:14:12:21 | Exit | +| SaveFileTest.java:12:14:12:21 | Normal Exit | SaveFileTest.java:12:14:12:21 | Exit | | SaveFileTest.java:15:2:55:2 | { ... } | SaveFileTest.java:17:3:17:25 | var ...; | | SaveFileTest.java:17:3:17:25 | var ...; | SaveFileTest.java:17:21:17:24 | path | | SaveFileTest.java:17:10:17:24 | savePath | SaveFileTest.java:18:3:18:27 | if (...) | @@ -95,9 +99,11 @@ | SaveFileTest.java:48:5:48:15 | flush(...) | SaveFileTest.java:50:6:50:30 | catch (...) | | SaveFileTest.java:48:5:48:16 | ; | SaveFileTest.java:48:5:48:7 | bos | | SaveFileTest.java:49:5:49:7 | bos | SaveFileTest.java:49:5:49:15 | close(...) | -| SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:12:14:12:21 | Exit | +| SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:12:14:12:21 | Exceptional Exit | +| SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:12:14:12:21 | Normal Exit | | SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:50:6:50:30 | catch (...) | | SaveFileTest.java:49:5:49:16 | ; | SaveFileTest.java:49:5:49:7 | bos | | SaveFileTest.java:50:6:50:30 | catch (...) | SaveFileTest.java:50:23:50:29 | ignored | | SaveFileTest.java:50:23:50:29 | ignored | SaveFileTest.java:51:4:52:4 | { ... } | -| SaveFileTest.java:51:4:52:4 | { ... } | SaveFileTest.java:12:14:12:21 | Exit | +| SaveFileTest.java:51:4:52:4 | { ... } | SaveFileTest.java:12:14:12:21 | Exceptional Exit | +| SaveFileTest.java:51:4:52:4 | { ... } | SaveFileTest.java:12:14:12:21 | Normal Exit | diff --git a/java/ql/test/library-tests/successors/SchackTest/TestSucc.expected b/java/ql/test/library-tests/successors/SchackTest/TestSucc.expected index c645abe35072..a23f6a2bc54e 100644 --- a/java/ql/test/library-tests/successors/SchackTest/TestSucc.expected +++ b/java/ql/test/library-tests/successors/SchackTest/TestSucc.expected @@ -1,9 +1,17 @@ -| SchackTest.java:1:14:1:23 | super(...) | SchackTest.java:1:14:1:23 | Exit | +| SchackTest.java:1:14:1:23 | Exceptional Exit | SchackTest.java:1:14:1:23 | Exit | +| SchackTest.java:1:14:1:23 | Normal Exit | SchackTest.java:1:14:1:23 | Exit | +| SchackTest.java:1:14:1:23 | super(...) | SchackTest.java:1:14:1:23 | Normal Exit | | SchackTest.java:1:14:1:23 | { ... } | SchackTest.java:1:14:1:23 | super(...) | -| SchackTest.java:2:8:2:10 | super(...) | SchackTest.java:2:8:2:10 | Exit | +| SchackTest.java:2:8:2:10 | Exceptional Exit | SchackTest.java:2:8:2:10 | Exit | +| SchackTest.java:2:8:2:10 | Normal Exit | SchackTest.java:2:8:2:10 | Exit | +| SchackTest.java:2:8:2:10 | super(...) | SchackTest.java:2:8:2:10 | Normal Exit | | SchackTest.java:2:8:2:10 | { ... } | SchackTest.java:2:8:2:10 | super(...) | -| SchackTest.java:3:8:3:10 | super(...) | SchackTest.java:3:8:3:10 | Exit | +| SchackTest.java:3:8:3:10 | Exceptional Exit | SchackTest.java:3:8:3:10 | Exit | +| SchackTest.java:3:8:3:10 | Normal Exit | SchackTest.java:3:8:3:10 | Exit | +| SchackTest.java:3:8:3:10 | super(...) | SchackTest.java:3:8:3:10 | Normal Exit | | SchackTest.java:3:8:3:10 | { ... } | SchackTest.java:3:8:3:10 | super(...) | +| SchackTest.java:5:7:5:9 | Exceptional Exit | SchackTest.java:5:7:5:9 | Exit | +| SchackTest.java:5:7:5:9 | Normal Exit | SchackTest.java:5:7:5:9 | Exit | | SchackTest.java:5:18:24:2 | { ... } | SchackTest.java:6:3:23:3 | try ... | | SchackTest.java:6:3:23:3 | try ... | SchackTest.java:6:7:17:3 | { ... } | | SchackTest.java:6:7:17:3 | { ... } | SchackTest.java:7:4:15:4 | try ... | @@ -56,18 +64,21 @@ | SchackTest.java:20:23:20:72 | "successor (but neither true nor false successor)" | SchackTest.java:20:4:20:73 | println(...) | | SchackTest.java:21:13:23:3 | { ... } | SchackTest.java:22:4:22:41 | ; | | SchackTest.java:22:4:22:13 | System.out | SchackTest.java:22:23:22:39 | "false successor" | -| SchackTest.java:22:4:22:40 | println(...) | SchackTest.java:5:7:5:9 | Exit | +| SchackTest.java:22:4:22:40 | println(...) | SchackTest.java:5:7:5:9 | Exceptional Exit | +| SchackTest.java:22:4:22:40 | println(...) | SchackTest.java:5:7:5:9 | Normal Exit | | SchackTest.java:22:4:22:41 | ; | SchackTest.java:22:4:22:13 | System.out | | SchackTest.java:22:23:22:39 | "false successor" | SchackTest.java:22:4:22:40 | println(...) | +| SchackTest.java:26:18:26:20 | Exceptional Exit | SchackTest.java:26:18:26:20 | Exit | +| SchackTest.java:26:18:26:20 | Normal Exit | SchackTest.java:26:18:26:20 | Exit | | SchackTest.java:26:35:30:2 | { ... } | SchackTest.java:27:3:27:25 | if (...) | | SchackTest.java:27:3:27:25 | if (...) | SchackTest.java:27:7:27:19 | random(...) | | SchackTest.java:27:7:27:19 | random(...) | SchackTest.java:27:23:27:24 | .5 | | SchackTest.java:27:7:27:24 | ... > ... | SchackTest.java:28:10:28:18 | new ExB(...) | | SchackTest.java:27:7:27:24 | ... > ... | SchackTest.java:29:10:29:22 | random(...) | | SchackTest.java:27:23:27:24 | .5 | SchackTest.java:27:7:27:24 | ... > ... | -| SchackTest.java:28:4:28:19 | throw ... | SchackTest.java:26:18:26:20 | Exit | +| SchackTest.java:28:4:28:19 | throw ... | SchackTest.java:26:18:26:20 | Exceptional Exit | | SchackTest.java:28:10:28:18 | new ExB(...) | SchackTest.java:28:4:28:19 | throw ... | -| SchackTest.java:29:3:29:28 | return ... | SchackTest.java:26:18:26:20 | Exit | +| SchackTest.java:29:3:29:28 | return ... | SchackTest.java:26:18:26:20 | Normal Exit | | SchackTest.java:29:10:29:22 | random(...) | SchackTest.java:29:26:29:27 | .3 | | SchackTest.java:29:10:29:27 | ... > ... | SchackTest.java:29:3:29:28 | return ... | | SchackTest.java:29:26:29:27 | .3 | SchackTest.java:29:10:29:27 | ... > ... | diff --git a/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected b/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected index 8dac71ffd45d..3fc266a0928c 100644 --- a/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected +++ b/java/ql/test/library-tests/successors/TestBreak/TestSucc.expected @@ -1,5 +1,9 @@ -| TestBreak.java:3:14:3:22 | super(...) | TestBreak.java:3:14:3:22 | Exit | +| TestBreak.java:3:14:3:22 | Exceptional Exit | TestBreak.java:3:14:3:22 | Exit | +| TestBreak.java:3:14:3:22 | Normal Exit | TestBreak.java:3:14:3:22 | Exit | +| TestBreak.java:3:14:3:22 | super(...) | TestBreak.java:3:14:3:22 | Normal Exit | | TestBreak.java:3:14:3:22 | { ... } | TestBreak.java:3:14:3:22 | super(...) | +| TestBreak.java:4:14:4:14 | Exceptional Exit | TestBreak.java:4:14:4:14 | Exit | +| TestBreak.java:4:14:4:14 | Normal Exit | TestBreak.java:4:14:4:14 | Exit | | TestBreak.java:5:2:85:2 | { ... } | TestBreak.java:7:3:8:11 |
  • Python Language Reference: The try statement, -Exceptions.
  • +
  • Python Language Reference: The try statement, +Exceptions.
  • M. Lutz, Learning Python, Section 35.3: Exception Design Tips and Gotchas, O'Reilly Media, 2013.
  • -
  • Python Tutorial: Errors and Exceptions.
  • +
  • Python Tutorial: Errors and Exceptions.
  • diff --git a/python/ql/src/Exceptions/EmptyExcept.qhelp b/python/ql/src/Exceptions/EmptyExcept.qhelp index 9b7ef09643fb..f968c65af196 100644 --- a/python/ql/src/Exceptions/EmptyExcept.qhelp +++ b/python/ql/src/Exceptions/EmptyExcept.qhelp @@ -7,7 +7,7 @@ The loss of information can lead to hard to debug errors and incomplete log files. It is even possible that ignoring an exception can cause a security vulnerability. An empty except block may be an indication that the programmer intended to -handle the exception but never wrote the code to do so.

    +handle the exception, but never wrote the code to do so.

    @@ -15,7 +15,7 @@ handle the exception but never wrote the code to do so.

    -

    In this example the program keeps running with the same privileges if it fails to drop to lower +

    In this example, the program keeps running with the same privileges if it fails to drop to lower privileges.

    diff --git a/python/ql/src/Exceptions/NotImplementedIsNotAnException.qhelp b/python/ql/src/Exceptions/NotImplementedIsNotAnException.qhelp index 3bf09bbfab07..a7930a8d2c21 100644 --- a/python/ql/src/Exceptions/NotImplementedIsNotAnException.qhelp +++ b/python/ql/src/Exceptions/NotImplementedIsNotAnException.qhelp @@ -4,25 +4,25 @@ -

    NotImplemented is not an Exception, but is often mistakenly used in place of NotImplementedError. -Executing raise NotImplemented or raise NotImplemented() will raise a TypeError. -When raise NotImplemented is used to mark code that is genuinely never called, this mistake is benign. - -However, should it be called, then a TypeError will be raised rather than the expected NotImplemented, -which might make debugging the issue difficult. +

    +The constant NotImplemented is not an Exception, but is often confused for NotImplementedError. +If it is used as an exception, such as in raise NotImplemented or raise NotImplemented("message"), +a TypeError will be raised rather than the expected NotImplemented. This may make debugging more difficult.

    -

    The correct use of NotImplemented is to implement binary operators. +

    NotImplemented should only be used as a special return value for implementing special methods such as __lt__. Code that is not intended to be called should raise NotImplementedError.

    -

    Replace uses of NotImplemented with NotImplementedError.

    +

    If a NotImplementedError is intended to be raised, replace the use of NotImplemented +with that. If NotImplemented is intended to be returned rather than raised, replace the raise with return NotImplemented. +

    -In the example below, the method wrong will incorrectly raise a TypeError when called. +In the following example, the method wrong will incorrectly raise a TypeError when called. The method right will raise a NotImplementedError.

    @@ -34,6 +34,7 @@ The method right will raise a NotImplementedError.
  • Python Language Reference: The NotImplementedError exception.
  • +
  • Python Language Reference: The NotImplemented constant.
  • Python Language Reference: Emulating numeric types.
  • diff --git a/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql b/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql index 80dcd6f0dbea..36bf992b51a7 100644 --- a/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql +++ b/python/ql/src/Exceptions/NotImplementedIsNotAnException.ql @@ -1,6 +1,6 @@ /** - * @name NotImplemented is not an Exception - * @description Using 'NotImplemented' as an exception will result in a type error. + * @name Raising `NotImplemented` + * @description Using `NotImplemented` as an exception will result in a type error. * @kind problem * @problem.severity warning * @sub-severity high @@ -12,8 +12,17 @@ */ import python -import Exceptions.NotImplemented +import semmle.python.ApiGraphs + +predicate raiseNotImplemented(Raise raise, Expr notImpl) { + exists(API::Node n | n = API::builtin("NotImplemented") | + notImpl = n.getACall().asExpr() + or + n.asSource().flowsTo(DataFlow::exprNode(notImpl)) + ) and + notImpl = raise.getException() +} from Expr notimpl -where use_of_not_implemented_in_raise(_, notimpl) +where raiseNotImplemented(_, notimpl) select notimpl, "NotImplemented is not an Exception. Did you mean NotImplementedError?" diff --git a/python/ql/src/Expressions/CallToSuperWrongClass.qhelp b/python/ql/src/Expressions/CallToSuperWrongClass.qhelp index dc88b1bea88c..7a2516329f4a 100644 --- a/python/ql/src/Expressions/CallToSuperWrongClass.qhelp +++ b/python/ql/src/Expressions/CallToSuperWrongClass.qhelp @@ -24,7 +24,7 @@ However, this may result in incorrect object initialization if the enclosing cla

    -In this example the call to super(Vehicle, self) in Car.__init__ is incorrect as it +In this example, the call to super(Vehicle, self) in Car.__init__ is incorrect, as it passes Vehicle rather than Car as the first argument to super. As a result, super(SportsCar, self).__init__() in the SportsCar.__init__ method will not call all __init__() methods because the call to super(Vehicle, self).__init__() @@ -37,7 +37,7 @@ skips StatusSymbol.__init__(). -

  • Python Standard Library: super.
  • +
  • Python Standard Library: super.
  • Artima Developer: Things to Know About Python Super.
  • diff --git a/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.py b/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.py index 14804d313005..ea051fcd1530 100644 --- a/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.py +++ b/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.py @@ -1,2 +1,2 @@ -dictionary = {1:"a", 2:"b", 2:"c"} -print dictionary[2] \ No newline at end of file +dictionary = {1:"a", 2:"b", 2:"c"} # BAD: The `2` key is duplicated. +print(dictionary[2]) \ No newline at end of file diff --git a/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.qhelp b/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.qhelp index 19c4df9a5581..3aeea4b954c3 100644 --- a/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.qhelp +++ b/python/ql/src/Expressions/DuplicateKeyInDictionaryLiteral.qhelp @@ -4,8 +4,8 @@

    Dictionary literals are constructed in the order given in the source. -This means that if a key is duplicated the second key-value pair will overwrite -the first as a dictionary can only have one value per key. +This means that if a key is duplicated, the second key-value pair will overwrite +the first; as a dictionary can only have one value per key.

    @@ -15,14 +15,14 @@ If they are then decide which value is wanted and delete the other one.

    -

    This example will output "c" because the mapping between 2 and "b" is overwritten by the -mapping from 2 to "c". The programmer may have meant to map 3 to "c" instead.

    +

    The following example will output "c", because the mapping between 2 and "b" is overwritten by the +mapping from 2 to "c". The programmer may have meant to map 3 to "c" instead.

    -
  • Python: Dictionary literals.
  • +
  • Python: Dictionary literals.
  • diff --git a/python/ql/src/Expressions/ExplicitCallToDel.qhelp b/python/ql/src/Expressions/ExplicitCallToDel.qhelp index 9ec18b46918e..3e6b79c929f8 100644 --- a/python/ql/src/Expressions/ExplicitCallToDel.qhelp +++ b/python/ql/src/Expressions/ExplicitCallToDel.qhelp @@ -17,7 +17,7 @@ wrap the use of the object in a with statement. -

    In the first example, rather than close the zip file in a conventional manner the programmer has called __del__. +

    In the first example, rather than close the zip file in a conventional manner, the programmer has called __del__. A safer alternative is shown in the second example.

    diff --git a/python/ql/src/Expressions/IncorrectComparisonUsingIs.qhelp b/python/ql/src/Expressions/IncorrectComparisonUsingIs.qhelp index b8c25fa04a24..b1df1e8b8b7c 100644 --- a/python/ql/src/Expressions/IncorrectComparisonUsingIs.qhelp +++ b/python/ql/src/Expressions/IncorrectComparisonUsingIs.qhelp @@ -37,7 +37,7 @@ either of the alternatives below.
    -
  • Python Standard Library: Comparisons.
  • +
  • Python Standard Library: Comparisons.
  • diff --git a/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql b/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql index 6eda4abbde21..fa0ca14669f6 100644 --- a/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql +++ b/python/ql/src/Expressions/IncorrectComparisonUsingIs.ql @@ -1,6 +1,6 @@ /** * @name Comparison using is when operands support `__eq__` - * @description Comparison using 'is' when equivalence is not the same as identity + * @description Comparison using `is` when equivalence is not the same as identity * @kind problem * @tags quality * reliability diff --git a/python/ql/src/Expressions/UnsupportedFormatCharacter.qhelp b/python/ql/src/Expressions/UnsupportedFormatCharacter.qhelp index b22d59a209c5..ae2f30afcb38 100644 --- a/python/ql/src/Expressions/UnsupportedFormatCharacter.qhelp +++ b/python/ql/src/Expressions/UnsupportedFormatCharacter.qhelp @@ -3,18 +3,19 @@ "qhelp.dtd"> -

    A format string, that is the string on the left hand side of an expression like fmt % arguments, must consist of legal conversion specifiers. +

    A printf-style format string (i.e. a string that is used as the left hand side of the % operator, such as fmt % arguments) +must consist of valid conversion specifiers, such as %s, %d, etc. Otherwise, a ValueError will be raised.

    -

    Choose a legal conversion specifier.

    +

    Ensure a valid conversion specifier is used.

    -

    In format_as_tuple_incorrect, "t" is not a legal conversion specifier. +

    In the following example, format_as_tuple_incorrect, %t is not a valid conversion specifier.

    @@ -22,7 +23,7 @@ Otherwise, a ValueError will be raised.
    -
  • Python Library Reference: String Formatting.
  • +
  • Python Library Reference: printf-style String Formatting.
  • diff --git a/python/ql/src/Functions/ConsistentReturns.qhelp b/python/ql/src/Functions/ConsistentReturns.qhelp index cd29062ada66..62162a2c1c48 100644 --- a/python/ql/src/Functions/ConsistentReturns.qhelp +++ b/python/ql/src/Functions/ConsistentReturns.qhelp @@ -6,7 +6,7 @@

    When a function contains both explicit returns (return value) and implicit returns -(where code falls off the end of a function) this often indicates that a return +(where code falls off the end of a function), this often indicates that a return statement has been forgotten. It is best to return an explicit return value even when returning None because this makes it easier for other developers to read your code.

    @@ -29,7 +29,7 @@ return value of None as this equates to False. However
    -
  • Python Language Reference: Function definitions. +
  • Python Language Reference: Function definitions.
  • diff --git a/python/ql/src/Functions/ConsistentReturns.ql b/python/ql/src/Functions/ConsistentReturns.ql index a1b308514562..1bc7b5724b36 100644 --- a/python/ql/src/Functions/ConsistentReturns.ql +++ b/python/ql/src/Functions/ConsistentReturns.ql @@ -1,6 +1,6 @@ /** * @name Explicit returns mixed with implicit (fall through) returns - * @description Mixing implicit and explicit returns indicates a likely error as implicit returns always return 'None'. + * @description Mixing implicit and explicit returns indicates a likely error as implicit returns always return `None`. * @kind problem * @tags quality * reliability @@ -31,4 +31,4 @@ predicate has_implicit_return(Function func) { from Function func where explicitly_returns_non_none(func) and has_implicit_return(func) select func, - "Mixing implicit and explicit returns may indicate an error as implicit returns always return None." + "Mixing implicit and explicit returns may indicate an error, as implicit returns always return None." diff --git a/python/ql/src/Functions/InitIsGenerator.qhelp b/python/ql/src/Functions/InitIsGenerator.qhelp index 113e444d1f39..d1144815c7fc 100644 --- a/python/ql/src/Functions/InitIsGenerator.qhelp +++ b/python/ql/src/Functions/InitIsGenerator.qhelp @@ -22,7 +22,7 @@ not logical in the context of an initializer.

    -
  • Python: The __init__ method.
  • +
  • Python: The __init__ method.
  • diff --git a/python/ql/src/Functions/ModificationOfParameterWithDefault.qhelp b/python/ql/src/Functions/ModificationOfParameterWithDefault.qhelp index 39bb484f8917..12714a68364d 100644 --- a/python/ql/src/Functions/ModificationOfParameterWithDefault.qhelp +++ b/python/ql/src/Functions/ModificationOfParameterWithDefault.qhelp @@ -37,7 +37,7 @@ function with a default of default=None, check if the parameter is
  • Effbot: Default Parameter Values in Python.
  • -
  • Python Language Reference: Function definitions.
  • +
  • Python Language Reference: Function definitions.
  • diff --git a/python/ql/src/change-notes/released/1.6.2.md b/python/ql/src/change-notes/released/1.6.2.md new file mode 100644 index 000000000000..bbe3747556fb --- /dev/null +++ b/python/ql/src/change-notes/released/1.6.2.md @@ -0,0 +1,3 @@ +## 1.6.2 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index ef7a789e0cf1..5f5beb68311a 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.1 +lastReleaseVersion: 1.6.2 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index eceeb93529f9..0605e37a7ccf 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.6.2-dev +version: 1.6.3-dev groups: - python - queries diff --git a/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected b/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected index c9fa73e7c127..7c5ee490b4e6 100644 --- a/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected +++ b/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected @@ -1,2 +1,2 @@ | exceptions_test.py:170:11:170:24 | NotImplemented | NotImplemented is not an Exception. Did you mean NotImplementedError? | -| exceptions_test.py:173:11:173:24 | NotImplemented | NotImplemented is not an Exception. Did you mean NotImplementedError? | +| exceptions_test.py:173:11:173:26 | NotImplemented() | NotImplemented is not an Exception. Did you mean NotImplementedError? | diff --git a/python/ql/test/query-tests/Functions/return_values/ConsistentReturns.expected b/python/ql/test/query-tests/Functions/return_values/ConsistentReturns.expected index 1bb6a25860be..302a327a1444 100644 --- a/python/ql/test/query-tests/Functions/return_values/ConsistentReturns.expected +++ b/python/ql/test/query-tests/Functions/return_values/ConsistentReturns.expected @@ -1,4 +1,4 @@ -| functions_test.py:18:1:18:11 | Function cr1 | Mixing implicit and explicit returns may indicate an error as implicit returns always return None. | -| functions_test.py:22:1:22:11 | Function cr2 | Mixing implicit and explicit returns may indicate an error as implicit returns always return None. | -| functions_test.py:336:1:336:16 | Function ok_match | Mixing implicit and explicit returns may indicate an error as implicit returns always return None. | -| functions_test.py:344:1:344:17 | Function ok_match2 | Mixing implicit and explicit returns may indicate an error as implicit returns always return None. | +| functions_test.py:18:1:18:11 | Function cr1 | Mixing implicit and explicit returns may indicate an error, as implicit returns always return None. | +| functions_test.py:22:1:22:11 | Function cr2 | Mixing implicit and explicit returns may indicate an error, as implicit returns always return None. | +| functions_test.py:336:1:336:16 | Function ok_match | Mixing implicit and explicit returns may indicate an error, as implicit returns always return None. | +| functions_test.py:344:1:344:17 | Function ok_match2 | Mixing implicit and explicit returns may indicate an error, as implicit returns always return None. | diff --git a/ql/ql/src/codeql/files/FileSystem.qll b/ql/ql/src/codeql/files/FileSystem.qll index 52174250af0c..74224e50c5f2 100644 --- a/ql/ql/src/codeql/files/FileSystem.qll +++ b/ql/ql/src/codeql/files/FileSystem.qll @@ -63,3 +63,8 @@ class File extends Container, Impl::File { /** Holds if this file was extracted from ordinary source code. */ predicate fromSource() { any() } } + +/** A test file. */ +class TestFile extends File { + TestFile() { this.getRelativePath().matches("%/" + ["experimental", "examples", "test"] + "/%") } +} diff --git a/ql/ql/src/codeql_ql/ast/Ast.qll b/ql/ql/src/codeql_ql/ast/Ast.qll index 325e2f54743c..a124632ae89f 100644 --- a/ql/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/ql/src/codeql_ql/ast/Ast.qll @@ -202,25 +202,43 @@ class QueryDoc extends QLDoc { override string getAPrimaryQlClass() { result = "QueryDoc" } - /** Gets the @kind for the query */ + /** Gets the @kind for the query. */ string getQueryKind() { result = this.getContents().regexpCapture("(?s).*@kind ([\\w-]+)\\s.*", 1) } - /** Gets the @name for the query */ + /** Gets the @name for the query. */ string getQueryName() { result = this.getContents().regexpCapture("(?s).*@name (.+?)(?=\\n).*", 1) } - /** Gets the id part (without language) of the @id */ + /** Gets the id part (without language) of the @id. */ string getQueryId() { result = this.getContents().regexpCapture("(?s).*@id (\\w+)/([\\w\\-/]+)\\s.*", 2) } - /** Gets the language of the @id */ + /** Gets the language of the @id. */ string getQueryLanguage() { result = this.getContents().regexpCapture("(?s).*@id (\\w+)/([\\w\\-/]+)\\s.*", 1) } + + /** Gets the @precision for the query. */ + string getQueryPrecision() { + result = this.getContents().regexpCapture("(?s).*@precision ([\\w\\-]+)\\s.*", 1) + } + + /** Gets the @security-severity for the query. */ + string getQuerySecuritySeverity() { + result = this.getContents().regexpCapture("(?s).*@security\\-severity ([\\d\\.]+)\\s.*", 1) + } + + /** Gets the individual @tags for the query, if any. */ + string getAQueryTag() { + exists(string tags | tags = this.getContents().regexpCapture("(?s).*@tags ([^@]+)", 1) | + result = tags.splitAt("*").trim() and + result.regexpMatch("[\\w\\s\\-]+") + ) + } } class BlockComment extends TBlockComment, Comment { diff --git a/ql/ql/src/queries/style/MissingQualityMetadata.ql b/ql/ql/src/queries/style/MissingQualityMetadata.ql new file mode 100644 index 000000000000..88c877186340 --- /dev/null +++ b/ql/ql/src/queries/style/MissingQualityMetadata.ql @@ -0,0 +1,52 @@ +/** + * @name Missing quality metadata + * @description Quality queries should have exactly one top-level category and if sub-categories are used, the appropriate top-level category should be used. + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/missing-quality-metadata + * @tags correctness + */ + +import ql + +private predicate hasQualityTag(QueryDoc doc) { doc.getAQueryTag() = "quality" } + +private predicate correctTopLevelCategorisation(QueryDoc doc) { + strictcount(string s | s = doc.getAQueryTag() and s = ["maintainability", "reliability"]) = 1 +} + +private predicate reliabilitySubCategory(QueryDoc doc) { + doc.getAQueryTag() = ["correctness", "performance", "concurrency", "error-handling"] +} + +private predicate maintainabilitySubCategory(QueryDoc doc) { + doc.getAQueryTag() = ["readability", "useless-code", "complexity"] +} + +from TopLevel t, QueryDoc doc, string msg +where + doc = t.getQLDoc() and + not t.getLocation().getFile() instanceof TestFile and + hasQualityTag(doc) and + ( + not correctTopLevelCategorisation(doc) and + msg = + "This query file has incorrect top-level categorisation. It should have exactly one top-level category, either `@tags maintainability` or `@tags reliability`." + or + correctTopLevelCategorisation(doc) and + ( + doc.getAQueryTag() = "reliability" and + not reliabilitySubCategory(doc) and + maintainabilitySubCategory(doc) and + msg = + "This query file has a sub-category of maintainability but has the `@tags reliability` tag." + or + doc.getAQueryTag() = "maintainability" and + not maintainabilitySubCategory(doc) and + reliabilitySubCategory(doc) and + msg = + "This query file has a sub-category of reliability but has the `@tags maintainability` tag." + ) + ) +select doc, msg diff --git a/ql/ql/src/queries/style/MissingSecurityMetadata.ql b/ql/ql/src/queries/style/MissingSecurityMetadata.ql index 10f50fb3f990..5ab2cd98bbe5 100644 --- a/ql/ql/src/queries/style/MissingSecurityMetadata.ql +++ b/ql/ql/src/queries/style/MissingSecurityMetadata.ql @@ -1,6 +1,6 @@ /** * @name Missing security metadata - * @description Security queries should have both a `@tag security` and a `@security-severity` tag. + * @description Security queries should have both a `@tags security` and a `@security-severity` tag. * @kind problem * @problem.severity warning * @precision very-high @@ -10,45 +10,26 @@ import ql -predicate missingSecuritySeverity(QLDoc doc) { - exists(string s | s = doc.getContents() | - exists(string securityTag | securityTag = s.splitAt("@") | - securityTag.matches("tags%security%") - ) and - exists(string precisionTag | precisionTag = s.splitAt("@") | - precisionTag.matches("precision %") - ) and - not exists(string securitySeverity | securitySeverity = s.splitAt("@") | - securitySeverity.matches("security-severity %") - ) - ) +predicate missingSecuritySeverity(QueryDoc doc) { + doc.getAQueryTag() = "security" and + exists(doc.getQueryPrecision()) and + not exists(doc.getQuerySecuritySeverity()) } -predicate missingSecurityTag(QLDoc doc) { - exists(string s | s = doc.getContents() | - exists(string securitySeverity | securitySeverity = s.splitAt("@") | - securitySeverity.matches("security-severity %") - ) and - exists(string precisionTag | precisionTag = s.splitAt("@") | - precisionTag.matches("precision %") - ) and - not exists(string securityTag | securityTag = s.splitAt("@") | - securityTag.matches("tags%security%") - ) - ) +predicate missingSecurityTag(QueryDoc doc) { + exists(doc.getQuerySecuritySeverity()) and + exists(doc.getQueryPrecision()) and + not doc.getAQueryTag() = "security" } -from TopLevel t, string msg +from TopLevel t, QueryDoc doc, string msg where - t.getLocation().getFile().getBaseName().matches("%.ql") and - not t.getLocation() - .getFile() - .getRelativePath() - .matches("%/" + ["experimental", "examples", "test"] + "/%") and + doc = t.getQLDoc() and + not t.getLocation().getFile() instanceof TestFile and ( - missingSecuritySeverity(t.getQLDoc()) and + missingSecuritySeverity(doc) and msg = "This query file is missing a `@security-severity` tag." or - missingSecurityTag(t.getQLDoc()) and msg = "This query file is missing a `@tag security`." + missingSecurityTag(doc) and msg = "This query file is missing a `@tags security`." ) -select t, msg +select doc, msg diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/MissingQualityMetadata.expected b/ql/ql/test/queries/style/MissingQualityMetadata/MissingQualityMetadata.expected new file mode 100644 index 000000000000..7904870bdf64 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/MissingQualityMetadata.expected @@ -0,0 +1,4 @@ +| testcases/BadQualityMaintainabilityWrongToplevel.ql:1:1:11:3 | QueryDoc | This query file has a sub-category of reliability but has the `@tags maintainability` tag. | +| testcases/BadQualityMultipleTopLevel.ql:1:1:11:3 | QueryDoc | This query file has incorrect top-level categorisation. It should have exactly one top-level category, either `@tags maintainability` or `@tags reliability`. | +| testcases/BadQualityNoToplevel.ql:1:1:10:3 | QueryDoc | This query file has incorrect top-level categorisation. It should have exactly one top-level category, either `@tags maintainability` or `@tags reliability`. | +| testcases/BadQualityReliabilityWrongToplevel.ql:1:1:11:3 | QueryDoc | This query file has a sub-category of maintainability but has the `@tags reliability` tag. | diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/MissingQualityMetadata.qlref b/ql/ql/test/queries/style/MissingQualityMetadata/MissingQualityMetadata.qlref new file mode 100644 index 000000000000..6d7eb26bedeb --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/MissingQualityMetadata.qlref @@ -0,0 +1 @@ +queries/style/MissingQualityMetadata.ql diff --git a/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMaintainabilityWrongToplevel.expected similarity index 100% rename from java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.expected rename to ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMaintainabilityWrongToplevel.expected diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMaintainabilityWrongToplevel.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMaintainabilityWrongToplevel.ql new file mode 100644 index 000000000000..3dd18771f959 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMaintainabilityWrongToplevel.ql @@ -0,0 +1,17 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * maintainability + * error-handling + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMultipleTopLevel.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMultipleTopLevel.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMultipleTopLevel.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMultipleTopLevel.ql new file mode 100644 index 000000000000..a9a7b48b76c7 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityMultipleTopLevel.ql @@ -0,0 +1,17 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * maintainability + * reliability + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityNoToplevel.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityNoToplevel.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityNoToplevel.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityNoToplevel.ql new file mode 100644 index 000000000000..ad2ab5c1fb57 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityNoToplevel.ql @@ -0,0 +1,16 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * someothertag + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityReliabilityWrongToplevel.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityReliabilityWrongToplevel.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityReliabilityWrongToplevel.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityReliabilityWrongToplevel.ql new file mode 100644 index 000000000000..53e84fb8a196 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/BadQualityReliabilityWrongToplevel.ql @@ -0,0 +1,17 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * reliability + * readability + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodNotQuality.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodNotQuality.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodNotQuality.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodNotQuality.ql new file mode 100644 index 000000000000..60b722918317 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodNotQuality.ql @@ -0,0 +1,16 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @security-severity 10.0 + * @precision very-high + * @id ql/quality-query-test + * @tags security + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainability.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainability.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainability.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainability.ql new file mode 100644 index 000000000000..9e152b90d458 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainability.ql @@ -0,0 +1,17 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @security-severity 10.0 + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * maintainability + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithCrossSub.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithCrossSub.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithCrossSub.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithCrossSub.ql new file mode 100644 index 000000000000..fe1f511abfff --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithCrossSub.ql @@ -0,0 +1,18 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * maintainability + * readability + * correctness + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithSub.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithSub.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithSub.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithSub.ql new file mode 100644 index 000000000000..7d70c8564033 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityMaintainabilityWithSub.ql @@ -0,0 +1,17 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * maintainability + * readability + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliability.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliability.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliability.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliability.ql new file mode 100644 index 000000000000..f3979922b0d8 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliability.ql @@ -0,0 +1,16 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * reliability + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithCrossSub.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithCrossSub.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithCrossSub.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithCrossSub.ql new file mode 100644 index 000000000000..78594e8f9c3c --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithCrossSub.ql @@ -0,0 +1,18 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * reliability + * correctness + * readability + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithSub.expected b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithSub.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithSub.ql b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithSub.ql new file mode 100644 index 000000000000..ec9c4136e862 --- /dev/null +++ b/ql/ql/test/queries/style/MissingQualityMetadata/testcases/GoodQualityReliabilityWithSub.ql @@ -0,0 +1,17 @@ +/** + * @name Some query + * @description Some description + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/quality-query-test + * @tags quality + * reliability + * correctness + */ + +import ql + +from Class c +where none() +select c, "" diff --git a/ql/ql/test/queries/style/MissingSecurityMetadata/MissingSecurityMetadata.expected b/ql/ql/test/queries/style/MissingSecurityMetadata/MissingSecurityMetadata.expected index 28421838ae37..bc241f3f0b4f 100644 --- a/ql/ql/test/queries/style/MissingSecurityMetadata/MissingSecurityMetadata.expected +++ b/ql/ql/test/queries/style/MissingSecurityMetadata/MissingSecurityMetadata.expected @@ -1,2 +1,2 @@ -| testcases/BadNoSecurity.ql:1:1:16:9 | TopLevel | This query file is missing a `@tag security`. | -| testcases/BadNoSeverity.ql:1:1:16:9 | TopLevel | This query file is missing a `@security-severity` tag. | +| testcases/BadNoSecurity.ql:1:1:10:3 | QueryDoc | This query file is missing a `@tags security`. | +| testcases/BadNoSeverity.ql:1:1:10:3 | QueryDoc | This query file is missing a `@security-severity` tag. | diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 758a1cb1ebde..185be6d23bc7 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,6 +1,14 @@ -## 4.1.10 +## 5.0.1 -No user-facing changes. +### Minor Analysis Improvements + +* The regular expressions in `SensitiveDataHeuristics.qll` have been extended to find more instances of sensitive data such as secrets used in authentication, finance and health information, and device data. The heuristics have also been refined to find fewer false positive matches. This will improve results for queries related to sensitive information. + +## 5.0.0 + +### Breaking Changes + +* Most classes and predicates in the AST, SSA, and control-flow-graph libraries are now annotated with `overlay[local]`, in preparation for incremental analysis. This could result in compiler errors for custom queries if they extend these classes. To mitigate such errors, look for ways to restructure custom QL code so it doesn't depend on changing the behavior of standard-library classes. ## 4.1.9 diff --git a/ruby/ql/lib/change-notes/2025-07-09-overlay-local.md b/ruby/ql/lib/change-notes/released/5.0.0.md similarity index 92% rename from ruby/ql/lib/change-notes/2025-07-09-overlay-local.md rename to ruby/ql/lib/change-notes/released/5.0.0.md index f1c7fe83a262..9f54450e95a2 100644 --- a/ruby/ql/lib/change-notes/2025-07-09-overlay-local.md +++ b/ruby/ql/lib/change-notes/released/5.0.0.md @@ -1,4 +1,5 @@ ---- -category: breaking ---- +## 5.0.0 + +### Breaking Changes + * Most classes and predicates in the AST, SSA, and control-flow-graph libraries are now annotated with `overlay[local]`, in preparation for incremental analysis. This could result in compiler errors for custom queries if they extend these classes. To mitigate such errors, look for ways to restructure custom QL code so it doesn't depend on changing the behavior of standard-library classes. diff --git a/ruby/ql/lib/change-notes/released/5.0.1.md b/ruby/ql/lib/change-notes/released/5.0.1.md new file mode 100644 index 000000000000..3cdf243f9e8c --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.0.1.md @@ -0,0 +1,5 @@ +## 5.0.1 + +### Minor Analysis Improvements + +* The regular expressions in `SensitiveDataHeuristics.qll` have been extended to find more instances of sensitive data such as secrets used in authentication, finance and health information, and device data. The heuristics have also been refined to find fewer false positive matches. This will improve results for queries related to sensitive information. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 8b76a5b9a341..ae7df5e18b78 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.1.10 +lastReleaseVersion: 5.0.1 diff --git a/ruby/ql/lib/codeql/ruby/Concepts.qll b/ruby/ql/lib/codeql/ruby/Concepts.qll index bd6faaacd69e..2ddcb433e1be 100644 --- a/ruby/ql/lib/codeql/ruby/Concepts.qll +++ b/ruby/ql/lib/codeql/ruby/Concepts.qll @@ -7,10 +7,14 @@ private import codeql.ruby.AST private import codeql.ruby.CFG private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.internal.DataFlowImplSpecific private import codeql.ruby.Frameworks private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.ApiGraphs private import codeql.ruby.Regexp as RE +private import codeql.concepts.ConceptsShared + +private module ConceptsShared = ConceptsMake; /** * A data-flow node that constructs a SQL statement. @@ -682,7 +686,7 @@ module Http { /** Provides classes for modeling HTTP clients. */ module Client { - import codeql.ruby.internal.ConceptsShared::Http::Client as SC + import ConceptsShared::Http::Client as SC /** * A method call that makes an outgoing HTTP request. @@ -1041,7 +1045,7 @@ module Cryptography { // modify that part of the shared concept... which means we have to explicitly // re-export everything else. // Using SC shorthand for "Shared Cryptography" - import codeql.ruby.internal.ConceptsShared::Cryptography as SC + import ConceptsShared::Cryptography as SC class CryptographicAlgorithm = SC::CryptographicAlgorithm; diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index 3e1d27a17ba0..fd1619b1c634 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -400,7 +400,8 @@ private module Cached { cached // nothing is actually cached module BarrierGuard { private predicate guardChecksAdjTypes( - DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, boolean branch + DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, + DataFlowIntegrationInput::GuardValue branch ) { guardChecks(g, e, branch) } @@ -475,6 +476,7 @@ class ParameterExt extends TParameterExt { private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInputSig { private import codeql.ruby.controlflow.internal.Guards as Guards + private import codeql.util.Boolean class Expr extends Cfg::CfgNodes::ExprCfgNode { predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { this = bb.getNode(i) } @@ -486,12 +488,16 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu any(ParameterExt p).isInitializedBy(def) or def.(Ssa::WriteDefinition).assigns(_) } + class GuardValue = Boolean; + class Guard extends Cfg::CfgNodes::AstCfgNode { /** * Holds if the evaluation of this guard to `branch` corresponds to the edge * from `bb1` to `bb2`. */ - predicate hasBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { + predicate hasValueBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch + ) { exists(Cfg::SuccessorTypes::ConditionalSuccessor s | this.getBasicBlock() = bb1 and bb2 = bb1.getASuccessor(s) and @@ -504,13 +510,15 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * branch edge from `bb1` to `bb2`. That is, following the edge from * `bb1` to `bb2` implies that this guard evaluated to `branch`. */ - predicate controlsBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { - this.hasBranchEdge(bb1, bb2, branch) + predicate valueControlsBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch + ) { + this.hasValueBranchEdge(bb1, bb2, branch) } } /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ - predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) { + predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, GuardValue branch) { Guards::guardControlsBlock(guard, bb, branch) } } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll index 122202c63b78..a034ad43f023 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveResource.qll @@ -183,8 +183,7 @@ module ActiveResource { CollectionSource getCollection() { result = collection } } - private class ModelClassMethodCallAsHttpRequest extends Http::Client::Request::Range, - ModelClassMethodCall + private class ModelClassMethodCallAsHttpRequest extends Http::Client::Request::Range instanceof ModelClassMethodCall { ModelClassMethodCallAsHttpRequest() { this.getMethodName() = ["all", "build", "create", "create!", "find", "first", "last"] @@ -195,20 +194,19 @@ module ActiveResource { override predicate disablesCertificateValidation( DataFlow::Node disablingNode, DataFlow::Node argumentOrigin ) { - this.getModelClass().disablesCertificateValidation(disablingNode) and + super.getModelClass().disablesCertificateValidation(disablingNode) and // TODO: highlight real argument origin argumentOrigin = disablingNode } override DataFlow::Node getAUrlPart() { - result = this.getModelClass().getASiteAssignment().getAUrlPart() + result = super.getModelClass().getASiteAssignment().getAUrlPart() } override DataFlow::Node getResponseBody() { result = this } } - private class ModelInstanceMethodCallAsHttpRequest extends Http::Client::Request::Range, - ModelInstanceMethodCall + private class ModelInstanceMethodCallAsHttpRequest extends Http::Client::Request::Range instanceof ModelInstanceMethodCall { ModelInstanceMethodCallAsHttpRequest() { this.getMethodName() = @@ -223,13 +221,13 @@ module ActiveResource { override predicate disablesCertificateValidation( DataFlow::Node disablingNode, DataFlow::Node argumentOrigin ) { - this.getModelClass().disablesCertificateValidation(disablingNode) and + super.getModelClass().disablesCertificateValidation(disablingNode) and // TODO: highlight real argument origin argumentOrigin = disablingNode } override DataFlow::Node getAUrlPart() { - result = this.getModelClass().getASiteAssignment().getAUrlPart() + result = super.getModelClass().getASiteAssignment().getAUrlPart() } override DataFlow::Node getResponseBody() { result = this } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll index adf7384183e1..e2ba1eb48fec 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll @@ -23,7 +23,7 @@ private import codeql.ruby.DataFlow * TODO: pipelining, streaming responses * https://github.com/excon/excon/blob/master/README.md */ -class ExconHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class ExconHttpRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; API::Node connectionNode; DataFlow::Node connectionUse; @@ -54,9 +54,9 @@ class ExconHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode // For one-off requests, the URL is in the first argument of the request method call. // For connection re-use, the URL is split between the first argument of the `new` call // and the `path` keyword argument of the request method call. - result = this.getArgument(0) and not result.asExpr().getExpr() instanceof Pair + result = super.getArgument(0) and not result.asExpr().getExpr() instanceof Pair or - result = this.getKeywordArgument("path") + result = super.getKeywordArgument("path") or result = connectionUse.(DataFlow::CallNode).getArgument(0) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll index 834180a7ee49..961732da0d08 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll @@ -22,7 +22,7 @@ private import codeql.ruby.DataFlow * connection.get("/").body * ``` */ -class FaradayHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class FaradayHttpRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; API::Node connectionNode; DataFlow::Node connectionUse; @@ -47,7 +47,7 @@ class FaradayHttpRequest extends Http::Client::Request::Range, DataFlow::CallNod override DataFlow::Node getResponseBody() { result = requestNode.getAMethodCall("body") } override DataFlow::Node getAUrlPart() { - result = this.getArgument(0) or + result = super.getArgument(0) or result = connectionUse.(DataFlow::CallNode).getArgument(0) or result = connectionUse.(DataFlow::CallNode).getKeywordArgument("url") } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll index c766ef96f23a..3fcd9b36703b 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll @@ -14,7 +14,7 @@ private import codeql.ruby.DataFlow * HTTPClient.get_content("http://example.com") * ``` */ -class HttpClientRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class HttpClientRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; API::Node connectionNode; string method; @@ -34,7 +34,7 @@ class HttpClientRequest extends Http::Client::Request::Range, DataFlow::CallNode ] } - override DataFlow::Node getAUrlPart() { result = this.getArgument(0) } + override DataFlow::Node getAUrlPart() { result = super.getArgument(0) } override DataFlow::Node getResponseBody() { // The `get_content` and `post_content` methods return the response body as diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll index e9f94f771f1a..fd0838c3f975 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll @@ -23,7 +23,7 @@ private import codeql.ruby.DataFlow * MyClass.new("http://example.com") * ``` */ -class HttpartyRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class HttpartyRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; HttpartyRequest() { @@ -33,7 +33,7 @@ class HttpartyRequest extends Http::Client::Request::Range, DataFlow::CallNode { .getReturn(["get", "head", "delete", "options", "post", "put", "patch"]) } - override DataFlow::Node getAUrlPart() { result = this.getArgument(0) } + override DataFlow::Node getAUrlPart() { result = super.getArgument(0) } override DataFlow::Node getResponseBody() { // If HTTParty can recognise the response type, it will parse and return it @@ -49,7 +49,7 @@ class HttpartyRequest extends Http::Client::Request::Range, DataFlow::CallNode { /** Gets the value that controls certificate validation, if any. */ DataFlow::Node getCertificateValidationControllingValue() { - result = this.getKeywordArgumentIncludeHashArgument(["verify", "verify_peer"]) + result = super.getKeywordArgumentIncludeHashArgument(["verify", "verify_peer"]) } cached diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll index e09917ae21ab..3a0b484e5465 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll @@ -18,7 +18,7 @@ private import codeql.ruby.DataFlow * response = req.get("/") * ``` */ -class NetHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class NetHttpRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { private DataFlow::CallNode request; private API::Node requestNode; private boolean returnsResponseBody; diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll index 8ccb744f84e1..38d6aced09f9 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll @@ -18,7 +18,7 @@ private import codeql.ruby.frameworks.Core * URI.parse("http://example.com").open.read * ``` */ -class OpenUriRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class OpenUriRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; OpenUriRequest() { @@ -30,7 +30,7 @@ class OpenUriRequest extends Http::Client::Request::Range, DataFlow::CallNode { this = requestNode.asSource() } - override DataFlow::Node getAUrlPart() { result = this.getArgument(0) } + override DataFlow::Node getAUrlPart() { result = super.getArgument(0) } override DataFlow::Node getResponseBody() { result = requestNode.getAMethodCall(["read", "readlines"]) @@ -38,7 +38,7 @@ class OpenUriRequest extends Http::Client::Request::Range, DataFlow::CallNode { /** Gets the value that controls certificate validation, if any. */ DataFlow::Node getCertificateValidationControllingValue() { - result = this.getKeywordArgumentIncludeHashArgument("ssl_verify_mode") + result = super.getKeywordArgumentIncludeHashArgument("ssl_verify_mode") } cached @@ -60,11 +60,10 @@ class OpenUriRequest extends Http::Client::Request::Range, DataFlow::CallNode { * Kernel.open("http://example.com").read * ``` */ -class OpenUriKernelOpenRequest extends Http::Client::Request::Range, DataFlow::CallNode instanceof KernelMethodCall -{ +class OpenUriKernelOpenRequest extends Http::Client::Request::Range instanceof KernelMethodCall { OpenUriKernelOpenRequest() { this.getMethodName() = "open" } - override DataFlow::Node getAUrlPart() { result = this.getArgument(0) } + override DataFlow::Node getAUrlPart() { result = super.getArgument(0) } override DataFlow::CallNode getResponseBody() { result.asExpr().getExpr().(MethodCall).getMethodName() in ["read", "readlines"] and @@ -73,14 +72,14 @@ class OpenUriKernelOpenRequest extends Http::Client::Request::Range, DataFlow::C /** Gets the value that controls certificate validation, if any. */ DataFlow::Node getCertificateValidationControllingValue() { - result = this.getKeywordArgument("ssl_verify_mode") + result = super.getKeywordArgument("ssl_verify_mode") or // using a hashliteral exists( DataFlow::LocalSourceNode optionsNode, CfgNodes::ExprNodes::PairCfgNode p, DataFlow::Node key | // can't flow to argument 0, since that's the URL - optionsNode.flowsTo(this.getArgument(any(int i | i > 0))) and + optionsNode.flowsTo(super.getArgument(any(int i | i > 0))) and p = optionsNode.asExpr().(CfgNodes::ExprNodes::HashLiteralCfgNode).getAKeyValuePair() and key.asExpr() = p.getKey() and key.getALocalSource().asExpr().getConstantValue().isStringlikeValue("ssl_verify_mode") and diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll index cac94f7166f2..268233c27def 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll @@ -16,7 +16,7 @@ private import codeql.ruby.DataFlow * RestClient::Request.execute(url: "http://example.com").body * ``` */ -class RestClientHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class RestClientHttpRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; API::Node connectionNode; @@ -37,9 +37,9 @@ class RestClientHttpRequest extends Http::Client::Request::Range, DataFlow::Call } override DataFlow::Node getAUrlPart() { - result = this.getKeywordArgument("url") + result = super.getKeywordArgument("url") or - result = this.getArgument(0) and + result = super.getArgument(0) and // this rules out the alternative above not result.asExpr().getExpr() instanceof Pair } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll index 2eae03a77481..19d3db23ece6 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll @@ -14,7 +14,7 @@ private import codeql.ruby.DataFlow * Typhoeus.get("http://example.com").body * ``` */ -class TyphoeusHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode { +class TyphoeusHttpRequest extends Http::Client::Request::Range instanceof DataFlow::CallNode { API::Node requestNode; boolean directResponse; @@ -31,7 +31,7 @@ class TyphoeusHttpRequest extends Http::Client::Request::Range, DataFlow::CallNo ) } - override DataFlow::Node getAUrlPart() { result = this.getArgument(0) } + override DataFlow::Node getAUrlPart() { result = super.getArgument(0) } override DataFlow::Node getResponseBody() { directResponse = true and @@ -43,7 +43,7 @@ class TyphoeusHttpRequest extends Http::Client::Request::Range, DataFlow::CallNo /** Gets the value that controls certificate validation, if any. */ DataFlow::Node getCertificateValidationControllingValue() { - result = this.getKeywordArgumentIncludeHashArgument("ssl_verifypeer") + result = super.getKeywordArgumentIncludeHashArgument("ssl_verifypeer") } cached diff --git a/ruby/ql/lib/codeql/ruby/internal/ConceptsImports.qll b/ruby/ql/lib/codeql/ruby/internal/ConceptsImports.qll deleted file mode 100644 index 478fffe56aef..000000000000 --- a/ruby/ql/lib/codeql/ruby/internal/ConceptsImports.qll +++ /dev/null @@ -1,7 +0,0 @@ -/** - * This file contains imports required for the Ruby version of `ConceptsShared.qll`. - * Since they are language-specific, they can't be placed directly in that file, as it is shared between languages. - */ - -import codeql.ruby.DataFlow -import codeql.ruby.security.CryptoAlgorithms as CryptoAlgorithms diff --git a/ruby/ql/lib/codeql/ruby/internal/ConceptsShared.qll b/ruby/ql/lib/codeql/ruby/internal/ConceptsShared.qll deleted file mode 100644 index 1b13e4ebb17e..000000000000 --- a/ruby/ql/lib/codeql/ruby/internal/ConceptsShared.qll +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Provides Concepts which are shared across languages. - * - * Each language has a language specific `Concepts.qll` file that can import the - * shared concepts from this file. A language can either re-export the concept directly, - * or can add additional member-predicates that are needed for that language. - * - * Moving forward, `Concepts.qll` will be the staging ground for brand new concepts from - * each language, but we will maintain a discipline of moving those concepts to - * `ConceptsShared.qll` ASAP. - */ - -private import ConceptsImports - -/** - * Provides models for cryptographic concepts. - * - * Note: The `CryptographicAlgorithm` class currently doesn't take weak keys into - * consideration for the `isWeak` member predicate. So RSA is always considered - * secure, although using a low number of bits will actually make it insecure. We plan - * to improve our libraries in the future to more precisely capture this aspect. - */ -module Cryptography { - class CryptographicAlgorithm = CryptoAlgorithms::CryptographicAlgorithm; - - class EncryptionAlgorithm = CryptoAlgorithms::EncryptionAlgorithm; - - class HashingAlgorithm = CryptoAlgorithms::HashingAlgorithm; - - class PasswordHashingAlgorithm = CryptoAlgorithms::PasswordHashingAlgorithm; - - /** - * A data flow node that is an application of a cryptographic algorithm. For example, - * encryption, decryption, signature-validation. - * - * Extend this class to refine existing API models. If you want to model new APIs, - * extend `CryptographicOperation::Range` instead. - */ - class CryptographicOperation extends DataFlow::Node instanceof CryptographicOperation::Range { - /** Gets the algorithm used, if it matches a known `CryptographicAlgorithm`. */ - CryptographicAlgorithm getAlgorithm() { result = super.getAlgorithm() } - - /** Gets the data flow node where the cryptographic algorithm used in this operation is configured. */ - DataFlow::Node getInitialization() { result = super.getInitialization() } - - /** Gets an input the algorithm is used on, for example the plain text input to be encrypted. */ - DataFlow::Node getAnInput() { result = super.getAnInput() } - - /** - * Gets the block mode used to perform this cryptographic operation. - * - * This predicate is only expected to have a result if two conditions hold: - * 1. The operation is an encryption operation, i.e. the algorithm used is an `EncryptionAlgorithm`, and - * 2. The algorithm used is a block cipher (not a stream cipher). - * - * If either of these conditions do not hold, then this predicate should have no result. - */ - BlockMode getBlockMode() { result = super.getBlockMode() } - } - - /** Provides classes for modeling new applications of a cryptographic algorithms. */ - module CryptographicOperation { - /** - * A data flow node that is an application of a cryptographic algorithm. For example, - * encryption, decryption, signature-validation. - * - * Extend this class to model new APIs. If you want to refine existing API models, - * extend `CryptographicOperation` instead. - */ - abstract class Range extends DataFlow::Node { - /** Gets the data flow node where the cryptographic algorithm used in this operation is configured. */ - abstract DataFlow::Node getInitialization(); - - /** Gets the algorithm used, if it matches a known `CryptographicAlgorithm`. */ - abstract CryptographicAlgorithm getAlgorithm(); - - /** Gets an input the algorithm is used on, for example the plain text input to be encrypted. */ - abstract DataFlow::Node getAnInput(); - - /** - * Gets the block mode used to perform this cryptographic operation. - * - * This predicate is only expected to have a result if two conditions hold: - * 1. The operation is an encryption operation, i.e. the algorithm used is an `EncryptionAlgorithm`, and - * 2. The algorithm used is a block cipher (not a stream cipher). - * - * If either of these conditions do not hold, then this predicate should have no result. - */ - abstract BlockMode getBlockMode(); - } - } - - /** - * A cryptographic block cipher mode of operation. This can be used to encrypt - * data of arbitrary length using a block encryption algorithm. - */ - class BlockMode extends string { - BlockMode() { - this = - [ - "ECB", "CBC", "GCM", "CCM", "CFB", "OFB", "CTR", "OPENPGP", - "XTS", // https://csrc.nist.gov/publications/detail/sp/800-38e/final - "EAX" // https://en.wikipedia.org/wiki/EAX_mode - ] - } - - /** Holds if this block mode is considered to be insecure. */ - predicate isWeak() { this = "ECB" } - - /** Holds if the given string appears to match this block mode. */ - bindingset[s] - predicate matchesString(string s) { s.toUpperCase().matches("%" + this + "%") } - } -} - -/** Provides classes for modeling HTTP-related APIs. */ -module Http { - /** Provides classes for modeling HTTP clients. */ - module Client { - /** - * A data flow node that makes an outgoing HTTP request. - * - * Extend this class to refine existing API models. If you want to model new APIs, - * extend `Http::Client::Request::Range` instead. - */ - class Request extends DataFlow::Node instanceof Request::Range { - /** - * Gets a data flow node that contributes to the URL of the request. - * Depending on the framework, a request may have multiple nodes which contribute to the URL. - */ - DataFlow::Node getAUrlPart() { result = super.getAUrlPart() } - - /** Gets a string that identifies the framework used for this request. */ - string getFramework() { result = super.getFramework() } - - /** - * Holds if this request is made using a mode that disables SSL/TLS - * certificate validation, where `disablingNode` represents the point at - * which the validation was disabled, and `argumentOrigin` represents the origin - * of the argument that disabled the validation (which could be the same node as - * `disablingNode`). - */ - predicate disablesCertificateValidation( - DataFlow::Node disablingNode, DataFlow::Node argumentOrigin - ) { - super.disablesCertificateValidation(disablingNode, argumentOrigin) - } - } - - /** Provides a class for modeling new HTTP requests. */ - module Request { - /** - * A data flow node that makes an outgoing HTTP request. - * - * Extend this class to model new APIs. If you want to refine existing API models, - * extend `Http::Client::Request` instead. - */ - abstract class Range extends DataFlow::Node { - /** - * Gets a data flow node that contributes to the URL of the request. - * Depending on the framework, a request may have multiple nodes which contribute to the URL. - */ - abstract DataFlow::Node getAUrlPart(); - - /** Gets a string that identifies the framework used for this request. */ - abstract string getFramework(); - - /** - * Holds if this request is made using a mode that disables SSL/TLS - * certificate validation, where `disablingNode` represents the point at - * which the validation was disabled, and `argumentOrigin` represents the origin - * of the argument that disabled the validation (which could be the same node as - * `disablingNode`). - */ - abstract predicate disablesCertificateValidation( - DataFlow::Node disablingNode, DataFlow::Node argumentOrigin - ); - } - } - } -} diff --git a/ruby/ql/lib/codeql/ruby/security/CryptoAlgorithms.qll b/ruby/ql/lib/codeql/ruby/security/CryptoAlgorithms.qll index 7176c666c573..13a03a3bd888 100644 --- a/ruby/ql/lib/codeql/ruby/security/CryptoAlgorithms.qll +++ b/ruby/ql/lib/codeql/ruby/security/CryptoAlgorithms.qll @@ -1,117 +1,5 @@ /** * Provides classes modeling cryptographic algorithms, separated into strong and weak variants. - * - * The classification into strong and weak are based on Wikipedia, OWASP and Google (2021). */ -private import internal.CryptoAlgorithmNames - -/** - * A cryptographic algorithm. - */ -private newtype TCryptographicAlgorithm = - MkHashingAlgorithm(string name, boolean isWeak) { - isStrongHashingAlgorithm(name) and isWeak = false - or - isWeakHashingAlgorithm(name) and isWeak = true - } or - MkEncryptionAlgorithm(string name, boolean isWeak) { - isStrongEncryptionAlgorithm(name) and isWeak = false - or - isWeakEncryptionAlgorithm(name) and isWeak = true - } or - MkPasswordHashingAlgorithm(string name, boolean isWeak) { - isStrongPasswordHashingAlgorithm(name) and isWeak = false - or - isWeakPasswordHashingAlgorithm(name) and isWeak = true - } - -/** - * Gets the most specific `CryptographicAlgorithm` that matches the given `name`. - * A matching algorithm is one where the name of the algorithm matches the start of name, with allowances made for different name formats. - * In the case that multiple `CryptographicAlgorithm`s match the given `name`, the algorithm(s) with the longest name will be selected. This is intended to select more specific versions of algorithms when multiple versions could match - for example "SHA3_224" matches against both "SHA3" and "SHA3224", but the latter is a more precise match. - */ -bindingset[name] -private CryptographicAlgorithm getBestAlgorithmForName(string name) { - result = - max(CryptographicAlgorithm algorithm | - algorithm.getName() = - [ - name.toUpperCase(), // the full name - name.toUpperCase().regexpCapture("^([\\w]+)(?:-.*)?$", 1), // the name prior to any dashes or spaces - name.toUpperCase().regexpCapture("^([A-Z0-9]+)(?:(-|_).*)?$", 1) // the name prior to any dashes, spaces, or underscores - ].regexpReplaceAll("[-_ ]", "") // strip dashes, underscores, and spaces - | - algorithm order by algorithm.getName().length() - ) -} - -/** - * A cryptographic algorithm. - */ -abstract class CryptographicAlgorithm extends TCryptographicAlgorithm { - /** Gets a textual representation of this element. */ - string toString() { result = this.getName() } - - /** - * Gets the normalized name of this algorithm (upper-case, no spaces, dashes or underscores). - */ - abstract string getName(); - - /** - * Holds if the name of this algorithm is the most specific match for `name`. - * This predicate matches quite liberally to account for different ways of formatting algorithm names, e.g. using dashes, underscores, or spaces as separators, including or not including block modes of operation, etc. - */ - bindingset[name] - predicate matchesName(string name) { this = getBestAlgorithmForName(name) } - - /** - * Holds if this algorithm is weak. - */ - abstract predicate isWeak(); -} - -/** - * A hashing algorithm such as `MD5` or `SHA512`. - */ -class HashingAlgorithm extends MkHashingAlgorithm, CryptographicAlgorithm { - string name; - boolean isWeak; - - HashingAlgorithm() { this = MkHashingAlgorithm(name, isWeak) } - - override string getName() { result = name } - - override predicate isWeak() { isWeak = true } -} - -/** - * An encryption algorithm such as `DES` or `AES512`. - */ -class EncryptionAlgorithm extends MkEncryptionAlgorithm, CryptographicAlgorithm { - string name; - boolean isWeak; - - EncryptionAlgorithm() { this = MkEncryptionAlgorithm(name, isWeak) } - - override string getName() { result = name } - - override predicate isWeak() { isWeak = true } - - /** Holds if this algorithm is a stream cipher. */ - predicate isStreamCipher() { isStreamCipher(name) } -} - -/** - * A password hashing algorithm such as `PBKDF2` or `SCRYPT`. - */ -class PasswordHashingAlgorithm extends MkPasswordHashingAlgorithm, CryptographicAlgorithm { - string name; - boolean isWeak; - - PasswordHashingAlgorithm() { this = MkPasswordHashingAlgorithm(name, isWeak) } - - override string getName() { result = name } - - override predicate isWeak() { isWeak = true } -} +import codeql.concepts.CryptoAlgorithms diff --git a/ruby/ql/lib/codeql/ruby/security/OpenSSL.qll b/ruby/ql/lib/codeql/ruby/security/OpenSSL.qll index 26f6d996f144..40b3ac036cc1 100644 --- a/ruby/ql/lib/codeql/ruby/security/OpenSSL.qll +++ b/ruby/ql/lib/codeql/ruby/security/OpenSSL.qll @@ -3,7 +3,7 @@ * an underlying OpenSSL or LibreSSL C library. */ -private import internal.CryptoAlgorithmNames +private import codeql.concepts.internal.CryptoAlgorithmNames private import codeql.ruby.Concepts private import codeql.ruby.DataFlow private import codeql.ruby.ApiGraphs @@ -544,8 +544,7 @@ private class CipherNode extends DataFlow::Node { } /** An operation using the OpenSSL library that uses a cipher. */ -private class CipherOperation extends Cryptography::CryptographicOperation::Range, - DataFlow::CallNode +private class CipherOperation extends Cryptography::CryptographicOperation::Range instanceof DataFlow::CallNode { private CipherNode cipherNode; @@ -564,8 +563,8 @@ private class CipherOperation extends Cryptography::CryptographicOperation::Rang } override DataFlow::Node getAnInput() { - this.getMethodName() = "update" and - result = this.getArgument(0) + super.getMethodName() = "update" and + result = super.getArgument(0) } override Cryptography::BlockMode getBlockMode() { diff --git a/ruby/ql/lib/codeql/ruby/security/SensitiveActions.qll b/ruby/ql/lib/codeql/ruby/security/SensitiveActions.qll index 34beb33604b7..e0dc68e7136e 100644 --- a/ruby/ql/lib/codeql/ruby/security/SensitiveActions.qll +++ b/ruby/ql/lib/codeql/ruby/security/SensitiveActions.qll @@ -11,7 +11,7 @@ private import codeql.ruby.AST private import codeql.ruby.DataFlow -import codeql.ruby.security.internal.SensitiveDataHeuristics +import codeql.concepts.internal.SensitiveDataHeuristics private import HeuristicNames private import codeql.ruby.CFG diff --git a/ruby/ql/lib/codeql/ruby/security/internal/CleartextSources.qll b/ruby/ql/lib/codeql/ruby/security/internal/CleartextSources.qll index 3338bbf65f70..f2867fa14bfe 100644 --- a/ruby/ql/lib/codeql/ruby/security/internal/CleartextSources.qll +++ b/ruby/ql/lib/codeql/ruby/security/internal/CleartextSources.qll @@ -8,8 +8,8 @@ private import codeql.ruby.AST private import codeql.ruby.DataFlow private import codeql.ruby.TaintTracking::TaintTracking private import codeql.ruby.dataflow.RemoteFlowSources -private import SensitiveDataHeuristics::HeuristicNames -private import SensitiveDataHeuristics +private import codeql.concepts.internal.SensitiveDataHeuristics::HeuristicNames +private import codeql.concepts.internal.SensitiveDataHeuristics private import codeql.ruby.CFG private import codeql.ruby.dataflow.SSA diff --git a/ruby/ql/lib/codeql/ruby/security/internal/CryptoAlgorithmNames.qll b/ruby/ql/lib/codeql/ruby/security/internal/CryptoAlgorithmNames.qll deleted file mode 100644 index 8bb63d97876a..000000000000 --- a/ruby/ql/lib/codeql/ruby/security/internal/CryptoAlgorithmNames.qll +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Names of cryptographic algorithms, separated into strong and weak variants. - * - * The names are normalized: upper-case, no spaces, dashes or underscores. - * - * The names are inspired by the names used in real world crypto libraries. - * - * The classification into strong and weak are based on Wikipedia, OWASP and Google (2021). - */ - -/** - * Holds if `name` corresponds to a strong hashing algorithm. - */ -predicate isStrongHashingAlgorithm(string name) { - name = - [ - // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#blake2 - // and https://www.blake2.net/ - "BLAKE2", "BLAKE2B", "BLAKE2S", - // see https://github.com/BLAKE3-team/BLAKE3 - "BLAKE3", - // - "DSA", "ED25519", "ES256", "ECDSA256", "ES384", "ECDSA384", "ES512", "ECDSA512", "SHA2", - "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "SHA3224", "SHA3256", "SHA3384", "SHA3512", - // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#cryptography.hazmat.primitives.hashes.SHAKE128 - "SHAKE128", "SHAKE256", - // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#sm3 - "SM3", - // see https://security.stackexchange.com/a/216297 - "WHIRLPOOL", - ] -} - -/** - * Holds if `name` corresponds to a weak hashing algorithm. - */ -predicate isWeakHashingAlgorithm(string name) { - name = - [ - "HAVEL128", "MD2", "MD4", "MD5", "PANAMA", "RIPEMD", "RIPEMD128", "RIPEMD256", "RIPEMD160", - "RIPEMD320", "SHA0", "SHA1" - ] -} - -/** - * Holds if `name` corresponds to a strong encryption algorithm. - */ -predicate isStrongEncryptionAlgorithm(string name) { - name = - [ - "AES", "AES128", "AES192", "AES256", "AES512", "AES-128", "AES-192", "AES-256", "AES-512", - "ARIA", "BLOWFISH", "BF", "ECIES", "CAST", "CAST5", "CAMELLIA", "CAMELLIA128", "CAMELLIA192", - "CAMELLIA256", "CAMELLIA-128", "CAMELLIA-192", "CAMELLIA-256", "CHACHA", "GOST", "GOST89", - "IDEA", "RABBIT", "RSA", "SEED", "SM4" - ] -} - -/** - * Holds if `name` corresponds to a weak encryption algorithm. - */ -predicate isWeakEncryptionAlgorithm(string name) { - name = - [ - "DES", "3DES", "DES3", "TRIPLEDES", "DESX", "TDEA", "TRIPLEDEA", "ARC2", "RC2", "ARC4", "RC4", - "ARCFOUR", "ARC5", "RC5" - ] -} - -/** - * Holds if `name` corresponds to a strong password hashing algorithm. - */ -predicate isStrongPasswordHashingAlgorithm(string name) { - name = ["ARGON2", "PBKDF2", "BCRYPT", "SCRYPT"] -} - -/** - * Holds if `name` corresponds to a weak password hashing algorithm. - */ -predicate isWeakPasswordHashingAlgorithm(string name) { name = "EVPKDF" } - -/** - * Holds if `name` corresponds to a stream cipher. - */ -predicate isStreamCipher(string name) { name = ["CHACHA", "RC4", "ARC4", "ARCFOUR", "RABBIT"] } diff --git a/ruby/ql/lib/codeql/ruby/security/regexp/MissingFullAnchorQuery.qll b/ruby/ql/lib/codeql/ruby/security/regexp/MissingFullAnchorQuery.qll index febfa0712d9b..3516e8319bca 100644 --- a/ruby/ql/lib/codeql/ruby/security/regexp/MissingFullAnchorQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/regexp/MissingFullAnchorQuery.qll @@ -17,6 +17,10 @@ private module MissingFullAnchorConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof Sink } predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + predicate observeDiffInformedIncrementalMode() { + none() // can't be made diff-informed because the locations of Ruby RegExpTerms aren't correct when the regexp is parsed from a string arising from constant folding + } } /** diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 7c0be7579359..2ee74c2d6034 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,11 +1,12 @@ name: codeql/ruby-all -version: 4.1.11-dev +version: 5.0.2-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme upgrades: upgrades library: true dependencies: + codeql/concepts: ${workspace} codeql/controlflow: ${workspace} codeql/dataflow: ${workspace} codeql/mad: ${workspace} diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 133810657ff9..330b92b7d7ed 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.2 + +No user-facing changes. + ## 1.4.1 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.4.2.md b/ruby/ql/src/change-notes/released/1.4.2.md new file mode 100644 index 000000000000..37be01f40d98 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.4.2.md @@ -0,0 +1,3 @@ +## 1.4.2 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 43ccf4467bed..a76cacdf7997 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.1 +lastReleaseVersion: 1.4.2 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index bf270b41b196..ac62f1cc0d9d 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.4.2-dev +version: 1.4.3-dev groups: - ruby - queries diff --git a/ruby/ql/test/library-tests/security/CryptoAlgorithms.ql b/ruby/ql/test/library-tests/security/CryptoAlgorithms.ql index c4c42532d899..f19368e3656f 100644 --- a/ruby/ql/test/library-tests/security/CryptoAlgorithms.ql +++ b/ruby/ql/test/library-tests/security/CryptoAlgorithms.ql @@ -1,5 +1,5 @@ import codeql.ruby.AST -import codeql.ruby.security.CryptoAlgorithms +import codeql.concepts.CryptoAlgorithms query predicate weakHashingAlgorithms(HashingAlgorithm ha) { ha.isWeak() } diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 1d2b69ce32ed..cac9970eeecf 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -256,7 +256,6 @@ lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7e lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d -lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll 635b491538a2ede0b2cf8ecaa1cea21e115a707dec4e023fcdbc1f7197615e8c 7a0dc718656631e08c4becc53174af42fbaaa639e252fb087d4317f5add840dc lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b lib/codeql/rust/elements/internal/ExprStmtConstructor.qll dd6bb06a7d48c12f630aafd611621cc50ce0f3e7d9abba5484a695f90879264b dc8b6ec8acc314e041ae71868803630c5d4cab488c72c1ea929bb756e1847c52 @@ -289,7 +288,6 @@ lib/codeql/rust/elements/internal/IdentPatConstructor.qll 09792f5a070996b65f095d lib/codeql/rust/elements/internal/IfExprConstructor.qll 03088b54c8fa623f93a5b5a7eb896f680e8b0e9025488157a02c48aaebc6ad56 906f916c3690d0721a31dd31b302dcdcec4233bb507683007d82cf10793a648f lib/codeql/rust/elements/internal/ImplConstructor.qll 24edccca59f70d812d1458b412a45310ddc096d095332f6e3258903c54c1bb44 7eb673b3ab33a0873ee5ce189105425066b376821cce0fc9eb8ace22995f0bc7 lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll 1ed355e5e56f432b24b6f4778e4dc45c6e65095190cacb7a5015529e0c9d01f8 c8505185a042da4eb20a0cc32323194a0290c4bf821c7e0fce7351b194b10f31 -lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll 26259dfa599f48fb00ff7e5e17e9a8b40c29360f02cf11abc4ccbb573996f5bb 5b4c0e29e9c20c3121e3f37f1f1cba3f181d56023e9912c6dc5c481cb8ee3e4d lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemImpl.qll e3fb78d572ce1c3cc857d2671bd71ff4d7850321acfddc5f15533ff87accda79 fbabc2081e4b2773b04938d57bb51af908c80b7bc53c3127c74ab5d4fb9837bc @@ -417,7 +415,6 @@ lib/codeql/rust/elements/internal/TupleFieldConstructor.qll 89d3cf2540235044ed5a lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll 4335ba2061b6e4968db9ec05c0b4d3e6a564db89a2df69e036f317672a7900b1 0b8dded875dbf696cf588e8c21acc27332a2ff66ced7bfabdfc1ad621991f888 lib/codeql/rust/elements/internal/TupleFieldListImpl.qll 74869e92a3cbdd7895adaaa418d29d5e97387daf46c17315f219ad967af15d76 5815e4b37db958663df1f6fedc9667a11b261c9c2133e3f983a3aedc452c01fc lib/codeql/rust/elements/internal/TuplePatConstructor.qll 2a5e83ad5b8713a732e610128aeddf14e9b344402d6cf30ff0b43aa39e838418 6d467f7141307523994f03ed7b8e8b1a5bcf860963c9934b90e54582ea38096a -lib/codeql/rust/elements/internal/TuplePatImpl.qll 4adb38f0f8dae4ff285b9f5843efb92af419719a7549e0ff62dc56969bd3c852 3f622130771d7731ed053175a83b289bab1d1f5931526c4854923dbcec7e43f1 lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll 9d68f67a17a5cec0e78907a53eccfa7696be5b0571da4b486c8184274e56344a 3ffa29f546cd6c644be4fecc7415477a3a4dc00d69b8764be9119abe4c6d8b9e lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll 80c31c25fd27e330690fb500d757a4bbd33f226186d88ea73bfe4cf29a7db508 d572a72fa361990a3d0a3f9b81d1e966e2ba1ac0a60314ec824c1b8b2814c857 lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll daf679e3cac0eaf1c20880b49b22bbe0822a27cc6ab2c241916b4bf6da995586 ebd87d7fce7d8acd7fa37c4107f8210e60412dd418104bd9fdbdbcde13c8b6a7 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 43819916ce08..4fc300e48cc4 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -258,7 +258,6 @@ /lib/codeql/rust/elements/internal/ContinueExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CrateConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/EnumConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExprStmtConstructor.qll linguist-generated @@ -291,7 +290,6 @@ /lib/codeql/rust/elements/internal/IfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/IndexExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemImpl.qll linguist-generated @@ -419,7 +417,6 @@ /lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TuplePatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TuplePatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll linguist-generated diff --git a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected index b3683f02d927..97e1cbe67ca4 100644 --- a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected @@ -15,9 +15,11 @@ ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql +ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql ql/rust/ql/src/queries/summary/NumberOfFilesExtractedWithErrors.ql ql/rust/ql/src/queries/summary/NumberOfSuccessfullyExtractedFiles.ql ql/rust/ql/src/queries/summary/QuerySinkCounts.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected index 650bf3169412..ae90e05411f0 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected @@ -16,10 +16,12 @@ ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql +ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql ql/rust/ql/src/queries/summary/NumberOfFilesExtractedWithErrors.ql ql/rust/ql/src/queries/summary/NumberOfSuccessfullyExtractedFiles.ql ql/rust/ql/src/queries/summary/QuerySinkCounts.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected index b5df88f96eca..1e5167f84fba 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected @@ -15,10 +15,12 @@ ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql +ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql ql/rust/ql/src/queries/summary/NumberOfFilesExtractedWithErrors.ql ql/rust/ql/src/queries/summary/NumberOfSuccessfullyExtractedFiles.ql ql/rust/ql/src/queries/summary/QuerySinkCounts.ql diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index d32eba422218..b2e266ccd063 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,7 +1,17 @@ +## 0.1.13 + +### Minor Analysis Improvements + +* Removed deprecated dataflow extensible predicates `sourceModelDeprecated`, `sinkModelDeprecated`, and `summaryModelDeprecated`, along with their associated classes. +* The regular expressions in `SensitiveDataHeuristics.qll` have been extended to find more instances of sensitive data such as secrets used in authentication, finance and health information, and device data. The heuristics have also been refined to find fewer false positive matches. This will improve results for queries related to sensitive information. + ## 0.1.12 ### Minor Analysis Improvements +* Type inference has been extended to support pattern matching. +* Call resolution for calls to associated functions has been improved, so it now disambiguates the targets based on type information at the call sites (either type information about the arguments or about the expected return types). +* Type inference has been improved for `for` loops and range expressions, which improves call resolution and may ultimately lead to more query results. * Implemented support for data flow through trait functions. For the purpose of data flow, calls to trait functions dispatch to all possible implementations. * `AssocItem` and `ExternItem` are now proper subclasses of `Item`. * Added type inference for `for` loops and array expressions. diff --git a/rust/ql/lib/change-notes/2025-07-07-type-inference-for-loops.md b/rust/ql/lib/change-notes/2025-07-07-type-inference-for-loops.md deleted file mode 100644 index eb65df0b9c50..000000000000 --- a/rust/ql/lib/change-notes/2025-07-07-type-inference-for-loops.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Type inference has been improved for `for` loops and range expressions, which improves call resolution and may ultimately lead to more query results. diff --git a/rust/ql/lib/change-notes/2025-07-10-assoc-func-disambiguation.md b/rust/ql/lib/change-notes/2025-07-10-assoc-func-disambiguation.md deleted file mode 100644 index af3587612e8c..000000000000 --- a/rust/ql/lib/change-notes/2025-07-10-assoc-func-disambiguation.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Call resolution for calls to associated functions has been improved, so it now disambiguates the targets based on type information at the call sites (either type information about the arguments or about the expected return types). \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md b/rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md deleted file mode 100644 index d1d586fc71ac..000000000000 --- a/rust/ql/lib/change-notes/2025-07-11-type-inference-patterns.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Type inference has been extended to support pattern matching. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/released/0.1.12.md b/rust/ql/lib/change-notes/released/0.1.12.md index 4db9d5803576..c168c7408922 100644 --- a/rust/ql/lib/change-notes/released/0.1.12.md +++ b/rust/ql/lib/change-notes/released/0.1.12.md @@ -2,6 +2,9 @@ ### Minor Analysis Improvements +* Type inference has been extended to support pattern matching. +* Call resolution for calls to associated functions has been improved, so it now disambiguates the targets based on type information at the call sites (either type information about the arguments or about the expected return types). +* Type inference has been improved for `for` loops and range expressions, which improves call resolution and may ultimately lead to more query results. * Implemented support for data flow through trait functions. For the purpose of data flow, calls to trait functions dispatch to all possible implementations. * `AssocItem` and `ExternItem` are now proper subclasses of `Item`. * Added type inference for `for` loops and array expressions. diff --git a/rust/ql/lib/change-notes/released/0.1.13.md b/rust/ql/lib/change-notes/released/0.1.13.md new file mode 100644 index 000000000000..12123d51a84f --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.1.13.md @@ -0,0 +1,6 @@ +## 0.1.13 + +### Minor Analysis Improvements + +* Removed deprecated dataflow extensible predicates `sourceModelDeprecated`, `sinkModelDeprecated`, and `summaryModelDeprecated`, along with their associated classes. +* The regular expressions in `SensitiveDataHeuristics.qll` have been extended to find more instances of sensitive data such as secrets used in authentication, finance and health information, and device data. The heuristics have also been refined to find fewer false positive matches. This will improve results for queries related to sensitive information. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index bfd6e9036419..f43379f81961 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.12 +lastReleaseVersion: 0.1.13 diff --git a/rust/ql/lib/codeql/rust/Concepts.qll b/rust/ql/lib/codeql/rust/Concepts.qll index 73dd629cef88..20247e088752 100644 --- a/rust/ql/lib/codeql/rust/Concepts.qll +++ b/rust/ql/lib/codeql/rust/Concepts.qll @@ -5,11 +5,16 @@ */ private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.Locations private import codeql.threatmodels.ThreatModels private import codeql.rust.Frameworks private import codeql.rust.dataflow.FlowSource private import codeql.rust.controlflow.ControlFlowGraph as Cfg private import codeql.rust.controlflow.CfgNodes as CfgNodes +private import codeql.concepts.ConceptsShared + +private module ConceptsShared = ConceptsMake; /** * A data flow source for a specific threat-model. @@ -302,7 +307,7 @@ module SqlSanitization { * Provides models for cryptographic things. */ module Cryptography { - private import codeql.rust.internal.ConceptsShared::Cryptography as SC + import ConceptsShared::Cryptography as SC final class CryptographicOperation = SC::CryptographicOperation; diff --git a/rust/ql/lib/codeql/rust/Frameworks.qll b/rust/ql/lib/codeql/rust/Frameworks.qll index 0e91ed427ba4..0c711096b209 100644 --- a/rust/ql/lib/codeql/rust/Frameworks.qll +++ b/rust/ql/lib/codeql/rust/Frameworks.qll @@ -4,6 +4,4 @@ private import codeql.rust.frameworks.rustcrypto.RustCrypto private import codeql.rust.frameworks.Poem -private import codeql.rust.frameworks.Sqlx -private import codeql.rust.frameworks.stdlib.Clone private import codeql.rust.frameworks.stdlib.Stdlib diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 112fe6de5dcd..7f8df8d144ba 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -49,23 +49,6 @@ private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink private import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprBaseImpl -/** - * DEPRECATED: Do not use. - * - * Holds if in a call to the function with canonical path `path`, defined in the - * crate `crate`, the value referred to by `output` is a flow source of the given - * `kind`. - * - * `output = "ReturnValue"` simply means the result of the call itself. - * - * For more information on the `kind` parameter, see - * https://github.com/github/codeql/blob/main/docs/codeql/reusables/threat-model-description.rst. - */ -extensible predicate sourceModelDeprecated( - string crate, string path, string output, string kind, string provenance, - QlBuiltins::ExtensionId madId -); - /** * Holds if in a call to the function with canonical path `path`, the value referred * to by `output` is a flow source of the given `kind`. @@ -79,53 +62,19 @@ extensible predicate sourceModel( string path, string output, string kind, string provenance, QlBuiltins::ExtensionId madId ); -/** - * DEPRECATED: Do not use. - * - * Holds if in a call to the function with canonical path `path`, defined in the - * crate `crate`, the value referred to by `input` is a flow sink of the given - * `kind`. - * - * For example, `input = Argument[0]` means the first argument of the call. - * - * The following kinds are supported: - * - * - `sql-injection`: a flow sink for SQL injection. - */ -extensible predicate sinkModelDeprecated( - string crate, string path, string input, string kind, string provenance, - QlBuiltins::ExtensionId madId -); - /** * Holds if in a call to the function with canonical path `path`, the value referred * to by `input` is a flow sink of the given `kind`. * * For example, `input = Argument[0]` means the first argument of the call. * - * The following kinds are supported: - * - * - `sql-injection`: a flow sink for SQL injection. + * The sink kinds supported by queries can be found by searching for uses of + * the `sinkNode` predicate. */ extensible predicate sinkModel( string path, string input, string kind, string provenance, QlBuiltins::ExtensionId madId ); -/** - * DEPRECATED: Do not use. - * - * Holds if in a call to the function with canonical path `path`, defined in the - * crate `crate`, the value referred to by `input` can flow to the value referred - * to by `output`. - * - * `kind` should be either `value` or `taint`, for value-preserving or taint-preserving - * steps, respectively. - */ -extensible predicate summaryModelDeprecated( - string crate, string path, string input, string output, string kind, string provenance, - QlBuiltins::ExtensionId madId -); - /** * Holds if in a call to the function with canonical path `path`, the value referred * to by `input` can flow to the value referred to by `output`. @@ -144,67 +93,22 @@ extensible predicate summaryModel( * This predicate should only be used in tests. */ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { - exists(string crate, string path, string output, string kind | - sourceModelDeprecated(crate, path, output, kind, _, madId) and - model = "Source: " + crate + "; " + path + "; " + output + "; " + kind - ) - or exists(string path, string output, string kind | sourceModel(path, output, kind, _, madId) and model = "Source: " + path + "; " + output + "; " + kind ) or - exists(string crate, string path, string input, string kind | - sinkModelDeprecated(crate, path, input, kind, _, madId) and - model = "Sink: " + crate + "; " + path + "; " + input + "; " + kind - ) - or exists(string path, string input, string kind | sinkModel(path, input, kind, _, madId) and model = "Sink: " + path + "; " + input + "; " + kind ) or - exists(string type, string path, string input, string output, string kind | - summaryModelDeprecated(type, path, input, output, kind, _, madId) and - model = "Summary: " + type + "; " + path + "; " + input + "; " + output + "; " + kind - ) - or exists(string path, string input, string output, string kind | summaryModel(path, input, output, kind, _, madId) and model = "Summary: " + path + "; " + input + "; " + output + "; " + kind ) } -private class SummarizedCallableFromModelDeprecated extends SummarizedCallable::Range { - private string crate; - private string path; - - SummarizedCallableFromModelDeprecated() { - summaryModelDeprecated(crate, path, _, _, _, _, _) and - exists(CallExprBase call, Resolvable r | - call.getStaticTarget() = this and - r = CallExprBaseImpl::getCallResolvable(call) and - r.getResolvedPath() = path and - r.getResolvedCrateOrigin() = crate - ) - } - - override predicate propagatesFlow( - string input, string output, boolean preservesValue, string model - ) { - exists(string kind, QlBuiltins::ExtensionId madId | - summaryModelDeprecated(crate, path, input, output, kind, _, madId) and - model = "MaD:" + madId.toString() - | - kind = "value" and - preservesValue = true - or - kind = "taint" and - preservesValue = false - ) - } -} - private class SummarizedCallableFromModel extends SummarizedCallable::Range { private string path; @@ -233,23 +137,6 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { } } -private class FlowSourceFromModelDeprecated extends FlowSource::Range { - private string crate; - private string path; - - FlowSourceFromModelDeprecated() { - sourceModelDeprecated(crate, path, _, _, _, _) and - this.callResolvesTo(crate, path) - } - - override predicate isSource(string output, string kind, Provenance provenance, string model) { - exists(QlBuiltins::ExtensionId madId | - sourceModelDeprecated(crate, path, output, kind, provenance, madId) and - model = "MaD:" + madId.toString() - ) - } -} - private class FlowSourceFromModel extends FlowSource::Range { private string path; @@ -266,23 +153,6 @@ private class FlowSourceFromModel extends FlowSource::Range { } } -private class FlowSinkFromModelDeprecated extends FlowSink::Range { - private string crate; - private string path; - - FlowSinkFromModelDeprecated() { - sinkModelDeprecated(crate, path, _, _, _, _) and - this.callResolvesTo(crate, path) - } - - override predicate isSink(string input, string kind, Provenance provenance, string model) { - exists(QlBuiltins::ExtensionId madId | - sinkModelDeprecated(crate, path, input, kind, provenance, madId) and - model = "MaD:" + madId.toString() - ) - } -} - private class FlowSinkFromModel extends FlowSink::Range { private string path; diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll index aef8391b66ff..9b6d254dec13 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll @@ -301,7 +301,8 @@ private module Cached { cached // nothing is actually cached module BarrierGuard { private predicate guardChecksAdjTypes( - DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, boolean branch + DataFlowIntegrationInput::Guard g, DataFlowIntegrationInput::Expr e, + DataFlowIntegrationInput::GuardValue branch ) { guardChecks(g, e, branch) } @@ -320,6 +321,7 @@ private import codeql.rust.dataflow.Ssa private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInputSig { private import codeql.rust.dataflow.internal.DataFlowImpl as DataFlowImpl + private import codeql.util.Boolean class Expr extends CfgNodes::AstCfgNode { predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { this = bb.getNode(i) } @@ -348,12 +350,16 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu ) } + class GuardValue = Boolean; + class Guard extends CfgNodes::AstCfgNode { /** * Holds if the evaluation of this guard to `branch` corresponds to the edge * from `bb1` to `bb2`. */ - predicate hasBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { + predicate hasValueBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch + ) { exists(Cfg::ConditionalSuccessor s | this = bb1.getANode() and bb2 = bb1.getASuccessor(s) and @@ -366,13 +372,15 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * branch edge from `bb1` to `bb2`. That is, following the edge from * `bb1` to `bb2` implies that this guard evaluated to `branch`. */ - predicate controlsBranchEdge(SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, boolean branch) { - this.hasBranchEdge(bb1, bb2, branch) + predicate valueControlsBranchEdge( + SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch + ) { + this.hasValueBranchEdge(bb1, bb2, branch) } } /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ - predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) { + predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, GuardValue branch) { exists(ConditionBasicBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/empty.model.yml b/rust/ql/lib/codeql/rust/dataflow/internal/empty.model.yml index 1200720a0cee..1a33951dfc38 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/empty.model.yml +++ b/rust/ql/lib/codeql/rust/dataflow/internal/empty.model.yml @@ -1,28 +1,16 @@ extensions: # Make sure that the extensible model predicates have at least one definition # to avoid errors about undefined extensionals. - - addsTo: - pack: codeql/rust-all - extensible: sourceModelDeprecated - data: [] - addsTo: pack: codeql/rust-all extensible: sourceModel data: [] - - addsTo: - pack: codeql/rust-all - extensible: sinkModelDeprecated - data: [] - addsTo: pack: codeql/rust-all extensible: sinkModel data: [] - - addsTo: - pack: codeql/rust-all - extensible: summaryModelDeprecated - data: [] - addsTo: pack: codeql/rust-all extensible: summaryModel diff --git a/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll index 0ea1d4397f94..53e46a5f65a7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `DynTraitTypeRepr`. * @@ -12,6 +11,10 @@ private import codeql.rust.elements.internal.generated.DynTraitTypeRepr * be referenced directly. */ module Impl { + private import rust + private import codeql.rust.internal.PathResolution as PathResolution + + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A dynamic trait object type. * @@ -21,5 +24,16 @@ module Impl { * // ^^^^^^^^^ * ``` */ - class DynTraitTypeRepr extends Generated::DynTraitTypeRepr { } + class DynTraitTypeRepr extends Generated::DynTraitTypeRepr { + /** Gets the trait that this trait object refers to. */ + pragma[nomagic] + Trait getTrait() { + result = + PathResolution::resolvePath(this.getTypeBoundList() + .getBound(0) + .getTypeRepr() + .(PathTypeRepr) + .getPath()) + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll index 6cbaa60da088..e751d3f4a024 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ImplTraitTypeRepr`. * @@ -6,12 +5,14 @@ */ private import codeql.rust.elements.internal.generated.ImplTraitTypeRepr +private import rust /** * INTERNAL: This module contains the customizable definition of `ImplTraitTypeRepr` and should not * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An `impl Trait` type. * @@ -21,5 +22,15 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class ImplTraitTypeRepr extends Generated::ImplTraitTypeRepr { } + class ImplTraitTypeRepr extends Generated::ImplTraitTypeRepr { + /** Gets the function for which this impl trait type occurs, if any. */ + Function getFunction() { + this.getParentNode*() = [result.getRetType().getTypeRepr(), result.getAParam().getTypeRepr()] + } + + /** Holds if this impl trait type occurs in the return type of a function. */ + predicate isInReturnPos() { + this.getParentNode*() = this.getFunction().getRetType().getTypeRepr() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll index 0926db57c97e..83ba43020d78 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll @@ -36,5 +36,36 @@ module Impl { not this.hasGenericParamList() and result = 0 } + + private int nrOfDirectTypeBounds() { + result = this.getTypeBoundList().getNumberOfBounds() + or + not this.hasTypeBoundList() and + result = 0 + } + + /** + * Gets the `index`th type bound of this trait, if any. + * + * This includes type bounds directly on the trait and bounds from any + * `where` clauses for `Self`. + */ + TypeBound getTypeBound(int index) { + result = this.getTypeBoundList().getBound(index) + or + exists(WherePred wp | + wp = this.getWhereClause().getAPredicate() and + wp.getTypeRepr().(PathTypeRepr).getPath().getText() = "Self" and + result = wp.getTypeBoundList().getBound(index - this.nrOfDirectTypeBounds()) + ) + } + + /** + * Gets a type bound of this trait. + * + * This includes type bounds directly on the trait and bounds from any + * `where` clauses for `Self`. + */ + TypeBound getATypeBound() { result = this.getTypeBound(_) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll index 93f5b79c8208..ac9a723b6e13 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TuplePat`. * @@ -12,6 +11,9 @@ private import codeql.rust.elements.internal.generated.TuplePat * be referenced directly. */ module Impl { + private import rust + + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A tuple pattern. For example: * ```rust @@ -19,5 +21,15 @@ module Impl { * let (a, b, .., z) = (1, 2, 3, 4, 5); * ``` */ - class TuplePat extends Generated::TuplePat { } + class TuplePat extends Generated::TuplePat { + /** + * Gets the arity of the tuple matched by this pattern, if any. + * + * This is the number of fields in the tuple pattern if and only if the + * pattern does not contain a `..` pattern. + */ + int getTupleArity() { + result = this.getNumberOfFields() and not this.getAField() instanceof RestPat + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeParamImpl.qll index 34af89b587b5..753f511dedb6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeParamImpl.qll @@ -12,6 +12,7 @@ private import codeql.rust.elements.internal.generated.TypeParam */ module Impl { private import rust + private import codeql.rust.internal.PathResolution // the following QLdoc is generated: if you need to edit it, do it in the schema file /** @@ -27,6 +28,41 @@ module Impl { /** Gets the position of this type parameter. */ int getPosition() { this = any(GenericParamList l).getTypeParam(result) } + private TypeBound getTypeBoundAt(int i, int j) { + exists(TypeBoundList tbl | result = tbl.getBound(j) | + tbl = this.getTypeBoundList() and i = 0 + or + exists(WherePred wp | + wp = this.(TypeParamItemNode).getAWherePred() and + tbl = wp.getTypeBoundList() and + wp = any(WhereClause wc).getPredicate(i) + ) + ) + } + + /** + * Gets the `index`th type bound of this type parameter, if any. + * + * This includes type bounds directly on this type parameter and bounds from + * any `where` clauses for this type parameter. + */ + TypeBound getTypeBound(int index) { + result = rank[index + 1](int i, int j | | this.getTypeBoundAt(i, j) order by i, j) + } + + /** + * Gets a type bound of this type parameter. + * + * This includes type bounds directly on this type parameter and bounds from + * any `where` clauses for this type parameter. + */ + TypeBound getATypeBound() { + // NOTE: This predicate is used in path resolution, so it can not be + // defined using `getTypeBound` as that would cause non-monotonic + // recursion due to the `rank`. + result = this.getTypeBoundAt(_, _) + } + override string toAbbreviatedString() { result = this.getName().getText() } override string toStringImpl() { result = this.getName().getText() } diff --git a/rust/ql/lib/codeql/rust/frameworks/Sqlx.qll b/rust/ql/lib/codeql/rust/frameworks/Sqlx.qll deleted file mode 100644 index 5504993ab744..000000000000 --- a/rust/ql/lib/codeql/rust/frameworks/Sqlx.qll +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Provides modeling for the `SQLx` library. - */ - -private import rust -private import codeql.rust.Concepts -private import codeql.rust.dataflow.DataFlow - -/** - * A call to `sqlx::query` and variations. - */ -private class SqlxQuery extends SqlConstruction::Range { - CallExpr call; - - SqlxQuery() { - this.asExpr().getExpr() = call and - call.getFunction().(PathExpr).getResolvedPath() = - [ - "crate::query::query", "crate::query_as::query_as", "crate::query_with::query_with", - "crate::query_as_with::query_as_with", "crate::query_scalar::query_scalar", - "crate::query_scalar_with::query_scalar_with", "crate::raw_sql::raw_sql" - ] - } - - override DataFlow::Node getSql() { result.asExpr().getExpr() = call.getArgList().getArg(0) } -} - -/** - * A call to `sqlx::Executor::execute`. - */ -private class SqlxExecute extends SqlExecution::Range { - MethodCallExpr call; - - SqlxExecute() { - this.asExpr().getExpr() = call and - call.(Resolvable).getResolvedPath() = "crate::executor::Executor::execute" - } - - override DataFlow::Node getSql() { result.asExpr().getExpr() = call.getArgList().getArg(0) } -} diff --git a/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml new file mode 100644 index 000000000000..76e2569a67aa --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/genericarray.model.yml @@ -0,0 +1,9 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::from_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] + - ["::from_mut_slice", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] + - ["::try_from_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] + - ["::try_from_mut_slice", "Argument[0].Reference", "ReturnValue.Field[crate::result::Result::Ok(0)].Reference", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index 84f3247d782e..7ceae820001c 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -8,3 +8,28 @@ extensions: - ["<_ as digest::digest::Digest>::chain_update", "Argument[0]", "hasher-input", "manual"] - ["<_ as digest::digest::Digest>::digest", "Argument[0]", "hasher-input", "manual"] - ["md5::compute", "Argument[0]", "hasher-input", "manual"] + - ["<_ as crypto_common::KeyInit>::new", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyInit>::new", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as crypto_common::KeyInit>::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyInit>::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["<_ as crypto_common::KeyIvInit>::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["<_ as aead::Aead>::encrypt", "Argument[0]", "credentials-nonce", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml new file mode 100644 index 000000000000..efc6022b0c55 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["sqlx_core::query::query", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::query_as::query_as", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::query_with::query_with", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::query_as_with::query_as_with", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::query_scalar::query_scalar", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::query_scalar_with::query_scalar_with", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::raw_sql::raw_sql", "Argument[0]", "sql-injection", "manual"] + - ["<_ as sqlx_core::executor::Executor>::execute", "Argument[0]", "sql-injection", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/Clone.qll b/rust/ql/lib/codeql/rust/frameworks/stdlib/Clone.qll deleted file mode 100644 index 954792ec61e4..000000000000 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/Clone.qll +++ /dev/null @@ -1,22 +0,0 @@ -/** A model for `clone` on the `Clone` trait. */ - -private import rust -private import codeql.rust.dataflow.FlowSummary - -/** A `clone` method. */ -final class CloneCallable extends SummarizedCallable::Range { - CloneCallable() { - this.getParamList().hasSelfParam() and - this.getParamList().getNumberOfParams() = 0 and - this.getName().getText() = "clone" - } - - final override predicate propagatesFlow( - string input, string output, boolean preservesValue, string model - ) { - input = "Argument[self].Reference" and - output = "ReturnValue" and - preservesValue = true and - model = "generated" - } -} diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll b/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll index 05c6103b792a..820c6330c25e 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/Stdlib.qll @@ -140,6 +140,26 @@ class FutureTrait extends Trait { } } +/** + * The [`FnOnce` trait][1]. + * + * [1]: https://doc.rust-lang.org/std/ops/trait.FnOnce.html + */ +class FnOnceTrait extends Trait { + pragma[nomagic] + FnOnceTrait() { this.getCanonicalPath() = "core::ops::function::FnOnce" } + + /** Gets the type parameter of this trait. */ + TypeParam getTypeParam() { result = this.getGenericParamList().getGenericParam(0) } + + /** Gets the `Output` associated type. */ + pragma[nomagic] + TypeAlias getOutputType() { + result = this.getAssocItemList().getAnAssocItem() and + result.getName().getText() = "Output" + } +} + /** * The [`Iterator` trait][1]. * diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index 44319a942bf5..46cf9e64e248 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -3,6 +3,14 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: + # Clone + - ["<_ as core::clone::Clone>::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] + # Conversions + - ["::align_to", "Argument[self].Element", "ReturnValue.Field[0,1,2].Reference.Element", "taint", "manual"] + - ["<_ as core::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["<_ as core::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] @@ -59,6 +67,8 @@ extensions: pack: codeql/rust-all extensible: sourceModel data: + # Mem + - ["core::mem::zeroed", "ReturnValue.Element", "constant-source", "manual"] # Ptr - ["core::ptr::drop_in_place", "Argument[0]", "pointer-invalidate", "manual"] - ["core::ptr::dangling", "ReturnValue", "pointer-invalidate", "manual"] diff --git a/rust/ql/lib/codeql/rust/internal/ConceptsImports.qll b/rust/ql/lib/codeql/rust/internal/ConceptsImports.qll deleted file mode 100644 index 341f3ade509f..000000000000 --- a/rust/ql/lib/codeql/rust/internal/ConceptsImports.qll +++ /dev/null @@ -1,7 +0,0 @@ -/** - * This file contains imports required for the Rust version of `ConceptsShared.qll`. - * Since they are language-specific, they can't be placed directly in that file, as it is shared between languages. - */ - -import codeql.rust.dataflow.DataFlow::DataFlow as DataFlow -import codeql.rust.security.CryptoAlgorithms as CryptoAlgorithms diff --git a/rust/ql/lib/codeql/rust/internal/ConceptsShared.qll b/rust/ql/lib/codeql/rust/internal/ConceptsShared.qll deleted file mode 100644 index 1b13e4ebb17e..000000000000 --- a/rust/ql/lib/codeql/rust/internal/ConceptsShared.qll +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Provides Concepts which are shared across languages. - * - * Each language has a language specific `Concepts.qll` file that can import the - * shared concepts from this file. A language can either re-export the concept directly, - * or can add additional member-predicates that are needed for that language. - * - * Moving forward, `Concepts.qll` will be the staging ground for brand new concepts from - * each language, but we will maintain a discipline of moving those concepts to - * `ConceptsShared.qll` ASAP. - */ - -private import ConceptsImports - -/** - * Provides models for cryptographic concepts. - * - * Note: The `CryptographicAlgorithm` class currently doesn't take weak keys into - * consideration for the `isWeak` member predicate. So RSA is always considered - * secure, although using a low number of bits will actually make it insecure. We plan - * to improve our libraries in the future to more precisely capture this aspect. - */ -module Cryptography { - class CryptographicAlgorithm = CryptoAlgorithms::CryptographicAlgorithm; - - class EncryptionAlgorithm = CryptoAlgorithms::EncryptionAlgorithm; - - class HashingAlgorithm = CryptoAlgorithms::HashingAlgorithm; - - class PasswordHashingAlgorithm = CryptoAlgorithms::PasswordHashingAlgorithm; - - /** - * A data flow node that is an application of a cryptographic algorithm. For example, - * encryption, decryption, signature-validation. - * - * Extend this class to refine existing API models. If you want to model new APIs, - * extend `CryptographicOperation::Range` instead. - */ - class CryptographicOperation extends DataFlow::Node instanceof CryptographicOperation::Range { - /** Gets the algorithm used, if it matches a known `CryptographicAlgorithm`. */ - CryptographicAlgorithm getAlgorithm() { result = super.getAlgorithm() } - - /** Gets the data flow node where the cryptographic algorithm used in this operation is configured. */ - DataFlow::Node getInitialization() { result = super.getInitialization() } - - /** Gets an input the algorithm is used on, for example the plain text input to be encrypted. */ - DataFlow::Node getAnInput() { result = super.getAnInput() } - - /** - * Gets the block mode used to perform this cryptographic operation. - * - * This predicate is only expected to have a result if two conditions hold: - * 1. The operation is an encryption operation, i.e. the algorithm used is an `EncryptionAlgorithm`, and - * 2. The algorithm used is a block cipher (not a stream cipher). - * - * If either of these conditions do not hold, then this predicate should have no result. - */ - BlockMode getBlockMode() { result = super.getBlockMode() } - } - - /** Provides classes for modeling new applications of a cryptographic algorithms. */ - module CryptographicOperation { - /** - * A data flow node that is an application of a cryptographic algorithm. For example, - * encryption, decryption, signature-validation. - * - * Extend this class to model new APIs. If you want to refine existing API models, - * extend `CryptographicOperation` instead. - */ - abstract class Range extends DataFlow::Node { - /** Gets the data flow node where the cryptographic algorithm used in this operation is configured. */ - abstract DataFlow::Node getInitialization(); - - /** Gets the algorithm used, if it matches a known `CryptographicAlgorithm`. */ - abstract CryptographicAlgorithm getAlgorithm(); - - /** Gets an input the algorithm is used on, for example the plain text input to be encrypted. */ - abstract DataFlow::Node getAnInput(); - - /** - * Gets the block mode used to perform this cryptographic operation. - * - * This predicate is only expected to have a result if two conditions hold: - * 1. The operation is an encryption operation, i.e. the algorithm used is an `EncryptionAlgorithm`, and - * 2. The algorithm used is a block cipher (not a stream cipher). - * - * If either of these conditions do not hold, then this predicate should have no result. - */ - abstract BlockMode getBlockMode(); - } - } - - /** - * A cryptographic block cipher mode of operation. This can be used to encrypt - * data of arbitrary length using a block encryption algorithm. - */ - class BlockMode extends string { - BlockMode() { - this = - [ - "ECB", "CBC", "GCM", "CCM", "CFB", "OFB", "CTR", "OPENPGP", - "XTS", // https://csrc.nist.gov/publications/detail/sp/800-38e/final - "EAX" // https://en.wikipedia.org/wiki/EAX_mode - ] - } - - /** Holds if this block mode is considered to be insecure. */ - predicate isWeak() { this = "ECB" } - - /** Holds if the given string appears to match this block mode. */ - bindingset[s] - predicate matchesString(string s) { s.toUpperCase().matches("%" + this + "%") } - } -} - -/** Provides classes for modeling HTTP-related APIs. */ -module Http { - /** Provides classes for modeling HTTP clients. */ - module Client { - /** - * A data flow node that makes an outgoing HTTP request. - * - * Extend this class to refine existing API models. If you want to model new APIs, - * extend `Http::Client::Request::Range` instead. - */ - class Request extends DataFlow::Node instanceof Request::Range { - /** - * Gets a data flow node that contributes to the URL of the request. - * Depending on the framework, a request may have multiple nodes which contribute to the URL. - */ - DataFlow::Node getAUrlPart() { result = super.getAUrlPart() } - - /** Gets a string that identifies the framework used for this request. */ - string getFramework() { result = super.getFramework() } - - /** - * Holds if this request is made using a mode that disables SSL/TLS - * certificate validation, where `disablingNode` represents the point at - * which the validation was disabled, and `argumentOrigin` represents the origin - * of the argument that disabled the validation (which could be the same node as - * `disablingNode`). - */ - predicate disablesCertificateValidation( - DataFlow::Node disablingNode, DataFlow::Node argumentOrigin - ) { - super.disablesCertificateValidation(disablingNode, argumentOrigin) - } - } - - /** Provides a class for modeling new HTTP requests. */ - module Request { - /** - * A data flow node that makes an outgoing HTTP request. - * - * Extend this class to model new APIs. If you want to refine existing API models, - * extend `Http::Client::Request` instead. - */ - abstract class Range extends DataFlow::Node { - /** - * Gets a data flow node that contributes to the URL of the request. - * Depending on the framework, a request may have multiple nodes which contribute to the URL. - */ - abstract DataFlow::Node getAUrlPart(); - - /** Gets a string that identifies the framework used for this request. */ - abstract string getFramework(); - - /** - * Holds if this request is made using a mode that disables SSL/TLS - * certificate validation, where `disablingNode` represents the point at - * which the validation was disabled, and `argumentOrigin` represents the origin - * of the argument that disabled the validation (which could be the same node as - * `disablingNode`). - */ - abstract predicate disablesCertificateValidation( - DataFlow::Node disablingNode, DataFlow::Node argumentOrigin - ); - } - } - } -} diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 33cfb6c0d7bf..2dcb23c92959 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -112,13 +112,18 @@ abstract class ItemNode extends Locatable { result = this.(SourceFileItemNode).getSuper() } + pragma[nomagic] + private ItemNode getAChildSuccessor(string name) { + this = result.getImmediateParent() and + name = result.getName() + } + cached ItemNode getASuccessorRec(string name) { Stages::PathResolutionStage::ref() and sourceFileEdge(this, name, result) or - this = result.getImmediateParent() and - name = result.getName() + result = this.getAChildSuccessor(name) or fileImportEdge(this, name, result) or @@ -224,6 +229,38 @@ abstract class ItemNode extends Locatable { result.(CrateItemNode).isPotentialDollarCrateTarget() } + /** + * Holds if the successor `item` with the name `name` is not available locally + * for unqualified paths. + * + * This has the effect that a path of the form `name` inside `this` will not + * resolve to `item`. + */ + pragma[nomagic] + predicate excludedLocally(string name, ItemNode item) { + // Associated items in an impl or trait block are not directly available + // inside the block, they require a qualified path with a `Self` prefix. + item = this.getAChildSuccessor(name) and + this instanceof ImplOrTraitItemNode and + item instanceof AssocItemNode + } + + /** + * Holds if the successor `item` with the name `name` is not available + * externally for qualified paths that resolve to this item. + * + * This has the effect that a path of the form `Qualifier::name`, where + * `Qualifier` resolves to this item, will not resolve to `item`. + */ + pragma[nomagic] + predicate excludedExternally(string name, ItemNode item) { + // Type parameters for an `impl` or trait block are not available outside of + // the block. + item = this.getAChildSuccessor(name) and + this instanceof ImplOrTraitItemNode and + item instanceof TypeParamItemNode + } + pragma[nomagic] private predicate hasSourceFunction(string name) { this.getASuccessorFull(name).(Function).fromSource() @@ -754,9 +791,7 @@ private class StructItemNode extends TypeItemNode instanceof Struct { class TraitItemNode extends ImplOrTraitItemNode, TypeItemNode instanceof Trait { pragma[nomagic] - Path getABoundPath() { - result = super.getTypeBoundList().getABound().getTypeRepr().(PathTypeRepr).getPath() - } + Path getABoundPath() { result = super.getATypeBound().getTypeRepr().(PathTypeRepr).getPath() } pragma[nomagic] ItemNode resolveABound() { result = resolvePath(this.getABoundPath()) } @@ -887,7 +922,8 @@ private class BlockExprItemNode extends ItemNode instanceof BlockExpr { } class TypeParamItemNode extends TypeItemNode instanceof TypeParam { - private WherePred getAWherePred() { + /** Gets a where predicate for this type parameter, if any */ + WherePred getAWherePred() { exists(ItemNode declaringItem | this = resolveTypeParamPathTypeRepr(result.getTypeRepr()) and result = declaringItem.getADescendant() and @@ -896,13 +932,7 @@ class TypeParamItemNode extends TypeItemNode instanceof TypeParam { } pragma[nomagic] - Path getABoundPath() { - exists(TypeBoundList tbl | result = tbl.getABound().getTypeRepr().(PathTypeRepr).getPath() | - tbl = super.getTypeBoundList() - or - tbl = this.getAWherePred().getTypeBoundList() - ) - } + Path getABoundPath() { result = super.getATypeBound().getTypeRepr().(PathTypeRepr).getPath() } pragma[nomagic] ItemNode resolveABound() { result = resolvePath(this.getABoundPath()) } @@ -919,12 +949,7 @@ class TypeParamItemNode extends TypeItemNode instanceof TypeParam { * ``` */ cached - predicate hasTraitBound() { - Stages::PathResolutionStage::ref() and - exists(this.getABoundPath()) - or - exists(this.getAWherePred()) - } + predicate hasTraitBound() { Stages::PathResolutionStage::ref() and exists(this.getABoundPath()) } /** * Holds if this type parameter has no trait bound. Examples: @@ -1145,7 +1170,9 @@ pragma[nomagic] private predicate declares(ItemNode item, Namespace ns, string name) { exists(ItemNode child | child.getImmediateParent() = item | child.getName() = name and - child.getNamespace() = ns + child.getNamespace() = ns and + // If `item` is excluded locally then it does not declare `name`. + not item.excludedLocally(name, child) or useTreeDeclares(child.(Use).getUseTree(), name) and exists(ns) // `use foo::bar` can refer to both a value and a type @@ -1193,38 +1220,27 @@ private ItemNode getOuterScope(ItemNode i) { result = i.getImmediateParent() } -pragma[nomagic] -private ItemNode getAdjustedEnclosing(ItemNode encl0, Namespace ns) { - // functions in `impl` blocks need to use explicit `Self::` to access other - // functions in the `impl` block - if encl0 instanceof ImplOrTraitItemNode and ns.isValue() - then result = encl0.getImmediateParent() - else result = encl0 -} - /** * Holds if the unqualified path `p` references an item named `name`, and `name` * may be looked up in the `ns` namespace inside enclosing item `encl`. */ pragma[nomagic] private predicate unqualifiedPathLookup(ItemNode encl, string name, Namespace ns, RelevantPath p) { - exists(ItemNode encl0 | encl = getAdjustedEnclosing(encl0, ns) | - // lookup in the immediately enclosing item - p.isUnqualified(name) and - encl0.getADescendant() = p and - exists(ns) and - not name = ["crate", "$crate", "super", "self"] - or - // lookup in an outer scope, but only if the item is not declared in inner scope - exists(ItemNode mid | - unqualifiedPathLookup(mid, name, ns, p) and - not declares(mid, ns, name) and - not ( - name = "Self" and - mid = any(ImplOrTraitItemNode i).getAnItemInSelfScope() - ) and - encl0 = getOuterScope(mid) - ) + // lookup in the immediately enclosing item + p.isUnqualified(name) and + encl.getADescendant() = p and + exists(ns) and + not name = ["crate", "$crate", "super", "self"] + or + // lookup in an outer scope, but only if the item is not declared in inner scope + exists(ItemNode mid | + unqualifiedPathLookup(mid, name, ns, p) and + not declares(mid, ns, name) and + not ( + name = "Self" and + mid = any(ImplOrTraitItemNode i).getAnItemInSelfScope() + ) and + encl = getOuterScope(mid) ) } @@ -1245,10 +1261,10 @@ private predicate sourceFileHasCratePathTc(ItemNode i1, ItemNode i2) = /** * Holds if the unqualified path `p` references a keyword item named `name`, and - * `name` may be looked up in the `ns` namespace inside enclosing item `encl`. + * `name` may be looked up inside enclosing item `encl`. */ pragma[nomagic] -private predicate keywordLookup(ItemNode encl, string name, Namespace ns, RelevantPath p) { +private predicate keywordLookup(ItemNode encl, string name, RelevantPath p) { // For `($)crate`, jump directly to the root module exists(ItemNode i | p.isCratePath(name, i) | encl instanceof SourceFile and @@ -1259,18 +1275,17 @@ private predicate keywordLookup(ItemNode encl, string name, Namespace ns, Releva or name = ["super", "self"] and p.isUnqualified(name) and - exists(ItemNode encl0 | - encl0.getADescendant() = p and - encl = getAdjustedEnclosing(encl0, ns) - ) + encl.getADescendant() = p } pragma[nomagic] private ItemNode unqualifiedPathLookup(RelevantPath p, Namespace ns) { - exists(ItemNode encl, string name | result = getASuccessorFull(encl, name, ns) | + exists(ItemNode encl, string name | + result = getASuccessorFull(encl, name, ns) and not encl.excludedLocally(name, result) + | unqualifiedPathLookup(encl, name, ns, p) or - keywordLookup(encl, name, ns, p) + keywordLookup(encl, name, p) and exists(ns) ) } @@ -1291,7 +1306,8 @@ private ItemNode resolvePath0(RelevantPath path, Namespace ns) { or exists(ItemNode q, string name | q = resolvePathQualifier(path, name) and - result = getASuccessorFull(q, name, ns) + result = getASuccessorFull(q, name, ns) and + not q.excludedExternally(name, result) ) or result = resolveUseTreeListItem(_, _, path) and @@ -1436,6 +1452,18 @@ private predicate externCrateEdge(ExternCrateItemNode ec, string name, CrateItem ) } +pragma[nomagic] +private predicate preludeItem(string name, ItemNode i) { + exists(Crate stdOrCore, ModuleLikeNode mod, ModuleItemNode prelude, ModuleItemNode rust | + stdOrCore.getName() = ["std", "core"] and + mod = stdOrCore.getSourceFile() and + prelude = mod.getASuccessorRec("prelude") and + rust = prelude.getASuccessorRec(["rust_2015", "rust_2018", "rust_2021", "rust_2024"]) and + i = rust.getASuccessorRec(name) and + not i instanceof Use + ) +} + /** * Holds if `i` is available inside `f` because it is reexported in * [the `core` prelude][1] or [the `std` prelude][2]. @@ -1448,15 +1476,8 @@ private predicate externCrateEdge(ExternCrateItemNode ec, string name, CrateItem */ pragma[nomagic] private predicate preludeEdge(SourceFile f, string name, ItemNode i) { - not declares(f, _, name) and - exists(Crate stdOrCore, ModuleLikeNode mod, ModuleItemNode prelude, ModuleItemNode rust | - stdOrCore.getName() = ["std", "core"] and - mod = stdOrCore.getSourceFile() and - prelude = mod.getASuccessorRec("prelude") and - rust = prelude.getASuccessorRec(["rust_2015", "rust_2018", "rust_2021", "rust_2024"]) and - i = rust.getASuccessorRec(name) and - not i instanceof Use - ) + preludeItem(name, i) and + not declares(f, _, name) } pragma[nomagic] diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index 77337138a84f..275776741a37 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -7,23 +7,66 @@ private import codeql.rust.internal.CachedStages private import codeql.rust.elements.internal.generated.Raw private import codeql.rust.elements.internal.generated.Synth +/** + * Holds if a dyn trait type should have a type parameter associated with `n`. A + * dyn trait type inherits the type parameters of the trait it implements. That + * includes the type parameters corresponding to associated types. + * + * For instance in + * ```rust + * trait SomeTrait { + * type AssociatedType; + * } + * ``` + * this predicate holds for the nodes `A` and `type AssociatedType`. + */ +private predicate dynTraitTypeParameter(Trait trait, AstNode n) { + trait = any(DynTraitTypeRepr dt).getTrait() and + ( + n = trait.getGenericParamList().getATypeParam() or + n = trait.(TraitItemNode).getAnAssocItem().(TypeAlias) + ) +} + cached newtype TType = - TUnit() or - TStruct(Struct s) { Stages::TypeInferenceStage::ref() } or + TTuple(int arity) { + arity = + [ + any(TupleTypeRepr t).getNumberOfFields(), + any(TupleExpr e).getNumberOfFields(), + any(TuplePat p).getNumberOfFields() + ] and + Stages::TypeInferenceStage::ref() + } or + TStruct(Struct s) or TEnum(Enum e) or TTrait(Trait t) or TArrayType() or // todo: add size? TRefType() or // todo: add mut? TImplTraitType(ImplTraitTypeRepr impl) or + TDynTraitType(Trait t) { t = any(DynTraitTypeRepr dt).getTrait() } or TSliceType() or + TTupleTypeParameter(int arity, int i) { exists(TTuple(arity)) and i in [0 .. arity - 1] } or TTypeParamTypeParameter(TypeParam t) or TAssociatedTypeTypeParameter(TypeAlias t) { any(TraitItemNode trait).getAnAssocItem() = t } or TArrayTypeParameter() or + TDynTraitTypeParameter(AstNode n) { dynTraitTypeParameter(_, n) } or + TImplTraitTypeParameter(ImplTraitTypeRepr implTrait, TypeParam tp) { + implTraitTypeParam(implTrait, _, tp) + } or TRefTypeParameter() or TSelfTypeParameter(Trait t) or TSliceTypeParameter() +private predicate implTraitTypeParam(ImplTraitTypeRepr implTrait, int i, TypeParam tp) { + implTrait.isInReturnPos() and + tp = implTrait.getFunction().getGenericParamList().getTypeParam(i) and + // Only include type parameters of the function that occur inside the impl + // trait type. + exists(Path path | path.getParentNode*() = implTrait and resolvePath(path) = tp) +} + /** * A type without type arguments. * @@ -55,21 +98,33 @@ abstract class Type extends TType { abstract Location getLocation(); } -/** The unit type `()`. */ -class UnitType extends Type, TUnit { - UnitType() { this = TUnit() } +/** A tuple type `(T, ...)`. */ +class TupleType extends Type, TTuple { + private int arity; + + TupleType() { this = TTuple(arity) } override StructField getStructField(string name) { none() } override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { none() } + override TypeParameter getTypeParameter(int i) { result = TTupleTypeParameter(arity, i) } - override string toString() { result = "()" } + /** Gets the arity of this tuple type. */ + int getArity() { result = arity } + + override string toString() { result = "(T_" + arity + ")" } override Location getLocation() { result instanceof EmptyLocation } } +/** The unit type `()`. */ +class UnitType extends TupleType, TTuple { + UnitType() { this = TTuple(0) } + + override string toString() { result = "()" } +} + abstract private class StructOrEnumType extends Type { abstract ItemNode asItemNode(); } @@ -219,13 +274,38 @@ class ImplTraitType extends Type, TImplTraitType { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { none() } + override TypeParameter getTypeParameter(int i) { + exists(TypeParam tp | + implTraitTypeParam(impl, i, tp) and + result = TImplTraitTypeParameter(impl, tp) + ) + } override string toString() { result = impl.toString() } override Location getLocation() { result = impl.getLocation() } } +class DynTraitType extends Type, TDynTraitType { + Trait trait; + + DynTraitType() { this = TDynTraitType(trait) } + + override StructField getStructField(string name) { none() } + + override TupleField getTupleField(int i) { none() } + + override DynTraitTypeParameter getTypeParameter(int i) { + result = TDynTraitTypeParameter(trait.getGenericParamList().getTypeParam(i)) + } + + Trait getTrait() { result = trait } + + override string toString() { result = "dyn " + trait.getName().toString() } + + override Location getLocation() { result = trait.getLocation() } +} + /** * An [impl Trait in return position][1] type, for example: * @@ -238,7 +318,7 @@ class ImplTraitType extends Type, TImplTraitType { class ImplTraitReturnType extends ImplTraitType { private Function function; - ImplTraitReturnType() { impl = function.getRetType().getTypeRepr() } + ImplTraitReturnType() { impl.isInReturnPos() and function = impl.getFunction() } override Function getFunction() { result = function } } @@ -329,6 +409,30 @@ class AssociatedTypeTypeParameter extends TypeParameter, TAssociatedTypeTypePara override Location getLocation() { result = typeAlias.getLocation() } } +/** + * A tuple type parameter. For instance the `T` in `(T, U)`. + * + * Since tuples are structural their type parameters can be represented as their + * positional index. The type inference library requires that type parameters + * belong to a single type, so we also include the arity of the tuple type. + */ +class TupleTypeParameter extends TypeParameter, TTupleTypeParameter { + private int arity; + private int index; + + TupleTypeParameter() { this = TTupleTypeParameter(arity, index) } + + override string toString() { result = index.toString() + "(" + arity + ")" } + + override Location getLocation() { result instanceof EmptyLocation } + + /** Gets the index of this tuple type parameter. */ + int getIndex() { result = index } + + /** Gets the tuple type that corresponds to this tuple type parameter. */ + TupleType getTupleType() { result = TTuple(arity) } +} + /** An implicit array type parameter. */ class ArrayTypeParameter extends TypeParameter, TArrayTypeParameter { override string toString() { result = "[T;...]" } @@ -336,6 +440,53 @@ class ArrayTypeParameter extends TypeParameter, TArrayTypeParameter { override Location getLocation() { result instanceof EmptyLocation } } +class DynTraitTypeParameter extends TypeParameter, TDynTraitTypeParameter { + private AstNode n; + + DynTraitTypeParameter() { this = TDynTraitTypeParameter(n) } + + Trait getTrait() { dynTraitTypeParameter(result, n) } + + /** Gets the dyn trait type that this type parameter belongs to. */ + DynTraitType getDynTraitType() { result.getTrait() = this.getTrait() } + + /** Gets the `TypeParam` of this dyn trait type parameter, if any. */ + TypeParam getTypeParam() { result = n } + + /** Gets the `TypeAlias` of this dyn trait type parameter, if any. */ + TypeAlias getTypeAlias() { result = n } + + /** Gets the trait type parameter that this dyn trait type parameter corresponds to. */ + TypeParameter getTraitTypeParameter() { + result.(TypeParamTypeParameter).getTypeParam() = n + or + result.(AssociatedTypeTypeParameter).getTypeAlias() = n + } + + private string toStringInner() { + result = [this.getTypeParam().toString(), this.getTypeAlias().getName().toString()] + } + + override string toString() { result = "dyn(" + this.toStringInner() + ")" } + + override Location getLocation() { result = n.getLocation() } +} + +class ImplTraitTypeParameter extends TypeParameter, TImplTraitTypeParameter { + private TypeParam typeParam; + private ImplTraitTypeRepr implTrait; + + ImplTraitTypeParameter() { this = TImplTraitTypeParameter(implTrait, typeParam) } + + TypeParam getTypeParam() { result = typeParam } + + ImplTraitTypeRepr getImplTraitTypeRepr() { result = implTrait } + + override string toString() { result = "impl(" + typeParam.toString() + ")" } + + override Location getLocation() { result = typeParam.getLocation() } +} + /** An implicit reference type parameter. */ class RefTypeParameter extends TypeParameter, TRefTypeParameter { override string toString() { result = "&T" } @@ -420,6 +571,12 @@ final class ImplTypeAbstraction extends TypeAbstraction, Impl { } } +final class DynTypeAbstraction extends TypeAbstraction, DynTraitTypeRepr { + override TypeParameter getATypeParameter() { + result = any(DynTraitTypeParameter tp | tp.getTrait() = this.getTrait()).getTraitTypeParameter() + } +} + final class TraitTypeAbstraction extends TypeAbstraction, Trait { override TypeParameter getATypeParameter() { result.(TypeParamTypeParameter).getTypeParam() = this.getGenericParamList().getATypeParam() @@ -443,5 +600,7 @@ final class SelfTypeBoundTypeAbstraction extends TypeAbstraction, Name { } final class ImplTraitTypeReprAbstraction extends TypeAbstraction, ImplTraitTypeRepr { - override TypeParameter getATypeParameter() { none() } + override TypeParameter getATypeParameter() { + implTraitTypeParam(this, _, result.(TypeParamTypeParameter).getTypeParam()) + } } diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll index 5ebb8eaa3175..f0f52da2375b 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll @@ -83,30 +83,52 @@ private module Input1 implements InputSig1 { int getTypeParameterId(TypeParameter tp) { tp = - rank[result](TypeParameter tp0, int kind, int id | + rank[result](TypeParameter tp0, int kind, int id1, int id2 | tp0 instanceof ArrayTypeParameter and kind = 0 and - id = 0 + id1 = 0 and + id2 = 0 or tp0 instanceof RefTypeParameter and kind = 0 and - id = 1 + id1 = 0 and + id2 = 1 or tp0 instanceof SliceTypeParameter and kind = 0 and - id = 2 + id1 = 0 and + id2 = 2 or kind = 1 and - exists(AstNode node | id = idOfTypeParameterAstNode(node) | + id1 = 0 and + id2 = + idOfTypeParameterAstNode([ + tp0.(DynTraitTypeParameter).getTypeParam().(AstNode), + tp0.(DynTraitTypeParameter).getTypeAlias() + ]) + or + kind = 2 and + id1 = idOfTypeParameterAstNode(tp0.(ImplTraitTypeParameter).getImplTraitTypeRepr()) and + id2 = idOfTypeParameterAstNode(tp0.(ImplTraitTypeParameter).getTypeParam()) + or + kind = 3 and + id1 = 0 and + exists(AstNode node | id2 = idOfTypeParameterAstNode(node) | node = tp0.(TypeParamTypeParameter).getTypeParam() or node = tp0.(AssociatedTypeTypeParameter).getTypeAlias() or node = tp0.(SelfTypeParameter).getTrait() or node = tp0.(ImplTraitTypeTypeParameter).getImplTraitTypeRepr() ) + or + kind = 4 and + id1 = tp0.(TupleTypeParameter).getTupleType().getArity() and + id2 = tp0.(TupleTypeParameter).getIndex() | - tp0 order by kind, id + tp0 order by kind, id1, id2 ) } + + int getTypePathLimit() { result = 10 } } private import Input1 @@ -115,6 +137,8 @@ private module M1 = Make1; private import M1 +predicate getTypePathLimit = Input1::getTypePathLimit/0; + class TypePath = M1::TypePath; module TypePath = M1::TypePath; @@ -127,7 +151,7 @@ private module Input2 implements InputSig2 { TypeMention getABaseTypeMention(Type t) { none() } TypeMention getATypeParameterConstraint(TypeParameter tp) { - result = tp.(TypeParamTypeParameter).getTypeParam().getTypeBoundList().getABound().getTypeRepr() + result = tp.(TypeParamTypeParameter).getTypeParam().getATypeBound().getTypeRepr() or result = tp.(SelfTypeParameter).getTrait() or @@ -160,12 +184,12 @@ private module Input2 implements InputSig2 { exists(Trait trait | abs = trait and condition = trait and - constraint = trait.getTypeBoundList().getABound().getTypeRepr() + constraint = trait.getATypeBound().getTypeRepr() ) or // trait bounds on type parameters exists(TypeParam param | - abs = param.getTypeBoundList().getABound() and + abs = param.getATypeBound() and condition = param and constraint = abs.(TypeBound).getTypeRepr() ) @@ -182,6 +206,14 @@ private module Input2 implements InputSig2 { condition = impl and constraint = impl.getTypeBoundList().getABound().getTypeRepr() ) + or + // a `dyn Trait` type implements `Trait`. See the comment on + // `DynTypeBoundListMention` for further details. + exists(DynTraitTypeRepr object | + abs = object and + condition = object.getTypeBoundList() and + constraint = object.getTrait() + ) } } @@ -189,7 +221,13 @@ private module M2 = Make2; private import M2 -module Consistency = M2::Consistency; +module Consistency { + import M2::Consistency + + query predicate nonUniqueCertainType(AstNode n, TypePath path) { + strictcount(CertainTypeInference::inferCertainType(n, path)) > 1 + } +} /** Gets the type annotation that applies to `n`, if any. */ private TypeMention getTypeAnnotation(AstNode n) { @@ -217,6 +255,134 @@ private Type inferAnnotatedType(AstNode n, TypePath path) { result = getTypeAnnotation(n).resolveTypeAt(path) } +/** Module for inferring certain type information. */ +private module CertainTypeInference { + /** Holds if the type mention does not contain any inferred types `_`. */ + predicate typeMentionIsComplete(TypeMention tm) { + not exists(InferTypeRepr t | t.getParentNode*() = tm) + } + + /** + * Holds if `ce` is a call where we can infer the type with certainty and if + * `f` is the target of the call and `p` the path invoked by the call. + * + * Necessary conditions for this are: + * - We are certain of the call target (i.e., the call target can not depend on type information). + * - The declared type of the function does not contain any generics that we + * need to infer. + * - The call does not contain any arguments, as arguments in calls are coercion sites. + * + * The current requirements are made to allow for call to `new` functions such + * as `Vec::new()` but not much more. + */ + predicate certainCallExprTarget(CallExpr ce, Function f, Path p) { + p = CallExprImpl::getFunctionPath(ce) and + f = resolvePath(p) and + // The function is not in a trait + not any(TraitItemNode t).getAnAssocItem() = f and + // The function is not in a trait implementation + not any(ImplItemNode impl | impl.(Impl).hasTrait()).getAnAssocItem() = f and + // The function does not have parameters. + not f.getParamList().hasSelfParam() and + f.getParamList().getNumberOfParams() = 0 and + // The function is not async. + not f.isAsync() and + // For now, exclude functions in macro expansions. + not ce.isInMacroExpansion() and + // The function has no type parameters. + not f.hasGenericParamList() and + // The function does not have `impl` types among its parameters (these are type parameters). + not any(ImplTraitTypeRepr itt | not itt.isInReturnPos()).getFunction() = f and + ( + not exists(ImplItemNode impl | impl.getAnAssocItem() = f) + or + // If the function is in an impl then the impl block has no type + // parameters or all the type parameters are given explicitly. + exists(ImplItemNode impl | impl.getAnAssocItem() = f | + not impl.(Impl).hasGenericParamList() or + impl.(Impl).getGenericParamList().getNumberOfGenericParams() = + p.getQualifier().getSegment().getGenericArgList().getNumberOfGenericArgs() + ) + ) + } + + private ImplItemNode getFunctionImpl(FunctionItemNode f) { result.getAnAssocItem() = f } + + Type inferCertainCallExprType(CallExpr ce, TypePath path) { + exists(Function f, Type ty, TypePath prefix, Path p | + certainCallExprTarget(ce, f, p) and + ty = f.getRetType().getTypeRepr().(TypeMention).resolveTypeAt(prefix) + | + if ty.(TypeParamTypeParameter).getTypeParam() = getFunctionImpl(f).getTypeParam(_) + then + exists(TypePath pathToTp, TypePath suffix | + // For type parameters of the `impl` block we must resolve their + // instantiation from the path. For instance, for `impl for Foo` + // and the path `Foo::bar` we must resolve `A` to `i64`. + ty = getFunctionImpl(f).(Impl).getSelfTy().(TypeMention).resolveTypeAt(pathToTp) and + result = p.getQualifier().(TypeMention).resolveTypeAt(pathToTp.appendInverse(suffix)) and + path = prefix.append(suffix) + ) + else ( + result = ty and path = prefix + ) + ) + } + + predicate certainTypeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + prefix1.isEmpty() and + prefix2.isEmpty() and + ( + exists(Variable v | n1 = v.getAnAccess() | + n2 = v.getPat().getName() or n2 = v.getParameter().(SelfParam) + ) + or + // A `let` statement with a type annotation is a coercion site and hence + // is not a certain type equality. + exists(LetStmt let | not let.hasTypeRepr() | + let.getPat() = n1 and + let.getInitializer() = n2 + ) + ) + or + n1 = + any(IdentPat ip | + n2 = ip.getName() and + prefix1.isEmpty() and + if ip.isRef() then prefix2 = TypePath::singleton(TRefTypeParameter()) else prefix2.isEmpty() + ) + } + + pragma[nomagic] + private Type inferCertainTypeEquality(AstNode n, TypePath path) { + exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | + result = inferCertainType(n2, prefix2.appendInverse(suffix)) and + path = prefix1.append(suffix) + | + certainTypeEquality(n, prefix1, n2, prefix2) + or + certainTypeEquality(n2, prefix2, n, prefix1) + ) + } + + /** + * Holds if `n` has complete and certain type information and if `n` has the + * resulting type at `path`. + */ + pragma[nomagic] + Type inferCertainType(AstNode n, TypePath path) { + exists(TypeMention tm | + tm = getTypeAnnotation(n) and + typeMentionIsComplete(tm) and + result = tm.resolveTypeAt(path) + ) + or + result = inferCertainCallExprType(n, path) + or + result = inferCertainTypeEquality(n, path) + } +} + private Type inferLogicalOperationType(AstNode n, TypePath path) { exists(Builtins::BuiltinType t, BinaryLogicalOperation be | n = [be, be.getLhs(), be.getRhs()] and @@ -229,7 +395,7 @@ private Type inferLogicalOperationType(AstNode n, TypePath path) { private Type inferAssignmentOperationType(AstNode n, TypePath path) { n instanceof AssignmentOperation and path.isEmpty() and - result = TUnit() + result instanceof UnitType } pragma[nomagic] @@ -256,15 +422,11 @@ private Struct getRangeType(RangeExpr re) { * through the type equality. */ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + CertainTypeInference::certainTypeEquality(n1, prefix1, n2, prefix2) + or prefix1.isEmpty() and prefix2.isEmpty() and ( - exists(Variable v | n1 = v.getAnAccess() | - n2 = v.getPat().getName() - or - n2 = v.getParameter().(SelfParam) - ) - or exists(LetStmt let | let.getPat() = n1 and let.getInitializer() = n2 @@ -307,13 +469,6 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion() ) or - n1 = - any(IdentPat ip | - n2 = ip.getName() and - prefix1.isEmpty() and - if ip.isRef() then prefix2 = TypePath::singleton(TRefTypeParameter()) else prefix2.isEmpty() - ) - or ( n1 = n2.(RefExpr).getExpr() or n1 = n2.(RefPat).getPat() @@ -321,6 +476,17 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat prefix1.isEmpty() and prefix2 = TypePath::singleton(TRefTypeParameter()) or + exists(int i, int arity | + prefix1.isEmpty() and + prefix2 = TypePath::singleton(TTupleTypeParameter(arity, i)) + | + arity = n2.(TupleExpr).getNumberOfFields() and + n1 = n2.(TupleExpr).getField(i) + or + arity = n2.(TuplePat).getTupleArity() and + n1 = n2.(TuplePat).getField(i) + ) + or exists(BlockExpr be | n1 = be and n2 = be.getStmtList().getTailExpr() and @@ -350,10 +516,24 @@ private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePat prefix2.isEmpty() and s = getRangeType(n1) ) + or + exists(ClosureExpr ce, int index | + n1 = ce and + n2 = ce.getParam(index).getPat() and + prefix1 = closureParameterPath(ce.getNumberOfParams(), index) and + prefix2.isEmpty() + ) + or + n1.(ClosureExpr).getBody() = n2 and + prefix1 = closureReturnPath() and + prefix2.isEmpty() } pragma[nomagic] private Type inferTypeEquality(AstNode n, TypePath path) { + // Don't propagate type information into a node for which we already have + // certain type information. + not exists(CertainTypeInference::inferCertainType(n, _)) and exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | result = inferType(n2, prefix2.appendInverse(suffix)) and path = prefix1.append(suffix) @@ -534,6 +714,12 @@ private Type inferStructExprType(AstNode n, TypePath path) { ) } +pragma[nomagic] +private Type inferTupleRootType(AstNode n) { + // `typeEquality` handles the non-root cases + result = TTuple([n.(TupleExpr).getNumberOfFields(), n.(TuplePat).getTupleArity()]) +} + pragma[nomagic] private Type inferPathExprType(PathExpr pe, TypePath path) { // nullary struct/variant constructors @@ -758,6 +944,8 @@ private module CallExprBaseMatchingInput implements MatchingInputSig { } final class Access extends Call { + Access() { not CertainTypeInference::certainCallExprTarget(this, _, _) } + pragma[nomagic] Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { exists(TypeMention arg | result = arg.resolveTypeAt(path) | @@ -1055,6 +1243,42 @@ private Type inferFieldExprType(AstNode n, TypePath path) { ) } +pragma[nomagic] +private Type inferTupleIndexExprType(FieldExpr fe, TypePath path) { + exists(int i, TypePath path0 | + fe.getIdentifier().getText() = i.toString() and + result = inferType(fe.getContainer(), path0) and + path0.isCons(TTupleTypeParameter(_, i), path) and + fe.getIdentifier().getText() = i.toString() + ) +} + +/** Infers the type of `t` in `t.n` when `t` is a tuple. */ +private Type inferTupleContainerExprType(Expr e, TypePath path) { + // NOTE: For a field expression `t.n` where `n` is a number `t` might be a + // tuple as in: + // ```rust + // let t = (Default::default(), 2); + // let s: String = t.0; + // ``` + // But it could also be a tuple struct as in: + // ```rust + // struct T(String, u32); + // let t = T(Default::default(), 2); + // let s: String = t.0; + // ``` + // We need type information to flow from `t.n` to tuple type parameters of `t` + // in the former case but not the latter case. Hence we include the condition + // that the root type of `t` must be a tuple type. + exists(int i, TypePath path0, FieldExpr fe, int arity | + e = fe.getContainer() and + fe.getIdentifier().getText() = i.toString() and + arity = inferType(fe.getContainer()).(TupleType).getArity() and + result = inferType(fe, path0) and + path = TypePath::cons(TTupleTypeParameter(arity, i), path0) + ) +} + /** Gets the root type of the reference node `ref`. */ pragma[nomagic] private Type inferRefNodeType(AstNode ref) { @@ -1360,6 +1584,122 @@ private Type inferForLoopExprType(AstNode n, TypePath path) { ) } +/** + * An invoked expression, the target of a call that is either a local variable + * or a non-path expression. This means that the expression denotes a + * first-class function. + */ +final private class InvokedClosureExpr extends Expr { + private CallExpr call; + + InvokedClosureExpr() { + call.getFunction() = this and + (not this instanceof PathExpr or this = any(Variable v).getAnAccess()) + } + + Type getTypeAt(TypePath path) { result = inferType(this, path) } + + CallExpr getCall() { result = call } +} + +private module InvokedClosureSatisfiesConstraintInput implements + SatisfiesConstraintInputSig +{ + predicate relevantConstraint(InvokedClosureExpr term, Type constraint) { + exists(term) and + constraint.(TraitType).getTrait() instanceof FnOnceTrait + } +} + +/** Gets the type of `ce` when viewed as an implementation of `FnOnce`. */ +private Type invokedClosureFnTypeAt(InvokedClosureExpr ce, TypePath path) { + SatisfiesConstraint::satisfiesConstraintType(ce, + _, path, result) +} + +/** Gets the path to a closure's return type. */ +private TypePath closureReturnPath() { + result = TypePath::singleton(TDynTraitTypeParameter(any(FnOnceTrait t).getOutputType())) +} + +/** Gets the path to a closure with arity `arity`s `index`th parameter type. */ +pragma[nomagic] +private TypePath closureParameterPath(int arity, int index) { + result = + TypePath::cons(TDynTraitTypeParameter(any(FnOnceTrait t).getTypeParam()), + TypePath::singleton(TTupleTypeParameter(arity, index))) +} + +/** Gets the path to the return type of the `FnOnce` trait. */ +private TypePath fnReturnPath() { + result = TypePath::singleton(TAssociatedTypeTypeParameter(any(FnOnceTrait t).getOutputType())) +} + +/** + * Gets the path to the parameter type of the `FnOnce` trait with arity `arity` + * and index `index`. + */ +pragma[nomagic] +private TypePath fnParameterPath(int arity, int index) { + result = + TypePath::cons(TTypeParamTypeParameter(any(FnOnceTrait t).getTypeParam()), + TypePath::singleton(TTupleTypeParameter(arity, index))) +} + +pragma[nomagic] +private Type inferDynamicCallExprType(Expr n, TypePath path) { + exists(InvokedClosureExpr ce | + // Propagate the function's return type to the call expression + exists(TypePath path0 | result = invokedClosureFnTypeAt(ce, path0) | + n = ce.getCall() and + path = path0.stripPrefix(fnReturnPath()) + or + // Propagate the function's parameter type to the arguments + exists(int index | + n = ce.getCall().getArgList().getArg(index) and + path = path0.stripPrefix(fnParameterPath(ce.getCall().getNumberOfArgs(), index)) + ) + ) + or + // _If_ the invoked expression has the type of a closure, then we propagate + // the surrounding types into the closure. + exists(int arity, TypePath path0 | + ce.getTypeAt(TypePath::nil()).(DynTraitType).getTrait() instanceof FnOnceTrait + | + // Propagate the type of arguments to the parameter types of closure + exists(int index | + n = ce and + arity = ce.getCall().getNumberOfArgs() and + result = inferType(ce.getCall().getArg(index), path0) and + path = closureParameterPath(arity, index).append(path0) + ) + or + // Propagate the type of the call expression to the return type of the closure + n = ce and + arity = ce.getCall().getNumberOfArgs() and + result = inferType(ce.getCall(), path0) and + path = closureReturnPath().append(path0) + ) + ) +} + +pragma[nomagic] +private Type inferClosureExprType(AstNode n, TypePath path) { + exists(ClosureExpr ce | + n = ce and + path.isEmpty() and + result = TDynTraitType(any(FnOnceTrait t)) + or + n = ce and + path = TypePath::singleton(TDynTraitTypeParameter(any(FnOnceTrait t).getTypeParam())) and + result = TTuple(ce.getNumberOfParams()) + or + // Propagate return type annotation to body + n = ce.getBody() and + result = ce.getRetType().getTypeRepr().(TypeMention).resolveTypeAt(path) + ) +} + pragma[nomagic] private Type inferCastExprType(CastExpr ce, TypePath path) { result = ce.getTypeRepr().(TypeMention).resolveTypeAt(path) @@ -1655,10 +1995,16 @@ private Function getMethodFromImpl(MethodCall mc) { bindingset[trait, name] pragma[inline_late] -private Function getTraitMethod(ImplTraitReturnType trait, string name) { +private Function getImplTraitMethod(ImplTraitReturnType trait, string name) { result = getMethodSuccessor(trait.getImplTraitTypeRepr(), name) } +bindingset[traitObject, name] +pragma[inline_late] +private Function getDynTraitMethod(DynTraitType traitObject, string name) { + result = getMethodSuccessor(traitObject.getTrait(), name) +} + pragma[nomagic] private Function resolveMethodCallTarget(MethodCall mc) { // The method comes from an `impl` block targeting the type of the receiver. @@ -1669,7 +2015,10 @@ private Function resolveMethodCallTarget(MethodCall mc) { result = getTypeParameterMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) or // The type of the receiver is an `impl Trait` type. - result = getTraitMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) + result = getImplTraitMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) + or + // The type of the receiver is a trait object `dyn Trait` type. + result = getDynTraitMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) } pragma[nomagic] @@ -1931,6 +2280,8 @@ private module Cached { cached Type inferType(AstNode n, TypePath path) { Stages::TypeInferenceStage::ref() and + result = CertainTypeInference::inferCertainType(n, path) + or result = inferAnnotatedType(n, path) or result = inferLogicalOperationType(n, path) @@ -1943,12 +2294,19 @@ private module Cached { or result = inferStructExprType(n, path) or + result = inferTupleRootType(n) and + path.isEmpty() + or result = inferPathExprType(n, path) or result = inferCallExprBaseType(n, path) or result = inferFieldExprType(n, path) or + result = inferTupleIndexExprType(n, path) + or + result = inferTupleContainerExprType(n, path) + or result = inferRefNodeType(n) and path.isEmpty() or @@ -1971,6 +2329,10 @@ private module Cached { or result = inferForLoopExprType(n, path) or + result = inferDynamicCallExprType(n, path) + or + result = inferClosureExprType(n, path) + or result = inferCastExprType(n, path) or result = inferStructPatType(n, path) @@ -2006,6 +2368,13 @@ private module Debug { result = resolveCallTarget(c) } + predicate debugConditionSatisfiesConstraint( + TypeAbstraction abs, TypeMention condition, TypeMention constraint + ) { + abs = getRelevantLocatable() and + Input2::conditionSatisfiesConstraint(abs, condition, constraint) + } + predicate debugInferImplicitSelfType(SelfParam self, TypePath path, Type t) { self = getRelevantLocatable() and t = inferImplicitSelfType(self, path) @@ -2032,6 +2401,16 @@ private module Debug { result = strictcount(Type t0 | t0 = inferType(n, path)) } + Type debugInferTypeForNodeAtLimit(AstNode n, TypePath path) { + result = inferType(n, path) and + exists(TypePath path0 | exists(inferType(n, path0)) and path0.length() >= getTypePathLimit()) + } + + predicate countTypesForNodeAtLimit(AstNode n, int c) { + n = getRelevantLocatable() and + c = strictcount(Type t, TypePath path | t = debugInferTypeForNodeAtLimit(n, path)) + } + predicate maxTypes(AstNode n, TypePath path, Type t, int c) { c = countTypesAtPath(n, path, t) and c = max(countTypesAtPath(_, _, _)) @@ -2058,4 +2437,10 @@ private module Debug { c = countTypePaths(n, path, t) and c = max(countTypePaths(_, _, _)) } + + Type debugInferCertainNonUniqueType(AstNode n, TypePath path) { + n = getRelevantLocatable() and + Consistency::nonUniqueCertainType(n, path) and + result = CertainTypeInference::inferCertainType(n, path) + } } diff --git a/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll b/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll index 5bcfde94d0b8..fd6257fc2602 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInferenceConsistency.qll @@ -2,8 +2,10 @@ * Provides classes for recognizing type inference inconsistencies. */ +private import rust private import Type private import TypeMention +private import TypeInference private import TypeInference::Consistency as Consistency import TypeInference::Consistency @@ -27,4 +29,7 @@ int getTypeInferenceInconsistencyCounts(string type) { or type = "Ill-formed type mention" and result = count(TypeMention tm | illFormedTypeMention(tm) | tm) + or + type = "Non-unique certain type information" and + result = count(AstNode n, TypePath path | nonUniqueCertainType(n, path) | n) } diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll index 6dd69ef49fc5..f7c5f2f25e0e 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll @@ -1,6 +1,7 @@ /** Provides classes for representing type mentions, used in type inference. */ private import rust +private import codeql.rust.frameworks.stdlib.Stdlib private import Type private import PathResolution private import TypeInference @@ -14,6 +15,30 @@ abstract class TypeMention extends AstNode { final Type resolveType() { result = this.resolveTypeAt(TypePath::nil()) } } +class TupleTypeReprMention extends TypeMention instanceof TupleTypeRepr { + override Type resolveTypeAt(TypePath path) { + path.isEmpty() and + result = TTuple(super.getNumberOfFields()) + or + exists(TypePath suffix, int i | + result = super.getField(i).(TypeMention).resolveTypeAt(suffix) and + path = TypePath::cons(TTupleTypeParameter(super.getNumberOfFields(), i), suffix) + ) + } +} + +class ParenthesizedArgListMention extends TypeMention instanceof ParenthesizedArgList { + override Type resolveTypeAt(TypePath path) { + path.isEmpty() and + result = TTuple(super.getNumberOfTypeArgs()) + or + exists(TypePath suffix, int index | + result = super.getTypeArg(index).getTypeRepr().(TypeMention).resolveTypeAt(suffix) and + path = TypePath::cons(TTupleTypeParameter(super.getNumberOfTypeArgs(), index), suffix) + ) + } +} + class ArrayTypeReprMention extends TypeMention instanceof ArrayTypeRepr { override Type resolveTypeAt(TypePath path) { path.isEmpty() and @@ -50,24 +75,56 @@ class SliceTypeReprMention extends TypeMention instanceof SliceTypeRepr { } } -class PathTypeMention extends TypeMention, Path { - TypeItemNode resolved; +abstract class PathTypeMention extends TypeMention, Path { } + +class AliasPathTypeMention extends PathTypeMention { + TypeAlias resolved; + TypeMention rhs; + + AliasPathTypeMention() { + resolved = resolvePath(this) and + rhs = resolved.getTypeRepr() + } - PathTypeMention() { - resolved = resolvePath(this) + TypeItemNode getResolved() { result = resolved } + + /** + * Holds if this path resolved to a type alias with a rhs. that has the + * resulting type at `typePath`. + */ + pragma[nomagic] + override Type resolveTypeAt(TypePath typePath) { + result = rhs.resolveTypeAt(typePath) and + not result = pathGetTypeParameter(resolved, _) or - resolved = resolvePath(this).(Variant).getEnum() + exists(TypeParameter tp, TypeMention arg, TypePath prefix, TypePath suffix, int i | + tp = rhs.resolveTypeAt(prefix) and + tp = pathGetTypeParameter(resolved, pragma[only_bind_into](i)) and + arg = this.getSegment().getGenericArgList().getTypeArg(pragma[only_bind_into](i)) and + result = arg.resolveTypeAt(suffix) and + typePath = prefix.append(suffix) + ) + } +} + +class NonAliasPathTypeMention extends PathTypeMention { + TypeItemNode resolved; + + NonAliasPathTypeMention() { + resolved = [resolvePath(this), resolvePath(this).(Variant).getEnum().(TypeItemNode)] and + not exists(resolved.(TypeAlias).getTypeRepr()) } TypeItemNode getResolved() { result = resolved } + /** + * Gets a type alias with the name `name` of the trait that this path resolves + * to, if any. + */ pragma[nomagic] private TypeAlias getResolvedTraitAlias(string name) { - exists(TraitItemNode trait | - trait = resolved and - result = trait.getAnAssocItem() and - name = result.getName().getText() - ) + result = resolved.(TraitItemNode).getAnAssocItem() and + name = result.getName().getText() } pragma[nomagic] @@ -115,92 +172,87 @@ class PathTypeMention extends TypeMention, Path { // If a type argument is not given in the path, then we use the default for // the type parameter if one exists for the type. not exists(this.getPositionalTypeArgument0(i)) and - result = this.resolveType().getTypeParameterDefault(i) and + result = this.resolveRootType().getTypeParameterDefault(i) and // Defaults only apply to type mentions in type annotations this = any(PathTypeRepr ptp).getPath().getQualifier*() } - /** - * Holds if this path resolved to a type alias with a rhs. that has the - * resulting type at `typePath`. - */ + /** Gets the type mention in this path for the type parameter `tp`, if any. */ pragma[nomagic] - private Type aliasResolveTypeAt(TypePath typePath) { - exists(TypeAlias alias, TypeMention rhs | alias = resolved and rhs = alias.getTypeRepr() | - result = rhs.resolveTypeAt(typePath) and - not result = pathGetTypeParameter(alias, _) + private TypeMention getTypeMentionForTypeParameter(TypeParameter tp) { + exists(int i | + result = this.getPositionalTypeArgument(pragma[only_bind_into](i)) and + tp = this.resolveRootType().getTypeParameter(pragma[only_bind_into](i)) + ) + or + exists(TypeAlias alias | + result = this.getAnAssocTypeArgument(alias) and + tp = TAssociatedTypeTypeParameter(alias) + ) + or + // If `path` is the trait of an `impl` block then any associated types + // defined in the `impl` block are type arguments to the trait. + // + // For instance, for a trait implementation like this + // ```rust + // impl MyTrait for MyType { + // ^^^^^^^ path + // type AssociatedType = i64 + // ^^^ result + // // ... + // } + // ``` + // the rhs. of the type alias is a type argument to the trait. + exists(ImplItemNode impl, AssociatedTypeTypeParameter param, TypeAlias alias, string name | + this = impl.getTraitPath() and + param.getTrait() = resolved and + name = param.getTypeAlias().getName().getText() and + alias = impl.getASuccessor(pragma[only_bind_into](name)) and + result = alias.getTypeRepr() and + tp = + TAssociatedTypeTypeParameter(resolved + .(TraitItemNode) + .getAssocItem(pragma[only_bind_into](name))) + ) + or + // Handle the special syntactic sugar for function traits. For now we only + // support `FnOnce` as we can't support the "inherited" associated types of + // `Fn` and `FnMut` yet. + exists(FnOnceTrait t | t = resolved | + tp = TTypeParamTypeParameter(t.getTypeParam()) and + result = this.getSegment().getParenthesizedArgList() or - exists(TypeParameter tp, TypeMention arg, TypePath prefix, TypePath suffix, int i | - tp = rhs.resolveTypeAt(prefix) and - tp = pathGetTypeParameter(alias, pragma[only_bind_into](i)) and - arg = this.getSegment().getGenericArgList().getTypeArg(pragma[only_bind_into](i)) and - result = arg.resolveTypeAt(suffix) and - typePath = prefix.append(suffix) - ) + tp = TAssociatedTypeTypeParameter(t.getOutputType()) and + result = this.getSegment().getRetType().getTypeRepr() ) } - override Type resolveTypeAt(TypePath typePath) { - result = this.aliasResolveTypeAt(typePath) + pragma[nomagic] + private Type resolveRootType() { + result = TStruct(resolved) or - typePath.isEmpty() and - ( - result = TStruct(resolved) - or - result = TEnum(resolved) - or - exists(TraitItemNode trait | trait = resolved | - // If this is a `Self` path, then it resolves to the implicit `Self` - // type parameter, otherwise it is a trait bound. - if this = trait.getASelfPath() - then result = TSelfTypeParameter(trait) - else result = TTrait(trait) - ) - or - result = TTypeParamTypeParameter(resolved) - or - result = TAssociatedTypeTypeParameter(resolved) + result = TEnum(resolved) + or + exists(TraitItemNode trait | trait = resolved | + // If this is a `Self` path, then it resolves to the implicit `Self` + // type parameter, otherwise it is a trait bound. + if this = trait.getASelfPath() + then result = TSelfTypeParameter(trait) + else result = TTrait(trait) ) or - not exists(resolved.(TypeAlias).getTypeRepr()) and - exists(TypeParameter tp, TypeMention arg, TypePath suffix | - result = arg.resolveTypeAt(suffix) and + result = TTypeParamTypeParameter(resolved) + or + result = TAssociatedTypeTypeParameter(resolved) + } + + override Type resolveTypeAt(TypePath typePath) { + typePath.isEmpty() and + result = this.resolveRootType() + or + exists(TypeParameter tp, TypePath suffix | + result = this.getTypeMentionForTypeParameter(tp).resolveTypeAt(suffix) and typePath = TypePath::cons(tp, suffix) - | - exists(int i | - arg = this.getPositionalTypeArgument(pragma[only_bind_into](i)) and - tp = this.resolveType().getTypeParameter(pragma[only_bind_into](i)) - ) - or - exists(TypeAlias alias | - arg = this.getAnAssocTypeArgument(alias) and - tp = TAssociatedTypeTypeParameter(alias) - ) - or - // If `path` is the trait of an `impl` block then any associated types - // defined in the `impl` block are type arguments to the trait. - // - // For instance, for a trait implementation like this - // ```rust - // impl MyTrait for MyType { - // ^^^^^^^ path - // type AssociatedType = i64 - // ^^^ result - // // ... - // } - // ``` - // the rhs. of the type alias is a type argument to the trait. - exists(ImplItemNode impl, AssociatedTypeTypeParameter param, TypeAlias alias, string name | - this = impl.getTraitPath() and - param.getTrait() = resolved and - name = param.getTypeAlias().getName().getText() and - alias = impl.getASuccessor(pragma[only_bind_into](name)) and - arg = alias.getTypeRepr() and - tp = - TAssociatedTypeTypeParameter(resolved - .(TraitItemNode) - .getAssocItem(pragma[only_bind_into](name))) - ) ) } } @@ -217,6 +269,12 @@ class ImplTraitTypeReprMention extends TypeMention instanceof ImplTraitTypeRepr override Type resolveTypeAt(TypePath typePath) { typePath.isEmpty() and result.(ImplTraitType).getImplTraitTypeRepr() = this + or + exists(ImplTraitTypeParameter tp | + this = tp.getImplTraitTypeRepr() and + typePath = TypePath::singleton(tp) and + result = TTypeParamTypeParameter(tp.getTypeParam()) + ) } } @@ -268,3 +326,64 @@ class SelfTypeParameterMention extends TypeMention instanceof Name { result = TSelfTypeParameter(trait) } } + +class DynTraitTypeReprMention extends TypeMention instanceof DynTraitTypeRepr { + private DynTraitType dynType; + + DynTraitTypeReprMention() { + // This excludes `DynTraitTypeRepr` elements where `getTrait` is not + // defined, i.e., where path resolution can't find a trait. + dynType.getTrait() = super.getTrait() + } + + override Type resolveTypeAt(TypePath path) { + path.isEmpty() and + result = dynType + or + exists(DynTraitTypeParameter tp, TypePath path0, TypePath suffix | + dynType = tp.getDynTraitType() and + path = TypePath::cons(tp, suffix) and + result = super.getTypeBoundList().getBound(0).getTypeRepr().(TypeMention).resolveTypeAt(path0) and + path0.isCons(tp.getTraitTypeParameter(), suffix) + ) + } +} + +// We want a type of the form `dyn Trait` to implement `Trait`. If `Trait` has +// type parameters then `dyn Trait` has equivalent type parameters and the +// implementation should be abstracted over them. +// +// Intuitively we want something to the effect of: +// ``` +// impl Trait for (dyn Trait) +// ``` +// To achieve this: +// - `DynTypeAbstraction` is an abstraction over type parameters of the trait. +// - `DynTypeBoundListMention` (this class) is a type mention which has `dyn +// Trait` at the root and which for every type parameter of `dyn Trait` has the +// corresponding type parameter of the trait. +// - `TraitMention` (which is used for other things as well) is a type mention +// for the trait applied to its own type parameters. +// +// We arbitrarily use the `TypeBoundList` inside `DynTraitTypeRepr` to encode +// this type mention, since it doesn't syntactically appear in the AST. This +// works because there is a one-to-one correspondence between a trait object and +// its list of type bounds. +class DynTypeBoundListMention extends TypeMention instanceof TypeBoundList { + private Trait trait; + + DynTypeBoundListMention() { + exists(DynTraitTypeRepr dyn | this = dyn.getTypeBoundList() and trait = dyn.getTrait()) + } + + override Type resolveTypeAt(TypePath path) { + path.isEmpty() and + result.(DynTraitType).getTrait() = trait + or + exists(DynTraitTypeParameter tp | + trait = tp.getTrait() and + path = TypePath::singleton(tp) and + result = tp.getTraitTypeParameter() + ) + } +} diff --git a/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll b/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll index 559509ad9f8e..0961efd553fd 100644 --- a/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/CleartextLoggingExtensions.qll @@ -5,7 +5,7 @@ import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.rust.dataflow.FlowSink private import codeql.rust.security.SensitiveData private import codeql.rust.Concepts @@ -40,6 +40,6 @@ module CleartextLogging { * A sink for logging from model data. */ private class ModelsAsDataSink extends Sink { - ModelsAsDataSink() { exists(string s | sinkNode(this, s) and s.matches("log-injection%")) } + ModelsAsDataSink() { sinkNode(this, "log-injection") } } } diff --git a/rust/ql/lib/codeql/rust/security/CryptoAlgorithms.qll b/rust/ql/lib/codeql/rust/security/CryptoAlgorithms.qll index 7176c666c573..13a03a3bd888 100644 --- a/rust/ql/lib/codeql/rust/security/CryptoAlgorithms.qll +++ b/rust/ql/lib/codeql/rust/security/CryptoAlgorithms.qll @@ -1,117 +1,5 @@ /** * Provides classes modeling cryptographic algorithms, separated into strong and weak variants. - * - * The classification into strong and weak are based on Wikipedia, OWASP and Google (2021). */ -private import internal.CryptoAlgorithmNames - -/** - * A cryptographic algorithm. - */ -private newtype TCryptographicAlgorithm = - MkHashingAlgorithm(string name, boolean isWeak) { - isStrongHashingAlgorithm(name) and isWeak = false - or - isWeakHashingAlgorithm(name) and isWeak = true - } or - MkEncryptionAlgorithm(string name, boolean isWeak) { - isStrongEncryptionAlgorithm(name) and isWeak = false - or - isWeakEncryptionAlgorithm(name) and isWeak = true - } or - MkPasswordHashingAlgorithm(string name, boolean isWeak) { - isStrongPasswordHashingAlgorithm(name) and isWeak = false - or - isWeakPasswordHashingAlgorithm(name) and isWeak = true - } - -/** - * Gets the most specific `CryptographicAlgorithm` that matches the given `name`. - * A matching algorithm is one where the name of the algorithm matches the start of name, with allowances made for different name formats. - * In the case that multiple `CryptographicAlgorithm`s match the given `name`, the algorithm(s) with the longest name will be selected. This is intended to select more specific versions of algorithms when multiple versions could match - for example "SHA3_224" matches against both "SHA3" and "SHA3224", but the latter is a more precise match. - */ -bindingset[name] -private CryptographicAlgorithm getBestAlgorithmForName(string name) { - result = - max(CryptographicAlgorithm algorithm | - algorithm.getName() = - [ - name.toUpperCase(), // the full name - name.toUpperCase().regexpCapture("^([\\w]+)(?:-.*)?$", 1), // the name prior to any dashes or spaces - name.toUpperCase().regexpCapture("^([A-Z0-9]+)(?:(-|_).*)?$", 1) // the name prior to any dashes, spaces, or underscores - ].regexpReplaceAll("[-_ ]", "") // strip dashes, underscores, and spaces - | - algorithm order by algorithm.getName().length() - ) -} - -/** - * A cryptographic algorithm. - */ -abstract class CryptographicAlgorithm extends TCryptographicAlgorithm { - /** Gets a textual representation of this element. */ - string toString() { result = this.getName() } - - /** - * Gets the normalized name of this algorithm (upper-case, no spaces, dashes or underscores). - */ - abstract string getName(); - - /** - * Holds if the name of this algorithm is the most specific match for `name`. - * This predicate matches quite liberally to account for different ways of formatting algorithm names, e.g. using dashes, underscores, or spaces as separators, including or not including block modes of operation, etc. - */ - bindingset[name] - predicate matchesName(string name) { this = getBestAlgorithmForName(name) } - - /** - * Holds if this algorithm is weak. - */ - abstract predicate isWeak(); -} - -/** - * A hashing algorithm such as `MD5` or `SHA512`. - */ -class HashingAlgorithm extends MkHashingAlgorithm, CryptographicAlgorithm { - string name; - boolean isWeak; - - HashingAlgorithm() { this = MkHashingAlgorithm(name, isWeak) } - - override string getName() { result = name } - - override predicate isWeak() { isWeak = true } -} - -/** - * An encryption algorithm such as `DES` or `AES512`. - */ -class EncryptionAlgorithm extends MkEncryptionAlgorithm, CryptographicAlgorithm { - string name; - boolean isWeak; - - EncryptionAlgorithm() { this = MkEncryptionAlgorithm(name, isWeak) } - - override string getName() { result = name } - - override predicate isWeak() { isWeak = true } - - /** Holds if this algorithm is a stream cipher. */ - predicate isStreamCipher() { isStreamCipher(name) } -} - -/** - * A password hashing algorithm such as `PBKDF2` or `SCRYPT`. - */ -class PasswordHashingAlgorithm extends MkPasswordHashingAlgorithm, CryptographicAlgorithm { - string name; - boolean isWeak; - - PasswordHashingAlgorithm() { this = MkPasswordHashingAlgorithm(name, isWeak) } - - override string getName() { result = name } - - override predicate isWeak() { isWeak = true } -} +import codeql.concepts.CryptoAlgorithms diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll new file mode 100644 index 000000000000..785a7f815bcd --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -0,0 +1,109 @@ +/** + * Provides classes and predicates for reasoning about hard-coded cryptographic value + * vulnerabilities. + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSource +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.Concepts +private import codeql.rust.security.SensitiveData + +/** + * A kind of cryptographic value. + */ +class CryptographicValueKind extends string { + CryptographicValueKind() { this = ["password", "key", "iv", "nonce", "salt"] } + + /** + * Gets a description of this value kind for user-facing messages. + */ + string getDescription() { + this = "password" and result = "a password" + or + this = "key" and result = "a key" + or + this = "iv" and result = "an initialization vector" + or + this = "nonce" and result = "a nonce" + or + this = "salt" and result = "a salt" + } +} + +/** + * Provides default sources, sinks and barriers for detecting hard-coded cryptographic + * value vulnerabilities, as well as extension points for adding your own. + */ +module HardcodedCryptographicValue { + /** + * A data flow source for hard-coded cryptographic value vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for hard-coded cryptographic value vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "HardcodedCryptographicValue" } + + /** + * Gets the kind of credential this sink is interpreted as. + */ + abstract CryptographicValueKind getKind(); + } + + /** + * A barrier for hard-coded cryptographic value vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * A literal, considered as a flow source. + */ + private class LiteralSource extends Source { + LiteralSource() { this.asExpr().getExpr() instanceof LiteralExpr } + } + + /** + * An array initialized from a list of literals, considered as a single flow source. For example: + * ``` + * `[0, 0, 0, 0]` + * ``` + */ + private class ArrayListSource extends Source { + ArrayListSource() { this.asExpr().getExpr().(ArrayListExpr).getExpr(_) instanceof LiteralExpr } + } + + /** + * An externally modeled source for constant values. + */ + private class ModeledSource extends Source { + ModeledSource() { sourceNode(this, "constant-source") } + } + + /** + * An externally modeled sink for hard-coded cryptographic value vulnerabilities. + */ + private class ModelsAsDataSinks extends Sink { + CryptographicValueKind kind; + + ModelsAsDataSinks() { sinkNode(this, "credentials-" + kind) } + + override CryptographicValueKind getKind() { result = kind } + } + + /** + * A call to `getrandom` that is a barrier. + */ + private class GetRandomBarrier extends Barrier { + GetRandomBarrier() { + exists(CallExprBase ce | + ce.getStaticTarget().(Addressable).getCanonicalPath() = + ["getrandom::fill", "getrandom::getrandom"] and + this.asExpr().getExpr().getParentNode*() = ce.getArgList().getArg(0) + ) + } + } +} diff --git a/rust/ql/lib/codeql/rust/security/SensitiveData.qll b/rust/ql/lib/codeql/rust/security/SensitiveData.qll index bf3364abdb6b..4e6ba21a2d28 100644 --- a/rust/ql/lib/codeql/rust/security/SensitiveData.qll +++ b/rust/ql/lib/codeql/rust/security/SensitiveData.qll @@ -6,7 +6,7 @@ */ import rust -import internal.SensitiveDataHeuristics +import codeql.concepts.internal.SensitiveDataHeuristics private import codeql.rust.dataflow.DataFlow /** diff --git a/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll index 8ead5ac684ac..f2921ef0cc13 100644 --- a/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/SqlInjectionExtensions.qll @@ -6,7 +6,7 @@ import rust private import codeql.rust.dataflow.DataFlow -private import codeql.rust.dataflow.internal.DataFlowImpl +private import codeql.rust.dataflow.FlowSink private import codeql.rust.Concepts private import codeql.util.Unit diff --git a/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll b/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll index 5f8d8b77ee82..9310999bd3dd 100644 --- a/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll @@ -69,7 +69,8 @@ module SanitizerGuard { */ private class DotDotCheck extends SanitizerGuard::Range, CfgNodes::MethodCallExprCfgNode { DotDotCheck() { - this.getAstNode().(Resolvable).getResolvedPath() = "::contains" and + this.getAstNode().(CallExprBase).getStaticTarget().(Addressable).getCanonicalPath() = + ["::contains", "::contains"] and this.getArgument(0).getAstNode().(LiteralExpr).getTextValue() = ["\"..\"", "\"../\"", "\"..\\\""] } diff --git a/rust/ql/lib/codeql/rust/security/internal/CryptoAlgorithmNames.qll b/rust/ql/lib/codeql/rust/security/internal/CryptoAlgorithmNames.qll deleted file mode 100644 index 8bb63d97876a..000000000000 --- a/rust/ql/lib/codeql/rust/security/internal/CryptoAlgorithmNames.qll +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Names of cryptographic algorithms, separated into strong and weak variants. - * - * The names are normalized: upper-case, no spaces, dashes or underscores. - * - * The names are inspired by the names used in real world crypto libraries. - * - * The classification into strong and weak are based on Wikipedia, OWASP and Google (2021). - */ - -/** - * Holds if `name` corresponds to a strong hashing algorithm. - */ -predicate isStrongHashingAlgorithm(string name) { - name = - [ - // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#blake2 - // and https://www.blake2.net/ - "BLAKE2", "BLAKE2B", "BLAKE2S", - // see https://github.com/BLAKE3-team/BLAKE3 - "BLAKE3", - // - "DSA", "ED25519", "ES256", "ECDSA256", "ES384", "ECDSA384", "ES512", "ECDSA512", "SHA2", - "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "SHA3224", "SHA3256", "SHA3384", "SHA3512", - // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#cryptography.hazmat.primitives.hashes.SHAKE128 - "SHAKE128", "SHAKE256", - // see https://cryptography.io/en/latest/hazmat/primitives/cryptographic-hashes/#sm3 - "SM3", - // see https://security.stackexchange.com/a/216297 - "WHIRLPOOL", - ] -} - -/** - * Holds if `name` corresponds to a weak hashing algorithm. - */ -predicate isWeakHashingAlgorithm(string name) { - name = - [ - "HAVEL128", "MD2", "MD4", "MD5", "PANAMA", "RIPEMD", "RIPEMD128", "RIPEMD256", "RIPEMD160", - "RIPEMD320", "SHA0", "SHA1" - ] -} - -/** - * Holds if `name` corresponds to a strong encryption algorithm. - */ -predicate isStrongEncryptionAlgorithm(string name) { - name = - [ - "AES", "AES128", "AES192", "AES256", "AES512", "AES-128", "AES-192", "AES-256", "AES-512", - "ARIA", "BLOWFISH", "BF", "ECIES", "CAST", "CAST5", "CAMELLIA", "CAMELLIA128", "CAMELLIA192", - "CAMELLIA256", "CAMELLIA-128", "CAMELLIA-192", "CAMELLIA-256", "CHACHA", "GOST", "GOST89", - "IDEA", "RABBIT", "RSA", "SEED", "SM4" - ] -} - -/** - * Holds if `name` corresponds to a weak encryption algorithm. - */ -predicate isWeakEncryptionAlgorithm(string name) { - name = - [ - "DES", "3DES", "DES3", "TRIPLEDES", "DESX", "TDEA", "TRIPLEDEA", "ARC2", "RC2", "ARC4", "RC4", - "ARCFOUR", "ARC5", "RC5" - ] -} - -/** - * Holds if `name` corresponds to a strong password hashing algorithm. - */ -predicate isStrongPasswordHashingAlgorithm(string name) { - name = ["ARGON2", "PBKDF2", "BCRYPT", "SCRYPT"] -} - -/** - * Holds if `name` corresponds to a weak password hashing algorithm. - */ -predicate isWeakPasswordHashingAlgorithm(string name) { name = "EVPKDF" } - -/** - * Holds if `name` corresponds to a stream cipher. - */ -predicate isStreamCipher(string name) { name = ["CHACHA", "RC4", "ARC4", "ARCFOUR", "RABBIT"] } diff --git a/rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll b/rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll deleted file mode 100644 index ede88ebf8149..000000000000 --- a/rust/ql/lib/codeql/rust/security/internal/SensitiveDataHeuristics.qll +++ /dev/null @@ -1,188 +0,0 @@ -/** - * INTERNAL: Do not use. - * - * Provides classes and predicates for identifying strings that may indicate the presence of sensitive data. - * Such that we can share this logic across our CodeQL analysis of different languages. - * - * 'Sensitive' data in general is anything that should not be sent around in unencrypted form. - */ - -/** - * A classification of different kinds of sensitive data: - * - * - secret: generic secret or trusted data; - * - id: a user name or other account information; - * - password: a password or authorization key; - * - certificate: a certificate. - * - private: private data such as credit card numbers - * - * While classifications are represented as strings, this should not be relied upon. - * Instead, use the predicates in `SensitiveDataClassification::` to work with - * classifications. - */ -class SensitiveDataClassification extends string { - SensitiveDataClassification() { this in ["secret", "id", "password", "certificate", "private"] } -} - -/** - * Provides predicates to select the different kinds of sensitive data we support. - */ -module SensitiveDataClassification { - /** Gets the classification for secret or trusted data. */ - SensitiveDataClassification secret() { result = "secret" } - - /** Gets the classification for user names or other account information. */ - SensitiveDataClassification id() { result = "id" } - - /** Gets the classification for passwords or authorization keys. */ - SensitiveDataClassification password() { result = "password" } - - /** Gets the classification for certificates. */ - SensitiveDataClassification certificate() { result = "certificate" } - - /** Gets the classification for private data. */ - SensitiveDataClassification private() { result = "private" } -} - -/** - * INTERNAL: Do not use. - * - * Provides heuristics for identifying names related to sensitive information. - */ -module HeuristicNames { - /** - * Gets a regular expression that identifies strings that may indicate the presence of secret - * or trusted data. - */ - string maybeSecret() { result = "(?is).*((?; diff --git a/rust/ql/src/queries/security/CWE-089/SqlInjection.ql b/rust/ql/src/queries/security/CWE-089/SqlInjection.ql index f61295263bfb..883fafd00d25 100644 --- a/rust/ql/src/queries/security/CWE-089/SqlInjection.ql +++ b/rust/ql/src/queries/security/CWE-089/SqlInjection.ql @@ -26,6 +26,8 @@ module SqlInjectionConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node node) { node instanceof Sink } predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } } module SqlInjectionFlow = TaintTracking::Global; diff --git a/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql b/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql index 739dca0f4185..50bf96f05738 100644 --- a/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql +++ b/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql @@ -37,6 +37,8 @@ module CleartextTransmissionConfig implements DataFlow::ConfigSig { // make sources barriers so that we only report the closest instance isSource(node) } + + predicate observeDiffInformedIncrementalMode() { any() } } module CleartextTransmissionFlow = TaintTracking::Global; @@ -46,6 +48,6 @@ import CleartextTransmissionFlow::PathGraph from CleartextTransmissionFlow::PathNode sourceNode, CleartextTransmissionFlow::PathNode sinkNode where CleartextTransmissionFlow::flowPath(sourceNode, sinkNode) select sinkNode.getNode(), sourceNode, sinkNode, - "The operation '" + sinkNode.getNode().toString() + - "', transmits data which may contain unencrypted sensitive data from $@.", sourceNode, + "This '" + sinkNode.getNode().toString() + + "' operation transmits data which may contain unencrypted sensitive data from $@.", sourceNode, sourceNode.getNode().toString() diff --git a/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql b/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql index c2a1dcc747f5..b1c56114c7bd 100644 --- a/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql +++ b/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql @@ -45,6 +45,8 @@ module CleartextLoggingConfig implements DataFlow::ConfigSig { isSink(node) and c.getAReadContent() instanceof DataFlow::TuplePositionContent } + + predicate observeDiffInformedIncrementalMode() { any() } } module CleartextLoggingFlow = TaintTracking::Global; diff --git a/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql b/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql index 3d25ede3187d..cb5fe07b4aa8 100644 --- a/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql +++ b/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql @@ -32,6 +32,8 @@ module UncontrolledAllocationConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof Sink } predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } } module UncontrolledAllocationFlow = TaintTracking::Global; diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp new file mode 100644 index 000000000000..3a6813cdef09 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.qhelp @@ -0,0 +1,58 @@ + + + + +

    +Hard-coded passwords, keys, initialization vectors, and salts should not be used for cryptographic operations. +

    +
      +
    • + Attackers can easily recover hard-coded values if they have access to the source code or compiled executable. +
    • +
    • + Some hard-coded values are easily guessable. +
    • +
    • + Use of hard-coded values may leave cryptographic operations vulnerable to dictionary attacks, rainbow tables, and other forms of cryptanalysis. +
    • +
    + +
    + + +

    +Use randomly generated key material, initialization vectors, and salts. Use strong passwords that are not hard-coded. +

    + +
    + + +

    +The following example shows instantiating a cipher with hard-coded key material, making the encrypted data vulnerable to recovery. +

    + + + +

    +In the fixed code below, the key material is randomly generated and not hard-coded, which protects the encrypted data against recovery. A real application would also need a strategy for secure key management after the key has been generated. +

    + + + +
    + + +
  • +OWASP: Use of hard-coded password. +
  • +
  • +OWASP: Key Management Cheat Sheet. +
  • +
  • +O'Reilly: Using Salts, Nonces, and Initialization Vectors. +
  • + +
    + diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql new file mode 100644 index 000000000000..cd0dca79119b --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql @@ -0,0 +1,58 @@ +/** + * @name Hard-coded cryptographic value + * @description Using hard-coded keys, passwords, salts or initialization + * vectors is not secure. + * @kind path-problem + * @problem.severity warning + * @security-severity 9.8 + * @precision high + * @id rust/hard-coded-cryptographic-value + * @tags security + * external/cwe/cwe-259 + * external/cwe/cwe-321 + * external/cwe/cwe-798 + * external/cwe/cwe-1204 + */ + +import rust +import codeql.rust.security.HardcodedCryptographicValueExtensions +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.dataflow.internal.DataFlowImpl +import codeql.rust.dataflow.internal.Content + +/** + * A taint-tracking configuration for hard-coded cryptographic value vulnerabilities. + */ +module HardcodedCryptographicValueConfig implements DataFlow::ConfigSig { + import HardcodedCryptographicValue + + predicate isSource(DataFlow::Node source) { source instanceof Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate isBarrierIn(DataFlow::Node node) { + // make sources barriers so that we only report the closest instance + // (this combined with sources for `ArrayListExpr` means we only get one source in + // case like `[0, 0, 0, 0]`) + isSource(node) + } + + predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { + // flow out from reference content at sinks. + isSink(node) and + c.getAReadContent() instanceof ReferenceContent + } +} + +module HardcodedCryptographicValueFlow = TaintTracking::Global; + +import HardcodedCryptographicValueFlow::PathGraph + +from + HardcodedCryptographicValueFlow::PathNode source, HardcodedCryptographicValueFlow::PathNode sink +where HardcodedCryptographicValueFlow::flowPath(source, sink) +select source.getNode(), source, sink, "This hard-coded value is used as $@.", sink, + sink.getNode().(HardcodedCryptographicValueConfig::Sink).getKind().getDescription() diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs new file mode 100644 index 000000000000..11dacfc08c42 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueBad.rs @@ -0,0 +1,2 @@ +let key: [u8;32] = [0;32]; // BAD: Using hard-coded keys for encryption +let cipher = Aes256Gcm::new(&key.into()); diff --git a/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs new file mode 100644 index 000000000000..06dc1af836d5 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValueGood.rs @@ -0,0 +1,2 @@ +let key = Aes256Gcm::generate_key(aes_gcm::aead::OsRng); // GOOD: Using randomly generated keys for encryption +let cipher = Aes256Gcm::new(&key); diff --git a/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql b/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql index b4f652668b71..fce64dcf0ff1 100644 --- a/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql +++ b/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql @@ -28,10 +28,33 @@ module AccessAfterLifetimeConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node node) { node instanceof AccessAfterLifetime::Sink } predicate isBarrier(DataFlow::Node barrier) { barrier instanceof AccessAfterLifetime::Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSourceLocation(DataFlow::Node source) { + exists(Variable target, DataFlow::Node sink | result = target.getLocation() | + isSink(sink) and + narrowDereferenceAfterLifetime(source, sink, target) + ) + } } module AccessAfterLifetimeFlow = TaintTracking::Global; +pragma[inline] +predicate narrowDereferenceAfterLifetime(DataFlow::Node source, DataFlow::Node sink, Variable target) { + // check that the dereference is outside the lifetime of the target + AccessAfterLifetime::dereferenceAfterLifetime(source, sink, target) and + // include only results inside `unsafe` blocks, as other results tend to be false positives + ( + sink.asExpr().getExpr().getEnclosingBlock*().isUnsafe() or + sink.asExpr().getExpr().getEnclosingCallable().(Function).isUnsafe() + ) and + // exclude cases with sources / sinks in macros, since these results are difficult to interpret + not source.asExpr().getExpr().isFromMacroExpansion() and + not sink.asExpr().getExpr().isFromMacroExpansion() +} + from AccessAfterLifetimeFlow::PathNode sourceNode, AccessAfterLifetimeFlow::PathNode sinkNode, Variable target @@ -39,14 +62,6 @@ where // flow from a pointer or reference to the dereference AccessAfterLifetimeFlow::flowPath(sourceNode, sinkNode) and // check that the dereference is outside the lifetime of the target - AccessAfterLifetime::dereferenceAfterLifetime(sourceNode.getNode(), sinkNode.getNode(), target) and - // include only results inside `unsafe` blocks, as other results tend to be false positives - ( - sinkNode.getNode().asExpr().getExpr().getEnclosingBlock*().isUnsafe() or - sinkNode.getNode().asExpr().getExpr().getEnclosingCallable().(Function).isUnsafe() - ) and - // exclude cases with sources / sinks in macros, since these results are difficult to interpret - not sourceNode.getNode().asExpr().getExpr().isFromMacroExpansion() and - not sinkNode.getNode().asExpr().getExpr().isFromMacroExpansion() + narrowDereferenceAfterLifetime(sourceNode.getNode(), sinkNode.getNode(), target) select sinkNode.getNode(), sourceNode, sinkNode, "Access of a pointer to $@ after its lifetime has ended.", target, target.toString() diff --git a/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql b/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql index d0a13b9ddb14..5177e1fb0e03 100644 --- a/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql +++ b/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql @@ -32,6 +32,8 @@ module AccessInvalidPointerConfig implements DataFlow::ConfigSig { // make sinks barriers so that we only report the closest instance isSink(node) } + + predicate observeDiffInformedIncrementalMode() { any() } } module AccessInvalidPointerFlow = TaintTracking::Global; diff --git a/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql b/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql new file mode 100644 index 000000000000..d06d1af510c9 --- /dev/null +++ b/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql @@ -0,0 +1,20 @@ +/** + * @name Nodes With Type At Length Limit + * @description Counts the number of AST nodes with a type at the type path length limit. + * @kind metric + * @id rust/summary/nodes-at-type-path-length-limit + * @tags summary + */ + +import rust +import codeql.rust.internal.TypeInference + +from int atLimit +where + atLimit = + count(AstNode n, TypePath path | + exists(inferType(n, path)) and path.length() = getTypePathLimit() + | + n + ) +select atLimit diff --git a/rust/ql/src/queries/summary/QuerySinks.ql b/rust/ql/src/queries/summary/QuerySinks.ql index a94ab2f8e804..714f5a8ab745 100644 --- a/rust/ql/src/queries/summary/QuerySinks.ql +++ b/rust/ql/src/queries/summary/QuerySinks.ql @@ -2,7 +2,8 @@ * @name Query Sinks * @description Lists query sinks that are found in the database. Query sinks are flow sinks that * are used as possible locations for query results. Cryptographic operations are - * excluded (see `rust/summary/cryptographic-operations` instead). + * excluded (see `rust/summary/cryptographic-operations` instead), as are certain + * sink types that are ubiquitous in most code. * @kind problem * @problem.severity info * @id rust/summary/query-sinks @@ -13,6 +14,11 @@ import rust import codeql.rust.dataflow.DataFlow import codeql.rust.Concepts import Stats +import codeql.rust.security.AccessInvalidPointerExtensions +import codeql.rust.security.CleartextLoggingExtensions from QuerySink s +where + not s instanceof AccessInvalidPointer::Sink and + not s instanceof CleartextLogging::Sink select s, "Sink for " + concat(s.getSinkType(), ", ") + "." diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 3156f1ffb26e..ba528a794338 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -25,6 +25,7 @@ private import codeql.rust.security.SqlInjectionExtensions private import codeql.rust.security.TaintedPathExtensions private import codeql.rust.security.UncontrolledAllocationSizeExtensions private import codeql.rust.security.WeakSensitiveDataHashingExtensions +private import codeql.rust.security.HardcodedCryptographicValueExtensions /** * Gets a count of the total number of lines of code in the database. diff --git a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..75c14035c455 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,2 @@ +multipleCallTargets +| main.rs:445:18:445:24 | n.len() | diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index a51811179f00..b6bb529b23ee 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -979,6 +979,7 @@ readStep | main.rs:442:25:442:29 | names | file://:0:0:0:0 | element | main.rs:442:9:442:20 | TuplePat | | main.rs:444:41:444:67 | [post] \|...\| ... | main.rs:441:9:441:20 | captured default_name | main.rs:444:41:444:67 | [post] default_name | | main.rs:444:44:444:55 | this | main.rs:441:9:441:20 | captured default_name | main.rs:444:44:444:55 | default_name | +| main.rs:445:18:445:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:445:18:445:18 | [post] n | | main.rs:469:13:469:13 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:469:13:469:13 | [post] b | | main.rs:470:18:470:18 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:470:18:470:18 | [post] b | | main.rs:481:10:481:11 | vs | file://:0:0:0:0 | element | main.rs:481:10:481:14 | vs[0] | @@ -1078,6 +1079,7 @@ storeStep | main.rs:429:30:429:30 | 3 | file://:0:0:0:0 | element | main.rs:429:23:429:31 | [...] | | main.rs:432:18:432:27 | source(...) | file://:0:0:0:0 | element | main.rs:432:5:432:11 | [post] mut_arr | | main.rs:444:41:444:67 | default_name | main.rs:441:9:441:20 | captured default_name | main.rs:444:41:444:67 | \|...\| ... | +| main.rs:445:18:445:18 | n | file://:0:0:0:0 | &ref | main.rs:445:18:445:18 | receiver for n | | main.rs:469:13:469:13 | b | file://:0:0:0:0 | &ref | main.rs:469:13:469:13 | receiver for b | | main.rs:470:18:470:18 | b | file://:0:0:0:0 | &ref | main.rs:470:18:470:18 | receiver for b | | main.rs:479:15:479:24 | source(...) | file://:0:0:0:0 | element | main.rs:479:14:479:34 | [...] | diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected index 04bf016217d7..bd2bfe9880e9 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected @@ -1,41 +1,42 @@ models -| 1 | Summary: ::into_pin; Argument[0]; ReturnValue; value | -| 2 | Summary: ::new; Argument[0]; ReturnValue.Reference; value | -| 3 | Summary: ::pin; Argument[0]; ReturnValue.Reference; value | -| 4 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | -| 5 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 6 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | -| 7 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::__pointer]; ReturnValue; value | -| 8 | Summary: ::into_inner; Argument[0]; ReturnValue; value | -| 9 | Summary: ::into_inner_unchecked; Argument[0]; ReturnValue; value | -| 10 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 11 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | -| 12 | Summary: ::new; Argument[0]; ReturnValue; value | -| 13 | Summary: ::new_unchecked; Argument[0].Reference; ReturnValue; value | -| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 15 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | -| 16 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | +| 1 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: ::into_pin; Argument[0]; ReturnValue; value | +| 3 | Summary: ::new; Argument[0]; ReturnValue.Reference; value | +| 4 | Summary: ::pin; Argument[0]; ReturnValue.Reference; value | +| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | +| 8 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::__pointer]; ReturnValue; value | +| 9 | Summary: ::into_inner; Argument[0]; ReturnValue; value | +| 10 | Summary: ::into_inner_unchecked; Argument[0]; ReturnValue; value | +| 11 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 12 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | +| 13 | Summary: ::new; Argument[0]; ReturnValue; value | +| 14 | Summary: ::new_unchecked; Argument[0].Reference; ReturnValue; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 16 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | +| 17 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | edges -| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:5 | +| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:6 | | main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | | | main.rs:12:13:12:28 | Some(...) [Some] | main.rs:12:9:12:9 | a [Some] | provenance | | | main.rs:12:18:12:27 | source(...) | main.rs:12:13:12:28 | Some(...) [Some] | provenance | | -| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:5 | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | generated | +| main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:6 | +| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:1 | | main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | | -| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:14 | +| main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:15 | | main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | | | main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | | | main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | | -| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:14 | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | generated | +| main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:15 | +| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:1 | | main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | | | main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | | | main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:4 | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | generated | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:1 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:5 | | main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | | | main.rs:43:18:43:22 | SelfParam [Wrapper] | main.rs:44:26:44:29 | self [Wrapper] | provenance | | | main.rs:44:13:44:33 | Wrapper {...} [Wrapper] | main.rs:43:33:45:9 | { ... } [Wrapper] | provenance | | @@ -46,12 +47,10 @@ edges | main.rs:49:30:49:39 | source(...) | main.rs:49:17:49:41 | Wrapper {...} [Wrapper] | provenance | | | main.rs:50:15:50:15 | w [Wrapper] | main.rs:43:18:43:22 | SelfParam [Wrapper] | provenance | | | main.rs:50:15:50:15 | w [Wrapper] | main.rs:51:13:51:28 | Wrapper {...} [Wrapper] | provenance | | -| main.rs:50:15:50:15 | w [Wrapper] | main.rs:53:17:53:17 | w [Wrapper] | provenance | | | main.rs:50:15:50:15 | w [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] | provenance | | | main.rs:51:13:51:28 | Wrapper {...} [Wrapper] | main.rs:51:26:51:26 | n | provenance | | | main.rs:51:26:51:26 | n | main.rs:51:38:51:38 | n | provenance | | | main.rs:53:13:53:13 | u [Wrapper] | main.rs:54:15:54:15 | u [Wrapper] | provenance | | -| main.rs:53:17:53:17 | w [Wrapper] | main.rs:53:17:53:25 | w.clone() [Wrapper] | provenance | generated | | main.rs:53:17:53:25 | w.clone() [Wrapper] | main.rs:53:13:53:13 | u [Wrapper] | provenance | | | main.rs:54:15:54:15 | u [Wrapper] | main.rs:55:13:55:28 | Wrapper {...} [Wrapper] | provenance | | | main.rs:55:13:55:28 | Wrapper {...} [Wrapper] | main.rs:55:26:55:26 | n | provenance | | @@ -61,14 +60,14 @@ edges | main.rs:66:22:66:31 | source(...) | main.rs:66:17:66:32 | Some(...) [Some] | provenance | | | main.rs:67:13:67:13 | z [Some, tuple.1] | main.rs:68:15:68:15 | z [Some, tuple.1] | provenance | | | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | main.rs:67:13:67:13 | z [Some, tuple.1] | provenance | | -| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:6 | +| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:7 | | main.rs:68:15:68:15 | z [Some, tuple.1] | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | provenance | | | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | main.rs:69:18:69:23 | TuplePat [tuple.1] | provenance | | | main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | | | main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | | | main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | | -| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:16 | -| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:15 | +| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:17 | +| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:16 | | main.rs:108:13:108:17 | mut i | main.rs:109:34:109:34 | i | provenance | | | main.rs:108:13:108:17 | mut i | main.rs:110:33:110:33 | i | provenance | | | main.rs:108:13:108:17 | mut i | main.rs:111:47:111:47 | i | provenance | | @@ -79,20 +78,20 @@ edges | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:115:31:115:34 | pin1 [Pin, &ref] | provenance | | | main.rs:109:24:109:35 | ...::new(...) [&ref] | main.rs:109:13:109:20 | mut pin1 [&ref] | provenance | | | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | provenance | | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:12 | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [&ref] | provenance | MaD:13 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:12 | | main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | | | main.rs:110:13:110:20 | mut pin2 [&ref] | main.rs:116:15:116:18 | pin2 [&ref] | provenance | | | main.rs:110:24:110:34 | ...::pin(...) [&ref] | main.rs:110:13:110:20 | mut pin2 [&ref] | provenance | | -| main.rs:110:33:110:33 | i | main.rs:110:24:110:34 | ...::pin(...) [&ref] | provenance | MaD:3 | +| main.rs:110:33:110:33 | i | main.rs:110:24:110:34 | ...::pin(...) [&ref] | provenance | MaD:4 | | main.rs:111:13:111:20 | mut pin3 [&ref] | main.rs:117:15:117:18 | pin3 [&ref] | provenance | | | main.rs:111:24:111:49 | ...::into_pin(...) [&ref] | main.rs:111:13:111:20 | mut pin3 [&ref] | provenance | | -| main.rs:111:38:111:48 | ...::new(...) [&ref] | main.rs:111:24:111:49 | ...::into_pin(...) [&ref] | provenance | MaD:1 | -| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [&ref] | provenance | MaD:2 | +| main.rs:111:38:111:48 | ...::new(...) [&ref] | main.rs:111:24:111:49 | ...::into_pin(...) [&ref] | provenance | MaD:2 | +| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [&ref] | provenance | MaD:3 | | main.rs:114:15:114:18 | pin1 [&ref] | main.rs:114:14:114:18 | * ... | provenance | | | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | main.rs:115:14:115:35 | * ... | provenance | | -| main.rs:115:31:115:34 | pin1 [&ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:8 | -| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:7 | +| main.rs:115:31:115:34 | pin1 [&ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:9 | +| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:8 | | main.rs:116:15:116:18 | pin2 [&ref] | main.rs:116:14:116:18 | * ... | provenance | | | main.rs:117:15:117:18 | pin3 [&ref] | main.rs:117:14:117:18 | * ... | provenance | | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | | @@ -101,20 +100,20 @@ edges | main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:123:13:123:20 | mut pin1 [MyStruct] | main.rs:129:30:129:33 | pin1 [MyStruct] | provenance | | | main.rs:123:24:123:36 | ...::new(...) [MyStruct] | main.rs:123:13:123:20 | mut pin1 [MyStruct] | provenance | | -| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [MyStruct] | provenance | MaD:10 | +| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [MyStruct] | provenance | MaD:11 | | main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | | | main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | | | main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | | -| main.rs:129:30:129:33 | pin1 [MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | provenance | MaD:8 | +| main.rs:129:30:129:33 | pin1 [MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [MyStruct] | provenance | MaD:9 | | main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | | | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | | | main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:137:13:137:20 | mut pin5 [MyStruct] | main.rs:139:40:139:43 | pin5 [MyStruct] | provenance | | | main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | main.rs:137:13:137:20 | mut pin5 [MyStruct] | provenance | | -| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | provenance | MaD:13 | +| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [MyStruct] | provenance | MaD:14 | | main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | | | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | | -| main.rs:139:40:139:43 | pin5 [MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | provenance | MaD:9 | +| main.rs:139:40:139:43 | pin5 [MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [MyStruct] | provenance | MaD:10 | nodes | main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] | | main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | @@ -152,7 +151,6 @@ nodes | main.rs:51:26:51:26 | n | semmle.label | n | | main.rs:51:38:51:38 | n | semmle.label | n | | main.rs:53:13:53:13 | u [Wrapper] | semmle.label | u [Wrapper] | -| main.rs:53:17:53:17 | w [Wrapper] | semmle.label | w [Wrapper] | | main.rs:53:17:53:25 | w.clone() [Wrapper] | semmle.label | w.clone() [Wrapper] | | main.rs:54:15:54:15 | u [Wrapper] | semmle.label | u [Wrapper] | | main.rs:55:13:55:28 | Wrapper {...} [Wrapper] | semmle.label | Wrapper {...} [Wrapper] | diff --git a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/TypeInferenceConsistency.expected new file mode 100644 index 000000000000..6b051f73c7aa --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/TypeInferenceConsistency.expected @@ -0,0 +1,4 @@ +nonUniqueCertainType +| web_frameworks.rs:139:30:139:39 | ...::get(...) | | +| web_frameworks.rs:140:34:140:43 | ...::get(...) | | +| web_frameworks.rs:141:30:141:39 | ...::get(...) | | diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 48d54f1589b8..0e649697a604 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -2,6 +2,6 @@ multipleCallTargets | main.rs:118:9:118:11 | f(...) | | proc_macro.rs:9:5:11:5 | ...::new(...) | multiplePathResolutions -| main.rs:626:3:626:12 | proc_macro | -| main.rs:632:7:632:16 | proc_macro | -| main.rs:635:7:635:16 | proc_macro | +| main.rs:641:3:641:12 | proc_macro | +| main.rs:647:7:647:16 | proc_macro | +| main.rs:650:7:650:16 | proc_macro | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index cf848ba26876..f58d82826d64 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -312,6 +312,21 @@ mod m15 { } } // I82 + #[rustfmt::skip] + trait Trait3< + TT // ITT + > + where + Self: Trait1, // $ item=ITrait3 item=I79 + TT: Trait1, // $ item=ITT item=I79 + { + fn f(&self, tt: TT) { // $ item=ITT + Self::g(self); // $ item=I80 + TT::g(&tt); // $ item=I80 + self.g(); // $ item=I80 + } + } // ITrait3 + struct S; // I81 #[rustfmt::skip] @@ -636,6 +651,60 @@ impl AStruct // $ item=I123 pub fn z(&self) {} // I125 } +mod associated_types { + use std::marker::PhantomData; // $ item=PhantomData + use std::result::Result; // $ item=Result + + trait Reduce { + type Input; // ReduceInput + type Error; // ReduceError + type Output; // ReduceOutput + fn feed( + &mut self, + item: Self::Input, // $ item=ReduceInput + ) -> Result; // $ item=Result item=ReduceOutput item=ReduceError + } // IReduce + + struct MyImpl { + _input: PhantomData, // $ item=PhantomData item=Input + _error: PhantomData, // $ item=PhantomData item=Error + } // MyImpl + + #[rustfmt::skip] + impl< + Input, // IInput + Error, // IError + > Reduce // $ item=IReduce + for MyImpl< + Input, // $ item=IInput + Error, // $ item=IError + > // $ item=MyImpl + { + type Input = Result< + Input, // $ item=IInput + Self::Error, // $ item=IErrorAssociated + > // $ item=Result + ; // IInputAssociated + type Error = Option< + Error // $ item=IError + > // $ item=Option + ; // IErrorAssociated + type Output = + Input // $ item=IInput + ; // IOutputAssociated + + fn feed( + &mut self, + item: Self::Input // $ item=IInputAssociated + ) -> Result< + Self::Output, // $ item=IOutputAssociated + Self::Error // $ item=IErrorAssociated + > { // $ item=Result + item + } + } +} + use std::{self as ztd}; // $ item=std fn use_ztd(x: ztd::string::String) {} // $ item=String diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index c757e29396f7..0eb100542b57 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -17,17 +17,18 @@ mod | main.rs:269:1:281:1 | mod m12 | | main.rs:283:1:296:1 | mod m13 | | main.rs:287:5:295:5 | mod m14 | -| main.rs:298:1:352:1 | mod m15 | -| main.rs:354:1:446:1 | mod m16 | -| main.rs:448:1:478:1 | mod m17 | -| main.rs:480:1:498:1 | mod m18 | -| main.rs:485:5:497:5 | mod m19 | -| main.rs:490:9:496:9 | mod m20 | -| main.rs:500:1:525:1 | mod m21 | -| main.rs:501:5:507:5 | mod m22 | -| main.rs:509:5:524:5 | mod m33 | -| main.rs:527:1:552:1 | mod m23 | -| main.rs:554:1:622:1 | mod m24 | +| main.rs:298:1:367:1 | mod m15 | +| main.rs:369:1:461:1 | mod m16 | +| main.rs:463:1:493:1 | mod m17 | +| main.rs:495:1:513:1 | mod m18 | +| main.rs:500:5:512:5 | mod m19 | +| main.rs:505:9:511:9 | mod m20 | +| main.rs:515:1:540:1 | mod m21 | +| main.rs:516:5:522:5 | mod m22 | +| main.rs:524:5:539:5 | mod m33 | +| main.rs:542:1:567:1 | mod m23 | +| main.rs:569:1:637:1 | mod m24 | +| main.rs:654:1:706:1 | mod associated_types | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:12:1:12:12 | mod my3 | | my2/mod.rs:14:1:15:10 | mod mymod | @@ -61,7 +62,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:677:2 | SourceFile | +| main.rs:40:9:40:13 | super | main.rs:1:1:746: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 | @@ -73,7 +74,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:677:2 | SourceFile | +| main.rs:68:5:68:8 | self | main.rs:1:1:746: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:78:16:78:18 | i32 | {EXTERNAL LOCATION} | struct i32 | @@ -88,7 +89,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:677:2 | SourceFile | +| main.rs:117:13:117:17 | super | main.rs:1:1:746: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 | @@ -155,195 +156,239 @@ resolvePath | main.rs:307:9:307:14 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | | main.rs:310:13:310:16 | Self | main.rs:305:5:313:5 | trait Trait2 | | main.rs:310:13:310:19 | ...::g | main.rs:302:9:302:20 | fn g | -| main.rs:318:10:318:15 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:319:11:319:11 | S | main.rs:315:5:315:13 | struct S | -| main.rs:322:13:322:16 | Self | main.rs:317:5:329:5 | impl Trait1 for S { ... } | -| main.rs:322:13:322:19 | ...::g | main.rs:326:9:328:9 | fn g | -| main.rs:332:10:332:15 | Trait2 | main.rs:305:5:313:5 | trait Trait2 | -| main.rs:333:11:333:11 | S | main.rs:315:5:315:13 | struct S | -| main.rs:342:17:342:17 | S | main.rs:315:5:315:13 | struct S | -| main.rs:343:10:343:10 | S | main.rs:315:5:315:13 | struct S | -| main.rs:344:14:344:19 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:346:10:346:10 | S | main.rs:315:5:315:13 | struct S | -| main.rs:347:14:347:19 | Trait2 | main.rs:305:5:313:5 | trait Trait2 | -| main.rs:349:9:349:9 | S | main.rs:315:5:315:13 | struct S | -| main.rs:349:9:349:12 | ...::g | main.rs:326:9:328:9 | fn g | -| main.rs:359:24:359:24 | T | main.rs:357:7:357:7 | T | -| main.rs:361:24:361:24 | T | main.rs:357:7:357:7 | T | -| main.rs:364:24:364:24 | T | main.rs:357:7:357:7 | T | -| main.rs:365:13:365:16 | Self | main.rs:355:5:371:5 | trait Trait1 | -| main.rs:365:13:365:19 | ...::g | main.rs:361:9:362:9 | fn g | -| main.rs:369:18:369:18 | T | main.rs:357:7:357:7 | T | -| main.rs:377:9:379:9 | Trait1::<...> | main.rs:355:5:371:5 | trait Trait1 | -| main.rs:378:11:378:11 | T | main.rs:375:7:375:7 | T | -| main.rs:380:24:380:24 | T | main.rs:375:7:375:7 | T | -| main.rs:382:13:382:16 | Self | main.rs:373:5:386:5 | trait Trait2 | -| main.rs:382:13:382:19 | ...::g | main.rs:361:9:362:9 | fn g | -| main.rs:384:13:384:16 | Self | main.rs:373:5:386:5 | trait Trait2 | -| main.rs:384:13:384:19 | ...::c | main.rs:369:9:370:9 | Const | -| main.rs:391:10:393:5 | Trait1::<...> | main.rs:355:5:371:5 | trait Trait1 | -| main.rs:392:7:392:7 | S | main.rs:388:5:388:13 | struct S | -| main.rs:394:11:394:11 | S | main.rs:388:5:388:13 | struct S | -| main.rs:395:24:395:24 | S | main.rs:388:5:388:13 | struct S | -| main.rs:397:13:397:16 | Self | main.rs:390:5:408:5 | impl Trait1::<...> for S { ... } | -| main.rs:397:13:397:19 | ...::g | main.rs:401:9:404:9 | fn g | -| main.rs:401:24:401:24 | S | main.rs:388:5:388:13 | struct S | -| main.rs:403:13:403:16 | Self | main.rs:390:5:408:5 | impl Trait1::<...> for S { ... } | -| main.rs:403:13:403:19 | ...::c | main.rs:406:9:407:9 | Const | -| main.rs:406:18:406:18 | S | main.rs:388:5:388:13 | struct S | -| main.rs:406:22:406:22 | S | main.rs:388:5:388:13 | struct S | -| main.rs:411:10:413:5 | Trait2::<...> | main.rs:373:5:386:5 | trait Trait2 | -| main.rs:412:7:412:7 | S | main.rs:388:5:388:13 | struct S | -| main.rs:414:11:414:11 | S | main.rs:388:5:388:13 | struct S | -| main.rs:415:24:415:24 | S | main.rs:388:5:388:13 | struct S | -| main.rs:417:13:417:16 | Self | main.rs:410:5:419:5 | impl Trait2::<...> for S { ... } | -| main.rs:424:17:424:17 | S | main.rs:388:5:388:13 | struct S | -| main.rs:425:10:425:10 | S | main.rs:388:5:388:13 | struct S | -| main.rs:426:14:428:11 | Trait1::<...> | main.rs:355:5:371:5 | trait Trait1 | -| main.rs:427:13:427:13 | S | main.rs:388:5:388:13 | struct S | -| main.rs:430:10:430:10 | S | main.rs:388:5:388:13 | struct S | -| main.rs:431:14:433:11 | Trait2::<...> | main.rs:373:5:386:5 | trait Trait2 | -| main.rs:432:13:432:13 | S | main.rs:388:5:388:13 | struct S | -| main.rs:435:9:435:9 | S | main.rs:388:5:388:13 | struct S | -| main.rs:435:9:435:12 | ...::g | main.rs:401:9:404:9 | fn g | -| main.rs:437:9:437:9 | S | main.rs:388:5:388:13 | struct S | -| main.rs:437:9:437:12 | ...::h | main.rs:364:9:367:9 | fn h | -| main.rs:439:9:439:9 | S | main.rs:388:5:388:13 | struct S | -| main.rs:439:9:439:12 | ...::c | main.rs:406:9:407:9 | Const | -| main.rs:440:10:440:10 | S | main.rs:388:5:388:13 | struct S | -| main.rs:441:14:443:11 | Trait1::<...> | main.rs:355:5:371:5 | trait Trait1 | -| main.rs:442:13:442:13 | S | main.rs:388:5:388:13 | struct S | -| main.rs:456:10:456:16 | MyTrait | main.rs:449:5:451:5 | trait MyTrait | -| main.rs:457:9:457:9 | S | main.rs:453:5:453:13 | struct S | -| main.rs:465:7:465:13 | MyTrait | main.rs:449:5:451:5 | trait MyTrait | -| main.rs:466:10:466:10 | T | main.rs:464:10:464:10 | T | -| main.rs:468:9:468:9 | T | main.rs:464:10:464:10 | T | -| main.rs:468:9:468:12 | ...::f | main.rs:450:9:450:20 | fn f | -| main.rs:469:9:469:15 | MyTrait | main.rs:449:5:451:5 | trait MyTrait | -| main.rs:469:9:469:18 | ...::f | main.rs:450:9:450:20 | fn f | -| main.rs:474:9:474:9 | g | main.rs:463:5:470:5 | fn g | -| main.rs:475:11:475:11 | S | main.rs:453:5:453:13 | struct S | -| main.rs:493:17:493:21 | super | main.rs:485:5:497:5 | mod m19 | -| main.rs:493:17:493:24 | ...::f | main.rs:486:9:488:9 | fn f | -| main.rs:494:17:494:21 | super | main.rs:485:5:497:5 | mod m19 | -| main.rs:494:17:494:28 | ...::super | main.rs:480:1:498:1 | mod m18 | -| main.rs:494:17:494:31 | ...::f | main.rs:481:5:483:5 | fn f | -| main.rs:511:13:511:17 | super | main.rs:500:1:525:1 | mod m21 | -| main.rs:511:13:511:22 | ...::m22 | main.rs:501:5:507:5 | mod m22 | -| main.rs:511:13:511:30 | ...::MyEnum | main.rs:502:9:504:9 | enum MyEnum | -| main.rs:512:13:512:16 | self | main.rs:502:9:504:9 | enum MyEnum | -| main.rs:516:13:516:17 | super | main.rs:500:1:525:1 | mod m21 | -| main.rs:516:13:516:22 | ...::m22 | main.rs:501:5:507:5 | mod m22 | -| main.rs:516:13:516:32 | ...::MyStruct | main.rs:506:9:506:28 | struct MyStruct | -| main.rs:517:13:517:16 | self | main.rs:506:9:506:28 | struct MyStruct | -| main.rs:521:21:521:26 | MyEnum | main.rs:502:9:504:9 | enum MyEnum | -| main.rs:521:21:521:29 | ...::A | main.rs:503:13:503:13 | A | -| main.rs:522:21:522:28 | MyStruct | main.rs:506:9:506:28 | struct MyStruct | -| main.rs:538:10:540:5 | Trait1::<...> | main.rs:528:5:533:5 | trait Trait1 | -| main.rs:539:7:539:10 | Self | main.rs:535:5:535:13 | struct S | -| main.rs:541:11:541:11 | S | main.rs:535:5:535:13 | struct S | -| main.rs:549:17:549:17 | S | main.rs:535:5:535:13 | struct S | -| main.rs:565:15:565:15 | T | main.rs:564:26:564:26 | T | -| main.rs:570:9:570:24 | GenericStruct::<...> | main.rs:563:5:566:5 | struct GenericStruct | -| main.rs:570:23:570:23 | T | main.rs:569:10:569:10 | T | -| main.rs:572:9:572:9 | T | main.rs:569:10:569:10 | T | -| main.rs:572:12:572:17 | TraitA | main.rs:555:5:557:5 | trait TraitA | -| main.rs:581:9:581:24 | GenericStruct::<...> | main.rs:563:5:566:5 | struct GenericStruct | -| main.rs:581:23:581:23 | T | main.rs:580:10:580:10 | T | -| main.rs:583:9:583:9 | T | main.rs:580:10:580:10 | T | -| main.rs:583:12:583:17 | TraitB | main.rs:559:5:561:5 | trait TraitB | -| main.rs:584:9:584:9 | T | main.rs:580:10:580:10 | T | -| main.rs:584:12:584:17 | TraitA | main.rs:555:5:557:5 | trait TraitA | -| main.rs:595:10:595:15 | TraitA | main.rs:555:5:557:5 | trait TraitA | -| main.rs:595:21:595:31 | Implementor | main.rs:592:5:592:23 | struct Implementor | -| main.rs:602:10:602:15 | TraitB | main.rs:559:5:561:5 | trait TraitB | -| main.rs:602:21:602:31 | Implementor | main.rs:592:5:592:23 | struct Implementor | -| main.rs:610:24:610:34 | Implementor | main.rs:592:5:592:23 | struct Implementor | -| main.rs:611:23:611:35 | GenericStruct | main.rs:563:5:566:5 | struct GenericStruct | -| main.rs:617:9:617:36 | GenericStruct::<...> | main.rs:563:5:566:5 | struct GenericStruct | -| main.rs:617:9:617:50 | ...::call_trait_a | main.rs:574:9:576:9 | fn call_trait_a | -| main.rs:617:25:617:35 | Implementor | main.rs:592:5:592:23 | struct Implementor | -| main.rs:620:9:620:36 | GenericStruct::<...> | main.rs:563:5:566:5 | struct GenericStruct | -| main.rs:620:9:620:47 | ...::call_both | main.rs:586:9:589:9 | fn call_both | -| main.rs:620:25:620:35 | Implementor | main.rs:592:5:592:23 | struct Implementor | -| main.rs:626:3:626:12 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | -| main.rs:626:3:626:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:626:3:626:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | -| main.rs:630:6:630:12 | AStruct | main.rs:629:1:629:17 | struct AStruct | -| main.rs:632:7:632:16 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | -| main.rs:632:7:632:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:632:7:632:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | -| main.rs:635:7:635:16 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | -| main.rs:635:7:635:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:635:7:635:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | -| main.rs:639:5:639:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:639:11:639:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:641:15:641:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:641:15:641:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:641:15:641:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:644:5:644:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:644:5:644:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:644:5:644:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:644:5:644:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:644:5:644:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:645:5:645:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:645:5:645:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:646:5:646:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:646:5:646:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:646:5:646:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:646:5:646:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:647:5:647:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:648:5:648:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:649:5:649:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:649:5:649:12 | ...::h | main.rs:50:1:69:1 | fn h | -| main.rs:650:5:650:6 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:650:5:650:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:650:5:650:13 | ...::g | main.rs:23:9:27:9 | fn g | -| main.rs:651:5:651:6 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:651:5:651:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:651:5:651:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 | -| main.rs:651:5:651:17 | ...::h | main.rs:30:27:34:13 | fn h | -| main.rs:652:5:652:6 | m4 | main.rs:39:1:46:1 | mod m4 | -| main.rs:652:5:652:9 | ...::i | main.rs:42:5:45:5 | fn i | -| main.rs:653:5:653:5 | h | main.rs:50:1:69:1 | fn h | -| main.rs:654:5:654:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:655:5:655:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:656:5:656:5 | j | main.rs:97:1:101:1 | fn j | -| main.rs:657:5:657:6 | m6 | main.rs:109:1:120:1 | mod m6 | -| main.rs:657:5:657:9 | ...::g | main.rs:114:5:119:5 | fn g | -| main.rs:658:5:658:6 | m7 | main.rs:122:1:141:1 | mod m7 | -| main.rs:658:5:658:9 | ...::f | main.rs:133:5:140:5 | fn f | -| main.rs:659:5:659:6 | m8 | main.rs:143:1:197:1 | mod m8 | -| main.rs:659:5:659:9 | ...::g | main.rs:181:5:196:5 | fn g | -| main.rs:660:5:660:6 | m9 | main.rs:199:1:207:1 | mod m9 | -| main.rs:660:5:660:9 | ...::f | main.rs:202:5:206:5 | fn f | -| main.rs:661:5:661:7 | m11 | main.rs:230:1:267:1 | mod m11 | -| main.rs:661:5:661:10 | ...::f | main.rs:235:5:238:5 | fn f | -| main.rs:662:5:662:7 | m15 | main.rs:298:1:352:1 | mod m15 | -| main.rs:662:5:662:10 | ...::f | main.rs:339:5:351:5 | fn f | -| main.rs:663:5:663:7 | m16 | main.rs:354:1:446:1 | mod m16 | -| main.rs:663:5:663:10 | ...::f | main.rs:421:5:445:5 | fn f | -| main.rs:664:5:664:7 | m17 | main.rs:448:1:478:1 | mod m17 | -| main.rs:664:5:664:10 | ...::f | main.rs:472:5:477:5 | fn f | -| main.rs:665:5:665:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:665:5:665:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:666:5:666:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:666:5:666:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:667:5:667:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 | -| main.rs:667:5:667:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:668:5:668:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:669:5:669:7 | m18 | main.rs:480:1:498:1 | mod m18 | -| main.rs:669:5:669:12 | ...::m19 | main.rs:485:5:497:5 | mod m19 | -| main.rs:669:5:669:17 | ...::m20 | main.rs:490:9:496:9 | mod m20 | -| main.rs:669:5:669:20 | ...::g | main.rs:491:13:495:13 | fn g | -| main.rs:670:5:670:7 | m23 | main.rs:527:1:552:1 | mod m23 | -| main.rs:670:5:670:10 | ...::f | main.rs:547:5:551:5 | fn f | -| main.rs:671:5:671:7 | m24 | main.rs:554:1:622:1 | mod m24 | -| main.rs:671:5:671:10 | ...::f | main.rs:608:5:621:5 | fn f | -| main.rs:672:5:672:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:672:5:672:11 | ...::h | main.rs:50:1:69:1 | fn h | -| main.rs:674:5:674:11 | AStruct | main.rs:629:1:629:17 | struct AStruct | -| main.rs:675:5:675:11 | AStruct | main.rs:629:1:629:17 | struct AStruct | +| main.rs:320:9:320:12 | Self | main.rs:315:5:328:5 | trait Trait3 | +| main.rs:320:15:320:20 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | +| main.rs:321:9:321:10 | TT | main.rs:317:9:317:10 | TT | +| main.rs:321:13:321:18 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | +| main.rs:323:25:323:26 | TT | main.rs:317:9:317:10 | TT | +| main.rs:324:13:324:16 | Self | main.rs:315:5:328:5 | trait Trait3 | +| main.rs:324:13:324:19 | ...::g | main.rs:302:9:302:20 | fn g | +| main.rs:325:13:325:14 | TT | main.rs:317:9:317:10 | TT | +| main.rs:325:13:325:17 | ...::g | main.rs:302:9:302:20 | fn g | +| main.rs:333:10:333:15 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | +| main.rs:334:11:334:11 | S | main.rs:330:5:330:13 | struct S | +| main.rs:337:13:337:16 | Self | main.rs:332:5:344:5 | impl Trait1 for S { ... } | +| main.rs:337:13:337:19 | ...::g | main.rs:341:9:343:9 | fn g | +| main.rs:347:10:347:15 | Trait2 | main.rs:305:5:313:5 | trait Trait2 | +| main.rs:348:11:348:11 | S | main.rs:330:5:330:13 | struct S | +| main.rs:357:17:357:17 | S | main.rs:330:5:330:13 | struct S | +| main.rs:358:10:358:10 | S | main.rs:330:5:330:13 | struct S | +| main.rs:359:14:359:19 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | +| main.rs:361:10:361:10 | S | main.rs:330:5:330:13 | struct S | +| main.rs:362:14:362:19 | Trait2 | main.rs:305:5:313:5 | trait Trait2 | +| main.rs:364:9:364:9 | S | main.rs:330:5:330:13 | struct S | +| main.rs:364:9:364:12 | ...::g | main.rs:341:9:343:9 | fn g | +| main.rs:374:24:374:24 | T | main.rs:372:7:372:7 | T | +| main.rs:376:24:376:24 | T | main.rs:372:7:372:7 | T | +| main.rs:379:24:379:24 | T | main.rs:372:7:372:7 | T | +| main.rs:380:13:380:16 | Self | main.rs:370:5:386:5 | trait Trait1 | +| main.rs:380:13:380:19 | ...::g | main.rs:376:9:377:9 | fn g | +| main.rs:384:18:384:18 | T | main.rs:372:7:372:7 | T | +| main.rs:392:9:394:9 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | +| main.rs:393:11:393:11 | T | main.rs:390:7:390:7 | T | +| main.rs:395:24:395:24 | T | main.rs:390:7:390:7 | T | +| main.rs:397:13:397:16 | Self | main.rs:388:5:401:5 | trait Trait2 | +| main.rs:397:13:397:19 | ...::g | main.rs:376:9:377:9 | fn g | +| main.rs:399:13:399:16 | Self | main.rs:388:5:401:5 | trait Trait2 | +| main.rs:399:13:399:19 | ...::c | main.rs:384:9:385:9 | Const | +| main.rs:406:10:408:5 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | +| main.rs:407:7:407:7 | S | main.rs:403:5:403:13 | struct S | +| main.rs:409:11:409:11 | S | main.rs:403:5:403:13 | struct S | +| main.rs:410:24:410:24 | S | main.rs:403:5:403:13 | struct S | +| main.rs:412:13:412:16 | Self | main.rs:405:5:423:5 | impl Trait1::<...> for S { ... } | +| main.rs:412:13:412:19 | ...::g | main.rs:416:9:419:9 | fn g | +| main.rs:416:24:416:24 | S | main.rs:403:5:403:13 | struct S | +| main.rs:418:13:418:16 | Self | main.rs:405:5:423:5 | impl Trait1::<...> for S { ... } | +| main.rs:418:13:418:19 | ...::c | main.rs:421:9:422:9 | Const | +| main.rs:421:18:421:18 | S | main.rs:403:5:403:13 | struct S | +| main.rs:421:22:421:22 | S | main.rs:403:5:403:13 | struct S | +| main.rs:426:10:428:5 | Trait2::<...> | main.rs:388:5:401:5 | trait Trait2 | +| main.rs:427:7:427:7 | S | main.rs:403:5:403:13 | struct S | +| main.rs:429:11:429:11 | S | main.rs:403:5:403:13 | struct S | +| main.rs:430:24:430:24 | S | main.rs:403:5:403:13 | struct S | +| main.rs:432:13:432:16 | Self | main.rs:425:5:434:5 | impl Trait2::<...> for S { ... } | +| main.rs:439:17:439:17 | S | main.rs:403:5:403:13 | struct S | +| main.rs:440:10:440:10 | S | main.rs:403:5:403:13 | struct S | +| main.rs:441:14:443:11 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | +| main.rs:442:13:442:13 | S | main.rs:403:5:403:13 | struct S | +| main.rs:445:10:445:10 | S | main.rs:403:5:403:13 | struct S | +| main.rs:446:14:448:11 | Trait2::<...> | main.rs:388:5:401:5 | trait Trait2 | +| main.rs:447:13:447:13 | S | main.rs:403:5:403:13 | struct S | +| main.rs:450:9:450:9 | S | main.rs:403:5:403:13 | struct S | +| main.rs:450:9:450:12 | ...::g | main.rs:416:9:419:9 | fn g | +| main.rs:452:9:452:9 | S | main.rs:403:5:403:13 | struct S | +| main.rs:452:9:452:12 | ...::h | main.rs:379:9:382:9 | fn h | +| main.rs:454:9:454:9 | S | main.rs:403:5:403:13 | struct S | +| main.rs:454:9:454:12 | ...::c | main.rs:421:9:422:9 | Const | +| main.rs:455:10:455:10 | S | main.rs:403:5:403:13 | struct S | +| main.rs:456:14:458:11 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | +| main.rs:457:13:457:13 | S | main.rs:403:5:403:13 | struct S | +| main.rs:471:10:471:16 | MyTrait | main.rs:464:5:466:5 | trait MyTrait | +| main.rs:472:9:472:9 | S | main.rs:468:5:468:13 | struct S | +| main.rs:480:7:480:13 | MyTrait | main.rs:464:5:466:5 | trait MyTrait | +| main.rs:481:10:481:10 | T | main.rs:479:10:479:10 | T | +| main.rs:483:9:483:9 | T | main.rs:479:10:479:10 | T | +| main.rs:483:9:483:12 | ...::f | main.rs:465:9:465:20 | fn f | +| main.rs:484:9:484:15 | MyTrait | main.rs:464:5:466:5 | trait MyTrait | +| main.rs:484:9:484:18 | ...::f | main.rs:465:9:465:20 | fn f | +| main.rs:489:9:489:9 | g | main.rs:478:5:485:5 | fn g | +| main.rs:490:11:490:11 | S | main.rs:468:5:468:13 | struct S | +| main.rs:508:17:508:21 | super | main.rs:500:5:512:5 | mod m19 | +| main.rs:508:17:508:24 | ...::f | main.rs:501:9:503:9 | fn f | +| main.rs:509:17:509:21 | super | main.rs:500:5:512:5 | mod m19 | +| main.rs:509:17:509:28 | ...::super | main.rs:495:1:513:1 | mod m18 | +| main.rs:509:17:509:31 | ...::f | main.rs:496:5:498:5 | fn f | +| main.rs:526:13:526:17 | super | main.rs:515:1:540:1 | mod m21 | +| main.rs:526:13:526:22 | ...::m22 | main.rs:516:5:522:5 | mod m22 | +| main.rs:526:13:526:30 | ...::MyEnum | main.rs:517:9:519:9 | enum MyEnum | +| main.rs:527:13:527:16 | self | main.rs:517:9:519:9 | enum MyEnum | +| main.rs:531:13:531:17 | super | main.rs:515:1:540:1 | mod m21 | +| main.rs:531:13:531:22 | ...::m22 | main.rs:516:5:522:5 | mod m22 | +| main.rs:531:13:531:32 | ...::MyStruct | main.rs:521:9:521:28 | struct MyStruct | +| main.rs:532:13:532:16 | self | main.rs:521:9:521:28 | struct MyStruct | +| main.rs:536:21:536:26 | MyEnum | main.rs:517:9:519:9 | enum MyEnum | +| main.rs:536:21:536:29 | ...::A | main.rs:518:13:518:13 | A | +| main.rs:537:21:537:28 | MyStruct | main.rs:521:9:521:28 | struct MyStruct | +| main.rs:553:10:555:5 | Trait1::<...> | main.rs:543:5:548:5 | trait Trait1 | +| main.rs:554:7:554:10 | Self | main.rs:550:5:550:13 | struct S | +| main.rs:556:11:556:11 | S | main.rs:550:5:550:13 | struct S | +| main.rs:564:17:564:17 | S | main.rs:550:5:550:13 | struct S | +| main.rs:580:15:580:15 | T | main.rs:579:26:579:26 | T | +| main.rs:585:9:585:24 | GenericStruct::<...> | main.rs:578:5:581:5 | struct GenericStruct | +| main.rs:585:23:585:23 | T | main.rs:584:10:584:10 | T | +| main.rs:587:9:587:9 | T | main.rs:584:10:584:10 | T | +| main.rs:587:12:587:17 | TraitA | main.rs:570:5:572:5 | trait TraitA | +| main.rs:596:9:596:24 | GenericStruct::<...> | main.rs:578:5:581:5 | struct GenericStruct | +| main.rs:596:23:596:23 | T | main.rs:595:10:595:10 | T | +| main.rs:598:9:598:9 | T | main.rs:595:10:595:10 | T | +| main.rs:598:12:598:17 | TraitB | main.rs:574:5:576:5 | trait TraitB | +| main.rs:599:9:599:9 | T | main.rs:595:10:595:10 | T | +| main.rs:599:12:599:17 | TraitA | main.rs:570:5:572:5 | trait TraitA | +| main.rs:610:10:610:15 | TraitA | main.rs:570:5:572:5 | trait TraitA | +| main.rs:610:21:610:31 | Implementor | main.rs:607:5:607:23 | struct Implementor | +| main.rs:617:10:617:15 | TraitB | main.rs:574:5:576:5 | trait TraitB | +| main.rs:617:21:617:31 | Implementor | main.rs:607:5:607:23 | struct Implementor | +| main.rs:625:24:625:34 | Implementor | main.rs:607:5:607:23 | struct Implementor | +| main.rs:626:23:626:35 | GenericStruct | main.rs:578:5:581:5 | struct GenericStruct | +| main.rs:632:9:632:36 | GenericStruct::<...> | main.rs:578:5:581:5 | struct GenericStruct | +| main.rs:632:9:632:50 | ...::call_trait_a | main.rs:589:9:591:9 | fn call_trait_a | +| main.rs:632:25:632:35 | Implementor | main.rs:607:5:607:23 | struct Implementor | +| main.rs:635:9:635:36 | GenericStruct::<...> | main.rs:578:5:581:5 | struct GenericStruct | +| main.rs:635:9:635:47 | ...::call_both | main.rs:601:9:604:9 | fn call_both | +| main.rs:635:25:635:35 | Implementor | main.rs:607:5:607:23 | struct Implementor | +| main.rs:641:3:641:12 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| main.rs:641:3:641:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:641:3:641:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:645:6:645:12 | AStruct | main.rs:644:1:644:17 | struct AStruct | +| main.rs:647:7:647:16 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| main.rs:647:7:647:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:647:7:647:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:650:7:650:16 | proc_macro | {EXTERNAL LOCATION} | Crate(proc_macro@0.0.0) | +| main.rs:650:7:650:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:650:7:650:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:655:9:655:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:655:9:655:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:655:9:655:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:656:9:656:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:656:9:656:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:656:9:656:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:664:19:664:22 | Self | main.rs:658:5:666:5 | trait Reduce | +| main.rs:664:19:664:29 | ...::Input | main.rs:659:9:659:19 | type Input | +| main.rs:665:14:665:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:665:21:665:24 | Self | main.rs:658:5:666:5 | trait Reduce | +| main.rs:665:21:665:32 | ...::Output | main.rs:660:21:661:20 | type Output | +| main.rs:665:35:665:38 | Self | main.rs:658:5:666:5 | trait Reduce | +| main.rs:665:35:665:45 | ...::Error | main.rs:659:21:660:19 | type Error | +| main.rs:669:17:669:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:669:29:669:33 | Input | main.rs:668:19:668:23 | Input | +| main.rs:670:17:670:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:670:29:670:33 | Error | main.rs:668:26:668:30 | Error | +| main.rs:677:11:677:16 | Reduce | main.rs:658:5:666:5 | trait Reduce | +| main.rs:678:13:681:9 | MyImpl::<...> | main.rs:668:5:671:5 | struct MyImpl | +| main.rs:679:13:679:17 | Input | main.rs:675:13:675:17 | Input | +| main.rs:680:13:680:17 | Error | main.rs:676:13:676:17 | Error | +| main.rs:683:22:686:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:684:13:684:17 | Input | main.rs:675:13:675:17 | Input | +| main.rs:685:13:685:16 | Self | main.rs:673:5:705:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:685:13:685:23 | ...::Error | main.rs:687:11:691:9 | type Error | +| main.rs:688:22:690:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:689:11:689:15 | Error | main.rs:676:13:676:17 | Error | +| main.rs:693:13:693:17 | Input | main.rs:675:13:675:17 | Input | +| main.rs:698:19:698:22 | Self | main.rs:673:5:705:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:698:19:698:29 | ...::Input | main.rs:683:9:687:9 | type Input | +| main.rs:699:14:702:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:700:13:700:16 | Self | main.rs:673:5:705:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:700:13:700:24 | ...::Output | main.rs:691:11:694:9 | type Output | +| main.rs:701:13:701:16 | Self | main.rs:673:5:705:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:701:13:701:23 | ...::Error | main.rs:687:11:691:9 | type Error | +| main.rs:708:5:708:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:708:11:708:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:710:15:710:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:710:15:710:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:710:15:710:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:713:5:713:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:713:5:713:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:713:5:713:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:713:5:713:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:713:5:713:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:714:5:714:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:714:5:714:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:715:5:715:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:715:5:715:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:715:5:715:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:715:5:715:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:716:5:716:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:717:5:717:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:718:5:718:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:718:5:718:12 | ...::h | main.rs:50:1:69:1 | fn h | +| main.rs:719:5:719:6 | m1 | main.rs:13:1:37:1 | mod m1 | +| main.rs:719:5:719:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | +| main.rs:719:5:719:13 | ...::g | main.rs:23:9:27:9 | fn g | +| main.rs:720:5:720:6 | m1 | main.rs:13:1:37:1 | mod m1 | +| main.rs:720:5:720:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | +| main.rs:720:5:720:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 | +| main.rs:720:5:720:17 | ...::h | main.rs:30:27:34:13 | fn h | +| main.rs:721:5:721:6 | m4 | main.rs:39:1:46:1 | mod m4 | +| main.rs:721:5:721:9 | ...::i | main.rs:42:5:45:5 | fn i | +| main.rs:722:5:722:5 | h | main.rs:50:1:69:1 | fn h | +| main.rs:723:5:723:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:724:5:724:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:725:5:725:5 | j | main.rs:97:1:101:1 | fn j | +| main.rs:726:5:726:6 | m6 | main.rs:109:1:120:1 | mod m6 | +| main.rs:726:5:726:9 | ...::g | main.rs:114:5:119:5 | fn g | +| main.rs:727:5:727:6 | m7 | main.rs:122:1:141:1 | mod m7 | +| main.rs:727:5:727:9 | ...::f | main.rs:133:5:140:5 | fn f | +| main.rs:728:5:728:6 | m8 | main.rs:143:1:197:1 | mod m8 | +| main.rs:728:5:728:9 | ...::g | main.rs:181:5:196:5 | fn g | +| main.rs:729:5:729:6 | m9 | main.rs:199:1:207:1 | mod m9 | +| main.rs:729:5:729:9 | ...::f | main.rs:202:5:206:5 | fn f | +| main.rs:730:5:730:7 | m11 | main.rs:230:1:267:1 | mod m11 | +| main.rs:730:5:730:10 | ...::f | main.rs:235:5:238:5 | fn f | +| main.rs:731:5:731:7 | m15 | main.rs:298:1:367:1 | mod m15 | +| main.rs:731:5:731:10 | ...::f | main.rs:354:5:366:5 | fn f | +| main.rs:732:5:732:7 | m16 | main.rs:369:1:461:1 | mod m16 | +| main.rs:732:5:732:10 | ...::f | main.rs:436:5:460:5 | fn f | +| main.rs:733:5:733:7 | m17 | main.rs:463:1:493:1 | mod m17 | +| main.rs:733:5:733:10 | ...::f | main.rs:487:5:492:5 | fn f | +| main.rs:734:5:734:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:734:5:734:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:735:5:735:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:735:5:735:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:736:5:736:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 | +| main.rs:736:5:736:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:737:5:737:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:738:5:738:7 | m18 | main.rs:495:1:513:1 | mod m18 | +| main.rs:738:5:738:12 | ...::m19 | main.rs:500:5:512:5 | mod m19 | +| main.rs:738:5:738:17 | ...::m20 | main.rs:505:9:511:9 | mod m20 | +| main.rs:738:5:738:20 | ...::g | main.rs:506:13:510:13 | fn g | +| main.rs:739:5:739:7 | m23 | main.rs:542:1:567:1 | mod m23 | +| main.rs:739:5:739:10 | ...::f | main.rs:562:5:566:5 | fn f | +| main.rs:740:5:740:7 | m24 | main.rs:569:1:637:1 | mod m24 | +| main.rs:740:5:740:10 | ...::f | main.rs:623:5:636:5 | fn f | +| main.rs:741:5:741:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:741:5:741:11 | ...::h | main.rs:50:1:69:1 | fn h | +| main.rs:743:5:743:11 | AStruct | main.rs:644:1:644:17 | struct AStruct | +| main.rs:744:5:744:11 | AStruct | main.rs:644:1:644:17 | struct AStruct | | 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 | @@ -359,7 +404,7 @@ resolvePath | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:17:30 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:677:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:746:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:17:30 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | diff --git a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected index 5222ecb5ad29..231252364953 100644 --- a/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/sensitivedata/CONSISTENCY/PathResolutionConsistency.expected @@ -1,29 +1,29 @@ multipleCallTargets -| test.rs:55:7:55:26 | ... .as_str() | -| test.rs:56:7:56:21 | ... .as_str() | -| test.rs:72:7:72:26 | ... .as_str() | -| test.rs:73:7:73:36 | ... .as_str() | -| test.rs:74:7:74:34 | ... .as_str() | -| test.rs:75:7:75:27 | ... .as_str() | -| test.rs:258:7:258:36 | ... .as_str() | -| test.rs:260:7:260:33 | ... .as_str() | -| test.rs:261:7:261:36 | ... .as_str() | -| test.rs:262:7:262:26 | ... .as_str() | -| test.rs:266:7:266:28 | ... .as_str() | -| test.rs:267:7:267:37 | ... .as_str() | -| test.rs:268:7:268:36 | ... .as_str() | -| test.rs:271:7:271:32 | ... .as_str() | -| test.rs:281:7:281:34 | ... .as_str() | -| test.rs:284:7:284:36 | ... .as_str() | -| test.rs:288:7:288:39 | ... .as_str() | -| test.rs:295:7:295:53 | ... .as_str() | -| test.rs:296:7:296:45 | ... .as_str() | -| test.rs:298:7:298:39 | ... .as_str() | -| test.rs:299:7:299:34 | ... .as_str() | -| test.rs:300:7:300:42 | ... .as_str() | -| test.rs:302:7:302:48 | ... .as_str() | -| test.rs:303:7:303:35 | ... .as_str() | -| test.rs:304:7:304:35 | ... .as_str() | -| test.rs:313:8:313:19 | num.as_str() | -| test.rs:324:8:324:19 | num.as_str() | -| test.rs:343:7:343:39 | ... .as_str() | +| test.rs:56:7:56:26 | ... .as_str() | +| test.rs:57:7:57:21 | ... .as_str() | +| test.rs:73:7:73:26 | ... .as_str() | +| test.rs:74:7:74:36 | ... .as_str() | +| test.rs:75:7:75:34 | ... .as_str() | +| test.rs:76:7:76:27 | ... .as_str() | +| test.rs:262:7:262:36 | ... .as_str() | +| test.rs:264:7:264:33 | ... .as_str() | +| test.rs:265:7:265:36 | ... .as_str() | +| test.rs:266:7:266:26 | ... .as_str() | +| test.rs:270:7:270:28 | ... .as_str() | +| test.rs:271:7:271:37 | ... .as_str() | +| test.rs:272:7:272:36 | ... .as_str() | +| test.rs:275:7:275:32 | ... .as_str() | +| test.rs:285:7:285:34 | ... .as_str() | +| test.rs:288:7:288:36 | ... .as_str() | +| test.rs:292:7:292:39 | ... .as_str() | +| test.rs:299:7:299:53 | ... .as_str() | +| test.rs:300:7:300:45 | ... .as_str() | +| test.rs:302:7:302:39 | ... .as_str() | +| test.rs:303:7:303:34 | ... .as_str() | +| test.rs:304:7:304:42 | ... .as_str() | +| test.rs:306:7:306:48 | ... .as_str() | +| test.rs:307:7:307:35 | ... .as_str() | +| test.rs:308:7:308:35 | ... .as_str() | +| test.rs:317:8:317:19 | num.as_str() | +| test.rs:328:8:328:19 | num.as_str() | +| test.rs:347:7:347:39 | ... .as_str() | diff --git a/rust/ql/test/library-tests/sensitivedata/test.rs b/rust/ql/test/library-tests/sensitivedata/test.rs index ad13fee59f15..0f4965ce2856 100644 --- a/rust/ql/test/library-tests/sensitivedata/test.rs +++ b/rust/ql/test/library-tests/sensitivedata/test.rs @@ -23,7 +23,7 @@ impl MyStruct { fn get_password() -> String { get_string() } fn test_passwords( - password: &str, pass_word: &str, passwd: &str, my_password: &str, password_str: &str, + password: &str, pass_word: &str, passwd: &str, my_password: &str, password_str: &str, password_confirmation: &str, pass_phrase: &str, passphrase: &str, passPhrase: &str, backup_code: &str, auth_key: &str, authkey: &str, authKey: &str, authentication_key: &str, authenticationkey: &str, authenticationKey: &str, oauth: &str, one_time_code: &str, @@ -37,6 +37,7 @@ fn test_passwords( sink(passwd); // $ sensitive=password sink(my_password); // $ sensitive=password sink(password_str); // $ sensitive=password + sink(password_confirmation); // $ sensitive=password sink(pass_phrase); // $ sensitive=password sink(passphrase); // $ sensitive=password sink(passPhrase); // $ sensitive=password @@ -48,12 +49,12 @@ fn test_passwords( sink(authentication_key); // $ sensitive=password sink(authenticationkey); // $ sensitive=password sink(authenticationKey); // $ sensitive=password - sink(oauth); // $ MISSING: sensitive=password + sink(oauth); // $ sensitive=password sink(one_time_code); // $ MISSING: sensitive=password sink(ms); // $ MISSING: sensitive=password sink(ms.password.as_str()); // $ sensitive=password - sink(ms.mfa.as_str()); // $ MISSING: sensitive=password + sink(ms.mfa.as_str()); // $ sensitive=password sink(get_password()); // $ sensitive=password let password2 = get_string(); @@ -67,10 +68,10 @@ fn test_passwords( sink(harmless); sink(encrypted_password); sink(password_hash); - sink(passwordFile); // $ SPURIOUS: sensitive=password + sink(passwordFile); sink(ms.harmless.as_str()); - sink(ms.password_file_path.as_str()); // $ SPURIOUS: sensitive=password + sink(ms.password_file_path.as_str()); sink(ms.password_enabled.as_str()); // $ SPURIOUS: sensitive=password sink(ms.numfailed.as_str()); @@ -127,11 +128,11 @@ fn test_credentials( sink(hashkey); sink(hash_key); - sink(sessionkeypath); // $ SPURIOUS: sensitive=id - sink(account_key_path); // $ SPURIOUS: sensitive=id + sink(sessionkeypath); + sink(account_key_path); - sink(ms.get_certificate_url()); // $ SPURIOUS: sensitive=certificate - sink(ms.get_certificate_file()); // $ SPURIOUS: sensitive=certificate + sink(ms.get_certificate_url()); + sink(ms.get_certificate_file()); sink(get_public_key()); sink(get_next_token()); @@ -160,16 +161,19 @@ impl DeviceInfo { fn test_device_info(&self, other: &DeviceInfo) { // private device info - sink(&self.api_key); // $ MISSING: sensitive=id - sink(&other.api_key); // $ MISSING: sensitive=id - sink(&self.deviceApiToken); // $ MISSING: sensitive=id - sink(&self.finger_print); // $ MISSING: sensitive=id - sink(&self.ip_address); // $ MISSING: sensitive=id - sink(self.macaddr12); // $ MISSING: sensitive=id - sink(&self.mac_addr); // $ MISSING: sensitive=id - sink(self.mac_addr.values); // $ MISSING: sensitive=id - sink(self.mac_addr.values[0]); // $ MISSING: sensitive=id - sink(&self.networkMacAddress); // $ MISSING: sensitive=id + sink(&self.api_key); // $ sensitive=password + sink(&other.api_key); // $ sensitive=password + sink(&self.deviceApiToken); // $ sensitive=password + sink(self.macaddr12); // $ sensitive=private + sink(&self.mac_addr); // $ sensitive=private + sink(self.mac_addr.values); // $ sensitive=private + sink(self.mac_addr.values[0]); // $ sensitive=private + sink(&self.networkMacAddress); // $ sensitive=private + + // dubious (may or may not be private device info, depending on context) + + sink(&self.finger_print); + sink(&self.ip_address); // not private device info @@ -267,26 +271,26 @@ fn test_private_info( sink(info.emergency_contact.as_str()); // $ sensitive=private sink(info.name_of_employer.as_str()); // $ sensitive=private - sink(&info.gender); // $ MISSING: sensitive=private - sink(info.genderString.as_str()); // $ MISSING: sensitive=private + sink(&info.gender); // $ sensitive=private + sink(info.genderString.as_str()); // $ sensitive=private let sex = "Male"; let gender = Gender::Female; let a = Gender::Female; - sink(sex); // $ MISSING: sensitive=private - sink(gender); // $ MISSING: sensitive=private + sink(sex); // $ sensitive=private + sink(gender); // $ sensitive=private sink(a); // $ MISSING: sensitive=private - sink(info.patient_id); // $ MISSING: sensitive=private - sink(info.linkedPatientId); // $ MISSING: sensitive=private - sink(info.patient_record.as_str()); // $ MISSING: sensitive=private - sink(info.patient_record.trim()); // $ MISSING: sensitive=private + sink(info.patient_id); // $ sensitive=private + sink(info.linkedPatientId); // $ sensitive=private + sink(info.patient_record.as_str()); // $ sensitive=private + sink(info.patient_record.trim()); // $ sensitive=private sink(&info.medical_notes); // $ sensitive=private sink(info.medical_notes[0].as_str()); // $ sensitive=private for n in info.medical_notes.iter() { sink(n.as_str()); // $ MISSING: sensitive=private } - sink(info.confidentialMessage.as_str()); // $ MISSING: sensitive=private - sink(info.confidentialMessage.to_lowercase()); // $ MISSING: sensitive=private + sink(info.confidentialMessage.as_str()); // $ sensitive=secret + sink(info.confidentialMessage.to_lowercase()); // $ sensitive=secret sink(info.latitude); // $ sensitive=private let x = info.longitude.unwrap(); @@ -296,12 +300,12 @@ fn test_private_info( sink(info.financials.credit_card_no.as_str()); // $ sensitive=private sink(info.financials.credit_rating); // $ sensitive=private sink(info.financials.user_ccn.as_str()); // $ sensitive=private - sink(info.financials.cvv.as_str()); // $ MISSING: sensitive=private - sink(info.financials.beneficiary.as_str()); // $ MISSING: sensitive=private - sink(info.financials.routing_number); // $ MISSING: sensitive=private - sink(info.financials.routingNumberText.as_str()); // $ MISSING: sensitive=private - sink(info.financials.iban.as_str()); // $ MISSING: sensitive=private - sink(info.financials.iBAN.as_str()); // $ MISSING: sensitive=private + sink(info.financials.cvv.as_str()); // $ sensitive=private + sink(info.financials.beneficiary.as_str()); // $ sensitive=private + sink(info.financials.routing_number); // $ sensitive=private + sink(info.financials.routingNumberText.as_str()); // $ sensitive=private + sink(info.financials.iban.as_str()); // $ sensitive=private + sink(info.financials.iBAN.as_str()); // $ sensitive=private sink(ContactDetails::HomePhoneNumber("123".to_string())); // $ sensitive=private sink(ContactDetails::MobileNumber("123".to_string())); // $ sensitive=private @@ -343,8 +347,8 @@ fn test_private_info( sink(info.financials.harmless.as_str()); sink(info.financials.num_accounts); // $ SPURIOUS: sensitive=id sink(info.financials.total_accounts); // $ SPURIOUS: sensitive=id - sink(info.financials.accounting); // $ SPURIOUS: sensitive=id - sink(info.financials.unaccounted); // $ SPURIOUS: sensitive=id + sink(info.financials.accounting); + sink(info.financials.unaccounted); sink(info.financials.multiband); sink(ContactDetails::FavouriteColor("blue".to_string())); @@ -362,5 +366,5 @@ impl MyArray { fn test_iterator() { let iter = std::iter::repeat(1).take(10); - sink(MyArray::from_trusted_iterator(iter)); // $ SPURIOUS: sensitive=secret + sink(MyArray::from_trusted_iterator(iter)); } diff --git a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected index 9ff363c2b5e8..c59e033048e5 100644 --- a/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/type-inference/CONSISTENCY/PathResolutionConsistency.expected @@ -1,8 +1,8 @@ multipleCallTargets | dereference.rs:61:15:61:24 | e1.deref() | -| main.rs:2186:13:2186:31 | ...::from(...) | -| main.rs:2187:13:2187:31 | ...::from(...) | -| main.rs:2188:13:2188:31 | ...::from(...) | -| main.rs:2194:13:2194:31 | ...::from(...) | -| main.rs:2195:13:2195:31 | ...::from(...) | -| main.rs:2196:13:2196:31 | ...::from(...) | +| main.rs:2314:13:2314:31 | ...::from(...) | +| main.rs:2315:13:2315:31 | ...::from(...) | +| main.rs:2316:13:2316:31 | ...::from(...) | +| main.rs:2322:13:2322:31 | ...::from(...) | +| main.rs:2323:13:2323:31 | ...::from(...) | +| main.rs:2324:13:2324:31 | ...::from(...) | diff --git a/rust/ql/test/library-tests/type-inference/closure.rs b/rust/ql/test/library-tests/type-inference/closure.rs new file mode 100644 index 000000000000..1b11335947c1 --- /dev/null +++ b/rust/ql/test/library-tests/type-inference/closure.rs @@ -0,0 +1,76 @@ +/// Tests for type inference for closures and higher-order functions. + +mod simple_closures { + pub fn test() { + // A simple closure without type annotations or invocations. + let my_closure = |a, b| a && b; + + let x: i64 = 1i64; // $ type=x:i64 + let add_one = |n| n + 1i64; // $ target=add + let _y = add_one(x); // $ type=_y:i64 + + // The type of `x` is inferred from the closure's argument type. + let x = Default::default(); // $ type=x:i64 target=default + let add_zero = |n: i64| n; + let _y = add_zero(x); // $ type=_y:i64 + + let _get_bool = || -> bool { + // The return type annotation on the closure lets us infer the type of `b`. + let b = Default::default(); // $ type=b:bool target=default + b + }; + + // The parameter type of `id` is inferred from the argument. + let id = |b| b; // $ type=b:bool + let _b = id(true); // $ type=_b:bool + + // The return type of `id2` is inferred from the type of the call expression. + let id2 = |b| b; + let arg = Default::default(); // $ target=default type=arg:bool + let _b2: bool = id2(arg); // $ type=_b2:bool + } +} + +mod fn_once_trait { + fn return_type i64>(f: F) { + let _return = f(true); // $ type=_return:i64 + } + + fn argument_type i64>(f: F) { + let arg = Default::default(); // $ target=default type=arg:bool + f(arg); + } + + fn apply B>(f: F, a: A) -> B { + f(a) + } + + fn apply_two(f: impl FnOnce(i64) -> i64) -> i64 { + f(2) + } + + fn test() { + let f = |x: bool| -> i64 { + if x { + 1 + } else { + 0 + } + }; + let _r = apply(f, true); // $ target=apply type=_r:i64 + + let f = |x| x + 1; // $ MISSING: type=x:i64 target=add + let _r2 = apply_two(f); // $ target=apply_two type=_r2:i64 + } +} + +mod dyn_fn_once { + fn apply_boxed B + ?Sized>(f: Box, arg: A) -> B { + f(arg) + } + + fn apply_boxed_dyn(f: Box B>, arg: A) { + let _r1 = apply_boxed(f, arg); // $ target=apply_boxed type=_r1:B + let _r2 = apply_boxed(Box::new(|_: i64| true), 3); // $ target=apply_boxed target=new type=_r2:bool + } +} diff --git a/rust/ql/test/library-tests/type-inference/dereference.rs b/rust/ql/test/library-tests/type-inference/dereference.rs index ad4ce93abb36..f4d9d68a0995 100644 --- a/rust/ql/test/library-tests/type-inference/dereference.rs +++ b/rust/ql/test/library-tests/type-inference/dereference.rs @@ -93,10 +93,46 @@ fn implicit_dereference() { let _y = x.is_positive(); // $ MISSING: target=is_positive type=_y:bool } +mod implicit_deref_coercion_cycle { + use std::collections::HashMap; + + #[derive(Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)] + pub struct Key {} + + // This example can trigger a cycle in type inference due to an implicit + // dereference if we are not careful and accurate enough. + // + // To explain how a cycle might happen, we let `[V]` denote the type of the + // type parameter `V` of `key_to_key` (i.e., the type of the values in the + // map) and `[key]` denote the type of `key`. + // + // 1. From the first two lines we infer `[V] = &Key` and `[key] = &Key` + // 2. At the 3. line we infer the type of `ref_key` to be `&[V]`. + // 3. At the 4. line we impose the equality `[key] = &[V]`, not accounting + // for the implicit deref caused by a coercion. + // 4. At the last line we infer `[key] = [V]`. + // + // Putting the above together we have `[V] = [key] = &[V]` which is a cycle. + // This means that `[key]` is both `&Key`, `&&Key`, `&&&Key`, and so on ad + // infinitum. + + #[rustfmt::skip] + pub fn test() { + let mut key_to_key = HashMap::<&Key, &Key>::new(); // $ target=new + let mut key = &Key {}; // Initialize key2 to a reference + if let Some(ref_key) = key_to_key.get(key) { // $ target=get + // Below `ref_key` is implicitly dereferenced from `&&Key` to `&Key` + key = ref_key; + } + key_to_key.insert(key, key); // $ target=insert + } +} + pub fn test() { explicit_monomorphic_dereference(); // $ target=explicit_monomorphic_dereference explicit_polymorphic_dereference(); // $ target=explicit_polymorphic_dereference explicit_ref_dereference(); // $ target=explicit_ref_dereference explicit_box_dereference(); // $ target=explicit_box_dereference implicit_dereference(); // $ target=implicit_dereference + implicit_deref_coercion_cycle::test(); // $ target=test } diff --git a/rust/ql/test/library-tests/type-inference/dyn_type.rs b/rust/ql/test/library-tests/type-inference/dyn_type.rs new file mode 100644 index 000000000000..24f320ec3f40 --- /dev/null +++ b/rust/ql/test/library-tests/type-inference/dyn_type.rs @@ -0,0 +1,108 @@ +// Test cases for type inference and method resolution with `dyn` types + +use std::fmt::Debug; + +trait MyTrait1 { + // MyTrait1::m + fn m(&self) -> String; +} + +trait GenericGet { + // GenericGet::get + fn get(&self) -> A; +} + +trait AssocTrait { + type AP; + // AssocTrait::get + fn get(&self) -> (GP, Self::AP); +} + +#[derive(Clone, Debug)] +struct MyStruct { + value: i32, +} + +impl MyTrait1 for MyStruct { + // MyStruct1::m + fn m(&self) -> String { + format!("MyTrait1: {}", self.value) // $ fieldof=MyStruct + } +} + +#[derive(Clone, Debug)] +struct GenStruct { + value: A, +} + +impl GenericGet for GenStruct { + // GenStruct::get + fn get(&self) -> A { + self.value.clone() // $ fieldof=GenStruct target=clone + } +} + +impl AssocTrait for GenStruct +where + GGP: Clone + Debug, +{ + type AP = bool; + // GenStruct::get + fn get(&self) -> (GGP, bool) { + (self.value.clone(), true) // $ fieldof=GenStruct target=clone + } +} + +fn get_a + ?Sized>(a: &G) -> A { + a.get() // $ target=GenericGet::get +} + +fn get_box_trait(a: A) -> Box> { + Box::new(GenStruct { value: a }) // $ target=new +} + +fn test_basic_dyn_trait(obj: &dyn MyTrait1) { + let _result = (*obj).m(); // $ target=deref target=MyTrait1::m type=_result:String +} + +fn test_generic_dyn_trait(obj: &dyn GenericGet) { + let _result1 = (*obj).get(); // $ target=deref target=GenericGet::get type=_result1:String + let _result2 = get_a(obj); // $ target=get_a type=_result2:String +} + +fn test_poly_dyn_trait() { + let obj = get_box_trait(true); // $ target=get_box_trait + let _result = (*obj).get(); // $ target=deref target=GenericGet::get type=_result:bool +} + +fn assoc_dyn_get(a: &dyn AssocTrait) -> (A, B) { + a.get() // $ target=AssocTrait::get +} + +fn assoc_get + ?Sized>(a: &T) -> (A, B) { + a.get() // $ target=AssocTrait::get +} + +fn test_assoc_type(obj: &dyn AssocTrait) { + let ( + _gp, // $ type=_gp:i64 + _ap, // $ type=_ap:bool + ) = (*obj).get(); // $ target=deref target=AssocTrait::get + let ( + _gp, // $ type=_gp:i64 + _ap, // $ type=_ap:bool + ) = assoc_dyn_get(obj); // $ target=assoc_dyn_get + let ( + _gp, // $ type=_gp:i64 + _ap, // $ type=_ap:bool + ) = assoc_get(obj); // $ target=assoc_get +} + +pub fn test() { + test_basic_dyn_trait(&MyStruct { value: 42 }); // $ target=test_basic_dyn_trait + test_generic_dyn_trait(&GenStruct { + value: "".to_string(), + }); // $ target=test_generic_dyn_trait + test_poly_dyn_trait(); // $ target=test_poly_dyn_trait + test_assoc_type(&GenStruct { value: 100 }); // $ target=test_assoc_type +} diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index a4a37e27794c..0b216ebe78d3 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -545,12 +545,29 @@ mod type_parameter_bounds { println!("{:?}", s); // $ type=s:S1 } + fn trait_per_where_bound_with_type(x: T) + where + T: FirstTrait, + { + let s = x.method(); // $ target=FirstTrait::method + println!("{:?}", s); // $ type=s:S1 + } + trait Pair { fn fst(self) -> P1; fn snd(self) -> P2; } + fn trait_per_multiple_where_bounds_with_type(x: T, y: T) + where + T: FirstTrait, + T: Pair, + { + let _ = x.fst(); // $ target=fst type=_:S1 + let _ = y.method(); // $ target=FirstTrait::method _:S1 + } + fn call_trait_per_bound_with_type_1>(x: T, y: T) { // The type in the type parameter bound determines the return type. let s1 = x.fst(); // $ target=fst type=s1:S1 @@ -653,7 +670,7 @@ mod function_trait_bounds { } } -mod trait_associated_type { +mod associated_type_in_trait { #[derive(Debug)] struct Wrapper { field: A, @@ -803,6 +820,64 @@ mod trait_associated_type { } } +mod associated_type_in_supertrait { + trait Supertrait { + type Content; + // Supertrait::insert + fn insert(&self, content: Self::Content); + } + + trait Subtrait: Supertrait { + // Subtrait::get_content + fn get_content(&self) -> Self::Content; + } + + // A subtrait declared using a `where` clause. + trait Subtrait2 + where + Self: Supertrait, + { + // Subtrait2::insert_two + fn insert_two(&self, c1: Self::Content, c2: Self::Content) { + self.insert(c1); // $ target=Supertrait::insert + self.insert(c2); // $ target=Supertrait::insert + } + } + + struct MyType(T); + + impl Supertrait for MyType { + type Content = T; + fn insert(&self, _content: Self::Content) { + println!("Inserting content: "); + } + } + + impl Subtrait for MyType { + // MyType::get_content + fn get_content(&self) -> Self::Content { + (*self).0.clone() // $ fieldof=MyType target=clone target=deref + } + } + + fn get_content(item: &T) -> T::Content { + item.get_content() // $ target=Subtrait::get_content + } + + fn insert_three(item: &T, c1: T::Content, c2: T::Content, c3: T::Content) { + item.insert(c1); // $ target=Supertrait::insert + item.insert_two(c2, c3); // $ target=Subtrait2::insert_two + } + + fn test() { + let item1 = MyType(42i64); + let _content1 = item1.get_content(); // $ target=MyType::get_content MISSING: type=_content1:i64 + + let item2 = MyType(true); + let _content2 = get_content(&item2); // $ target=get_content MISSING: type=_content2:bool + } +} + mod generic_enum { #[derive(Debug)] enum MyEnum { @@ -1042,6 +1117,23 @@ mod type_aliases { type S7 = Result, S1>; + struct GenS(GenT); + + trait TraitWithAssocType { + type Output; + fn get_input(self) -> Self::Output; + } + + impl TraitWithAssocType for GenS { + // This is not a recursive type, the `Output` on the right-hand side + // refers to the type parameter of the impl block just above. + type Output = Result; + + fn get_input(self) -> Self::Output { + Ok(self.0) // $ fieldof=GenS type=Ok(...):Result type=Ok(...):T.Output type=Ok(...):E.Output + } + } + pub fn f() { // Type can be inferred from the constructor let p1: MyPair = PairOption::PairBoth(S1, S2); @@ -1062,6 +1154,8 @@ mod type_aliases { g(PairOption::PairSnd(PairOption::PairSnd(S3))); // $ target=g let x: S7; // $ type=x:Result $ type=x:E.S1 $ type=x:T.S4 $ type=x:T.T41.S2 $ type=x:T.T42.S5 $ type=x:T.T42.T5.S2 + + let y = GenS(true).get_input(); // $ type=y:Result type=y:T.bool type=y:E.bool target=get_input } } @@ -1854,8 +1948,10 @@ mod async_ { } mod impl_trait { + #[derive(Copy, Clone)] struct S1; struct S2; + struct S3(T3); trait Trait1 { fn f1(&self) {} // Trait1f1 @@ -1887,6 +1983,13 @@ mod impl_trait { } } + impl MyTrait for S3 { + fn get_a(&self) -> T { + let S3(t) = self; + t.clone() + } + } + fn get_a_my_trait() -> impl MyTrait { S1 } @@ -1895,6 +1998,18 @@ mod impl_trait { t.get_a() // $ target=MyTrait::get_a } + fn get_a_my_trait2(x: T) -> impl MyTrait { + S3(x) + } + + fn get_a_my_trait3(x: T) -> Option> { + Some(S3(x)) + } + + fn get_a_my_trait4(x: T) -> (impl MyTrait, impl MyTrait) { + (S3(x.clone()), S3(x)) // $ target=clone + } + fn uses_my_trait2(t: impl MyTrait) -> A { t.get_a() // $ target=MyTrait::get_a } @@ -1908,6 +2023,11 @@ mod impl_trait { let a = get_a_my_trait(); // $ target=get_a_my_trait let c = uses_my_trait2(a); // $ type=c:S2 target=uses_my_trait2 let d = uses_my_trait2(S1); // $ type=d:S2 target=uses_my_trait2 + let e = get_a_my_trait2(S1).get_a(); // $ target=get_a_my_trait2 target=MyTrait::get_a type=e:S1 + + // For this function the `impl` type does not appear in the root of the return type + let f = get_a_my_trait3(S1).unwrap().get_a(); // $ target=get_a_my_trait3 target=unwrap target=MyTrait::get_a type=f:S1 + let g = get_a_my_trait4(S1).0.get_a(); // $ target=get_a_my_trait4 target=MyTrait::get_a type=g:S1 } } @@ -2006,7 +2126,11 @@ mod method_determined_by_argument_type { // MyAdd::my_add fn my_add(self, value: bool) -> Self { - if value { 1 } else { 0 } + if value { + 1 + } else { + 0 + } } } @@ -2057,7 +2181,11 @@ mod method_determined_by_argument_type { impl MyFrom for i64 { // MyFrom::my_from fn my_from(value: bool) -> Self { - if value { 1 } else { 0 } + if value { + 1 + } else { + 0 + } } } @@ -2162,7 +2290,7 @@ mod loops { for i in [1, 2, 3] {} // $ type=i:i32 for i in [1, 2, 3].map(|x| x + 1) {} // $ target=map MISSING: type=i:i32 - for i in [1, 2, 3].into_iter() {} // $ target=into_iter MISSING: type=i:i32 + for i in [1, 2, 3].into_iter() {} // $ target=into_iter type=i:i32 let vals1 = [1u8, 2, 3]; // $ type=vals1:[T;...].u8 for u in vals1 {} // $ type=u:u8 @@ -2260,13 +2388,11 @@ mod loops { #[rustfmt::skip] let _ = while a < 10 // $ target=lt type=a:i64 { - a += 1; // $ type=a:i64 target=add_assign + a += 1; // $ type=a:i64 MISSING: target=add_assign }; } } -mod dereference; - mod explicit_type_args { struct S1(T); @@ -2334,20 +2460,36 @@ mod tuples { } pub fn f() { - let a = S1::get_pair(); // $ target=get_pair MISSING: type=a:? - let mut b = S1::get_pair(); // $ target=get_pair MISSING: type=b:? - let (c, d) = S1::get_pair(); // $ target=get_pair MISSING: type=c:? type=d:? - let (mut e, f) = S1::get_pair(); // $ target=get_pair MISSING: type=e: type=f: - let (mut g, mut h) = S1::get_pair(); // $ target=get_pair MISSING: type=g:? type=h:? - - a.0.foo(); // $ MISSING: target=foo - b.1.foo(); // $ MISSING: target=foo - c.foo(); // $ MISSING: target=foo - d.foo(); // $ MISSING: target=foo - e.foo(); // $ MISSING: target=foo - f.foo(); // $ MISSING: target=foo - g.foo(); // $ MISSING: target=foo - h.foo(); // $ MISSING: target=foo + let a = S1::get_pair(); // $ target=get_pair type=a:(T_2) + let mut b = S1::get_pair(); // $ target=get_pair type=b:(T_2) + let (c, d) = S1::get_pair(); // $ target=get_pair type=c:S1 type=d:S1 + let (mut e, f) = S1::get_pair(); // $ target=get_pair type=e:S1 type=f:S1 + let (mut g, mut h) = S1::get_pair(); // $ target=get_pair type=g:S1 type=h:S1 + + a.0.foo(); // $ target=foo + b.1.foo(); // $ target=foo + c.foo(); // $ target=foo + d.foo(); // $ target=foo + e.foo(); // $ target=foo + f.foo(); // $ target=foo + g.foo(); // $ target=foo + h.foo(); // $ target=foo + + // Here type information must flow from `pair.0` and `pair.1` into + // `pair` and from `(a, b)` into `a` and `b` in order for the types of + // `a` and `b` to be inferred. + let a = Default::default(); // $ target=default type=a:i64 + let b = Default::default(); // $ target=default type=b:bool + let pair = (a, b); // $ type=pair:0(2).i64 type=pair:1(2).bool + let i: i64 = pair.0; + let j: bool = pair.1; + + let pair = [1, 1].into(); // $ type=pair:(T_2) type=pair:0(2).i32 type=pair:1(2).i32 MISSING: target=into + match pair { + (0, 0) => print!("unexpected"), + _ => print!("expected"), + } + let x = pair.0; // $ type=x:i32 } } @@ -2378,46 +2520,47 @@ pub mod pattern_matching_experimental { } } -mod closures { - struct Row { - data: i64, - } +pub mod exec { + // a *greatly* simplified model of `MySqlConnection.execute` in SQLX - impl Row { - fn get(&self) -> i64 { - self.data // $ fieldof=Row - } - } + trait Connection {} - struct Table { - rows: Vec, + trait Executor { + fn execute1(&self); + fn execute2(&self, query: E); } - impl Table { - fn new() -> Self { - Table { rows: Vec::new() } // $ target=new + impl Executor for T { + fn execute1(&self) { + println!("Executor::execute1"); } - fn count_with(&self, property: impl Fn(Row) -> bool) -> i64 { - 0 // (not implemented) + fn execute2(&self, _query: E) { + println!("Executor::execute2"); } } + struct MySqlConnection {} + + impl Connection for MySqlConnection {} + pub fn f() { - Some(1).map(|x| { - let x = x; // $ MISSING: type=x:i32 - println!("{x}"); - }); // $ target=map - - let table = Table::new(); // $ target=new type=table:Table - let result = table.count_with(|row| // $ type=result:i64 - { - let v = row.get(); // $ MISSING: target=get type=v:i64 - v > 0 // $ MISSING: target=gt - }); // $ target=count_with + let c = MySqlConnection {}; // $ type=c:MySqlConnection + + c.execute1(); // $ MISSING: target=execute1 + MySqlConnection::execute1(&c); // $ MISSING: target=execute1 + + c.execute2("SELECT * FROM users"); // $ MISSING: target=execute2 + c.execute2::<&str>("SELECT * FROM users"); // $ MISSING: target=execute2 + MySqlConnection::execute2(&c, "SELECT * FROM users"); // $ MISSING: target=execute2 + MySqlConnection::execute2::<&str>(&c, "SELECT * FROM users"); // $ MISSING: target=execute2 } } +mod closure; +mod dereference; +mod dyn_type; + fn main() { field_access::f(); // $ target=f method_impl::f(); // $ target=f @@ -2425,7 +2568,7 @@ fn main() { method_non_parametric_impl::f(); // $ target=f method_non_parametric_trait_impl::f(); // $ target=f function_trait_bounds::f(); // $ target=f - trait_associated_type::f(); // $ target=f + associated_type_in_trait::f(); // $ target=f generic_enum::f(); // $ target=f method_supertraits::f(); // $ target=f function_trait_bounds_2::f(); // $ target=f @@ -2445,8 +2588,9 @@ fn main() { macros::f(); // $ target=f method_determined_by_argument_type::f(); // $ target=f tuples::f(); // $ target=f + exec::f(); // $ target=f dereference::test(); // $ target=test pattern_matching::test_all_patterns(); // $ target=test_all_patterns pattern_matching_experimental::box_patterns(); // $ target=box_patterns - closures::f() // $ target=f + dyn_type::test(); // $ target=test } diff --git a/rust/ql/test/library-tests/type-inference/pattern_matching.rs b/rust/ql/test/library-tests/type-inference/pattern_matching.rs index 9da38e6ea57d..28da3e1ab580 100755 --- a/rust/ql/test/library-tests/type-inference/pattern_matching.rs +++ b/rust/ql/test/library-tests/type-inference/pattern_matching.rs @@ -446,13 +446,13 @@ pub fn tuple_patterns() { // TuplePat - Tuple patterns match tuple { (1, 2, 3.0) => { - let exact_tuple = tuple; // $ MISSING: type=exact_tuple:? + let exact_tuple = tuple; // $ type=exact_tuple:(T_3) println!("Exact tuple: {:?}", exact_tuple); } (a, b, c) => { - let first_elem = a; // $ MISSING: type=first_elem:i32 - let second_elem = b; // $ MISSING: type=second_elem:i64 - let third_elem = c; // $ MISSING: type=third_elem:f32 + let first_elem = a; // $ type=first_elem:i32 + let second_elem = b; // $ type=second_elem:i64 + let third_elem = c; // $ type=third_elem:f32 println!("Tuple: ({}, {}, {})", first_elem, second_elem, third_elem); } } @@ -469,7 +469,7 @@ pub fn tuple_patterns() { let unit = (); match unit { () => { - let unit_value = unit; // $ MISSING: type=unit_value:? + let unit_value = unit; // $ type=unit_value:() println!("Unit value: {:?}", unit_value); } } @@ -478,7 +478,7 @@ pub fn tuple_patterns() { let single = (42i32,); match single { (x,) => { - let single_elem = x; // $ MISSING: type=single_elem:i32 + let single_elem = x; // $ type=single_elem:i32 println!("Single element tuple: {}", single_elem); } } @@ -499,8 +499,8 @@ pub fn parenthesized_patterns() { let tuple = (1i32, 2i32); match tuple { (x, (y)) => { - let paren_x = x; // $ MISSING: type=paren_x:i32 - let paren_y = y; // $ MISSING: type=paren_y:i32 + let paren_x = x; // $ type=paren_x:i32 + let paren_y = y; // $ type=paren_y:i32 println!("Parenthesized in tuple: {}, {}", paren_x, paren_y); } } @@ -704,7 +704,7 @@ pub fn complex_nested_patterns() { } // Catch-all with identifier pattern other => { - let other_complex = other; // $ MISSING: type=other_complex:? + let other_complex = other; // $ type=other_complex:0(2).Point type=other_complex:1(2).MyOption println!("Other complex data: {:?}", other_complex); } } @@ -719,9 +719,9 @@ pub fn patterns_in_let_statements() { let tuple = (1i32, 2i64, 3.0f32); let (a, b, c) = tuple; // TuplePat in let - let let_a = a; // $ MISSING: type=let_a:i32 - let let_b = b; // $ MISSING: type=let_b:i64 - let let_c = c; // $ MISSING: type=let_c:f32 + let let_a = a; // $ type=let_a:i32 + let let_b = b; // $ type=let_b:i64 + let let_c = c; // $ type=let_c:f32 let array = [1i32, 2, 3, 4, 5]; let [first, .., last] = array; // SlicePat in let @@ -759,20 +759,20 @@ pub fn patterns_in_function_parameters() { } fn extract_tuple((first, _, third): (i32, f64, bool)) -> (i32, bool) { - let param_first = first; // $ MISSING: type=param_first:i32 - let param_third = third; // $ MISSING: type=param_third:bool + let param_first = first; // $ type=param_first:i32 + let param_third = third; // $ type=param_third:bool (param_first, param_third) } // Call the functions to use them let point = Point { x: 5, y: 10 }; - let extracted = extract_point(point); // $ target=extract_point MISSING: type=extracted:? + let extracted = extract_point(point); // $ target=extract_point type=extracted:0(2).i32 type=extracted:1(2).i32 let color = Color(200, 100, 50); let red = extract_color(color); // $ target=extract_color type=red:u8 let tuple = (42i32, 3.14f64, true); - let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple MISSING: type=tuple_extracted:? + let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple type=tuple_extracted:0(2).i32 type=tuple_extracted:1(2).bool } #[rustfmt::skip] diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index e4da3d0dd168..f25567711782 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -1,4 +1,213 @@ inferType +| closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:6:13:6:22 | my_closure | dyn(Args) | file://:0:0:0:0 | (T_2) | +| closure.rs:6:13:6:22 | my_closure | dyn(Args).0(2) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:13:6:22 | my_closure | dyn(Args).1(2) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:13:6:22 | my_closure | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:26:6:38 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_2) | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).0(2) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).1(2) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:26:6:38 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:6:27:6:27 | a | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:30:6:30 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:33:6:33 | a | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:33:6:38 | ... && ... | | {EXTERNAL LOCATION} | bool | +| closure.rs:6:38:6:38 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:8:13:8:13 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:8:22:8:25 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:13:9:19 | add_one | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:9:13:9:19 | add_one | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:9:13:9:19 | add_one | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:13:9:19 | add_one | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:23:9:34 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:23:9:34 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:24:9:24 | n | | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:27:9:27 | n | | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:27:9:34 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| closure.rs:9:31:9:34 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:13:10:14 | _y | | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:18:10:24 | add_one | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:10:18:10:24 | add_one | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:10:18:10:24 | add_one | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:18:10:24 | add_one | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:18:10:27 | add_one(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:10:26:10:26 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:13:13:13:13 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:13:17:13:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:13:14:20 | add_zero | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:14:13:14:20 | add_zero | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:14:13:14:20 | add_zero | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:13:14:20 | add_zero | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:24:14:33 | \|...\| n | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:14:24:14:33 | \|...\| n | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:14:24:14:33 | \|...\| n | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:24:14:33 | \|...\| n | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:25:14:25 | n | | {EXTERNAL LOCATION} | i64 | +| closure.rs:14:33:14:33 | n | | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:13:15:14 | _y | | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:18:15:25 | add_zero | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:15:18:15:25 | add_zero | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:15:18:15:25 | add_zero | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:18:15:25 | add_zero | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:18:15:28 | add_zero(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:27:15:27 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:17:13:17:21 | _get_bool | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:17:13:17:21 | _get_bool | dyn(Args) | file://:0:0:0:0 | () | +| closure.rs:17:13:17:21 | _get_bool | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:17:25:21:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:17:25:21:9 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | () | +| closure.rs:17:25:21:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:17:36:21:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| closure.rs:19:17:19:17 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:19:21:19:38 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:20:13:20:13 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:24:13:24:14 | id | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:24:13:24:14 | id | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:24:13:24:14 | id | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:24:13:24:14 | id | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:24:18:24:22 | \|...\| b | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:24:18:24:22 | \|...\| b | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:24:18:24:22 | \|...\| b | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:24:18:24:22 | \|...\| b | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:24:19:24:19 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:24:22:24:22 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:25:13:25:14 | _b | | {EXTERNAL LOCATION} | bool | +| closure.rs:25:18:25:19 | id | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:25:18:25:19 | id | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:25:18:25:19 | id | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:25:18:25:19 | id | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:25:18:25:25 | id(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:25:21:25:24 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:28:13:28:15 | id2 | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:28:13:28:15 | id2 | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:28:13:28:15 | id2 | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:28:13:28:15 | id2 | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:28:19:28:23 | \|...\| b | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:28:19:28:23 | \|...\| b | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:28:19:28:23 | \|...\| b | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:28:19:28:23 | \|...\| b | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:28:20:28:20 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:28:23:28:23 | b | | {EXTERNAL LOCATION} | bool | +| closure.rs:29:13:29:15 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:29:19:29:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:30:13:30:15 | _b2 | | {EXTERNAL LOCATION} | bool | +| closure.rs:30:25:30:27 | id2 | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:30:25:30:27 | id2 | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:30:25:30:27 | id2 | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:30:25:30:27 | id2 | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:30:25:30:32 | id2(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:30:29:30:31 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:35:44:35:44 | f | | closure.rs:35:20:35:41 | F | +| closure.rs:36:13:36:19 | _return | | {EXTERNAL LOCATION} | i64 | +| closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | +| closure.rs:36:23:36:29 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:39:46:39:46 | f | | closure.rs:39:22:39:43 | F | +| closure.rs:40:13:40:15 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:40:19:40:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:41:9:41:9 | f | | closure.rs:39:22:39:43 | F | +| closure.rs:41:9:41:14 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:41:11:41:13 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:44:39:44:39 | f | | closure.rs:44:20:44:36 | F | +| closure.rs:44:45:44:45 | a | | closure.rs:44:14:44:14 | A | +| closure.rs:44:56:46:5 | { ... } | | closure.rs:44:17:44:17 | B | +| closure.rs:45:9:45:9 | f | | closure.rs:44:20:44:36 | F | +| closure.rs:45:9:45:12 | f(...) | | closure.rs:44:17:44:17 | B | +| closure.rs:45:11:45:11 | a | | closure.rs:44:14:44:14 | A | +| closure.rs:48:18:48:18 | f | | closure.rs:48:21:48:43 | ImplTraitTypeRepr | +| closure.rs:48:53:50:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:49:9:49:9 | f | | closure.rs:48:21:48:43 | ImplTraitTypeRepr | +| closure.rs:49:9:49:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:13:53:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:53:13:53:13 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:53:13:53:13 | f | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:53:13:53:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:53:13:53:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:17:59:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:53:17:59:9 | \|...\| ... | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:53:17:59:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:53:17:59:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:18:53:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:53:34:59:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:53:34:59:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:54:13:58:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| closure.rs:54:13:58:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| closure.rs:54:16:54:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:54:18:56:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:54:18:56:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:55:17:55:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:55:17:55:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:56:20:58:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:56:20:58:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:57:17:57:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:57:17:57:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:60:13:60:14 | _r | | {EXTERNAL LOCATION} | i32 | +| closure.rs:60:13:60:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:60:18:60:31 | apply(...) | | {EXTERNAL LOCATION} | i32 | +| closure.rs:60:18:60:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:60:24:60:24 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:60:24:60:24 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:60:24:60:24 | f | dyn(Args).0(1) | {EXTERNAL LOCATION} | bool | +| closure.rs:60:24:60:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:60:24:60:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:60:27:60:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:62:13:62:13 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:62:13:62:13 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:62:17:62:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:62:17:62:25 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:62:25:62:25 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:63:13:63:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:63:19:63:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:63:29:63:29 | f | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:63:29:63:29 | f | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:68:54:68:54 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:68:54:68:54 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:68:54:68:54 | f | T | closure.rs:68:26:68:51 | F | +| closure.rs:68:65:68:67 | arg | | closure.rs:68:20:68:20 | A | +| closure.rs:68:78:70:5 | { ... } | | closure.rs:68:23:68:23 | B | +| closure.rs:69:9:69:9 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:69:9:69:9 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:69:9:69:9 | f | T | closure.rs:68:26:68:51 | F | +| closure.rs:69:9:69:14 | f(...) | | closure.rs:68:23:68:23 | B | +| closure.rs:69:11:69:13 | arg | | closure.rs:68:20:68:20 | A | +| closure.rs:72:30:72:30 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:72:30:72:30 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:72:30:72:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:72:30:72:30 | f | T.dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:72:30:72:30 | f | T.dyn(Args).0(1) | closure.rs:72:24:72:24 | A | +| closure.rs:72:30:72:30 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | +| closure.rs:72:58:72:60 | arg | | closure.rs:72:24:72:24 | A | +| closure.rs:73:13:73:15 | _r1 | | closure.rs:72:27:72:27 | B | +| closure.rs:73:19:73:37 | apply_boxed(...) | | closure.rs:72:27:72:27 | B | +| closure.rs:73:31:73:31 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:73:31:73:31 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:73:31:73:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:73:31:73:31 | f | T.dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:73:31:73:31 | f | T.dyn(Args).0(1) | closure.rs:72:24:72:24 | A | +| closure.rs:73:31:73:31 | f | T.dyn(Output) | closure.rs:72:27:72:27 | B | +| closure.rs:73:34:73:36 | arg | | closure.rs:72:24:72:24 | A | +| closure.rs:74:13:74:15 | _r2 | | {EXTERNAL LOCATION} | bool | +| closure.rs:74:19:74:57 | apply_boxed(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:74:31:74:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| closure.rs:74:31:74:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| closure.rs:74:31:74:53 | ...::new(...) | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:31:74:53 | ...::new(...) | T.dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:74:40:74:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:74:40:74:52 | \|...\| true | dyn(Args) | file://:0:0:0:0 | (T_1) | +| closure.rs:74:40:74:52 | \|...\| true | dyn(Args).0(1) | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:40:74:52 | \|...\| true | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:74:41:74:41 | _ | | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:49:74:52 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:74:56:74:56 | 3 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:74:56:74:56 | 3 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:12:14:12:18 | SelfParam | | file://:0:0:0:0 | & | | dereference.rs:12:14:12:18 | SelfParam | &T | dereference.rs:4:1:6:1 | MyIntPointer | | dereference.rs:12:29:14:5 | { ... } | | file://:0:0:0:0 | & | @@ -156,6 +365,294 @@ inferType | dereference.rs:92:37:92:41 | 34i64 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:93:14:93:14 | x | | dereference.rs:17:1:19:1 | MySmartPointer | | dereference.rs:93:14:93:14 | x | T | {EXTERNAL LOCATION} | i64 | +| dereference.rs:121:17:121:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:121:17:121:26 | key_to_key | K | file://:0:0:0:0 | & | +| dereference.rs:121:17:121:26 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:121:17:121:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:121:17:121:26 | key_to_key | V | file://:0:0:0:0 | & | +| dereference.rs:121:17:121:26 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:121:30:121:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:121:30:121:57 | ...::new(...) | K | file://:0:0:0:0 | & | +| dereference.rs:121:30:121:57 | ...::new(...) | K.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:121:30:121:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:121:30:121:57 | ...::new(...) | V | file://:0:0:0:0 | & | +| dereference.rs:121:30:121:57 | ...::new(...) | V.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:122:17:122:19 | key | | file://:0:0:0:0 | & | +| dereference.rs:122:17:122:19 | key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:122:17:122:19 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:122:17:122:19 | key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:122:23:122:29 | &... | | file://:0:0:0:0 | & | +| dereference.rs:122:23:122:29 | &... | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:122:23:122:29 | &... | &T | file://:0:0:0:0 | & | +| dereference.rs:122:23:122:29 | &... | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:122:24:122:29 | Key {...} | | dereference.rs:99:5:100:21 | Key | +| dereference.rs:122:24:122:29 | Key {...} | | file://:0:0:0:0 | & | +| dereference.rs:122:24:122:29 | Key {...} | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:16:123:28 | Some(...) | | {EXTERNAL LOCATION} | Option | +| dereference.rs:123:16:123:28 | Some(...) | T | file://:0:0:0:0 | & | +| dereference.rs:123:16:123:28 | Some(...) | T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:16:123:28 | Some(...) | T.&T | file://:0:0:0:0 | & | +| dereference.rs:123:16:123:28 | Some(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:21:123:27 | ref_key | | file://:0:0:0:0 | & | +| dereference.rs:123:21:123:27 | ref_key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:21:123:27 | ref_key | &T | file://:0:0:0:0 | & | +| dereference.rs:123:21:123:27 | ref_key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:32:123:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:123:32:123:41 | key_to_key | K | file://:0:0:0:0 | & | +| dereference.rs:123:32:123:41 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:32:123:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:123:32:123:41 | key_to_key | V | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:32:123:41 | key_to_key | V | file://:0:0:0:0 | & | +| dereference.rs:123:32:123:41 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:32:123:50 | key_to_key.get(...) | | {EXTERNAL LOCATION} | Option | +| dereference.rs:123:32:123:50 | key_to_key.get(...) | T | file://:0:0:0:0 | & | +| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T | file://:0:0:0:0 | & | +| dereference.rs:123:32:123:50 | key_to_key.get(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:47:123:49 | key | | file://:0:0:0:0 | & | +| dereference.rs:123:47:123:49 | key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:123:47:123:49 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:123:47:123:49 | key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:125:13:125:15 | key | | file://:0:0:0:0 | & | +| dereference.rs:125:13:125:15 | key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:125:13:125:15 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:125:13:125:15 | key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:125:13:125:25 | ... = ... | | file://:0:0:0:0 | () | +| dereference.rs:125:19:125:25 | ref_key | | file://:0:0:0:0 | & | +| dereference.rs:125:19:125:25 | ref_key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:125:19:125:25 | ref_key | &T | file://:0:0:0:0 | & | +| dereference.rs:125:19:125:25 | ref_key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:9:127:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:127:9:127:18 | key_to_key | K | file://:0:0:0:0 | & | +| dereference.rs:127:9:127:18 | key_to_key | K.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:9:127:18 | key_to_key | K.&T | file://:0:0:0:0 | & | +| dereference.rs:127:9:127:18 | key_to_key | K.&T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:9:127:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:127:9:127:18 | key_to_key | V | file://:0:0:0:0 | & | +| dereference.rs:127:9:127:18 | key_to_key | V.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:9:127:18 | key_to_key | V.&T | file://:0:0:0:0 | & | +| dereference.rs:127:9:127:18 | key_to_key | V.&T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:9:127:35 | key_to_key.insert(...) | | {EXTERNAL LOCATION} | Option | +| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T | file://:0:0:0:0 | & | +| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T | file://:0:0:0:0 | & | +| dereference.rs:127:9:127:35 | key_to_key.insert(...) | T.&T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:27:127:29 | key | | file://:0:0:0:0 | & | +| dereference.rs:127:27:127:29 | key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:27:127:29 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:127:27:127:29 | key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:32:127:34 | key | | file://:0:0:0:0 | & | +| dereference.rs:127:32:127:34 | key | &T | dereference.rs:99:5:100:21 | Key | +| dereference.rs:127:32:127:34 | key | &T | file://:0:0:0:0 | & | +| dereference.rs:127:32:127:34 | key | &T.&T | dereference.rs:99:5:100:21 | Key | +| dyn_type.rs:7:10:7:14 | SelfParam | | file://:0:0:0:0 | & | +| dyn_type.rs:7:10:7:14 | SelfParam | &T | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] | +| dyn_type.rs:12:12:12:16 | SelfParam | | file://:0:0:0:0 | & | +| dyn_type.rs:12:12:12:16 | SelfParam | &T | dyn_type.rs:10:1:13:1 | Self [trait GenericGet] | +| dyn_type.rs:18:12:18:16 | SelfParam | | file://:0:0:0:0 | & | +| dyn_type.rs:18:12:18:16 | SelfParam | &T | dyn_type.rs:15:1:19:1 | Self [trait AssocTrait] | +| dyn_type.rs:28:10:28:14 | SelfParam | | file://:0:0:0:0 | & | +| dyn_type.rs:28:10:28:14 | SelfParam | &T | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:28:27:30:5 | { ... } | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:9:29:43 | MacroExpr | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | | file://:0:0:0:0 | & | +| dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | &T | {EXTERNAL LOCATION} | str | +| dyn_type.rs:29:17:29:42 | ...::format(...) | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:17:29:42 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:17:29:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| dyn_type.rs:29:17:29:42 | MacroBlockExpr | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:17:29:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| dyn_type.rs:29:17:29:42 | { ... } | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:29:33:29:36 | self | | file://:0:0:0:0 | & | +| dyn_type.rs:29:33:29:36 | self | &T | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:29:33:29:42 | self.value | | {EXTERNAL LOCATION} | i32 | +| dyn_type.rs:40:12:40:16 | SelfParam | | file://:0:0:0:0 | & | +| dyn_type.rs:40:12:40:16 | SelfParam | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:40:12:40:16 | SelfParam | &T.A | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:40:24:42:5 | { ... } | | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:41:9:41:12 | self | | file://:0:0:0:0 | & | +| dyn_type.rs:41:9:41:12 | self | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:41:9:41:12 | self | &T.A | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:41:9:41:18 | self.value | | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:41:9:41:26 | ... .clone() | | dyn_type.rs:38:6:38:21 | A | +| dyn_type.rs:51:12:51:16 | SelfParam | | file://:0:0:0:0 | & | +| dyn_type.rs:51:12:51:16 | SelfParam | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:51:12:51:16 | SelfParam | &T.A | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:34:53:5 | { ... } | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:51:34:53:5 | { ... } | 0(2) | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:51:34:53:5 | { ... } | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:52:9:52:34 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:52:9:52:34 | TupleExpr | 0(2) | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:52:9:52:34 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:52:10:52:13 | self | | file://:0:0:0:0 | & | +| dyn_type.rs:52:10:52:13 | self | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:52:10:52:13 | self | &T.A | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:52:10:52:19 | self.value | | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:52:10:52:27 | ... .clone() | | dyn_type.rs:45:6:45:8 | GGP | +| dyn_type.rs:52:30:52:33 | true | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:56:40:56:40 | a | | file://:0:0:0:0 | & | +| dyn_type.rs:56:40:56:40 | a | &T | dyn_type.rs:56:13:56:37 | G | +| dyn_type.rs:56:52:58:1 | { ... } | | dyn_type.rs:56:10:56:10 | A | +| dyn_type.rs:57:5:57:5 | a | | file://:0:0:0:0 | & | +| dyn_type.rs:57:5:57:5 | a | &T | dyn_type.rs:56:13:56:37 | G | +| dyn_type.rs:57:5:57:11 | a.get() | | dyn_type.rs:56:10:56:10 | A | +| dyn_type.rs:60:46:60:46 | a | | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:60:78:62:1 | { ... } | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:60:78:62:1 | { ... } | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:60:78:62:1 | { ... } | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:61:5:61:36 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:61:5:61:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:61:5:61:36 | ...::new(...) | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:61:5:61:36 | ...::new(...) | T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:61:5:61:36 | ...::new(...) | T.A | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:61:5:61:36 | ...::new(...) | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:61:14:61:35 | GenStruct {...} | A | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:61:14:61:35 | GenStruct {...} | dyn(A) | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:61:33:61:33 | a | | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:64:25:64:27 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:64:25:64:27 | obj | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:65:9:65:15 | _result | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:65:19:65:24 | (...) | | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:65:19:65:28 | ... .m() | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:65:20:65:23 | * ... | | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:65:21:65:23 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:65:21:65:23 | obj | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:68:27:68:29 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:68:27:68:29 | obj | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:68:27:68:29 | obj | &T.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:69:9:69:16 | _result1 | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:69:20:69:25 | (...) | | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:69:20:69:25 | (...) | dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:69:20:69:31 | ... .get() | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:69:21:69:24 | * ... | | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:69:21:69:24 | * ... | dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:69:22:69:24 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:69:22:69:24 | obj | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:69:22:69:24 | obj | &T.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:70:9:70:16 | _result2 | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:70:20:70:29 | get_a(...) | | {EXTERNAL LOCATION} | String | +| dyn_type.rs:70:26:70:28 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:70:26:70:28 | obj | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:70:26:70:28 | obj | &T.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:74:9:74:11 | obj | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:74:9:74:11 | obj | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:74:9:74:11 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:74:9:74:11 | obj | T.dyn(A) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:74:15:74:33 | get_box_trait(...) | T.dyn(A) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:74:29:74:32 | true | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:75:9:75:15 | _result | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:75:19:75:24 | (...) | | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:75:19:75:24 | (...) | dyn(A) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:75:19:75:30 | ... .get() | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:75:20:75:23 | * ... | | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:75:20:75:23 | * ... | dyn(A) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:75:21:75:23 | obj | | {EXTERNAL LOCATION} | Box | +| dyn_type.rs:75:21:75:23 | obj | A | {EXTERNAL LOCATION} | Global | +| dyn_type.rs:75:21:75:23 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:75:21:75:23 | obj | T.dyn(A) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:78:24:78:24 | a | | file://:0:0:0:0 | & | +| dyn_type.rs:78:24:78:24 | a | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:78:24:78:24 | a | &T.dyn(AP) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:78:24:78:24 | a | &T.dyn(GP) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:78:65:80:1 | { ... } | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:78:65:80:1 | { ... } | 0(2) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:78:65:80:1 | { ... } | 1(2) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:79:5:79:5 | a | | file://:0:0:0:0 | & | +| dyn_type.rs:79:5:79:5 | a | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:79:5:79:5 | a | &T.dyn(AP) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:79:5:79:5 | a | &T.dyn(GP) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:79:5:79:11 | a.get() | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:79:5:79:11 | a.get() | 0(2) | dyn_type.rs:78:18:78:18 | A | +| dyn_type.rs:79:5:79:11 | a.get() | 1(2) | dyn_type.rs:78:21:78:21 | B | +| dyn_type.rs:82:55:82:55 | a | | file://:0:0:0:0 | & | +| dyn_type.rs:82:55:82:55 | a | &T | dyn_type.rs:82:20:82:52 | T | +| dyn_type.rs:82:72:84:1 | { ... } | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:82:72:84:1 | { ... } | 0(2) | dyn_type.rs:82:14:82:14 | A | +| dyn_type.rs:82:72:84:1 | { ... } | 1(2) | dyn_type.rs:82:17:82:17 | B | +| dyn_type.rs:83:5:83:5 | a | | file://:0:0:0:0 | & | +| dyn_type.rs:83:5:83:5 | a | &T | dyn_type.rs:82:20:82:52 | T | +| dyn_type.rs:83:5:83:11 | a.get() | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:83:5:83:11 | a.get() | 0(2) | dyn_type.rs:82:14:82:14 | A | +| dyn_type.rs:83:5:83:11 | a.get() | 1(2) | dyn_type.rs:82:17:82:17 | B | +| dyn_type.rs:86:20:86:22 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:86:20:86:22 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:86:20:86:22 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:86:20:86:22 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:87:9:90:5 | TuplePat | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:87:9:90:5 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:87:9:90:5 | TuplePat | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:88:9:88:11 | _gp | | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:89:9:89:11 | _ap | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:9:90:14 | (...) | | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:90:9:90:14 | (...) | dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:9:90:14 | (...) | dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:90:9:90:20 | ... .get() | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:90:9:90:20 | ... .get() | 0(2) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:90:9:90:20 | ... .get() | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:10:90:13 | * ... | | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:90:10:90:13 | * ... | dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:10:90:13 | * ... | dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:90:11:90:13 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:90:11:90:13 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:90:11:90:13 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:90:11:90:13 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:91:9:94:5 | TuplePat | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:91:9:94:5 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:91:9:94:5 | TuplePat | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:92:9:92:11 | _gp | | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:93:9:93:11 | _ap | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | 0(2) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:23:94:25 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:94:23:94:25 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:94:23:94:25 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:94:23:94:25 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:95:9:98:5 | TuplePat | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:95:9:98:5 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:95:9:98:5 | TuplePat | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:96:9:96:11 | _gp | | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:97:9:97:11 | _ap | | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | | file://:0:0:0:0 | (T_2) | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | 0(2) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:98:9:98:22 | assoc_get(...) | 1(2) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:98:19:98:21 | obj | | file://:0:0:0:0 | & | +| dyn_type.rs:98:19:98:21 | obj | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:98:19:98:21 | obj | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:98:19:98:21 | obj | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:102:26:102:48 | &... | | file://:0:0:0:0 | & | +| dyn_type.rs:102:26:102:48 | &... | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:102:26:102:48 | &... | &T | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | +| dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:21:1:24:1 | MyStruct | +| dyn_type.rs:102:45:102:46 | 42 | | {EXTERNAL LOCATION} | i32 | +| dyn_type.rs:103:28:105:5 | &... | | file://:0:0:0:0 | & | +| dyn_type.rs:103:28:105:5 | &... | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:103:28:105:5 | &... | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:103:28:105:5 | &... | &T.dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:10:1:13:1 | dyn GenericGet | +| dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:103:29:105:5 | GenStruct {...} | dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:104:16:104:17 | "" | | file://:0:0:0:0 | & | +| dyn_type.rs:104:16:104:17 | "" | &T | {EXTERNAL LOCATION} | str | +| dyn_type.rs:107:21:107:45 | &... | | file://:0:0:0:0 | & | +| dyn_type.rs:107:21:107:45 | &... | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:107:21:107:45 | &... | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:107:21:107:45 | &... | &T.A | {EXTERNAL LOCATION} | i32 | +| dyn_type.rs:107:21:107:45 | &... | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:107:21:107:45 | &... | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:15:1:19:1 | dyn AssocTrait | +| dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:107:22:107:45 | GenStruct {...} | A | {EXTERNAL LOCATION} | i32 | +| dyn_type.rs:107:22:107:45 | GenStruct {...} | dyn(AP) | {EXTERNAL LOCATION} | bool | +| dyn_type.rs:107:22:107:45 | GenStruct {...} | dyn(GP) | {EXTERNAL LOCATION} | i64 | +| dyn_type.rs:107:41:107:43 | 100 | | {EXTERNAL LOCATION} | i32 | | loop/main.rs:7:12:7:15 | SelfParam | | loop/main.rs:6:1:8:1 | Self [trait T1] | | loop/main.rs:11:12:11:15 | SelfParam | | loop/main.rs:10:1:14:1 | Self [trait T2] | | loop/main.rs:12:9:12:12 | self | | loop/main.rs:10:1:14:1 | Self [trait T2] | @@ -920,3236 +1417,3545 @@ inferType | main.rs:545:18:545:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:545:18:545:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:545:26:545:26 | s | | main.rs:508:5:509:14 | S1 | -| main.rs:549:16:549:19 | SelfParam | | main.rs:548:5:552:5 | Self [trait Pair] | -| main.rs:551:16:551:19 | SelfParam | | main.rs:548:5:552:5 | Self [trait Pair] | -| main.rs:554:58:554:58 | x | | main.rs:554:41:554:55 | T | -| main.rs:554:64:554:64 | y | | main.rs:554:41:554:55 | T | -| main.rs:556:13:556:14 | s1 | | main.rs:508:5:509:14 | S1 | -| main.rs:556:18:556:18 | x | | main.rs:554:41:554:55 | T | -| main.rs:556:18:556:24 | x.fst() | | main.rs:508:5:509:14 | S1 | -| main.rs:557:13:557:14 | s2 | | main.rs:511:5:512:14 | S2 | -| main.rs:557:18:557:18 | y | | main.rs:554:41:554:55 | T | -| main.rs:557:18:557:24 | y.snd() | | main.rs:511:5:512:14 | S2 | -| main.rs:558:18:558:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:558:18:558:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:558:18:558:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:558:18:558:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:558:32:558:33 | s1 | | main.rs:508:5:509:14 | S1 | -| main.rs:558:36:558:37 | s2 | | main.rs:511:5:512:14 | S2 | -| main.rs:561:69:561:69 | x | | main.rs:561:52:561:66 | T | -| main.rs:561:75:561:75 | y | | main.rs:561:52:561:66 | T | -| main.rs:563:13:563:14 | s1 | | main.rs:508:5:509:14 | S1 | -| main.rs:563:18:563:18 | x | | main.rs:561:52:561:66 | T | -| main.rs:563:18:563:24 | x.fst() | | main.rs:508:5:509:14 | S1 | -| main.rs:564:13:564:14 | s2 | | main.rs:561:41:561:49 | T2 | -| main.rs:564:18:564:18 | y | | main.rs:561:52:561:66 | T | -| main.rs:564:18:564:24 | y.snd() | | main.rs:561:41:561:49 | T2 | -| main.rs:565:18:565:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:565:18:565:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:565:18:565:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:565:18:565:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:565:32:565:33 | s1 | | main.rs:508:5:509:14 | S1 | -| main.rs:565:36:565:37 | s2 | | main.rs:561:41:561:49 | T2 | -| main.rs:568:50:568:50 | x | | main.rs:568:41:568:47 | T | -| main.rs:568:56:568:56 | y | | main.rs:568:41:568:47 | T | -| main.rs:570:13:570:14 | s1 | | {EXTERNAL LOCATION} | bool | -| main.rs:570:18:570:18 | x | | main.rs:568:41:568:47 | T | -| main.rs:570:18:570:24 | x.fst() | | {EXTERNAL LOCATION} | bool | -| main.rs:571:13:571:14 | s2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:571:18:571:18 | y | | main.rs:568:41:568:47 | T | -| main.rs:571:18:571:24 | y.snd() | | {EXTERNAL LOCATION} | i64 | -| main.rs:572:18:572:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:572:18:572:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:572:18:572:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:572:18:572:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:572:32:572:33 | s1 | | {EXTERNAL LOCATION} | bool | -| main.rs:572:36:572:37 | s2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:575:54:575:54 | x | | main.rs:575:41:575:51 | T | -| main.rs:575:60:575:60 | y | | main.rs:575:41:575:51 | T | -| main.rs:577:13:577:14 | s1 | | {EXTERNAL LOCATION} | u8 | -| main.rs:577:18:577:18 | x | | main.rs:575:41:575:51 | T | -| main.rs:577:18:577:24 | x.fst() | | {EXTERNAL LOCATION} | u8 | -| main.rs:578:13:578:14 | s2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:578:18:578:18 | y | | main.rs:575:41:575:51 | T | -| main.rs:578:18:578:24 | y.snd() | | {EXTERNAL LOCATION} | i64 | -| main.rs:579:18:579:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:579:18:579:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:579:18:579:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:579:18:579:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:579:32:579:33 | s1 | | {EXTERNAL LOCATION} | u8 | -| main.rs:579:36:579:37 | s2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:595:15:595:18 | SelfParam | | main.rs:594:5:603:5 | Self [trait MyTrait] | -| main.rs:597:15:597:18 | SelfParam | | main.rs:594:5:603:5 | Self [trait MyTrait] | -| main.rs:600:9:602:9 | { ... } | | main.rs:594:19:594:19 | A | -| main.rs:601:13:601:16 | self | | main.rs:594:5:603:5 | Self [trait MyTrait] | -| main.rs:601:13:601:21 | self.m1() | | main.rs:594:19:594:19 | A | -| main.rs:607:43:607:43 | x | | main.rs:607:26:607:40 | T2 | -| main.rs:607:56:609:5 | { ... } | | main.rs:607:22:607:23 | T1 | -| main.rs:608:9:608:9 | x | | main.rs:607:26:607:40 | T2 | -| main.rs:608:9:608:14 | x.m1() | | main.rs:607:22:607:23 | T1 | -| main.rs:613:49:613:49 | x | | main.rs:584:5:587:5 | MyThing | -| main.rs:613:49:613:49 | x | T | main.rs:613:32:613:46 | T2 | -| main.rs:613:71:615:5 | { ... } | | main.rs:613:28:613:29 | T1 | -| main.rs:614:9:614:9 | x | | main.rs:584:5:587:5 | MyThing | -| main.rs:614:9:614:9 | x | T | main.rs:613:32:613:46 | T2 | -| main.rs:614:9:614:11 | x.a | | main.rs:613:32:613:46 | T2 | -| main.rs:614:9:614:16 | ... .m1() | | main.rs:613:28:613:29 | T1 | -| main.rs:618:15:618:18 | SelfParam | | main.rs:584:5:587:5 | MyThing | -| main.rs:618:15:618:18 | SelfParam | T | main.rs:617:10:617:10 | T | -| main.rs:618:26:620:9 | { ... } | | main.rs:617:10:617:10 | T | -| main.rs:619:13:619:16 | self | | main.rs:584:5:587:5 | MyThing | -| main.rs:619:13:619:16 | self | T | main.rs:617:10:617:10 | T | -| main.rs:619:13:619:18 | self.a | | main.rs:617:10:617:10 | T | -| main.rs:624:13:624:13 | x | | main.rs:584:5:587:5 | MyThing | -| main.rs:624:13:624:13 | x | T | main.rs:589:5:590:14 | S1 | -| main.rs:624:17:624:33 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:624:17:624:33 | MyThing {...} | T | main.rs:589:5:590:14 | S1 | -| main.rs:624:30:624:31 | S1 | | main.rs:589:5:590:14 | S1 | -| main.rs:625:13:625:13 | y | | main.rs:584:5:587:5 | MyThing | -| main.rs:625:13:625:13 | y | T | main.rs:591:5:592:14 | S2 | -| main.rs:625:17:625:33 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:625:17:625:33 | MyThing {...} | T | main.rs:591:5:592:14 | S2 | -| main.rs:625:30:625:31 | S2 | | main.rs:591:5:592:14 | S2 | -| main.rs:627:18:627:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:627:18:627:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:627:18:627:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:627:18:627:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:627:26:627:26 | x | | main.rs:584:5:587:5 | MyThing | -| main.rs:627:26:627:26 | x | T | main.rs:589:5:590:14 | S1 | -| main.rs:627:26:627:31 | x.m1() | | main.rs:589:5:590:14 | S1 | -| main.rs:628:18:628:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:628:18:628:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:628:18:628:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:628:18:628:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:628:26:628:26 | y | | main.rs:584:5:587:5 | MyThing | -| main.rs:628:26:628:26 | y | T | main.rs:591:5:592:14 | S2 | -| main.rs:628:26:628:31 | y.m1() | | main.rs:591:5:592:14 | S2 | -| main.rs:630:13:630:13 | x | | main.rs:584:5:587:5 | MyThing | -| main.rs:630:13:630:13 | x | T | main.rs:589:5:590:14 | S1 | -| main.rs:630:17:630:33 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:630:17:630:33 | MyThing {...} | T | main.rs:589:5:590:14 | S1 | -| main.rs:630:30:630:31 | S1 | | main.rs:589:5:590:14 | S1 | -| main.rs:631:13:631:13 | y | | main.rs:584:5:587:5 | MyThing | -| main.rs:631:13:631:13 | y | T | main.rs:591:5:592:14 | S2 | -| main.rs:631:17:631:33 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:631:17:631:33 | MyThing {...} | T | main.rs:591:5:592:14 | S2 | -| main.rs:631:30:631:31 | S2 | | main.rs:591:5:592:14 | S2 | -| main.rs:633:18:633:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:633:18:633:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:633:18:633:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:633:18:633:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:633:26:633:26 | x | | main.rs:584:5:587:5 | MyThing | -| main.rs:633:26:633:26 | x | T | main.rs:589:5:590:14 | S1 | -| main.rs:633:26:633:31 | x.m2() | | main.rs:589:5:590:14 | S1 | -| main.rs:634:18:634:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:634:18:634:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:634:18:634:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:634:18:634:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:634:26:634:26 | y | | main.rs:584:5:587:5 | MyThing | -| main.rs:634:26:634:26 | y | T | main.rs:591:5:592:14 | S2 | -| main.rs:634:26:634:31 | y.m2() | | main.rs:591:5:592:14 | S2 | -| main.rs:636:13:636:14 | x2 | | main.rs:584:5:587:5 | MyThing | -| main.rs:636:13:636:14 | x2 | T | main.rs:589:5:590:14 | S1 | -| main.rs:636:18:636:34 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:636:18:636:34 | MyThing {...} | T | main.rs:589:5:590:14 | S1 | -| main.rs:636:31:636:32 | S1 | | main.rs:589:5:590:14 | S1 | -| main.rs:637:13:637:14 | y2 | | main.rs:584:5:587:5 | MyThing | -| main.rs:637:13:637:14 | y2 | T | main.rs:591:5:592:14 | S2 | -| main.rs:637:18:637:34 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:637:18:637:34 | MyThing {...} | T | main.rs:591:5:592:14 | S2 | -| main.rs:637:31:637:32 | S2 | | main.rs:591:5:592:14 | S2 | -| main.rs:639:18:639:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:639:18:639:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:639:18:639:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:639:18:639:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:639:26:639:42 | call_trait_m1(...) | | main.rs:589:5:590:14 | S1 | -| main.rs:639:40:639:41 | x2 | | main.rs:584:5:587:5 | MyThing | -| main.rs:639:40:639:41 | x2 | T | main.rs:589:5:590:14 | S1 | -| main.rs:640:18:640:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:640:18:640:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:640:18:640:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:640:18:640:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:640:26:640:42 | call_trait_m1(...) | | main.rs:591:5:592:14 | S2 | -| main.rs:640:40:640:41 | y2 | | main.rs:584:5:587:5 | MyThing | -| main.rs:640:40:640:41 | y2 | T | main.rs:591:5:592:14 | S2 | -| main.rs:642:13:642:14 | x3 | | main.rs:584:5:587:5 | MyThing | -| main.rs:642:13:642:14 | x3 | T | main.rs:584:5:587:5 | MyThing | -| main.rs:642:13:642:14 | x3 | T.T | main.rs:589:5:590:14 | S1 | -| main.rs:642:18:644:9 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:642:18:644:9 | MyThing {...} | T | main.rs:584:5:587:5 | MyThing | -| main.rs:642:18:644:9 | MyThing {...} | T.T | main.rs:589:5:590:14 | S1 | -| main.rs:643:16:643:32 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:643:16:643:32 | MyThing {...} | T | main.rs:589:5:590:14 | S1 | -| main.rs:643:29:643:30 | S1 | | main.rs:589:5:590:14 | S1 | -| main.rs:645:13:645:14 | y3 | | main.rs:584:5:587:5 | MyThing | -| main.rs:645:13:645:14 | y3 | T | main.rs:584:5:587:5 | MyThing | -| main.rs:645:13:645:14 | y3 | T.T | main.rs:591:5:592:14 | S2 | -| main.rs:645:18:647:9 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:645:18:647:9 | MyThing {...} | T | main.rs:584:5:587:5 | MyThing | -| main.rs:645:18:647:9 | MyThing {...} | T.T | main.rs:591:5:592:14 | S2 | -| main.rs:646:16:646:32 | MyThing {...} | | main.rs:584:5:587:5 | MyThing | -| main.rs:646:16:646:32 | MyThing {...} | T | main.rs:591:5:592:14 | S2 | -| main.rs:646:29:646:30 | S2 | | main.rs:591:5:592:14 | S2 | -| main.rs:649:13:649:13 | a | | main.rs:589:5:590:14 | S1 | -| main.rs:649:17:649:39 | call_trait_thing_m1(...) | | main.rs:589:5:590:14 | S1 | -| main.rs:649:37:649:38 | x3 | | main.rs:584:5:587:5 | MyThing | -| main.rs:649:37:649:38 | x3 | T | main.rs:584:5:587:5 | MyThing | -| main.rs:649:37:649:38 | x3 | T.T | main.rs:589:5:590:14 | S1 | +| main.rs:548:43:548:43 | x | | main.rs:548:40:548:40 | T | +| main.rs:552:13:552:13 | s | | main.rs:508:5:509:14 | S1 | +| main.rs:552:17:552:17 | x | | main.rs:548:40:548:40 | T | +| main.rs:552:17:552:26 | x.method() | | main.rs:508:5:509:14 | S1 | +| main.rs:553:18:553:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:553:18:553:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:553:18:553:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:553:18:553:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:553:26:553:26 | s | | main.rs:508:5:509:14 | S1 | +| main.rs:557:16:557:19 | SelfParam | | main.rs:556:5:560:5 | Self [trait Pair] | +| main.rs:559:16:559:19 | SelfParam | | main.rs:556:5:560:5 | Self [trait Pair] | +| main.rs:562:53:562:53 | x | | main.rs:562:50:562:50 | T | +| main.rs:562:59:562:59 | y | | main.rs:562:50:562:50 | T | +| main.rs:567:13:567:13 | _ | | main.rs:508:5:509:14 | S1 | +| main.rs:567:17:567:17 | x | | main.rs:562:50:562:50 | T | +| main.rs:567:17:567:23 | x.fst() | | main.rs:508:5:509:14 | S1 | +| main.rs:568:13:568:13 | _ | | main.rs:508:5:509:14 | S1 | +| main.rs:568:17:568:17 | y | | main.rs:562:50:562:50 | T | +| main.rs:568:17:568:26 | y.method() | | main.rs:508:5:509:14 | S1 | +| main.rs:571:58:571:58 | x | | main.rs:571:41:571:55 | T | +| main.rs:571:64:571:64 | y | | main.rs:571:41:571:55 | T | +| main.rs:573:13:573:14 | s1 | | main.rs:508:5:509:14 | S1 | +| main.rs:573:18:573:18 | x | | main.rs:571:41:571:55 | T | +| main.rs:573:18:573:24 | x.fst() | | main.rs:508:5:509:14 | S1 | +| main.rs:574:13:574:14 | s2 | | main.rs:511:5:512:14 | S2 | +| main.rs:574:18:574:18 | y | | main.rs:571:41:571:55 | T | +| main.rs:574:18:574:24 | y.snd() | | main.rs:511:5:512:14 | S2 | +| main.rs:575:18:575:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:575:18:575:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:575:18:575:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:575:18:575:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:575:32:575:33 | s1 | | main.rs:508:5:509:14 | S1 | +| main.rs:575:36:575:37 | s2 | | main.rs:511:5:512:14 | S2 | +| main.rs:578:69:578:69 | x | | main.rs:578:52:578:66 | T | +| main.rs:578:75:578:75 | y | | main.rs:578:52:578:66 | T | +| main.rs:580:13:580:14 | s1 | | main.rs:508:5:509:14 | S1 | +| main.rs:580:18:580:18 | x | | main.rs:578:52:578:66 | T | +| main.rs:580:18:580:24 | x.fst() | | main.rs:508:5:509:14 | S1 | +| main.rs:581:13:581:14 | s2 | | main.rs:578:41:578:49 | T2 | +| main.rs:581:18:581:18 | y | | main.rs:578:52:578:66 | T | +| main.rs:581:18:581:24 | y.snd() | | main.rs:578:41:578:49 | T2 | +| main.rs:582:18:582:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:582:18:582:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:582:18:582:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:582:18:582:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:582:32:582:33 | s1 | | main.rs:508:5:509:14 | S1 | +| main.rs:582:36:582:37 | s2 | | main.rs:578:41:578:49 | T2 | +| main.rs:585:50:585:50 | x | | main.rs:585:41:585:47 | T | +| main.rs:585:56:585:56 | y | | main.rs:585:41:585:47 | T | +| main.rs:587:13:587:14 | s1 | | {EXTERNAL LOCATION} | bool | +| main.rs:587:18:587:18 | x | | main.rs:585:41:585:47 | T | +| main.rs:587:18:587:24 | x.fst() | | {EXTERNAL LOCATION} | bool | +| main.rs:588:13:588:14 | s2 | | {EXTERNAL LOCATION} | i64 | +| main.rs:588:18:588:18 | y | | main.rs:585:41:585:47 | T | +| main.rs:588:18:588:24 | y.snd() | | {EXTERNAL LOCATION} | i64 | +| main.rs:589:18:589:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:589:18:589:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:589:18:589:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:589:18:589:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:589:32:589:33 | s1 | | {EXTERNAL LOCATION} | bool | +| main.rs:589:36:589:37 | s2 | | {EXTERNAL LOCATION} | i64 | +| main.rs:592:54:592:54 | x | | main.rs:592:41:592:51 | T | +| main.rs:592:60:592:60 | y | | main.rs:592:41:592:51 | T | +| main.rs:594:13:594:14 | s1 | | {EXTERNAL LOCATION} | u8 | +| main.rs:594:18:594:18 | x | | main.rs:592:41:592:51 | T | +| main.rs:594:18:594:24 | x.fst() | | {EXTERNAL LOCATION} | u8 | +| main.rs:595:13:595:14 | s2 | | {EXTERNAL LOCATION} | i64 | +| main.rs:595:18:595:18 | y | | main.rs:592:41:592:51 | T | +| main.rs:595:18:595:24 | y.snd() | | {EXTERNAL LOCATION} | i64 | +| main.rs:596:18:596:29 | "{:?}, {:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:596:18:596:29 | "{:?}, {:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:596:18:596:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:596:18:596:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:596:32:596:33 | s1 | | {EXTERNAL LOCATION} | u8 | +| main.rs:596:36:596:37 | s2 | | {EXTERNAL LOCATION} | i64 | +| main.rs:612:15:612:18 | SelfParam | | main.rs:611:5:620:5 | Self [trait MyTrait] | +| main.rs:614:15:614:18 | SelfParam | | main.rs:611:5:620:5 | Self [trait MyTrait] | +| main.rs:617:9:619:9 | { ... } | | main.rs:611:19:611:19 | A | +| main.rs:618:13:618:16 | self | | main.rs:611:5:620:5 | Self [trait MyTrait] | +| main.rs:618:13:618:21 | self.m1() | | main.rs:611:19:611:19 | A | +| main.rs:624:43:624:43 | x | | main.rs:624:26:624:40 | T2 | +| main.rs:624:56:626:5 | { ... } | | main.rs:624:22:624:23 | T1 | +| main.rs:625:9:625:9 | x | | main.rs:624:26:624:40 | T2 | +| main.rs:625:9:625:14 | x.m1() | | main.rs:624:22:624:23 | T1 | +| main.rs:630:49:630:49 | x | | main.rs:601:5:604:5 | MyThing | +| main.rs:630:49:630:49 | x | T | main.rs:630:32:630:46 | T2 | +| main.rs:630:71:632:5 | { ... } | | main.rs:630:28:630:29 | T1 | +| main.rs:631:9:631:9 | x | | main.rs:601:5:604:5 | MyThing | +| main.rs:631:9:631:9 | x | T | main.rs:630:32:630:46 | T2 | +| main.rs:631:9:631:11 | x.a | | main.rs:630:32:630:46 | T2 | +| main.rs:631:9:631:16 | ... .m1() | | main.rs:630:28:630:29 | T1 | +| main.rs:635:15:635:18 | SelfParam | | main.rs:601:5:604:5 | MyThing | +| main.rs:635:15:635:18 | SelfParam | T | main.rs:634:10:634:10 | T | +| main.rs:635:26:637:9 | { ... } | | main.rs:634:10:634:10 | T | +| main.rs:636:13:636:16 | self | | main.rs:601:5:604:5 | MyThing | +| main.rs:636:13:636:16 | self | T | main.rs:634:10:634:10 | T | +| main.rs:636:13:636:18 | self.a | | main.rs:634:10:634:10 | T | +| main.rs:641:13:641:13 | x | | main.rs:601:5:604:5 | MyThing | +| main.rs:641:13:641:13 | x | T | main.rs:606:5:607:14 | S1 | +| main.rs:641:17:641:33 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:641:17:641:33 | MyThing {...} | T | main.rs:606:5:607:14 | S1 | +| main.rs:641:30:641:31 | S1 | | main.rs:606:5:607:14 | S1 | +| main.rs:642:13:642:13 | y | | main.rs:601:5:604:5 | MyThing | +| main.rs:642:13:642:13 | y | T | main.rs:608:5:609:14 | S2 | +| main.rs:642:17:642:33 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:642:17:642:33 | MyThing {...} | T | main.rs:608:5:609:14 | S2 | +| main.rs:642:30:642:31 | S2 | | main.rs:608:5:609:14 | S2 | +| main.rs:644:18:644:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:644:18:644:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:644:18:644:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:644:18:644:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:644:26:644:26 | x | | main.rs:601:5:604:5 | MyThing | +| main.rs:644:26:644:26 | x | T | main.rs:606:5:607:14 | S1 | +| main.rs:644:26:644:31 | x.m1() | | main.rs:606:5:607:14 | S1 | +| main.rs:645:18:645:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:645:18:645:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:645:18:645:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:645:18:645:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:645:26:645:26 | y | | main.rs:601:5:604:5 | MyThing | +| main.rs:645:26:645:26 | y | T | main.rs:608:5:609:14 | S2 | +| main.rs:645:26:645:31 | y.m1() | | main.rs:608:5:609:14 | S2 | +| main.rs:647:13:647:13 | x | | main.rs:601:5:604:5 | MyThing | +| main.rs:647:13:647:13 | x | T | main.rs:606:5:607:14 | S1 | +| main.rs:647:17:647:33 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:647:17:647:33 | MyThing {...} | T | main.rs:606:5:607:14 | S1 | +| main.rs:647:30:647:31 | S1 | | main.rs:606:5:607:14 | S1 | +| main.rs:648:13:648:13 | y | | main.rs:601:5:604:5 | MyThing | +| main.rs:648:13:648:13 | y | T | main.rs:608:5:609:14 | S2 | +| main.rs:648:17:648:33 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:648:17:648:33 | MyThing {...} | T | main.rs:608:5:609:14 | S2 | +| main.rs:648:30:648:31 | S2 | | main.rs:608:5:609:14 | S2 | | main.rs:650:18:650:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:650:18:650:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:650:18:650:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:650:18:650:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:650:26:650:26 | a | | main.rs:589:5:590:14 | S1 | -| main.rs:651:13:651:13 | b | | main.rs:591:5:592:14 | S2 | -| main.rs:651:17:651:39 | call_trait_thing_m1(...) | | main.rs:591:5:592:14 | S2 | -| main.rs:651:37:651:38 | y3 | | main.rs:584:5:587:5 | MyThing | -| main.rs:651:37:651:38 | y3 | T | main.rs:584:5:587:5 | MyThing | -| main.rs:651:37:651:38 | y3 | T.T | main.rs:591:5:592:14 | S2 | -| main.rs:652:18:652:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:652:18:652:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:652:18:652:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:652:18:652:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:652:26:652:26 | b | | main.rs:591:5:592:14 | S2 | -| main.rs:663:19:663:22 | SelfParam | | main.rs:657:5:660:5 | Wrapper | -| main.rs:663:19:663:22 | SelfParam | A | main.rs:662:10:662:10 | A | -| main.rs:663:30:665:9 | { ... } | | main.rs:662:10:662:10 | A | -| main.rs:664:13:664:16 | self | | main.rs:657:5:660:5 | Wrapper | -| main.rs:664:13:664:16 | self | A | main.rs:662:10:662:10 | A | -| main.rs:664:13:664:22 | self.field | | main.rs:662:10:662:10 | A | -| main.rs:672:15:672:18 | SelfParam | | main.rs:668:5:682:5 | Self [trait MyTrait] | -| main.rs:674:15:674:18 | SelfParam | | main.rs:668:5:682:5 | Self [trait MyTrait] | -| main.rs:678:9:681:9 | { ... } | | main.rs:669:9:669:28 | AssociatedType | -| main.rs:679:13:679:16 | self | | main.rs:668:5:682:5 | Self [trait MyTrait] | -| main.rs:679:13:679:21 | self.m1() | | main.rs:669:9:669:28 | AssociatedType | -| main.rs:680:13:680:43 | ...::default(...) | | main.rs:669:9:669:28 | AssociatedType | -| main.rs:688:19:688:23 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:688:19:688:23 | SelfParam | &T | main.rs:684:5:694:5 | Self [trait MyTraitAssoc2] | -| main.rs:688:26:688:26 | a | | main.rs:688:16:688:16 | A | -| main.rs:690:22:690:26 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:690:22:690:26 | SelfParam | &T | main.rs:684:5:694:5 | Self [trait MyTraitAssoc2] | -| main.rs:690:29:690:29 | a | | main.rs:690:19:690:19 | A | -| main.rs:690:35:690:35 | b | | main.rs:690:19:690:19 | A | -| main.rs:690:75:693:9 | { ... } | | main.rs:685:9:685:52 | GenericAssociatedType | -| main.rs:691:13:691:16 | self | | file://:0:0:0:0 | & | -| main.rs:691:13:691:16 | self | &T | main.rs:684:5:694:5 | Self [trait MyTraitAssoc2] | -| main.rs:691:13:691:23 | self.put(...) | | main.rs:685:9:685:52 | GenericAssociatedType | -| main.rs:691:22:691:22 | a | | main.rs:690:19:690:19 | A | -| main.rs:692:13:692:16 | self | | file://:0:0:0:0 | & | -| main.rs:692:13:692:16 | self | &T | main.rs:684:5:694:5 | Self [trait MyTraitAssoc2] | -| main.rs:692:13:692:23 | self.put(...) | | main.rs:685:9:685:52 | GenericAssociatedType | -| main.rs:692:22:692:22 | b | | main.rs:690:19:690:19 | A | -| main.rs:701:21:701:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:701:21:701:25 | SelfParam | &T | main.rs:696:5:706:5 | Self [trait TraitMultipleAssoc] | -| main.rs:703:20:703:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:703:20:703:24 | SelfParam | &T | main.rs:696:5:706:5 | Self [trait TraitMultipleAssoc] | -| main.rs:705:20:705:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:705:20:705:24 | SelfParam | &T | main.rs:696:5:706:5 | Self [trait TraitMultipleAssoc] | -| main.rs:721:15:721:18 | SelfParam | | main.rs:708:5:709:13 | S | -| main.rs:721:45:723:9 | { ... } | | main.rs:714:5:715:14 | AT | -| main.rs:722:13:722:14 | AT | | main.rs:714:5:715:14 | AT | -| main.rs:731:19:731:23 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:731:19:731:23 | SelfParam | &T | main.rs:708:5:709:13 | S | -| main.rs:731:26:731:26 | a | | main.rs:731:16:731:16 | A | -| main.rs:731:46:733:9 | { ... } | | main.rs:657:5:660:5 | Wrapper | -| main.rs:731:46:733:9 | { ... } | A | main.rs:731:16:731:16 | A | -| main.rs:732:13:732:32 | Wrapper {...} | | main.rs:657:5:660:5 | Wrapper | -| main.rs:732:13:732:32 | Wrapper {...} | A | main.rs:731:16:731:16 | A | -| main.rs:732:30:732:30 | a | | main.rs:731:16:731:16 | A | -| main.rs:740:15:740:18 | SelfParam | | main.rs:711:5:712:14 | S2 | -| main.rs:740:45:742:9 | { ... } | | main.rs:657:5:660:5 | Wrapper | -| main.rs:740:45:742:9 | { ... } | A | main.rs:711:5:712:14 | S2 | -| main.rs:741:13:741:35 | Wrapper {...} | | main.rs:657:5:660:5 | Wrapper | -| main.rs:741:13:741:35 | Wrapper {...} | A | main.rs:711:5:712:14 | S2 | -| main.rs:741:30:741:33 | self | | main.rs:711:5:712:14 | S2 | -| main.rs:747:30:749:9 | { ... } | | main.rs:657:5:660:5 | Wrapper | -| main.rs:747:30:749:9 | { ... } | A | main.rs:711:5:712:14 | S2 | -| main.rs:748:13:748:33 | Wrapper {...} | | main.rs:657:5:660:5 | Wrapper | -| main.rs:748:13:748:33 | Wrapper {...} | A | main.rs:711:5:712:14 | S2 | -| main.rs:748:30:748:31 | S2 | | main.rs:711:5:712:14 | S2 | -| main.rs:754:22:754:26 | thing | | main.rs:754:10:754:19 | T | -| main.rs:755:9:755:13 | thing | | main.rs:754:10:754:19 | T | -| main.rs:762:21:762:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:762:21:762:25 | SelfParam | &T | main.rs:714:5:715:14 | AT | -| main.rs:762:34:764:9 | { ... } | | main.rs:714:5:715:14 | AT | -| main.rs:763:13:763:14 | AT | | main.rs:714:5:715:14 | AT | -| main.rs:766:20:766:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:766:20:766:24 | SelfParam | &T | main.rs:714:5:715:14 | AT | -| main.rs:766:43:768:9 | { ... } | | main.rs:708:5:709:13 | S | -| main.rs:767:13:767:13 | S | | main.rs:708:5:709:13 | S | -| main.rs:770:20:770:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:770:20:770:24 | SelfParam | &T | main.rs:714:5:715:14 | AT | -| main.rs:770:43:772:9 | { ... } | | main.rs:711:5:712:14 | S2 | -| main.rs:771:13:771:14 | S2 | | main.rs:711:5:712:14 | S2 | -| main.rs:776:13:776:14 | x1 | | main.rs:708:5:709:13 | S | -| main.rs:776:18:776:18 | S | | main.rs:708:5:709:13 | S | -| main.rs:778:18:778:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:778:18:778:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:778:18:778:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:778:18:778:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:778:26:778:27 | x1 | | main.rs:708:5:709:13 | S | -| main.rs:778:26:778:32 | x1.m1() | | main.rs:714:5:715:14 | AT | -| main.rs:780:13:780:14 | x2 | | main.rs:708:5:709:13 | S | -| main.rs:780:18:780:18 | S | | main.rs:708:5:709:13 | S | -| main.rs:782:13:782:13 | y | | main.rs:714:5:715:14 | AT | -| main.rs:782:17:782:18 | x2 | | main.rs:708:5:709:13 | S | -| main.rs:782:17:782:23 | x2.m2() | | main.rs:714:5:715:14 | AT | -| main.rs:783:18:783:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:783:18:783:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:783:18:783:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:783:18:783:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:783:26:783:26 | y | | main.rs:714:5:715:14 | AT | -| main.rs:785:13:785:14 | x3 | | main.rs:708:5:709:13 | S | -| main.rs:785:18:785:18 | S | | main.rs:708:5:709:13 | S | -| main.rs:787:18:787:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:787:18:787:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:787:18:787:43 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:787:18:787:43 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:787:26:787:27 | x3 | | main.rs:708:5:709:13 | S | -| main.rs:787:26:787:34 | x3.put(...) | | main.rs:657:5:660:5 | Wrapper | -| main.rs:787:26:787:34 | x3.put(...) | A | {EXTERNAL LOCATION} | i32 | -| main.rs:787:26:787:43 | ... .unwrap() | | {EXTERNAL LOCATION} | i32 | -| main.rs:787:33:787:33 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:790:18:790:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:790:18:790:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:790:18:790:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:790:18:790:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:790:26:790:27 | x3 | | main.rs:708:5:709:13 | S | -| main.rs:790:26:790:40 | x3.putTwo(...) | | main.rs:657:5:660:5 | Wrapper | -| main.rs:790:26:790:40 | x3.putTwo(...) | A | main.rs:728:36:728:50 | AssociatedParam | -| main.rs:790:26:790:49 | ... .unwrap() | | main.rs:728:36:728:50 | AssociatedParam | -| main.rs:790:36:790:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:790:39:790:39 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:792:20:792:20 | S | | main.rs:708:5:709:13 | S | -| main.rs:793:18:793:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:793:18:793:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:793:18:793:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:793:18:793:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:795:13:795:14 | x5 | | main.rs:711:5:712:14 | S2 | -| main.rs:795:18:795:19 | S2 | | main.rs:711:5:712:14 | S2 | -| main.rs:796:18:796:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:796:18:796:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:796:18:796:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:796:18:796:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:796:26:796:27 | x5 | | main.rs:711:5:712:14 | S2 | -| main.rs:796:26:796:32 | x5.m1() | | main.rs:657:5:660:5 | Wrapper | -| main.rs:796:26:796:32 | x5.m1() | A | main.rs:711:5:712:14 | S2 | -| main.rs:797:13:797:14 | x6 | | main.rs:711:5:712:14 | S2 | -| main.rs:797:18:797:19 | S2 | | main.rs:711:5:712:14 | S2 | -| main.rs:798:18:798:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:798:18:798:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:798:18:798:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:798:18:798:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:798:26:798:27 | x6 | | main.rs:711:5:712:14 | S2 | -| main.rs:798:26:798:32 | x6.m2() | | main.rs:657:5:660:5 | Wrapper | -| main.rs:798:26:798:32 | x6.m2() | A | main.rs:711:5:712:14 | S2 | -| main.rs:800:13:800:22 | assoc_zero | | main.rs:714:5:715:14 | AT | -| main.rs:800:26:800:27 | AT | | main.rs:714:5:715:14 | AT | -| main.rs:800:26:800:38 | AT.get_zero() | | main.rs:714:5:715:14 | AT | -| main.rs:801:13:801:21 | assoc_one | | main.rs:708:5:709:13 | S | -| main.rs:801:25:801:26 | AT | | main.rs:714:5:715:14 | AT | -| main.rs:801:25:801:36 | AT.get_one() | | main.rs:708:5:709:13 | S | -| main.rs:802:13:802:21 | assoc_two | | main.rs:711:5:712:14 | S2 | -| main.rs:802:25:802:26 | AT | | main.rs:714:5:715:14 | AT | -| main.rs:802:25:802:36 | AT.get_two() | | main.rs:711:5:712:14 | S2 | -| main.rs:819:15:819:18 | SelfParam | | main.rs:807:5:811:5 | MyEnum | -| main.rs:819:15:819:18 | SelfParam | A | main.rs:818:10:818:10 | T | -| main.rs:819:26:824:9 | { ... } | | main.rs:818:10:818:10 | T | -| main.rs:820:13:823:13 | match self { ... } | | main.rs:818:10:818:10 | T | -| main.rs:820:19:820:22 | self | | main.rs:807:5:811:5 | MyEnum | -| main.rs:820:19:820:22 | self | A | main.rs:818:10:818:10 | T | -| main.rs:821:17:821:29 | ...::C1(...) | | main.rs:807:5:811:5 | MyEnum | -| main.rs:821:17:821:29 | ...::C1(...) | A | main.rs:818:10:818:10 | T | -| main.rs:821:28:821:28 | a | | main.rs:818:10:818:10 | T | -| main.rs:821:34:821:34 | a | | main.rs:818:10:818:10 | T | -| main.rs:822:17:822:32 | ...::C2 {...} | | main.rs:807:5:811:5 | MyEnum | -| main.rs:822:17:822:32 | ...::C2 {...} | A | main.rs:818:10:818:10 | T | -| main.rs:822:30:822:30 | a | | main.rs:818:10:818:10 | T | -| main.rs:822:37:822:37 | a | | main.rs:818:10:818:10 | T | -| main.rs:828:13:828:13 | x | | main.rs:807:5:811:5 | MyEnum | -| main.rs:828:13:828:13 | x | A | main.rs:813:5:814:14 | S1 | -| main.rs:828:17:828:30 | ...::C1(...) | | main.rs:807:5:811:5 | MyEnum | -| main.rs:828:17:828:30 | ...::C1(...) | A | main.rs:813:5:814:14 | S1 | -| main.rs:828:28:828:29 | S1 | | main.rs:813:5:814:14 | S1 | -| main.rs:829:13:829:13 | y | | main.rs:807:5:811:5 | MyEnum | -| main.rs:829:13:829:13 | y | A | main.rs:815:5:816:14 | S2 | -| main.rs:829:17:829:36 | ...::C2 {...} | | main.rs:807:5:811:5 | MyEnum | -| main.rs:829:17:829:36 | ...::C2 {...} | A | main.rs:815:5:816:14 | S2 | -| main.rs:829:33:829:34 | S2 | | main.rs:815:5:816:14 | S2 | -| main.rs:831:18:831:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:831:18:831:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:831:18:831:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:831:18:831:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:831:26:831:26 | x | | main.rs:807:5:811:5 | MyEnum | -| main.rs:831:26:831:26 | x | A | main.rs:813:5:814:14 | S1 | -| main.rs:831:26:831:31 | x.m1() | | main.rs:813:5:814:14 | S1 | -| main.rs:832:18:832:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:832:18:832:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:832:18:832:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:832:18:832:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:832:26:832:26 | y | | main.rs:807:5:811:5 | MyEnum | -| main.rs:832:26:832:26 | y | A | main.rs:815:5:816:14 | S2 | -| main.rs:832:26:832:31 | y.m1() | | main.rs:815:5:816:14 | S2 | -| main.rs:854:15:854:18 | SelfParam | | main.rs:852:5:855:5 | Self [trait MyTrait1] | -| main.rs:859:15:859:18 | SelfParam | | main.rs:857:5:869:5 | Self [trait MyTrait2] | -| main.rs:862:9:868:9 | { ... } | | main.rs:857:20:857:22 | Tr2 | -| main.rs:863:13:867:13 | if ... {...} else {...} | | main.rs:857:20:857:22 | Tr2 | -| main.rs:863:16:863:16 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:863:16:863:20 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:863:20:863:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:863:22:865:13 | { ... } | | main.rs:857:20:857:22 | Tr2 | -| main.rs:864:17:864:20 | self | | main.rs:857:5:869:5 | Self [trait MyTrait2] | -| main.rs:864:17:864:25 | self.m1() | | main.rs:857:20:857:22 | Tr2 | -| main.rs:865:20:867:13 | { ... } | | main.rs:857:20:857:22 | Tr2 | -| main.rs:866:17:866:30 | ...::m1(...) | | main.rs:857:20:857:22 | Tr2 | -| main.rs:866:26:866:29 | self | | main.rs:857:5:869:5 | Self [trait MyTrait2] | -| main.rs:873:15:873:18 | SelfParam | | main.rs:871:5:883:5 | Self [trait MyTrait3] | -| main.rs:876:9:882:9 | { ... } | | main.rs:871:20:871:22 | Tr3 | -| main.rs:877:13:881:13 | if ... {...} else {...} | | main.rs:871:20:871:22 | Tr3 | -| main.rs:877:16:877:16 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:877:16:877:20 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:877:20:877:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:877:22:879:13 | { ... } | | main.rs:871:20:871:22 | Tr3 | -| main.rs:878:17:878:20 | self | | main.rs:871:5:883:5 | Self [trait MyTrait3] | -| main.rs:878:17:878:25 | self.m2() | | main.rs:837:5:840:5 | MyThing | -| main.rs:878:17:878:25 | self.m2() | A | main.rs:871:20:871:22 | Tr3 | -| main.rs:878:17:878:27 | ... .a | | main.rs:871:20:871:22 | Tr3 | -| main.rs:879:20:881:13 | { ... } | | main.rs:871:20:871:22 | Tr3 | -| main.rs:880:17:880:30 | ...::m2(...) | | main.rs:837:5:840:5 | MyThing | -| main.rs:880:17:880:30 | ...::m2(...) | A | main.rs:871:20:871:22 | Tr3 | -| main.rs:880:17:880:32 | ... .a | | main.rs:871:20:871:22 | Tr3 | -| main.rs:880:26:880:29 | self | | main.rs:871:5:883:5 | Self [trait MyTrait3] | -| main.rs:887:15:887:18 | SelfParam | | main.rs:837:5:840:5 | MyThing | -| main.rs:887:15:887:18 | SelfParam | A | main.rs:885:10:885:10 | T | -| main.rs:887:26:889:9 | { ... } | | main.rs:885:10:885:10 | T | -| main.rs:888:13:888:16 | self | | main.rs:837:5:840:5 | MyThing | -| main.rs:888:13:888:16 | self | A | main.rs:885:10:885:10 | T | -| main.rs:888:13:888:18 | self.a | | main.rs:885:10:885:10 | T | -| main.rs:896:15:896:18 | SelfParam | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:896:15:896:18 | SelfParam | A | main.rs:894:10:894:10 | T | -| main.rs:896:35:898:9 | { ... } | | main.rs:837:5:840:5 | MyThing | -| main.rs:896:35:898:9 | { ... } | A | main.rs:894:10:894:10 | T | -| main.rs:897:13:897:33 | MyThing {...} | | main.rs:837:5:840:5 | MyThing | -| main.rs:897:13:897:33 | MyThing {...} | A | main.rs:894:10:894:10 | T | -| main.rs:897:26:897:29 | self | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:897:26:897:29 | self | A | main.rs:894:10:894:10 | T | -| main.rs:897:26:897:31 | self.a | | main.rs:894:10:894:10 | T | -| main.rs:905:44:905:44 | x | | main.rs:905:26:905:41 | T2 | -| main.rs:905:57:907:5 | { ... } | | main.rs:905:22:905:23 | T1 | -| main.rs:906:9:906:9 | x | | main.rs:905:26:905:41 | T2 | -| main.rs:906:9:906:14 | x.m1() | | main.rs:905:22:905:23 | T1 | -| main.rs:909:56:909:56 | x | | main.rs:909:39:909:53 | T | -| main.rs:911:13:911:13 | a | | main.rs:837:5:840:5 | MyThing | -| main.rs:911:13:911:13 | a | A | main.rs:847:5:848:14 | S1 | -| main.rs:911:17:911:17 | x | | main.rs:909:39:909:53 | T | -| main.rs:911:17:911:22 | x.m1() | | main.rs:837:5:840:5 | MyThing | -| main.rs:911:17:911:22 | x.m1() | A | main.rs:847:5:848:14 | S1 | -| main.rs:912:18:912:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:912:18:912:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:912:18:912:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:912:18:912:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:912:26:912:26 | a | | main.rs:837:5:840:5 | MyThing | -| main.rs:912:26:912:26 | a | A | main.rs:847:5:848:14 | S1 | -| main.rs:916:13:916:13 | x | | main.rs:837:5:840:5 | MyThing | -| main.rs:916:13:916:13 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:916:17:916:33 | MyThing {...} | | main.rs:837:5:840:5 | MyThing | -| main.rs:916:17:916:33 | MyThing {...} | A | main.rs:847:5:848:14 | S1 | -| main.rs:916:30:916:31 | S1 | | main.rs:847:5:848:14 | S1 | -| main.rs:917:13:917:13 | y | | main.rs:837:5:840:5 | MyThing | -| main.rs:917:13:917:13 | y | A | main.rs:849:5:850:14 | S2 | -| main.rs:917:17:917:33 | MyThing {...} | | main.rs:837:5:840:5 | MyThing | -| main.rs:917:17:917:33 | MyThing {...} | A | main.rs:849:5:850:14 | S2 | -| main.rs:917:30:917:31 | S2 | | main.rs:849:5:850:14 | S2 | -| main.rs:919:18:919:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:919:18:919:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:919:18:919:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:919:18:919:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:919:26:919:26 | x | | main.rs:837:5:840:5 | MyThing | -| main.rs:919:26:919:26 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:919:26:919:31 | x.m1() | | main.rs:847:5:848:14 | S1 | -| main.rs:920:18:920:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:920:18:920:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:920:18:920:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:920:18:920:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:920:26:920:26 | y | | main.rs:837:5:840:5 | MyThing | -| main.rs:920:26:920:26 | y | A | main.rs:849:5:850:14 | S2 | -| main.rs:920:26:920:31 | y.m1() | | main.rs:849:5:850:14 | S2 | -| main.rs:922:13:922:13 | x | | main.rs:837:5:840:5 | MyThing | -| main.rs:922:13:922:13 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:922:17:922:33 | MyThing {...} | | main.rs:837:5:840:5 | MyThing | -| main.rs:922:17:922:33 | MyThing {...} | A | main.rs:847:5:848:14 | S1 | -| main.rs:922:30:922:31 | S1 | | main.rs:847:5:848:14 | S1 | -| main.rs:923:13:923:13 | y | | main.rs:837:5:840:5 | MyThing | -| main.rs:923:13:923:13 | y | A | main.rs:849:5:850:14 | S2 | -| main.rs:923:17:923:33 | MyThing {...} | | main.rs:837:5:840:5 | MyThing | -| main.rs:923:17:923:33 | MyThing {...} | A | main.rs:849:5:850:14 | S2 | -| main.rs:923:30:923:31 | S2 | | main.rs:849:5:850:14 | S2 | -| main.rs:925:18:925:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:925:18:925:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:925:18:925:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:925:18:925:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:925:26:925:26 | x | | main.rs:837:5:840:5 | MyThing | -| main.rs:925:26:925:26 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:925:26:925:31 | x.m2() | | main.rs:847:5:848:14 | S1 | -| main.rs:926:18:926:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:926:18:926:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:926:18:926:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:926:18:926:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:926:26:926:26 | y | | main.rs:837:5:840:5 | MyThing | -| main.rs:926:26:926:26 | y | A | main.rs:849:5:850:14 | S2 | -| main.rs:926:26:926:31 | y.m2() | | main.rs:849:5:850:14 | S2 | -| main.rs:928:13:928:13 | x | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:928:13:928:13 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:928:17:928:34 | MyThing2 {...} | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:928:17:928:34 | MyThing2 {...} | A | main.rs:847:5:848:14 | S1 | -| main.rs:928:31:928:32 | S1 | | main.rs:847:5:848:14 | S1 | -| main.rs:929:13:929:13 | y | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:929:13:929:13 | y | A | main.rs:849:5:850:14 | S2 | -| main.rs:929:17:929:34 | MyThing2 {...} | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:929:17:929:34 | MyThing2 {...} | A | main.rs:849:5:850:14 | S2 | -| main.rs:929:31:929:32 | S2 | | main.rs:849:5:850:14 | S2 | -| main.rs:931:18:931:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:931:18:931:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:931:18:931:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:931:18:931:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:931:26:931:26 | x | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:931:26:931:26 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:931:26:931:31 | x.m3() | | main.rs:847:5:848:14 | S1 | -| main.rs:932:18:932:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:932:18:932:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:932:18:932:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:932:18:932:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:932:26:932:26 | y | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:932:26:932:26 | y | A | main.rs:849:5:850:14 | S2 | -| main.rs:932:26:932:31 | y.m3() | | main.rs:849:5:850:14 | S2 | -| main.rs:934:13:934:13 | x | | main.rs:837:5:840:5 | MyThing | -| main.rs:934:13:934:13 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:934:17:934:33 | MyThing {...} | | main.rs:837:5:840:5 | MyThing | -| main.rs:934:17:934:33 | MyThing {...} | A | main.rs:847:5:848:14 | S1 | -| main.rs:934:30:934:31 | S1 | | main.rs:847:5:848:14 | S1 | -| main.rs:935:13:935:13 | s | | main.rs:847:5:848:14 | S1 | -| main.rs:935:17:935:32 | call_trait_m1(...) | | main.rs:847:5:848:14 | S1 | -| main.rs:935:31:935:31 | x | | main.rs:837:5:840:5 | MyThing | -| main.rs:935:31:935:31 | x | A | main.rs:847:5:848:14 | S1 | -| main.rs:937:13:937:13 | x | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:937:13:937:13 | x | A | main.rs:849:5:850:14 | S2 | -| main.rs:937:17:937:34 | MyThing2 {...} | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:937:17:937:34 | MyThing2 {...} | A | main.rs:849:5:850:14 | S2 | -| main.rs:937:31:937:32 | S2 | | main.rs:849:5:850:14 | S2 | -| main.rs:938:13:938:13 | s | | main.rs:837:5:840:5 | MyThing | -| main.rs:938:13:938:13 | s | A | main.rs:849:5:850:14 | S2 | -| main.rs:938:17:938:32 | call_trait_m1(...) | | main.rs:837:5:840:5 | MyThing | -| main.rs:938:17:938:32 | call_trait_m1(...) | A | main.rs:849:5:850:14 | S2 | -| main.rs:938:31:938:31 | x | | main.rs:842:5:845:5 | MyThing2 | -| main.rs:938:31:938:31 | x | A | main.rs:849:5:850:14 | S2 | -| main.rs:955:22:955:22 | x | | file://:0:0:0:0 | & | -| main.rs:955:22:955:22 | x | &T | main.rs:955:11:955:19 | T | -| main.rs:955:35:957:5 | { ... } | | file://:0:0:0:0 | & | -| main.rs:955:35:957:5 | { ... } | &T | main.rs:955:11:955:19 | T | -| main.rs:956:9:956:9 | x | | file://:0:0:0:0 | & | -| main.rs:956:9:956:9 | x | &T | main.rs:955:11:955:19 | T | -| main.rs:960:17:960:20 | SelfParam | | main.rs:945:5:946:14 | S1 | -| main.rs:960:29:962:9 | { ... } | | main.rs:948:5:949:14 | S2 | -| main.rs:961:13:961:14 | S2 | | main.rs:948:5:949:14 | S2 | -| main.rs:965:21:965:21 | x | | main.rs:965:13:965:14 | T1 | -| main.rs:968:5:970:5 | { ... } | | main.rs:965:17:965:18 | T2 | -| main.rs:969:9:969:9 | x | | main.rs:965:13:965:14 | T1 | -| main.rs:969:9:969:16 | x.into() | | main.rs:965:17:965:18 | T2 | -| main.rs:973:13:973:13 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:973:17:973:18 | S1 | | main.rs:945:5:946:14 | S1 | -| main.rs:974:18:974:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:974:18:974:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:974:18:974:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:974:18:974:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:974:26:974:31 | id(...) | | file://:0:0:0:0 | & | -| main.rs:974:26:974:31 | id(...) | &T | main.rs:945:5:946:14 | S1 | -| main.rs:974:29:974:30 | &x | | file://:0:0:0:0 | & | -| main.rs:974:29:974:30 | &x | &T | main.rs:945:5:946:14 | S1 | -| main.rs:974:30:974:30 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:976:13:976:13 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:976:17:976:18 | S1 | | main.rs:945:5:946:14 | S1 | -| main.rs:977:18:977:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:977:18:977:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:977:18:977:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:977:18:977:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:977:26:977:37 | id::<...>(...) | | file://:0:0:0:0 | & | -| main.rs:977:26:977:37 | id::<...>(...) | &T | main.rs:945:5:946:14 | S1 | -| main.rs:977:35:977:36 | &x | | file://:0:0:0:0 | & | -| main.rs:977:35:977:36 | &x | &T | main.rs:945:5:946:14 | S1 | -| main.rs:977:36:977:36 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:979:13:979:13 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:979:17:979:18 | S1 | | main.rs:945:5:946:14 | S1 | -| main.rs:981:18:981:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:981:18:981:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:981:18:981:44 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:981:18:981:44 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:981:26:981:44 | id::<...>(...) | | file://:0:0:0:0 | & | -| main.rs:981:26:981:44 | id::<...>(...) | &T | main.rs:945:5:946:14 | S1 | -| main.rs:981:42:981:43 | &x | | file://:0:0:0:0 | & | -| main.rs:981:42:981:43 | &x | &T | main.rs:945:5:946:14 | S1 | -| main.rs:981:43:981:43 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:983:13:983:13 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:983:17:983:18 | S1 | | main.rs:945:5:946:14 | S1 | -| main.rs:984:9:984:25 | into::<...>(...) | | main.rs:948:5:949:14 | S2 | -| main.rs:984:24:984:24 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:986:13:986:13 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:986:17:986:18 | S1 | | main.rs:945:5:946:14 | S1 | -| main.rs:987:13:987:13 | y | | main.rs:948:5:949:14 | S2 | -| main.rs:987:21:987:27 | into(...) | | main.rs:948:5:949:14 | S2 | -| main.rs:987:26:987:26 | x | | main.rs:945:5:946:14 | S1 | -| main.rs:1001:22:1001:25 | SelfParam | | main.rs:992:5:998:5 | PairOption | -| main.rs:1001:22:1001:25 | SelfParam | Fst | main.rs:1000:10:1000:12 | Fst | -| main.rs:1001:22:1001:25 | SelfParam | Snd | main.rs:1000:15:1000:17 | Snd | -| main.rs:1001:35:1008:9 | { ... } | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1002:13:1007:13 | match self { ... } | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1002:19:1002:22 | self | | main.rs:992:5:998:5 | PairOption | -| main.rs:1002:19:1002:22 | self | Fst | main.rs:1000:10:1000:12 | Fst | -| main.rs:1002:19:1002:22 | self | Snd | main.rs:1000:15:1000:17 | Snd | -| main.rs:1003:17:1003:38 | ...::PairNone(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1003:17:1003:38 | ...::PairNone(...) | Fst | main.rs:1000:10:1000:12 | Fst | -| main.rs:1003:17:1003:38 | ...::PairNone(...) | Snd | main.rs:1000:15:1000:17 | Snd | -| main.rs:1003:43:1003:82 | MacroExpr | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1003:50:1003:81 | "PairNone has no second elemen... | | file://:0:0:0:0 | & | -| main.rs:1003:50:1003:81 | "PairNone has no second elemen... | &T | {EXTERNAL LOCATION} | str | -| main.rs:1003:50:1003:81 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1003:50:1003:81 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1003:50:1003:81 | MacroExpr | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1003:50:1003:81 | { ... } | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1004:17:1004:38 | ...::PairFst(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1004:17:1004:38 | ...::PairFst(...) | Fst | main.rs:1000:10:1000:12 | Fst | -| main.rs:1004:17:1004:38 | ...::PairFst(...) | Snd | main.rs:1000:15:1000:17 | Snd | -| main.rs:1004:37:1004:37 | _ | | main.rs:1000:10:1000:12 | Fst | -| main.rs:1004:43:1004:81 | MacroExpr | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1004:50:1004:80 | "PairFst has no second element... | | file://:0:0:0:0 | & | -| main.rs:1004:50:1004:80 | "PairFst has no second element... | &T | {EXTERNAL LOCATION} | str | -| main.rs:1004:50:1004:80 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1004:50:1004:80 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1004:50:1004:80 | MacroExpr | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1004:50:1004:80 | { ... } | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1005:17:1005:40 | ...::PairSnd(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1005:17:1005:40 | ...::PairSnd(...) | Fst | main.rs:1000:10:1000:12 | Fst | -| main.rs:1005:17:1005:40 | ...::PairSnd(...) | Snd | main.rs:1000:15:1000:17 | Snd | -| main.rs:1005:37:1005:39 | snd | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1005:45:1005:47 | snd | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1006:17:1006:44 | ...::PairBoth(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1006:17:1006:44 | ...::PairBoth(...) | Fst | main.rs:1000:10:1000:12 | Fst | -| main.rs:1006:17:1006:44 | ...::PairBoth(...) | Snd | main.rs:1000:15:1000:17 | Snd | -| main.rs:1006:38:1006:38 | _ | | main.rs:1000:10:1000:12 | Fst | -| main.rs:1006:41:1006:43 | snd | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1006:49:1006:51 | snd | | main.rs:1000:15:1000:17 | Snd | -| main.rs:1032:10:1032:10 | t | | main.rs:992:5:998:5 | PairOption | -| main.rs:1032:10:1032:10 | t | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1032:10:1032:10 | t | Snd | main.rs:992:5:998:5 | PairOption | -| main.rs:1032:10:1032:10 | t | Snd.Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1032:10:1032:10 | t | Snd.Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1033:13:1033:13 | x | | main.rs:1017:5:1018:14 | S3 | -| main.rs:1033:17:1033:17 | t | | main.rs:992:5:998:5 | PairOption | -| main.rs:1033:17:1033:17 | t | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1033:17:1033:17 | t | Snd | main.rs:992:5:998:5 | PairOption | -| main.rs:1033:17:1033:17 | t | Snd.Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1033:17:1033:17 | t | Snd.Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1033:17:1033:29 | t.unwrapSnd() | | main.rs:992:5:998:5 | PairOption | -| main.rs:1033:17:1033:29 | t.unwrapSnd() | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1033:17:1033:29 | t.unwrapSnd() | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1033:17:1033:41 | ... .unwrapSnd() | | main.rs:1017:5:1018:14 | S3 | -| main.rs:1034:18:1034:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1034:18:1034:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1034:18:1034:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1034:18:1034:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1034:26:1034:26 | x | | main.rs:1017:5:1018:14 | S3 | -| main.rs:1047:13:1047:14 | p1 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1047:13:1047:14 | p1 | Fst | main.rs:1011:5:1012:14 | S1 | -| main.rs:1047:13:1047:14 | p1 | Snd | main.rs:1014:5:1015:14 | S2 | -| main.rs:1047:26:1047:53 | ...::PairBoth(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1047:26:1047:53 | ...::PairBoth(...) | Fst | main.rs:1011:5:1012:14 | S1 | -| main.rs:1047:26:1047:53 | ...::PairBoth(...) | Snd | main.rs:1014:5:1015:14 | S2 | -| main.rs:1047:47:1047:48 | S1 | | main.rs:1011:5:1012:14 | S1 | -| main.rs:1047:51:1047:52 | S2 | | main.rs:1014:5:1015:14 | S2 | -| main.rs:1048:18:1048:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1048:18:1048:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1048:18:1048:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1048:18:1048:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1048:26:1048:27 | p1 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1048:26:1048:27 | p1 | Fst | main.rs:1011:5:1012:14 | S1 | -| main.rs:1048:26:1048:27 | p1 | Snd | main.rs:1014:5:1015:14 | S2 | -| main.rs:1051:13:1051:14 | p2 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1051:13:1051:14 | p2 | Fst | main.rs:1011:5:1012:14 | S1 | -| main.rs:1051:13:1051:14 | p2 | Snd | main.rs:1014:5:1015:14 | S2 | -| main.rs:1051:26:1051:47 | ...::PairNone(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1051:26:1051:47 | ...::PairNone(...) | Fst | main.rs:1011:5:1012:14 | S1 | -| main.rs:1051:26:1051:47 | ...::PairNone(...) | Snd | main.rs:1014:5:1015:14 | S2 | +| main.rs:650:18:650:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:650:18:650:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:650:26:650:26 | x | | main.rs:601:5:604:5 | MyThing | +| main.rs:650:26:650:26 | x | T | main.rs:606:5:607:14 | S1 | +| main.rs:650:26:650:31 | x.m2() | | main.rs:606:5:607:14 | S1 | +| main.rs:651:18:651:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:651:18:651:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:651:18:651:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:651:18:651:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:651:26:651:26 | y | | main.rs:601:5:604:5 | MyThing | +| main.rs:651:26:651:26 | y | T | main.rs:608:5:609:14 | S2 | +| main.rs:651:26:651:31 | y.m2() | | main.rs:608:5:609:14 | S2 | +| main.rs:653:13:653:14 | x2 | | main.rs:601:5:604:5 | MyThing | +| main.rs:653:13:653:14 | x2 | T | main.rs:606:5:607:14 | S1 | +| main.rs:653:18:653:34 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:653:18:653:34 | MyThing {...} | T | main.rs:606:5:607:14 | S1 | +| main.rs:653:31:653:32 | S1 | | main.rs:606:5:607:14 | S1 | +| main.rs:654:13:654:14 | y2 | | main.rs:601:5:604:5 | MyThing | +| main.rs:654:13:654:14 | y2 | T | main.rs:608:5:609:14 | S2 | +| main.rs:654:18:654:34 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:654:18:654:34 | MyThing {...} | T | main.rs:608:5:609:14 | S2 | +| main.rs:654:31:654:32 | S2 | | main.rs:608:5:609:14 | S2 | +| main.rs:656:18:656:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:656:18:656:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:656:18:656:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:656:18:656:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:656:26:656:42 | call_trait_m1(...) | | main.rs:606:5:607:14 | S1 | +| main.rs:656:40:656:41 | x2 | | main.rs:601:5:604:5 | MyThing | +| main.rs:656:40:656:41 | x2 | T | main.rs:606:5:607:14 | S1 | +| main.rs:657:18:657:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:657:18:657:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:657:18:657:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:657:18:657:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:657:26:657:42 | call_trait_m1(...) | | main.rs:608:5:609:14 | S2 | +| main.rs:657:40:657:41 | y2 | | main.rs:601:5:604:5 | MyThing | +| main.rs:657:40:657:41 | y2 | T | main.rs:608:5:609:14 | S2 | +| main.rs:659:13:659:14 | x3 | | main.rs:601:5:604:5 | MyThing | +| main.rs:659:13:659:14 | x3 | T | main.rs:601:5:604:5 | MyThing | +| main.rs:659:13:659:14 | x3 | T.T | main.rs:606:5:607:14 | S1 | +| main.rs:659:18:661:9 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:659:18:661:9 | MyThing {...} | T | main.rs:601:5:604:5 | MyThing | +| main.rs:659:18:661:9 | MyThing {...} | T.T | main.rs:606:5:607:14 | S1 | +| main.rs:660:16:660:32 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:660:16:660:32 | MyThing {...} | T | main.rs:606:5:607:14 | S1 | +| main.rs:660:29:660:30 | S1 | | main.rs:606:5:607:14 | S1 | +| main.rs:662:13:662:14 | y3 | | main.rs:601:5:604:5 | MyThing | +| main.rs:662:13:662:14 | y3 | T | main.rs:601:5:604:5 | MyThing | +| main.rs:662:13:662:14 | y3 | T.T | main.rs:608:5:609:14 | S2 | +| main.rs:662:18:664:9 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:662:18:664:9 | MyThing {...} | T | main.rs:601:5:604:5 | MyThing | +| main.rs:662:18:664:9 | MyThing {...} | T.T | main.rs:608:5:609:14 | S2 | +| main.rs:663:16:663:32 | MyThing {...} | | main.rs:601:5:604:5 | MyThing | +| main.rs:663:16:663:32 | MyThing {...} | T | main.rs:608:5:609:14 | S2 | +| main.rs:663:29:663:30 | S2 | | main.rs:608:5:609:14 | S2 | +| main.rs:666:13:666:13 | a | | main.rs:606:5:607:14 | S1 | +| main.rs:666:17:666:39 | call_trait_thing_m1(...) | | main.rs:606:5:607:14 | S1 | +| main.rs:666:37:666:38 | x3 | | main.rs:601:5:604:5 | MyThing | +| main.rs:666:37:666:38 | x3 | T | main.rs:601:5:604:5 | MyThing | +| main.rs:666:37:666:38 | x3 | T.T | main.rs:606:5:607:14 | S1 | +| main.rs:667:18:667:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:667:18:667:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:667:18:667:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:667:18:667:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:667:26:667:26 | a | | main.rs:606:5:607:14 | S1 | +| main.rs:668:13:668:13 | b | | main.rs:608:5:609:14 | S2 | +| main.rs:668:17:668:39 | call_trait_thing_m1(...) | | main.rs:608:5:609:14 | S2 | +| main.rs:668:37:668:38 | y3 | | main.rs:601:5:604:5 | MyThing | +| main.rs:668:37:668:38 | y3 | T | main.rs:601:5:604:5 | MyThing | +| main.rs:668:37:668:38 | y3 | T.T | main.rs:608:5:609:14 | S2 | +| main.rs:669:18:669:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:669:18:669:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:669:18:669:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:669:18:669:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:669:26:669:26 | b | | main.rs:608:5:609:14 | S2 | +| main.rs:680:19:680:22 | SelfParam | | main.rs:674:5:677:5 | Wrapper | +| main.rs:680:19:680:22 | SelfParam | A | main.rs:679:10:679:10 | A | +| main.rs:680:30:682:9 | { ... } | | main.rs:679:10:679:10 | A | +| main.rs:681:13:681:16 | self | | main.rs:674:5:677:5 | Wrapper | +| main.rs:681:13:681:16 | self | A | main.rs:679:10:679:10 | A | +| main.rs:681:13:681:22 | self.field | | main.rs:679:10:679:10 | A | +| main.rs:689:15:689:18 | SelfParam | | main.rs:685:5:699:5 | Self [trait MyTrait] | +| main.rs:691:15:691:18 | SelfParam | | main.rs:685:5:699:5 | Self [trait MyTrait] | +| main.rs:695:9:698:9 | { ... } | | main.rs:686:9:686:28 | AssociatedType | +| main.rs:696:13:696:16 | self | | main.rs:685:5:699:5 | Self [trait MyTrait] | +| main.rs:696:13:696:21 | self.m1() | | main.rs:686:9:686:28 | AssociatedType | +| main.rs:697:13:697:43 | ...::default(...) | | main.rs:686:9:686:28 | AssociatedType | +| main.rs:705:19:705:23 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:705:19:705:23 | SelfParam | &T | main.rs:701:5:711:5 | Self [trait MyTraitAssoc2] | +| main.rs:705:26:705:26 | a | | main.rs:705:16:705:16 | A | +| main.rs:707:22:707:26 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:707:22:707:26 | SelfParam | &T | main.rs:701:5:711:5 | Self [trait MyTraitAssoc2] | +| main.rs:707:29:707:29 | a | | main.rs:707:19:707:19 | A | +| main.rs:707:35:707:35 | b | | main.rs:707:19:707:19 | A | +| main.rs:707:75:710:9 | { ... } | | main.rs:702:9:702:52 | GenericAssociatedType | +| main.rs:708:13:708:16 | self | | file://:0:0:0:0 | & | +| main.rs:708:13:708:16 | self | &T | main.rs:701:5:711:5 | Self [trait MyTraitAssoc2] | +| main.rs:708:13:708:23 | self.put(...) | | main.rs:702:9:702:52 | GenericAssociatedType | +| main.rs:708:22:708:22 | a | | main.rs:707:19:707:19 | A | +| main.rs:709:13:709:16 | self | | file://:0:0:0:0 | & | +| main.rs:709:13:709:16 | self | &T | main.rs:701:5:711:5 | Self [trait MyTraitAssoc2] | +| main.rs:709:13:709:23 | self.put(...) | | main.rs:702:9:702:52 | GenericAssociatedType | +| main.rs:709:22:709:22 | b | | main.rs:707:19:707:19 | A | +| main.rs:718:21:718:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:718:21:718:25 | SelfParam | &T | main.rs:713:5:723:5 | Self [trait TraitMultipleAssoc] | +| main.rs:720:20:720:24 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:720:20:720:24 | SelfParam | &T | main.rs:713:5:723:5 | Self [trait TraitMultipleAssoc] | +| main.rs:722:20:722:24 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:722:20:722:24 | SelfParam | &T | main.rs:713:5:723:5 | Self [trait TraitMultipleAssoc] | +| main.rs:738:15:738:18 | SelfParam | | main.rs:725:5:726:13 | S | +| main.rs:738:45:740:9 | { ... } | | main.rs:731:5:732:14 | AT | +| main.rs:739:13:739:14 | AT | | main.rs:731:5:732:14 | AT | +| main.rs:748:19:748:23 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:748:19:748:23 | SelfParam | &T | main.rs:725:5:726:13 | S | +| main.rs:748:26:748:26 | a | | main.rs:748:16:748:16 | A | +| main.rs:748:46:750:9 | { ... } | | main.rs:674:5:677:5 | Wrapper | +| main.rs:748:46:750:9 | { ... } | A | main.rs:748:16:748:16 | A | +| main.rs:749:13:749:32 | Wrapper {...} | | main.rs:674:5:677:5 | Wrapper | +| main.rs:749:13:749:32 | Wrapper {...} | A | main.rs:748:16:748:16 | A | +| main.rs:749:30:749:30 | a | | main.rs:748:16:748:16 | A | +| main.rs:757:15:757:18 | SelfParam | | main.rs:728:5:729:14 | S2 | +| main.rs:757:45:759:9 | { ... } | | main.rs:674:5:677:5 | Wrapper | +| main.rs:757:45:759:9 | { ... } | A | main.rs:728:5:729:14 | S2 | +| main.rs:758:13:758:35 | Wrapper {...} | | main.rs:674:5:677:5 | Wrapper | +| main.rs:758:13:758:35 | Wrapper {...} | A | main.rs:728:5:729:14 | S2 | +| main.rs:758:30:758:33 | self | | main.rs:728:5:729:14 | S2 | +| main.rs:764:30:766:9 | { ... } | | main.rs:674:5:677:5 | Wrapper | +| main.rs:764:30:766:9 | { ... } | A | main.rs:728:5:729:14 | S2 | +| main.rs:765:13:765:33 | Wrapper {...} | | main.rs:674:5:677:5 | Wrapper | +| main.rs:765:13:765:33 | Wrapper {...} | A | main.rs:728:5:729:14 | S2 | +| main.rs:765:30:765:31 | S2 | | main.rs:728:5:729:14 | S2 | +| main.rs:771:22:771:26 | thing | | main.rs:771:10:771:19 | T | +| main.rs:772:9:772:13 | thing | | main.rs:771:10:771:19 | T | +| main.rs:779:21:779:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:779:21:779:25 | SelfParam | &T | main.rs:731:5:732:14 | AT | +| main.rs:779:34:781:9 | { ... } | | main.rs:731:5:732:14 | AT | +| main.rs:780:13:780:14 | AT | | main.rs:731:5:732:14 | AT | +| main.rs:783:20:783:24 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:783:20:783:24 | SelfParam | &T | main.rs:731:5:732:14 | AT | +| main.rs:783:43:785:9 | { ... } | | main.rs:725:5:726:13 | S | +| main.rs:784:13:784:13 | S | | main.rs:725:5:726:13 | S | +| main.rs:787:20:787:24 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:787:20:787:24 | SelfParam | &T | main.rs:731:5:732:14 | AT | +| main.rs:787:43:789:9 | { ... } | | main.rs:728:5:729:14 | S2 | +| main.rs:788:13:788:14 | S2 | | main.rs:728:5:729:14 | S2 | +| main.rs:793:13:793:14 | x1 | | main.rs:725:5:726:13 | S | +| main.rs:793:18:793:18 | S | | main.rs:725:5:726:13 | S | +| main.rs:795:18:795:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:795:18:795:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:795:18:795:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:795:18:795:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:795:26:795:27 | x1 | | main.rs:725:5:726:13 | S | +| main.rs:795:26:795:32 | x1.m1() | | main.rs:731:5:732:14 | AT | +| main.rs:797:13:797:14 | x2 | | main.rs:725:5:726:13 | S | +| main.rs:797:18:797:18 | S | | main.rs:725:5:726:13 | S | +| main.rs:799:13:799:13 | y | | main.rs:731:5:732:14 | AT | +| main.rs:799:17:799:18 | x2 | | main.rs:725:5:726:13 | S | +| main.rs:799:17:799:23 | x2.m2() | | main.rs:731:5:732:14 | AT | +| main.rs:800:18:800:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:800:18:800:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:800:18:800:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:800:18:800:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:800:26:800:26 | y | | main.rs:731:5:732:14 | AT | +| main.rs:802:13:802:14 | x3 | | main.rs:725:5:726:13 | S | +| main.rs:802:18:802:18 | S | | main.rs:725:5:726:13 | S | +| main.rs:804:18:804:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:804:18:804:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:804:18:804:43 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:804:18:804:43 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:804:26:804:27 | x3 | | main.rs:725:5:726:13 | S | +| main.rs:804:26:804:34 | x3.put(...) | | main.rs:674:5:677:5 | Wrapper | +| main.rs:804:26:804:34 | x3.put(...) | A | {EXTERNAL LOCATION} | i32 | +| main.rs:804:26:804:43 | ... .unwrap() | | {EXTERNAL LOCATION} | i32 | +| main.rs:804:33:804:33 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:807:18:807:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:807:18:807:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:807:18:807:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:807:18:807:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:807:26:807:27 | x3 | | main.rs:725:5:726:13 | S | +| main.rs:807:26:807:40 | x3.putTwo(...) | | main.rs:674:5:677:5 | Wrapper | +| main.rs:807:26:807:40 | x3.putTwo(...) | A | main.rs:745:36:745:50 | AssociatedParam | +| main.rs:807:26:807:49 | ... .unwrap() | | main.rs:745:36:745:50 | AssociatedParam | +| main.rs:807:36:807:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:807:39:807:39 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:809:20:809:20 | S | | main.rs:725:5:726:13 | S | +| main.rs:810:18:810:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:810:18:810:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:810:18:810:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:810:18:810:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:812:13:812:14 | x5 | | main.rs:728:5:729:14 | S2 | +| main.rs:812:18:812:19 | S2 | | main.rs:728:5:729:14 | S2 | +| main.rs:813:18:813:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:813:18:813:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:813:18:813:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:813:18:813:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:813:26:813:27 | x5 | | main.rs:728:5:729:14 | S2 | +| main.rs:813:26:813:32 | x5.m1() | | main.rs:674:5:677:5 | Wrapper | +| main.rs:813:26:813:32 | x5.m1() | A | main.rs:728:5:729:14 | S2 | +| main.rs:814:13:814:14 | x6 | | main.rs:728:5:729:14 | S2 | +| main.rs:814:18:814:19 | S2 | | main.rs:728:5:729:14 | S2 | +| main.rs:815:18:815:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:815:18:815:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:815:18:815:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:815:18:815:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:815:26:815:27 | x6 | | main.rs:728:5:729:14 | S2 | +| main.rs:815:26:815:32 | x6.m2() | | main.rs:674:5:677:5 | Wrapper | +| main.rs:815:26:815:32 | x6.m2() | A | main.rs:728:5:729:14 | S2 | +| main.rs:817:13:817:22 | assoc_zero | | main.rs:731:5:732:14 | AT | +| main.rs:817:26:817:27 | AT | | main.rs:731:5:732:14 | AT | +| main.rs:817:26:817:38 | AT.get_zero() | | main.rs:731:5:732:14 | AT | +| main.rs:818:13:818:21 | assoc_one | | main.rs:725:5:726:13 | S | +| main.rs:818:25:818:26 | AT | | main.rs:731:5:732:14 | AT | +| main.rs:818:25:818:36 | AT.get_one() | | main.rs:725:5:726:13 | S | +| main.rs:819:13:819:21 | assoc_two | | main.rs:728:5:729:14 | S2 | +| main.rs:819:25:819:26 | AT | | main.rs:731:5:732:14 | AT | +| main.rs:819:25:819:36 | AT.get_two() | | main.rs:728:5:729:14 | S2 | +| main.rs:827:19:827:23 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:827:19:827:23 | SelfParam | &T | main.rs:824:5:828:5 | Self [trait Supertrait] | +| main.rs:827:26:827:32 | content | | main.rs:825:9:825:21 | Content | +| main.rs:832:24:832:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:832:24:832:28 | SelfParam | &T | main.rs:830:5:833:5 | Self [trait Subtrait] | +| main.rs:841:23:841:27 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:841:23:841:27 | SelfParam | &T | main.rs:835:5:845:5 | Self [trait Subtrait2] | +| main.rs:841:30:841:31 | c1 | | main.rs:825:9:825:21 | Content | +| main.rs:841:49:841:50 | c2 | | main.rs:825:9:825:21 | Content | +| main.rs:842:13:842:16 | self | | file://:0:0:0:0 | & | +| main.rs:842:13:842:16 | self | &T | main.rs:835:5:845:5 | Self [trait Subtrait2] | +| main.rs:842:25:842:26 | c1 | | main.rs:825:9:825:21 | Content | +| main.rs:843:13:843:16 | self | | file://:0:0:0:0 | & | +| main.rs:843:13:843:16 | self | &T | main.rs:835:5:845:5 | Self [trait Subtrait2] | +| main.rs:843:25:843:26 | c2 | | main.rs:825:9:825:21 | Content | +| main.rs:851:19:851:23 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:851:19:851:23 | SelfParam | &T | main.rs:847:5:847:24 | MyType | +| main.rs:851:19:851:23 | SelfParam | &T.T | main.rs:849:10:849:10 | T | +| main.rs:851:26:851:33 | _content | | main.rs:849:10:849:10 | T | +| main.rs:852:22:852:42 | "Inserting content: \\n" | | file://:0:0:0:0 | & | +| main.rs:852:22:852:42 | "Inserting content: \\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:852:22:852:42 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:852:22:852:42 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:858:24:858:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:858:24:858:28 | SelfParam | &T | main.rs:847:5:847:24 | MyType | +| main.rs:858:24:858:28 | SelfParam | &T.T | main.rs:856:10:856:17 | T | +| main.rs:858:48:860:9 | { ... } | | main.rs:856:10:856:17 | T | +| main.rs:859:13:859:19 | (...) | | main.rs:847:5:847:24 | MyType | +| main.rs:859:13:859:19 | (...) | T | main.rs:856:10:856:17 | T | +| main.rs:859:13:859:21 | ... .0 | | main.rs:856:10:856:17 | T | +| main.rs:859:13:859:29 | ... .clone() | | main.rs:856:10:856:17 | T | +| main.rs:859:14:859:18 | * ... | | main.rs:847:5:847:24 | MyType | +| main.rs:859:14:859:18 | * ... | T | main.rs:856:10:856:17 | T | +| main.rs:859:15:859:18 | self | | file://:0:0:0:0 | & | +| main.rs:859:15:859:18 | self | &T | main.rs:847:5:847:24 | MyType | +| main.rs:859:15:859:18 | self | &T.T | main.rs:856:10:856:17 | T | +| main.rs:863:33:863:36 | item | | file://:0:0:0:0 | & | +| main.rs:863:33:863:36 | item | &T | main.rs:863:20:863:30 | T | +| main.rs:863:57:865:5 | { ... } | | main.rs:825:9:825:21 | Content | +| main.rs:864:9:864:12 | item | | file://:0:0:0:0 | & | +| main.rs:864:9:864:12 | item | &T | main.rs:863:20:863:30 | T | +| main.rs:864:9:864:26 | item.get_content() | | main.rs:825:9:825:21 | Content | +| main.rs:867:35:867:38 | item | | file://:0:0:0:0 | & | +| main.rs:867:35:867:38 | item | &T | main.rs:867:21:867:32 | T | +| main.rs:867:45:867:46 | c1 | | main.rs:825:9:825:21 | Content | +| main.rs:867:61:867:62 | c2 | | main.rs:825:9:825:21 | Content | +| main.rs:867:77:867:78 | c3 | | main.rs:825:9:825:21 | Content | +| main.rs:868:9:868:12 | item | | file://:0:0:0:0 | & | +| main.rs:868:9:868:12 | item | &T | main.rs:867:21:867:32 | T | +| main.rs:868:21:868:22 | c1 | | main.rs:825:9:825:21 | Content | +| main.rs:869:9:869:12 | item | | file://:0:0:0:0 | & | +| main.rs:869:9:869:12 | item | &T | main.rs:867:21:867:32 | T | +| main.rs:869:25:869:26 | c2 | | main.rs:825:9:825:21 | Content | +| main.rs:869:29:869:30 | c3 | | main.rs:825:9:825:21 | Content | +| main.rs:873:13:873:17 | item1 | | main.rs:847:5:847:24 | MyType | +| main.rs:873:13:873:17 | item1 | T | {EXTERNAL LOCATION} | i64 | +| main.rs:873:21:873:33 | MyType(...) | | main.rs:847:5:847:24 | MyType | +| main.rs:873:21:873:33 | MyType(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:873:28:873:32 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:874:25:874:29 | item1 | | main.rs:847:5:847:24 | MyType | +| main.rs:874:25:874:29 | item1 | T | {EXTERNAL LOCATION} | i64 | +| main.rs:876:13:876:17 | item2 | | main.rs:847:5:847:24 | MyType | +| main.rs:876:13:876:17 | item2 | T | {EXTERNAL LOCATION} | bool | +| main.rs:876:21:876:32 | MyType(...) | | main.rs:847:5:847:24 | MyType | +| main.rs:876:21:876:32 | MyType(...) | T | {EXTERNAL LOCATION} | bool | +| main.rs:876:28:876:31 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:877:37:877:42 | &item2 | | file://:0:0:0:0 | & | +| main.rs:877:37:877:42 | &item2 | &T | main.rs:847:5:847:24 | MyType | +| main.rs:877:37:877:42 | &item2 | &T.T | {EXTERNAL LOCATION} | bool | +| main.rs:877:38:877:42 | item2 | | main.rs:847:5:847:24 | MyType | +| main.rs:877:38:877:42 | item2 | T | {EXTERNAL LOCATION} | bool | +| main.rs:894:15:894:18 | SelfParam | | main.rs:882:5:886:5 | MyEnum | +| main.rs:894:15:894:18 | SelfParam | A | main.rs:893:10:893:10 | T | +| main.rs:894:26:899:9 | { ... } | | main.rs:893:10:893:10 | T | +| main.rs:895:13:898:13 | match self { ... } | | main.rs:893:10:893:10 | T | +| main.rs:895:19:895:22 | self | | main.rs:882:5:886:5 | MyEnum | +| main.rs:895:19:895:22 | self | A | main.rs:893:10:893:10 | T | +| main.rs:896:17:896:29 | ...::C1(...) | | main.rs:882:5:886:5 | MyEnum | +| main.rs:896:17:896:29 | ...::C1(...) | A | main.rs:893:10:893:10 | T | +| main.rs:896:28:896:28 | a | | main.rs:893:10:893:10 | T | +| main.rs:896:34:896:34 | a | | main.rs:893:10:893:10 | T | +| main.rs:897:17:897:32 | ...::C2 {...} | | main.rs:882:5:886:5 | MyEnum | +| main.rs:897:17:897:32 | ...::C2 {...} | A | main.rs:893:10:893:10 | T | +| main.rs:897:30:897:30 | a | | main.rs:893:10:893:10 | T | +| main.rs:897:37:897:37 | a | | main.rs:893:10:893:10 | T | +| main.rs:903:13:903:13 | x | | main.rs:882:5:886:5 | MyEnum | +| main.rs:903:13:903:13 | x | A | main.rs:888:5:889:14 | S1 | +| main.rs:903:17:903:30 | ...::C1(...) | | main.rs:882:5:886:5 | MyEnum | +| main.rs:903:17:903:30 | ...::C1(...) | A | main.rs:888:5:889:14 | S1 | +| main.rs:903:28:903:29 | S1 | | main.rs:888:5:889:14 | S1 | +| main.rs:904:13:904:13 | y | | main.rs:882:5:886:5 | MyEnum | +| main.rs:904:13:904:13 | y | A | main.rs:890:5:891:14 | S2 | +| main.rs:904:17:904:36 | ...::C2 {...} | | main.rs:882:5:886:5 | MyEnum | +| main.rs:904:17:904:36 | ...::C2 {...} | A | main.rs:890:5:891:14 | S2 | +| main.rs:904:33:904:34 | S2 | | main.rs:890:5:891:14 | S2 | +| main.rs:906:18:906:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:906:18:906:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:906:18:906:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:906:18:906:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:906:26:906:26 | x | | main.rs:882:5:886:5 | MyEnum | +| main.rs:906:26:906:26 | x | A | main.rs:888:5:889:14 | S1 | +| main.rs:906:26:906:31 | x.m1() | | main.rs:888:5:889:14 | S1 | +| main.rs:907:18:907:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:907:18:907:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:907:18:907:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:907:18:907:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:907:26:907:26 | y | | main.rs:882:5:886:5 | MyEnum | +| main.rs:907:26:907:26 | y | A | main.rs:890:5:891:14 | S2 | +| main.rs:907:26:907:31 | y.m1() | | main.rs:890:5:891:14 | S2 | +| main.rs:929:15:929:18 | SelfParam | | main.rs:927:5:930:5 | Self [trait MyTrait1] | +| main.rs:934:15:934:18 | SelfParam | | main.rs:932:5:944:5 | Self [trait MyTrait2] | +| main.rs:937:9:943:9 | { ... } | | main.rs:932:20:932:22 | Tr2 | +| main.rs:938:13:942:13 | if ... {...} else {...} | | main.rs:932:20:932:22 | Tr2 | +| main.rs:938:16:938:16 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:938:16:938:20 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:938:20:938:20 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:938:22:940:13 | { ... } | | main.rs:932:20:932:22 | Tr2 | +| main.rs:939:17:939:20 | self | | main.rs:932:5:944:5 | Self [trait MyTrait2] | +| main.rs:939:17:939:25 | self.m1() | | main.rs:932:20:932:22 | Tr2 | +| main.rs:940:20:942:13 | { ... } | | main.rs:932:20:932:22 | Tr2 | +| main.rs:941:17:941:30 | ...::m1(...) | | main.rs:932:20:932:22 | Tr2 | +| main.rs:941:26:941:29 | self | | main.rs:932:5:944:5 | Self [trait MyTrait2] | +| main.rs:948:15:948:18 | SelfParam | | main.rs:946:5:958:5 | Self [trait MyTrait3] | +| main.rs:951:9:957:9 | { ... } | | main.rs:946:20:946:22 | Tr3 | +| main.rs:952:13:956:13 | if ... {...} else {...} | | main.rs:946:20:946:22 | Tr3 | +| main.rs:952:16:952:16 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:952:16:952:20 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:952:20:952:20 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:952:22:954:13 | { ... } | | main.rs:946:20:946:22 | Tr3 | +| main.rs:953:17:953:20 | self | | main.rs:946:5:958:5 | Self [trait MyTrait3] | +| main.rs:953:17:953:25 | self.m2() | | main.rs:912:5:915:5 | MyThing | +| main.rs:953:17:953:25 | self.m2() | A | main.rs:946:20:946:22 | Tr3 | +| main.rs:953:17:953:27 | ... .a | | main.rs:946:20:946:22 | Tr3 | +| main.rs:954:20:956:13 | { ... } | | main.rs:946:20:946:22 | Tr3 | +| main.rs:955:17:955:30 | ...::m2(...) | | main.rs:912:5:915:5 | MyThing | +| main.rs:955:17:955:30 | ...::m2(...) | A | main.rs:946:20:946:22 | Tr3 | +| main.rs:955:17:955:32 | ... .a | | main.rs:946:20:946:22 | Tr3 | +| main.rs:955:26:955:29 | self | | main.rs:946:5:958:5 | Self [trait MyTrait3] | +| main.rs:962:15:962:18 | SelfParam | | main.rs:912:5:915:5 | MyThing | +| main.rs:962:15:962:18 | SelfParam | A | main.rs:960:10:960:10 | T | +| main.rs:962:26:964:9 | { ... } | | main.rs:960:10:960:10 | T | +| main.rs:963:13:963:16 | self | | main.rs:912:5:915:5 | MyThing | +| main.rs:963:13:963:16 | self | A | main.rs:960:10:960:10 | T | +| main.rs:963:13:963:18 | self.a | | main.rs:960:10:960:10 | T | +| main.rs:971:15:971:18 | SelfParam | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:971:15:971:18 | SelfParam | A | main.rs:969:10:969:10 | T | +| main.rs:971:35:973:9 | { ... } | | main.rs:912:5:915:5 | MyThing | +| main.rs:971:35:973:9 | { ... } | A | main.rs:969:10:969:10 | T | +| main.rs:972:13:972:33 | MyThing {...} | | main.rs:912:5:915:5 | MyThing | +| main.rs:972:13:972:33 | MyThing {...} | A | main.rs:969:10:969:10 | T | +| main.rs:972:26:972:29 | self | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:972:26:972:29 | self | A | main.rs:969:10:969:10 | T | +| main.rs:972:26:972:31 | self.a | | main.rs:969:10:969:10 | T | +| main.rs:980:44:980:44 | x | | main.rs:980:26:980:41 | T2 | +| main.rs:980:57:982:5 | { ... } | | main.rs:980:22:980:23 | T1 | +| main.rs:981:9:981:9 | x | | main.rs:980:26:980:41 | T2 | +| main.rs:981:9:981:14 | x.m1() | | main.rs:980:22:980:23 | T1 | +| main.rs:984:56:984:56 | x | | main.rs:984:39:984:53 | T | +| main.rs:986:13:986:13 | a | | main.rs:912:5:915:5 | MyThing | +| main.rs:986:13:986:13 | a | A | main.rs:922:5:923:14 | S1 | +| main.rs:986:17:986:17 | x | | main.rs:984:39:984:53 | T | +| main.rs:986:17:986:22 | x.m1() | | main.rs:912:5:915:5 | MyThing | +| main.rs:986:17:986:22 | x.m1() | A | main.rs:922:5:923:14 | S1 | +| main.rs:987:18:987:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:987:18:987:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:987:18:987:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:987:18:987:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:987:26:987:26 | a | | main.rs:912:5:915:5 | MyThing | +| main.rs:987:26:987:26 | a | A | main.rs:922:5:923:14 | S1 | +| main.rs:991:13:991:13 | x | | main.rs:912:5:915:5 | MyThing | +| main.rs:991:13:991:13 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:991:17:991:33 | MyThing {...} | | main.rs:912:5:915:5 | MyThing | +| main.rs:991:17:991:33 | MyThing {...} | A | main.rs:922:5:923:14 | S1 | +| main.rs:991:30:991:31 | S1 | | main.rs:922:5:923:14 | S1 | +| main.rs:992:13:992:13 | y | | main.rs:912:5:915:5 | MyThing | +| main.rs:992:13:992:13 | y | A | main.rs:924:5:925:14 | S2 | +| main.rs:992:17:992:33 | MyThing {...} | | main.rs:912:5:915:5 | MyThing | +| main.rs:992:17:992:33 | MyThing {...} | A | main.rs:924:5:925:14 | S2 | +| main.rs:992:30:992:31 | S2 | | main.rs:924:5:925:14 | S2 | +| main.rs:994:18:994:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:994:18:994:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:994:18:994:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:994:18:994:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:994:26:994:26 | x | | main.rs:912:5:915:5 | MyThing | +| main.rs:994:26:994:26 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:994:26:994:31 | x.m1() | | main.rs:922:5:923:14 | S1 | +| main.rs:995:18:995:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:995:18:995:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:995:18:995:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:995:18:995:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:995:26:995:26 | y | | main.rs:912:5:915:5 | MyThing | +| main.rs:995:26:995:26 | y | A | main.rs:924:5:925:14 | S2 | +| main.rs:995:26:995:31 | y.m1() | | main.rs:924:5:925:14 | S2 | +| main.rs:997:13:997:13 | x | | main.rs:912:5:915:5 | MyThing | +| main.rs:997:13:997:13 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:997:17:997:33 | MyThing {...} | | main.rs:912:5:915:5 | MyThing | +| main.rs:997:17:997:33 | MyThing {...} | A | main.rs:922:5:923:14 | S1 | +| main.rs:997:30:997:31 | S1 | | main.rs:922:5:923:14 | S1 | +| main.rs:998:13:998:13 | y | | main.rs:912:5:915:5 | MyThing | +| main.rs:998:13:998:13 | y | A | main.rs:924:5:925:14 | S2 | +| main.rs:998:17:998:33 | MyThing {...} | | main.rs:912:5:915:5 | MyThing | +| main.rs:998:17:998:33 | MyThing {...} | A | main.rs:924:5:925:14 | S2 | +| main.rs:998:30:998:31 | S2 | | main.rs:924:5:925:14 | S2 | +| main.rs:1000:18:1000:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1000:18:1000:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1000:18:1000:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1000:18:1000:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1000:26:1000:26 | x | | main.rs:912:5:915:5 | MyThing | +| main.rs:1000:26:1000:26 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:1000:26:1000:31 | x.m2() | | main.rs:922:5:923:14 | S1 | +| main.rs:1001:18:1001:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1001:18:1001:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1001:18:1001:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1001:18:1001:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1001:26:1001:26 | y | | main.rs:912:5:915:5 | MyThing | +| main.rs:1001:26:1001:26 | y | A | main.rs:924:5:925:14 | S2 | +| main.rs:1001:26:1001:31 | y.m2() | | main.rs:924:5:925:14 | S2 | +| main.rs:1003:13:1003:13 | x | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1003:13:1003:13 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:1003:17:1003:34 | MyThing2 {...} | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1003:17:1003:34 | MyThing2 {...} | A | main.rs:922:5:923:14 | S1 | +| main.rs:1003:31:1003:32 | S1 | | main.rs:922:5:923:14 | S1 | +| main.rs:1004:13:1004:13 | y | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1004:13:1004:13 | y | A | main.rs:924:5:925:14 | S2 | +| main.rs:1004:17:1004:34 | MyThing2 {...} | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1004:17:1004:34 | MyThing2 {...} | A | main.rs:924:5:925:14 | S2 | +| main.rs:1004:31:1004:32 | S2 | | main.rs:924:5:925:14 | S2 | +| main.rs:1006:18:1006:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1006:18:1006:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1006:18:1006:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1006:18:1006:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1006:26:1006:26 | x | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1006:26:1006:26 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:1006:26:1006:31 | x.m3() | | main.rs:922:5:923:14 | S1 | +| main.rs:1007:18:1007:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1007:18:1007:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1007:18:1007:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1007:18:1007:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1007:26:1007:26 | y | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1007:26:1007:26 | y | A | main.rs:924:5:925:14 | S2 | +| main.rs:1007:26:1007:31 | y.m3() | | main.rs:924:5:925:14 | S2 | +| main.rs:1009:13:1009:13 | x | | main.rs:912:5:915:5 | MyThing | +| main.rs:1009:13:1009:13 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:1009:17:1009:33 | MyThing {...} | | main.rs:912:5:915:5 | MyThing | +| main.rs:1009:17:1009:33 | MyThing {...} | A | main.rs:922:5:923:14 | S1 | +| main.rs:1009:30:1009:31 | S1 | | main.rs:922:5:923:14 | S1 | +| main.rs:1010:13:1010:13 | s | | main.rs:922:5:923:14 | S1 | +| main.rs:1010:17:1010:32 | call_trait_m1(...) | | main.rs:922:5:923:14 | S1 | +| main.rs:1010:31:1010:31 | x | | main.rs:912:5:915:5 | MyThing | +| main.rs:1010:31:1010:31 | x | A | main.rs:922:5:923:14 | S1 | +| main.rs:1012:13:1012:13 | x | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1012:13:1012:13 | x | A | main.rs:924:5:925:14 | S2 | +| main.rs:1012:17:1012:34 | MyThing2 {...} | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1012:17:1012:34 | MyThing2 {...} | A | main.rs:924:5:925:14 | S2 | +| main.rs:1012:31:1012:32 | S2 | | main.rs:924:5:925:14 | S2 | +| main.rs:1013:13:1013:13 | s | | main.rs:912:5:915:5 | MyThing | +| main.rs:1013:13:1013:13 | s | A | main.rs:924:5:925:14 | S2 | +| main.rs:1013:17:1013:32 | call_trait_m1(...) | | main.rs:912:5:915:5 | MyThing | +| main.rs:1013:17:1013:32 | call_trait_m1(...) | A | main.rs:924:5:925:14 | S2 | +| main.rs:1013:31:1013:31 | x | | main.rs:917:5:920:5 | MyThing2 | +| main.rs:1013:31:1013:31 | x | A | main.rs:924:5:925:14 | S2 | +| main.rs:1030:22:1030:22 | x | | file://:0:0:0:0 | & | +| main.rs:1030:22:1030:22 | x | &T | main.rs:1030:11:1030:19 | T | +| main.rs:1030:35:1032:5 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1030:35:1032:5 | { ... } | &T | main.rs:1030:11:1030:19 | T | +| main.rs:1031:9:1031:9 | x | | file://:0:0:0:0 | & | +| main.rs:1031:9:1031:9 | x | &T | main.rs:1030:11:1030:19 | T | +| main.rs:1035:17:1035:20 | SelfParam | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1035:29:1037:9 | { ... } | | main.rs:1023:5:1024:14 | S2 | +| main.rs:1036:13:1036:14 | S2 | | main.rs:1023:5:1024:14 | S2 | +| main.rs:1040:21:1040:21 | x | | main.rs:1040:13:1040:14 | T1 | +| main.rs:1043:5:1045:5 | { ... } | | main.rs:1040:17:1040:18 | T2 | +| main.rs:1044:9:1044:9 | x | | main.rs:1040:13:1040:14 | T1 | +| main.rs:1044:9:1044:16 | x.into() | | main.rs:1040:17:1040:18 | T2 | +| main.rs:1048:13:1048:13 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1048:17:1048:18 | S1 | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1049:18:1049:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1049:18:1049:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1049:18:1049:31 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1049:18:1049:31 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1049:26:1049:31 | id(...) | | file://:0:0:0:0 | & | +| main.rs:1049:26:1049:31 | id(...) | &T | main.rs:1020:5:1021:14 | S1 | +| main.rs:1049:29:1049:30 | &x | | file://:0:0:0:0 | & | +| main.rs:1049:29:1049:30 | &x | &T | main.rs:1020:5:1021:14 | S1 | +| main.rs:1049:30:1049:30 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1051:13:1051:13 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1051:17:1051:18 | S1 | | main.rs:1020:5:1021:14 | S1 | | main.rs:1052:18:1052:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1052:18:1052:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1052:18:1052:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1052:18:1052:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1052:26:1052:27 | p2 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1052:26:1052:27 | p2 | Fst | main.rs:1011:5:1012:14 | S1 | -| main.rs:1052:26:1052:27 | p2 | Snd | main.rs:1014:5:1015:14 | S2 | -| main.rs:1055:13:1055:14 | p3 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1055:13:1055:14 | p3 | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1055:13:1055:14 | p3 | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1055:34:1055:56 | ...::PairSnd(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1055:34:1055:56 | ...::PairSnd(...) | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1055:34:1055:56 | ...::PairSnd(...) | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1055:54:1055:55 | S3 | | main.rs:1017:5:1018:14 | S3 | +| main.rs:1052:18:1052:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1052:18:1052:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1052:26:1052:37 | id::<...>(...) | | file://:0:0:0:0 | & | +| main.rs:1052:26:1052:37 | id::<...>(...) | &T | main.rs:1020:5:1021:14 | S1 | +| main.rs:1052:35:1052:36 | &x | | file://:0:0:0:0 | & | +| main.rs:1052:35:1052:36 | &x | &T | main.rs:1020:5:1021:14 | S1 | +| main.rs:1052:36:1052:36 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1054:13:1054:13 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1054:13:1054:13 | x | | main.rs:1026:5:1026:25 | dyn Trait | +| main.rs:1054:17:1054:18 | S1 | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1054:17:1054:18 | S1 | | main.rs:1026:5:1026:25 | dyn Trait | | main.rs:1056:18:1056:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1056:18:1056:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1056:18:1056:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1056:18:1056:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1056:26:1056:27 | p3 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1056:26:1056:27 | p3 | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1056:26:1056:27 | p3 | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1059:13:1059:14 | p3 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1059:13:1059:14 | p3 | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1059:13:1059:14 | p3 | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1059:35:1059:56 | ...::PairNone(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1059:35:1059:56 | ...::PairNone(...) | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1059:35:1059:56 | ...::PairNone(...) | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1060:18:1060:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1060:18:1060:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1060:18:1060:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1060:18:1060:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1060:26:1060:27 | p3 | | main.rs:992:5:998:5 | PairOption | -| main.rs:1060:26:1060:27 | p3 | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1060:26:1060:27 | p3 | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1062:11:1062:54 | ...::PairSnd(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1062:11:1062:54 | ...::PairSnd(...) | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1062:11:1062:54 | ...::PairSnd(...) | Snd | main.rs:992:5:998:5 | PairOption | -| main.rs:1062:11:1062:54 | ...::PairSnd(...) | Snd.Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1062:11:1062:54 | ...::PairSnd(...) | Snd.Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1062:31:1062:53 | ...::PairSnd(...) | | main.rs:992:5:998:5 | PairOption | -| main.rs:1062:31:1062:53 | ...::PairSnd(...) | Fst | main.rs:1014:5:1015:14 | S2 | -| main.rs:1062:31:1062:53 | ...::PairSnd(...) | Snd | main.rs:1017:5:1018:14 | S3 | -| main.rs:1062:51:1062:52 | S3 | | main.rs:1017:5:1018:14 | S3 | -| main.rs:1064:13:1064:13 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1064:13:1064:13 | x | E | main.rs:1011:5:1012:14 | S1 | -| main.rs:1064:13:1064:13 | x | T | main.rs:1037:5:1037:34 | S4 | -| main.rs:1064:13:1064:13 | x | T.T41 | main.rs:1014:5:1015:14 | S2 | -| main.rs:1064:13:1064:13 | x | T.T42 | main.rs:1039:5:1039:22 | S5 | -| main.rs:1064:13:1064:13 | x | T.T42.T5 | main.rs:1014:5:1015:14 | S2 | -| main.rs:1077:16:1077:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1077:16:1077:24 | SelfParam | &T | main.rs:1075:5:1082:5 | Self [trait MyTrait] | -| main.rs:1077:27:1077:31 | value | | main.rs:1075:19:1075:19 | S | -| main.rs:1079:21:1079:29 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1079:21:1079:29 | SelfParam | &T | main.rs:1075:5:1082:5 | Self [trait MyTrait] | -| main.rs:1079:32:1079:36 | value | | main.rs:1075:19:1075:19 | S | -| main.rs:1080:13:1080:16 | self | | file://:0:0:0:0 | & | -| main.rs:1080:13:1080:16 | self | &T | main.rs:1075:5:1082:5 | Self [trait MyTrait] | -| main.rs:1080:22:1080:26 | value | | main.rs:1075:19:1075:19 | S | -| main.rs:1086:16:1086:24 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1086:16:1086:24 | SelfParam | &T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1086:16:1086:24 | SelfParam | &T.T | main.rs:1084:10:1084:10 | T | -| main.rs:1086:27:1086:31 | value | | main.rs:1084:10:1084:10 | T | -| main.rs:1090:26:1092:9 | { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1090:26:1092:9 | { ... } | T | main.rs:1089:10:1089:10 | T | -| main.rs:1091:13:1091:30 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1091:13:1091:30 | ...::MyNone(...) | T | main.rs:1089:10:1089:10 | T | -| main.rs:1096:20:1096:23 | SelfParam | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1096:20:1096:23 | SelfParam | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1096:20:1096:23 | SelfParam | T.T | main.rs:1095:10:1095:10 | T | -| main.rs:1096:41:1101:9 | { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1096:41:1101:9 | { ... } | T | main.rs:1095:10:1095:10 | T | -| main.rs:1097:13:1100:13 | match self { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1097:13:1100:13 | match self { ... } | T | main.rs:1095:10:1095:10 | T | -| main.rs:1097:19:1097:22 | self | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1097:19:1097:22 | self | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1097:19:1097:22 | self | T.T | main.rs:1095:10:1095:10 | T | -| main.rs:1098:17:1098:34 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1098:17:1098:34 | ...::MyNone(...) | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1098:17:1098:34 | ...::MyNone(...) | T.T | main.rs:1095:10:1095:10 | T | -| main.rs:1098:39:1098:56 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1098:39:1098:56 | ...::MyNone(...) | T | main.rs:1095:10:1095:10 | T | -| main.rs:1099:17:1099:35 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1099:17:1099:35 | ...::MySome(...) | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1099:17:1099:35 | ...::MySome(...) | T.T | main.rs:1095:10:1095:10 | T | -| main.rs:1099:34:1099:34 | x | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1099:34:1099:34 | x | T | main.rs:1095:10:1095:10 | T | -| main.rs:1099:40:1099:40 | x | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1099:40:1099:40 | x | T | main.rs:1095:10:1095:10 | T | -| main.rs:1108:13:1108:14 | x1 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1108:13:1108:14 | x1 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1108:18:1108:37 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1108:18:1108:37 | ...::new(...) | T | main.rs:1104:5:1105:13 | S | +| main.rs:1056:18:1056:44 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1056:18:1056:44 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1056:26:1056:44 | id::<...>(...) | | file://:0:0:0:0 | & | +| main.rs:1056:26:1056:44 | id::<...>(...) | &T | main.rs:1026:5:1026:25 | dyn Trait | +| main.rs:1056:42:1056:43 | &x | | file://:0:0:0:0 | & | +| main.rs:1056:42:1056:43 | &x | &T | main.rs:1020:5:1021:14 | S1 | +| main.rs:1056:42:1056:43 | &x | &T | main.rs:1026:5:1026:25 | dyn Trait | +| main.rs:1056:43:1056:43 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1056:43:1056:43 | x | | main.rs:1026:5:1026:25 | dyn Trait | +| main.rs:1058:13:1058:13 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1058:17:1058:18 | S1 | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1059:9:1059:25 | into::<...>(...) | | main.rs:1023:5:1024:14 | S2 | +| main.rs:1059:24:1059:24 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1061:13:1061:13 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1061:17:1061:18 | S1 | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1062:13:1062:13 | y | | main.rs:1023:5:1024:14 | S2 | +| main.rs:1062:21:1062:27 | into(...) | | main.rs:1023:5:1024:14 | S2 | +| main.rs:1062:26:1062:26 | x | | main.rs:1020:5:1021:14 | S1 | +| main.rs:1076:22:1076:25 | SelfParam | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1076:22:1076:25 | SelfParam | Fst | main.rs:1075:10:1075:12 | Fst | +| main.rs:1076:22:1076:25 | SelfParam | Snd | main.rs:1075:15:1075:17 | Snd | +| main.rs:1076:35:1083:9 | { ... } | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1077:13:1082:13 | match self { ... } | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1077:19:1077:22 | self | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1077:19:1077:22 | self | Fst | main.rs:1075:10:1075:12 | Fst | +| main.rs:1077:19:1077:22 | self | Snd | main.rs:1075:15:1075:17 | Snd | +| main.rs:1078:17:1078:38 | ...::PairNone(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1078:17:1078:38 | ...::PairNone(...) | Fst | main.rs:1075:10:1075:12 | Fst | +| main.rs:1078:17:1078:38 | ...::PairNone(...) | Snd | main.rs:1075:15:1075:17 | Snd | +| main.rs:1078:43:1078:82 | MacroExpr | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1078:50:1078:81 | "PairNone has no second elemen... | | file://:0:0:0:0 | & | +| main.rs:1078:50:1078:81 | "PairNone has no second elemen... | &T | {EXTERNAL LOCATION} | str | +| main.rs:1078:50:1078:81 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1078:50:1078:81 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1078:50:1078:81 | MacroExpr | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1078:50:1078:81 | { ... } | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1079:17:1079:38 | ...::PairFst(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1079:17:1079:38 | ...::PairFst(...) | Fst | main.rs:1075:10:1075:12 | Fst | +| main.rs:1079:17:1079:38 | ...::PairFst(...) | Snd | main.rs:1075:15:1075:17 | Snd | +| main.rs:1079:37:1079:37 | _ | | main.rs:1075:10:1075:12 | Fst | +| main.rs:1079:43:1079:81 | MacroExpr | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1079:50:1079:80 | "PairFst has no second element... | | file://:0:0:0:0 | & | +| main.rs:1079:50:1079:80 | "PairFst has no second element... | &T | {EXTERNAL LOCATION} | str | +| main.rs:1079:50:1079:80 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1079:50:1079:80 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1079:50:1079:80 | MacroExpr | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1079:50:1079:80 | { ... } | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1080:17:1080:40 | ...::PairSnd(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1080:17:1080:40 | ...::PairSnd(...) | Fst | main.rs:1075:10:1075:12 | Fst | +| main.rs:1080:17:1080:40 | ...::PairSnd(...) | Snd | main.rs:1075:15:1075:17 | Snd | +| main.rs:1080:37:1080:39 | snd | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1080:45:1080:47 | snd | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1081:17:1081:44 | ...::PairBoth(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1081:17:1081:44 | ...::PairBoth(...) | Fst | main.rs:1075:10:1075:12 | Fst | +| main.rs:1081:17:1081:44 | ...::PairBoth(...) | Snd | main.rs:1075:15:1075:17 | Snd | +| main.rs:1081:38:1081:38 | _ | | main.rs:1075:10:1075:12 | Fst | +| main.rs:1081:41:1081:43 | snd | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1081:49:1081:51 | snd | | main.rs:1075:15:1075:17 | Snd | +| main.rs:1107:10:1107:10 | t | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1107:10:1107:10 | t | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1107:10:1107:10 | t | Snd | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1107:10:1107:10 | t | Snd.Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1107:10:1107:10 | t | Snd.Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1108:13:1108:13 | x | | main.rs:1092:5:1093:14 | S3 | +| main.rs:1108:17:1108:17 | t | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1108:17:1108:17 | t | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1108:17:1108:17 | t | Snd | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1108:17:1108:17 | t | Snd.Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1108:17:1108:17 | t | Snd.Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1108:17:1108:29 | t.unwrapSnd() | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1108:17:1108:29 | t.unwrapSnd() | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1108:17:1108:29 | t.unwrapSnd() | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1108:17:1108:41 | ... .unwrapSnd() | | main.rs:1092:5:1093:14 | S3 | | main.rs:1109:18:1109:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1109:18:1109:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1109:18:1109:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1109:18:1109:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1109:26:1109:27 | x1 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1109:26:1109:27 | x1 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1111:17:1111:18 | x2 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1111:17:1111:18 | x2 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1111:22:1111:36 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1111:22:1111:36 | ...::new(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1112:9:1112:10 | x2 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1112:9:1112:10 | x2 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1112:16:1112:16 | S | | main.rs:1104:5:1105:13 | S | -| main.rs:1113:18:1113:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1113:18:1113:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1113:18:1113:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1113:18:1113:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1113:26:1113:27 | x2 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1113:26:1113:27 | x2 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1116:17:1116:18 | x3 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1116:22:1116:36 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1117:9:1117:10 | x3 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1117:21:1117:21 | S | | main.rs:1104:5:1105:13 | S | -| main.rs:1118:18:1118:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1118:18:1118:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1118:18:1118:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1118:18:1118:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1118:26:1118:27 | x3 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1120:17:1120:18 | x4 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1120:17:1120:18 | x4 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1120:22:1120:36 | ...::new(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1120:22:1120:36 | ...::new(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1121:23:1121:29 | &mut x4 | | file://:0:0:0:0 | & | -| main.rs:1121:23:1121:29 | &mut x4 | &T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1121:23:1121:29 | &mut x4 | &T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1121:28:1121:29 | x4 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1121:28:1121:29 | x4 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1121:32:1121:32 | S | | main.rs:1104:5:1105:13 | S | -| main.rs:1122:18:1122:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1122:18:1122:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1122:18:1122:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1122:18:1122:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1122:26:1122:27 | x4 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1122:26:1122:27 | x4 | T | main.rs:1104:5:1105:13 | S | -| main.rs:1124:13:1124:14 | x5 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1124:13:1124:14 | x5 | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1124:13:1124:14 | x5 | T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1124:18:1124:58 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1124:18:1124:58 | ...::MySome(...) | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1124:18:1124:58 | ...::MySome(...) | T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1124:35:1124:57 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1124:35:1124:57 | ...::MyNone(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1125:18:1125:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1125:18:1125:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1125:18:1125:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1125:18:1125:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1125:26:1125:27 | x5 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1125:26:1125:27 | x5 | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1125:26:1125:27 | x5 | T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1125:26:1125:37 | x5.flatten() | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1125:26:1125:37 | x5.flatten() | T | main.rs:1104:5:1105:13 | S | -| main.rs:1127:13:1127:14 | x6 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1127:13:1127:14 | x6 | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1127:13:1127:14 | x6 | T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1127:18:1127:58 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1127:18:1127:58 | ...::MySome(...) | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1127:18:1127:58 | ...::MySome(...) | T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1127:35:1127:57 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1127:35:1127:57 | ...::MyNone(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1128:18:1128:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1128:18:1128:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1128:18:1128:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1128:18:1128:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1128:26:1128:61 | ...::flatten(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1128:26:1128:61 | ...::flatten(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1128:59:1128:60 | x6 | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1128:59:1128:60 | x6 | T | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1128:59:1128:60 | x6 | T.T | main.rs:1104:5:1105:13 | S | -| main.rs:1131:13:1131:19 | from_if | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1131:13:1131:19 | from_if | T | main.rs:1104:5:1105:13 | S | -| main.rs:1131:23:1135:9 | if ... {...} else {...} | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1131:23:1135:9 | if ... {...} else {...} | T | main.rs:1104:5:1105:13 | S | -| main.rs:1131:26:1131:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1131:26:1131:30 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1131:30:1131:30 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1131:32:1133:9 | { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1131:32:1133:9 | { ... } | T | main.rs:1104:5:1105:13 | S | -| main.rs:1132:13:1132:30 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1132:13:1132:30 | ...::MyNone(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1133:16:1135:9 | { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1133:16:1135:9 | { ... } | T | main.rs:1104:5:1105:13 | S | -| main.rs:1134:13:1134:31 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1134:13:1134:31 | ...::MySome(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1134:30:1134:30 | S | | main.rs:1104:5:1105:13 | S | -| main.rs:1136:18:1136:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1136:18:1136:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1136:18:1136:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1136:18:1136:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1136:26:1136:32 | from_if | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1136:26:1136:32 | from_if | T | main.rs:1104:5:1105:13 | S | -| main.rs:1139:13:1139:22 | from_match | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1139:13:1139:22 | from_match | T | main.rs:1104:5:1105:13 | S | -| main.rs:1139:26:1142:9 | match ... { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1139:26:1142:9 | match ... { ... } | T | main.rs:1104:5:1105:13 | S | -| main.rs:1139:32:1139:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1139:32:1139:36 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1139:36:1139:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1140:13:1140:16 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1140:21:1140:38 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1140:21:1140:38 | ...::MyNone(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1141:13:1141:17 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1141:22:1141:40 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1141:22:1141:40 | ...::MySome(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1141:39:1141:39 | S | | main.rs:1104:5:1105:13 | S | -| main.rs:1143:18:1143:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1143:18:1143:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1143:18:1143:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1143:18:1143:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1143:26:1143:35 | from_match | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1143:26:1143:35 | from_match | T | main.rs:1104:5:1105:13 | S | -| main.rs:1146:13:1146:21 | from_loop | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1146:13:1146:21 | from_loop | T | main.rs:1104:5:1105:13 | S | -| main.rs:1146:25:1151:9 | loop { ... } | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1146:25:1151:9 | loop { ... } | T | main.rs:1104:5:1105:13 | S | -| main.rs:1147:16:1147:16 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1147:16:1147:20 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1147:20:1147:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1148:23:1148:40 | ...::MyNone(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1148:23:1148:40 | ...::MyNone(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1150:19:1150:37 | ...::MySome(...) | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1150:19:1150:37 | ...::MySome(...) | T | main.rs:1104:5:1105:13 | S | -| main.rs:1150:36:1150:36 | S | | main.rs:1104:5:1105:13 | S | +| main.rs:1109:18:1109:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1109:18:1109:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1109:26:1109:26 | x | | main.rs:1092:5:1093:14 | S3 | +| main.rs:1124:22:1124:25 | SelfParam | | main.rs:1122:5:1125:5 | Self [trait TraitWithAssocType] | +| main.rs:1132:22:1132:25 | SelfParam | | main.rs:1120:5:1120:28 | GenS | +| main.rs:1132:22:1132:25 | SelfParam | GenT | main.rs:1127:10:1127:15 | Output | +| main.rs:1132:44:1134:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1132:44:1134:9 | { ... } | E | main.rs:1127:10:1127:15 | Output | +| main.rs:1132:44:1134:9 | { ... } | T | main.rs:1127:10:1127:15 | Output | +| main.rs:1133:13:1133:22 | Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1133:13:1133:22 | Ok(...) | E | main.rs:1127:10:1127:15 | Output | +| main.rs:1133:13:1133:22 | Ok(...) | T | main.rs:1127:10:1127:15 | Output | +| main.rs:1133:16:1133:19 | self | | main.rs:1120:5:1120:28 | GenS | +| main.rs:1133:16:1133:19 | self | GenT | main.rs:1127:10:1127:15 | Output | +| main.rs:1133:16:1133:21 | self.0 | | main.rs:1127:10:1127:15 | Output | +| main.rs:1139:13:1139:14 | p1 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1139:13:1139:14 | p1 | Fst | main.rs:1086:5:1087:14 | S1 | +| main.rs:1139:13:1139:14 | p1 | Snd | main.rs:1089:5:1090:14 | S2 | +| main.rs:1139:26:1139:53 | ...::PairBoth(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1139:26:1139:53 | ...::PairBoth(...) | Fst | main.rs:1086:5:1087:14 | S1 | +| main.rs:1139:26:1139:53 | ...::PairBoth(...) | Snd | main.rs:1089:5:1090:14 | S2 | +| main.rs:1139:47:1139:48 | S1 | | main.rs:1086:5:1087:14 | S1 | +| main.rs:1139:51:1139:52 | S2 | | main.rs:1089:5:1090:14 | S2 | +| main.rs:1140:18:1140:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1140:18:1140:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1140:18:1140:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1140:18:1140:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1140:26:1140:27 | p1 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1140:26:1140:27 | p1 | Fst | main.rs:1086:5:1087:14 | S1 | +| main.rs:1140:26:1140:27 | p1 | Snd | main.rs:1089:5:1090:14 | S2 | +| main.rs:1143:13:1143:14 | p2 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1143:13:1143:14 | p2 | Fst | main.rs:1086:5:1087:14 | S1 | +| main.rs:1143:13:1143:14 | p2 | Snd | main.rs:1089:5:1090:14 | S2 | +| main.rs:1143:26:1143:47 | ...::PairNone(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1143:26:1143:47 | ...::PairNone(...) | Fst | main.rs:1086:5:1087:14 | S1 | +| main.rs:1143:26:1143:47 | ...::PairNone(...) | Snd | main.rs:1089:5:1090:14 | S2 | +| main.rs:1144:18:1144:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1144:18:1144:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1144:18:1144:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1144:18:1144:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1144:26:1144:27 | p2 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1144:26:1144:27 | p2 | Fst | main.rs:1086:5:1087:14 | S1 | +| main.rs:1144:26:1144:27 | p2 | Snd | main.rs:1089:5:1090:14 | S2 | +| main.rs:1147:13:1147:14 | p3 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1147:13:1147:14 | p3 | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1147:13:1147:14 | p3 | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1147:34:1147:56 | ...::PairSnd(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1147:34:1147:56 | ...::PairSnd(...) | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1147:34:1147:56 | ...::PairSnd(...) | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1147:54:1147:55 | S3 | | main.rs:1092:5:1093:14 | S3 | +| main.rs:1148:18:1148:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1148:18:1148:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1148:18:1148:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1148:18:1148:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1148:26:1148:27 | p3 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1148:26:1148:27 | p3 | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1148:26:1148:27 | p3 | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1151:13:1151:14 | p3 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1151:13:1151:14 | p3 | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1151:13:1151:14 | p3 | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1151:35:1151:56 | ...::PairNone(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1151:35:1151:56 | ...::PairNone(...) | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1151:35:1151:56 | ...::PairNone(...) | Snd | main.rs:1092:5:1093:14 | S3 | | main.rs:1152:18:1152:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1152:18:1152:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1152:18:1152:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1152:18:1152:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1152:26:1152:34 | from_loop | | main.rs:1069:5:1073:5 | MyOption | -| main.rs:1152:26:1152:34 | from_loop | T | main.rs:1104:5:1105:13 | S | -| main.rs:1170:15:1170:18 | SelfParam | | main.rs:1158:5:1159:19 | S | -| main.rs:1170:15:1170:18 | SelfParam | T | main.rs:1169:10:1169:10 | T | -| main.rs:1170:26:1172:9 | { ... } | | main.rs:1169:10:1169:10 | T | -| main.rs:1171:13:1171:16 | self | | main.rs:1158:5:1159:19 | S | -| main.rs:1171:13:1171:16 | self | T | main.rs:1169:10:1169:10 | T | -| main.rs:1171:13:1171:18 | self.0 | | main.rs:1169:10:1169:10 | T | -| main.rs:1174:15:1174:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1174:15:1174:19 | SelfParam | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1174:15:1174:19 | SelfParam | &T.T | main.rs:1169:10:1169:10 | T | -| main.rs:1174:28:1176:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1174:28:1176:9 | { ... } | &T | main.rs:1169:10:1169:10 | T | -| main.rs:1175:13:1175:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1175:13:1175:19 | &... | &T | main.rs:1169:10:1169:10 | T | -| main.rs:1175:14:1175:17 | self | | file://:0:0:0:0 | & | -| main.rs:1175:14:1175:17 | self | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1175:14:1175:17 | self | &T.T | main.rs:1169:10:1169:10 | T | -| main.rs:1175:14:1175:19 | self.0 | | main.rs:1169:10:1169:10 | T | -| main.rs:1178:15:1178:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1178:15:1178:25 | SelfParam | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1178:15:1178:25 | SelfParam | &T.T | main.rs:1169:10:1169:10 | T | -| main.rs:1178:34:1180:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1178:34:1180:9 | { ... } | &T | main.rs:1169:10:1169:10 | T | -| main.rs:1179:13:1179:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1179:13:1179:19 | &... | &T | main.rs:1169:10:1169:10 | T | -| main.rs:1179:14:1179:17 | self | | file://:0:0:0:0 | & | -| main.rs:1179:14:1179:17 | self | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1179:14:1179:17 | self | &T.T | main.rs:1169:10:1169:10 | T | -| main.rs:1179:14:1179:19 | self.0 | | main.rs:1169:10:1169:10 | T | -| main.rs:1184:29:1184:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1184:29:1184:33 | SelfParam | &T | main.rs:1183:5:1186:5 | Self [trait ATrait] | -| main.rs:1185:33:1185:36 | SelfParam | | main.rs:1183:5:1186:5 | Self [trait ATrait] | -| main.rs:1191:29:1191:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1191:29:1191:33 | SelfParam | &T | file://:0:0:0:0 | & | -| main.rs:1191:29:1191:33 | SelfParam | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1191:29:1191:33 | SelfParam | &T.&T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1191:43:1193:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:1192:13:1192:22 | (...) | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:13:1192:24 | ... .a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1192:14:1192:21 | * ... | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:15:1192:21 | (...) | | file://:0:0:0:0 | & | -| main.rs:1192:15:1192:21 | (...) | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:15:1192:21 | (...) | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:16:1192:20 | * ... | | file://:0:0:0:0 | & | -| main.rs:1192:16:1192:20 | * ... | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:16:1192:20 | * ... | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:17:1192:20 | self | | file://:0:0:0:0 | & | -| main.rs:1192:17:1192:20 | self | &T | file://:0:0:0:0 | & | -| main.rs:1192:17:1192:20 | self | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1192:17:1192:20 | self | &T.&T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1196:33:1196:36 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1196:33:1196:36 | SelfParam | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1196:46:1198:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:1197:13:1197:19 | (...) | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1197:13:1197:21 | ... .a | | {EXTERNAL LOCATION} | i64 | -| main.rs:1197:14:1197:18 | * ... | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1197:15:1197:18 | self | | file://:0:0:0:0 | & | -| main.rs:1197:15:1197:18 | self | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1202:13:1202:14 | x1 | | main.rs:1158:5:1159:19 | S | -| main.rs:1202:13:1202:14 | x1 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1202:18:1202:22 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1202:18:1202:22 | S(...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1202:20:1202:21 | S2 | | main.rs:1161:5:1162:14 | S2 | +| main.rs:1152:18:1152:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1152:18:1152:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1152:26:1152:27 | p3 | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1152:26:1152:27 | p3 | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1152:26:1152:27 | p3 | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1154:11:1154:54 | ...::PairSnd(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1154:11:1154:54 | ...::PairSnd(...) | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1154:11:1154:54 | ...::PairSnd(...) | Snd | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1154:11:1154:54 | ...::PairSnd(...) | Snd.Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1154:11:1154:54 | ...::PairSnd(...) | Snd.Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1154:31:1154:53 | ...::PairSnd(...) | | main.rs:1067:5:1073:5 | PairOption | +| main.rs:1154:31:1154:53 | ...::PairSnd(...) | Fst | main.rs:1089:5:1090:14 | S2 | +| main.rs:1154:31:1154:53 | ...::PairSnd(...) | Snd | main.rs:1092:5:1093:14 | S3 | +| main.rs:1154:51:1154:52 | S3 | | main.rs:1092:5:1093:14 | S3 | +| main.rs:1156:13:1156:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1156:13:1156:13 | x | E | main.rs:1086:5:1087:14 | S1 | +| main.rs:1156:13:1156:13 | x | T | main.rs:1112:5:1112:34 | S4 | +| main.rs:1156:13:1156:13 | x | T.T41 | main.rs:1089:5:1090:14 | S2 | +| main.rs:1156:13:1156:13 | x | T.T42 | main.rs:1114:5:1114:22 | S5 | +| main.rs:1156:13:1156:13 | x | T.T42.T5 | main.rs:1089:5:1090:14 | S2 | +| main.rs:1158:13:1158:13 | y | | {EXTERNAL LOCATION} | Result | +| main.rs:1158:13:1158:13 | y | E | {EXTERNAL LOCATION} | bool | +| main.rs:1158:13:1158:13 | y | T | {EXTERNAL LOCATION} | bool | +| main.rs:1158:17:1158:26 | GenS(...) | | main.rs:1120:5:1120:28 | GenS | +| main.rs:1158:17:1158:26 | GenS(...) | GenT | {EXTERNAL LOCATION} | bool | +| main.rs:1158:17:1158:38 | ... .get_input() | | {EXTERNAL LOCATION} | Result | +| main.rs:1158:17:1158:38 | ... .get_input() | E | {EXTERNAL LOCATION} | bool | +| main.rs:1158:17:1158:38 | ... .get_input() | T | {EXTERNAL LOCATION} | bool | +| main.rs:1158:22:1158:25 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1171:16:1171:24 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1171:16:1171:24 | SelfParam | &T | main.rs:1169:5:1176:5 | Self [trait MyTrait] | +| main.rs:1171:27:1171:31 | value | | main.rs:1169:19:1169:19 | S | +| main.rs:1173:21:1173:29 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1173:21:1173:29 | SelfParam | &T | main.rs:1169:5:1176:5 | Self [trait MyTrait] | +| main.rs:1173:32:1173:36 | value | | main.rs:1169:19:1169:19 | S | +| main.rs:1174:13:1174:16 | self | | file://:0:0:0:0 | & | +| main.rs:1174:13:1174:16 | self | &T | main.rs:1169:5:1176:5 | Self [trait MyTrait] | +| main.rs:1174:22:1174:26 | value | | main.rs:1169:19:1169:19 | S | +| main.rs:1180:16:1180:24 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1180:16:1180:24 | SelfParam | &T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1180:16:1180:24 | SelfParam | &T.T | main.rs:1178:10:1178:10 | T | +| main.rs:1180:27:1180:31 | value | | main.rs:1178:10:1178:10 | T | +| main.rs:1184:26:1186:9 | { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1184:26:1186:9 | { ... } | T | main.rs:1183:10:1183:10 | T | +| main.rs:1185:13:1185:30 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1185:13:1185:30 | ...::MyNone(...) | T | main.rs:1183:10:1183:10 | T | +| main.rs:1190:20:1190:23 | SelfParam | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1190:20:1190:23 | SelfParam | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1190:20:1190:23 | SelfParam | T.T | main.rs:1189:10:1189:10 | T | +| main.rs:1190:41:1195:9 | { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1190:41:1195:9 | { ... } | T | main.rs:1189:10:1189:10 | T | +| main.rs:1191:13:1194:13 | match self { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1191:13:1194:13 | match self { ... } | T | main.rs:1189:10:1189:10 | T | +| main.rs:1191:19:1191:22 | self | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1191:19:1191:22 | self | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1191:19:1191:22 | self | T.T | main.rs:1189:10:1189:10 | T | +| main.rs:1192:17:1192:34 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1192:17:1192:34 | ...::MyNone(...) | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1192:17:1192:34 | ...::MyNone(...) | T.T | main.rs:1189:10:1189:10 | T | +| main.rs:1192:39:1192:56 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1192:39:1192:56 | ...::MyNone(...) | T | main.rs:1189:10:1189:10 | T | +| main.rs:1193:17:1193:35 | ...::MySome(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1193:17:1193:35 | ...::MySome(...) | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1193:17:1193:35 | ...::MySome(...) | T.T | main.rs:1189:10:1189:10 | T | +| main.rs:1193:34:1193:34 | x | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1193:34:1193:34 | x | T | main.rs:1189:10:1189:10 | T | +| main.rs:1193:40:1193:40 | x | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1193:40:1193:40 | x | T | main.rs:1189:10:1189:10 | T | +| main.rs:1202:13:1202:14 | x1 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1202:13:1202:14 | x1 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1202:18:1202:37 | ...::new(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1202:18:1202:37 | ...::new(...) | T | main.rs:1198:5:1199:13 | S | | main.rs:1203:18:1203:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1203:18:1203:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1203:18:1203:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1203:18:1203:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1203:26:1203:27 | x1 | | main.rs:1158:5:1159:19 | S | -| main.rs:1203:26:1203:27 | x1 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1203:26:1203:32 | x1.m1() | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1205:13:1205:14 | x2 | | main.rs:1158:5:1159:19 | S | -| main.rs:1205:13:1205:14 | x2 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1205:18:1205:22 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1205:18:1205:22 | S(...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1205:20:1205:21 | S2 | | main.rs:1161:5:1162:14 | S2 | +| main.rs:1203:18:1203:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1203:18:1203:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1203:26:1203:27 | x1 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1203:26:1203:27 | x1 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1205:17:1205:18 | x2 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1205:17:1205:18 | x2 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1205:22:1205:36 | ...::new(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1205:22:1205:36 | ...::new(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1206:9:1206:10 | x2 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1206:9:1206:10 | x2 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1206:16:1206:16 | S | | main.rs:1198:5:1199:13 | S | | main.rs:1207:18:1207:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1207:18:1207:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1207:18:1207:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1207:18:1207:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1207:26:1207:27 | x2 | | main.rs:1158:5:1159:19 | S | -| main.rs:1207:26:1207:27 | x2 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1207:26:1207:32 | x2.m2() | | file://:0:0:0:0 | & | -| main.rs:1207:26:1207:32 | x2.m2() | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1208:18:1208:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1208:18:1208:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1208:18:1208:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1208:18:1208:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1208:26:1208:27 | x2 | | main.rs:1158:5:1159:19 | S | -| main.rs:1208:26:1208:27 | x2 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1208:26:1208:32 | x2.m3() | | file://:0:0:0:0 | & | -| main.rs:1208:26:1208:32 | x2.m3() | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1210:13:1210:14 | x3 | | main.rs:1158:5:1159:19 | S | -| main.rs:1210:13:1210:14 | x3 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1210:18:1210:22 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1210:18:1210:22 | S(...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1210:20:1210:21 | S2 | | main.rs:1161:5:1162:14 | S2 | +| main.rs:1207:18:1207:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1207:18:1207:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1207:26:1207:27 | x2 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1207:26:1207:27 | x2 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1210:17:1210:18 | x3 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1210:22:1210:36 | ...::new(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1211:9:1211:10 | x3 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1211:21:1211:21 | S | | main.rs:1198:5:1199:13 | S | | main.rs:1212:18:1212:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1212:18:1212:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1212:18:1212:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1212:18:1212:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1212:26:1212:41 | ...::m2(...) | | file://:0:0:0:0 | & | -| main.rs:1212:26:1212:41 | ...::m2(...) | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1212:38:1212:40 | &x3 | | file://:0:0:0:0 | & | -| main.rs:1212:38:1212:40 | &x3 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1212:38:1212:40 | &x3 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1212:39:1212:40 | x3 | | main.rs:1158:5:1159:19 | S | -| main.rs:1212:39:1212:40 | x3 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1213:18:1213:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1213:18:1213:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1213:18:1213:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1213:18:1213:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1213:26:1213:41 | ...::m3(...) | | file://:0:0:0:0 | & | -| main.rs:1213:26:1213:41 | ...::m3(...) | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1213:38:1213:40 | &x3 | | file://:0:0:0:0 | & | -| main.rs:1213:38:1213:40 | &x3 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1213:38:1213:40 | &x3 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1213:39:1213:40 | x3 | | main.rs:1158:5:1159:19 | S | -| main.rs:1213:39:1213:40 | x3 | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1215:13:1215:14 | x4 | | file://:0:0:0:0 | & | -| main.rs:1215:13:1215:14 | x4 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1215:13:1215:14 | x4 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1215:18:1215:23 | &... | | file://:0:0:0:0 | & | -| main.rs:1215:18:1215:23 | &... | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1215:18:1215:23 | &... | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1215:19:1215:23 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1215:19:1215:23 | S(...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1215:21:1215:22 | S2 | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1217:18:1217:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1217:18:1217:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1217:18:1217:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1217:18:1217:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1217:26:1217:27 | x4 | | file://:0:0:0:0 | & | -| main.rs:1217:26:1217:27 | x4 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1217:26:1217:27 | x4 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1217:26:1217:32 | x4.m2() | | file://:0:0:0:0 | & | -| main.rs:1217:26:1217:32 | x4.m2() | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1218:18:1218:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1218:18:1218:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1218:18:1218:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1218:18:1218:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1218:26:1218:27 | x4 | | file://:0:0:0:0 | & | -| main.rs:1218:26:1218:27 | x4 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1218:26:1218:27 | x4 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1218:26:1218:32 | x4.m3() | | file://:0:0:0:0 | & | -| main.rs:1218:26:1218:32 | x4.m3() | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1220:13:1220:14 | x5 | | file://:0:0:0:0 | & | -| main.rs:1220:13:1220:14 | x5 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1220:13:1220:14 | x5 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1220:18:1220:23 | &... | | file://:0:0:0:0 | & | -| main.rs:1220:18:1220:23 | &... | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1220:18:1220:23 | &... | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1220:19:1220:23 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1220:19:1220:23 | S(...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1220:21:1220:22 | S2 | | main.rs:1161:5:1162:14 | S2 | +| main.rs:1212:18:1212:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1212:18:1212:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1212:26:1212:27 | x3 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1214:17:1214:18 | x4 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1214:17:1214:18 | x4 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1214:22:1214:36 | ...::new(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1214:22:1214:36 | ...::new(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1215:23:1215:29 | &mut x4 | | file://:0:0:0:0 | & | +| main.rs:1215:23:1215:29 | &mut x4 | &T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1215:23:1215:29 | &mut x4 | &T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1215:28:1215:29 | x4 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1215:28:1215:29 | x4 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1215:32:1215:32 | S | | main.rs:1198:5:1199:13 | S | +| main.rs:1216:18:1216:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1216:18:1216:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1216:18:1216:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1216:18:1216:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1216:26:1216:27 | x4 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1216:26:1216:27 | x4 | T | main.rs:1198:5:1199:13 | S | +| main.rs:1218:13:1218:14 | x5 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1218:13:1218:14 | x5 | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1218:13:1218:14 | x5 | T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1218:18:1218:58 | ...::MySome(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1218:18:1218:58 | ...::MySome(...) | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1218:18:1218:58 | ...::MySome(...) | T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1218:35:1218:57 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1218:35:1218:57 | ...::MyNone(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1219:18:1219:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1219:18:1219:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1219:18:1219:37 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1219:18:1219:37 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1219:26:1219:27 | x5 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1219:26:1219:27 | x5 | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1219:26:1219:27 | x5 | T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1219:26:1219:37 | x5.flatten() | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1219:26:1219:37 | x5.flatten() | T | main.rs:1198:5:1199:13 | S | +| main.rs:1221:13:1221:14 | x6 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1221:13:1221:14 | x6 | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1221:13:1221:14 | x6 | T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1221:18:1221:58 | ...::MySome(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1221:18:1221:58 | ...::MySome(...) | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1221:18:1221:58 | ...::MySome(...) | T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1221:35:1221:57 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1221:35:1221:57 | ...::MyNone(...) | T | main.rs:1198:5:1199:13 | S | | main.rs:1222:18:1222:23 | "{:?}\\n" | | file://:0:0:0:0 | & | | main.rs:1222:18:1222:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1222:18:1222:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1222:18:1222:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1222:26:1222:27 | x5 | | file://:0:0:0:0 | & | -| main.rs:1222:26:1222:27 | x5 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1222:26:1222:27 | x5 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1222:26:1222:32 | x5.m1() | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1223:18:1223:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1223:18:1223:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1223:18:1223:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1223:18:1223:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1223:26:1223:27 | x5 | | file://:0:0:0:0 | & | -| main.rs:1223:26:1223:27 | x5 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1223:26:1223:27 | x5 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1223:26:1223:29 | x5.0 | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1225:13:1225:14 | x6 | | file://:0:0:0:0 | & | -| main.rs:1225:13:1225:14 | x6 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1225:13:1225:14 | x6 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1225:18:1225:23 | &... | | file://:0:0:0:0 | & | -| main.rs:1225:18:1225:23 | &... | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1225:18:1225:23 | &... | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1225:19:1225:23 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1225:19:1225:23 | S(...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1225:21:1225:22 | S2 | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1228:18:1228:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1228:18:1228:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1228:18:1228:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1228:18:1228:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1228:26:1228:30 | (...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1228:26:1228:30 | (...) | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1228:26:1228:35 | ... .m1() | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1228:27:1228:29 | * ... | | main.rs:1158:5:1159:19 | S | -| main.rs:1228:27:1228:29 | * ... | T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1228:28:1228:29 | x6 | | file://:0:0:0:0 | & | -| main.rs:1228:28:1228:29 | x6 | &T | main.rs:1158:5:1159:19 | S | -| main.rs:1228:28:1228:29 | x6 | &T.T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1230:13:1230:14 | x7 | | main.rs:1158:5:1159:19 | S | -| main.rs:1230:13:1230:14 | x7 | T | file://:0:0:0:0 | & | -| main.rs:1230:13:1230:14 | x7 | T.&T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1230:18:1230:23 | S(...) | | main.rs:1158:5:1159:19 | S | -| main.rs:1230:18:1230:23 | S(...) | T | file://:0:0:0:0 | & | -| main.rs:1230:18:1230:23 | S(...) | T.&T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1230:20:1230:22 | &S2 | | file://:0:0:0:0 | & | -| main.rs:1230:20:1230:22 | &S2 | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1230:21:1230:22 | S2 | | main.rs:1161:5:1162:14 | S2 | -| main.rs:1233:13:1233:13 | t | | file://:0:0:0:0 | & | -| main.rs:1233:13:1233:13 | t | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1233:17:1233:18 | x7 | | main.rs:1158:5:1159:19 | S | -| main.rs:1233:17:1233:18 | x7 | T | file://:0:0:0:0 | & | -| main.rs:1233:17:1233:18 | x7 | T.&T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1233:17:1233:23 | x7.m1() | | file://:0:0:0:0 | & | -| main.rs:1233:17:1233:23 | x7.m1() | &T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1234:18:1234:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1234:18:1234:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1234:18:1234:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1234:18:1234:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1234:26:1234:27 | x7 | | main.rs:1158:5:1159:19 | S | -| main.rs:1234:26:1234:27 | x7 | T | file://:0:0:0:0 | & | -| main.rs:1234:26:1234:27 | x7 | T.&T | main.rs:1161:5:1162:14 | S2 | -| main.rs:1236:13:1236:14 | x9 | | {EXTERNAL LOCATION} | String | -| main.rs:1236:26:1236:32 | "Hello" | | file://:0:0:0:0 | & | -| main.rs:1236:26:1236:32 | "Hello" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1236:26:1236:44 | "Hello".to_string() | | {EXTERNAL LOCATION} | String | -| main.rs:1240:13:1240:13 | u | | {EXTERNAL LOCATION} | Result | -| main.rs:1240:13:1240:13 | u | T | {EXTERNAL LOCATION} | u32 | -| main.rs:1240:17:1240:18 | x9 | | {EXTERNAL LOCATION} | String | -| main.rs:1240:17:1240:33 | x9.parse() | | {EXTERNAL LOCATION} | Result | -| main.rs:1240:17:1240:33 | x9.parse() | T | {EXTERNAL LOCATION} | u32 | -| main.rs:1242:13:1242:20 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1242:13:1242:20 | my_thing | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1242:24:1242:39 | &... | | file://:0:0:0:0 | & | -| main.rs:1242:24:1242:39 | &... | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1242:25:1242:39 | MyInt {...} | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1242:36:1242:37 | 37 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1242:36:1242:37 | 37 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1244:17:1244:24 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1244:17:1244:24 | my_thing | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1245:18:1245:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1245:18:1245:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1245:18:1245:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1245:18:1245:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1248:13:1248:20 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1248:13:1248:20 | my_thing | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1248:24:1248:39 | &... | | file://:0:0:0:0 | & | -| main.rs:1248:24:1248:39 | &... | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1248:25:1248:39 | MyInt {...} | | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1248:36:1248:37 | 38 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1248:36:1248:37 | 38 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1249:17:1249:24 | my_thing | | file://:0:0:0:0 | & | -| main.rs:1249:17:1249:24 | my_thing | &T | main.rs:1164:5:1167:5 | MyInt | -| main.rs:1250:18:1250:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1250:18:1250:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1250:18:1250:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1250:18:1250:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1257:16:1257:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1257:16:1257:20 | SelfParam | &T | main.rs:1255:5:1263:5 | Self [trait MyTrait] | -| main.rs:1260:16:1260:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1260:16:1260:20 | SelfParam | &T | main.rs:1255:5:1263:5 | Self [trait MyTrait] | -| main.rs:1260:32:1262:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1260:32:1262:9 | { ... } | &T | main.rs:1255:5:1263:5 | Self [trait MyTrait] | -| main.rs:1261:13:1261:16 | self | | file://:0:0:0:0 | & | -| main.rs:1261:13:1261:16 | self | &T | main.rs:1255:5:1263:5 | Self [trait MyTrait] | -| main.rs:1261:13:1261:22 | self.foo() | | file://:0:0:0:0 | & | -| main.rs:1261:13:1261:22 | self.foo() | &T | main.rs:1255:5:1263:5 | Self [trait MyTrait] | -| main.rs:1269:16:1269:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1269:16:1269:20 | SelfParam | &T | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1269:36:1271:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1269:36:1271:9 | { ... } | &T | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1270:13:1270:16 | self | | file://:0:0:0:0 | & | -| main.rs:1270:13:1270:16 | self | &T | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1275:13:1275:13 | x | | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1275:17:1275:24 | MyStruct | | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1276:9:1276:9 | x | | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1276:9:1276:15 | x.bar() | | file://:0:0:0:0 | & | -| main.rs:1276:9:1276:15 | x.bar() | &T | main.rs:1265:5:1265:20 | MyStruct | -| main.rs:1286:16:1286:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1286:16:1286:20 | SelfParam | &T | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1286:16:1286:20 | SelfParam | &T.T | main.rs:1285:10:1285:10 | T | -| main.rs:1286:32:1288:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1286:32:1288:9 | { ... } | &T | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1286:32:1288:9 | { ... } | &T.T | main.rs:1285:10:1285:10 | T | -| main.rs:1287:13:1287:16 | self | | file://:0:0:0:0 | & | -| main.rs:1287:13:1287:16 | self | &T | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1287:13:1287:16 | self | &T.T | main.rs:1285:10:1285:10 | T | -| main.rs:1292:13:1292:13 | x | | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1292:13:1292:13 | x | T | main.rs:1281:5:1281:13 | S | -| main.rs:1292:17:1292:27 | MyStruct(...) | | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1292:17:1292:27 | MyStruct(...) | T | main.rs:1281:5:1281:13 | S | -| main.rs:1292:26:1292:26 | S | | main.rs:1281:5:1281:13 | S | -| main.rs:1293:9:1293:9 | x | | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1293:9:1293:9 | x | T | main.rs:1281:5:1281:13 | S | -| main.rs:1293:9:1293:15 | x.foo() | | file://:0:0:0:0 | & | -| main.rs:1293:9:1293:15 | x.foo() | &T | main.rs:1283:5:1283:26 | MyStruct | -| main.rs:1293:9:1293:15 | x.foo() | &T.T | main.rs:1281:5:1281:13 | S | -| main.rs:1304:17:1304:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1304:17:1304:25 | SelfParam | &T | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1305:13:1305:16 | self | | file://:0:0:0:0 | & | -| main.rs:1305:13:1305:16 | self | &T | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1305:13:1305:21 | self.bool | | {EXTERNAL LOCATION} | bool | -| main.rs:1305:13:1305:34 | ... = ... | | file://:0:0:0:0 | () | -| main.rs:1305:25:1305:34 | ! ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1305:26:1305:29 | self | | file://:0:0:0:0 | & | -| main.rs:1305:26:1305:29 | self | &T | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1305:26:1305:34 | self.bool | | {EXTERNAL LOCATION} | bool | -| main.rs:1312:15:1312:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1312:15:1312:19 | SelfParam | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1312:31:1314:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1312:31:1314:9 | { ... } | &T | file://:0:0:0:0 | & | -| main.rs:1312:31:1314:9 | { ... } | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1312:31:1314:9 | { ... } | &T.&T | file://:0:0:0:0 | & | -| main.rs:1312:31:1314:9 | { ... } | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1312:31:1314:9 | { ... } | &T.&T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1313:13:1313:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1313:13:1313:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1313:13:1313:19 | &... | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1313:13:1313:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1313:13:1313:19 | &... | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1313:13:1313:19 | &... | &T.&T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1313:14:1313:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1313:14:1313:19 | &... | | main.rs:1309:5:1309:13 | S | -| main.rs:1313:14:1313:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1313:14:1313:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1313:14:1313:19 | &... | &T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1313:15:1313:19 | &self | | file://:0:0:0:0 | & | -| main.rs:1313:15:1313:19 | &self | &T | file://:0:0:0:0 | & | -| main.rs:1313:15:1313:19 | &self | &T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1313:16:1313:19 | self | | file://:0:0:0:0 | & | -| main.rs:1313:16:1313:19 | self | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1316:15:1316:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1316:15:1316:25 | SelfParam | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1316:37:1318:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1316:37:1318:9 | { ... } | &T | file://:0:0:0:0 | & | -| main.rs:1316:37:1318:9 | { ... } | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1316:37:1318:9 | { ... } | &T.&T | file://:0:0:0:0 | & | -| main.rs:1316:37:1318:9 | { ... } | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1316:37:1318:9 | { ... } | &T.&T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1317:13:1317:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1317:13:1317:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1317:13:1317:19 | &... | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1317:13:1317:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1317:13:1317:19 | &... | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1317:13:1317:19 | &... | &T.&T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1317:14:1317:19 | &... | | file://:0:0:0:0 | & | -| main.rs:1317:14:1317:19 | &... | | main.rs:1309:5:1309:13 | S | -| main.rs:1317:14:1317:19 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1317:14:1317:19 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1317:14:1317:19 | &... | &T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1317:15:1317:19 | &self | | file://:0:0:0:0 | & | -| main.rs:1317:15:1317:19 | &self | &T | file://:0:0:0:0 | & | -| main.rs:1317:15:1317:19 | &self | &T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1317:16:1317:19 | self | | file://:0:0:0:0 | & | -| main.rs:1317:16:1317:19 | self | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1320:15:1320:15 | x | | file://:0:0:0:0 | & | -| main.rs:1320:15:1320:15 | x | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1320:34:1322:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1320:34:1322:9 | { ... } | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1321:13:1321:13 | x | | file://:0:0:0:0 | & | -| main.rs:1321:13:1321:13 | x | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1324:15:1324:15 | x | | file://:0:0:0:0 | & | -| main.rs:1324:15:1324:15 | x | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1324:34:1326:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1324:34:1326:9 | { ... } | &T | file://:0:0:0:0 | & | -| main.rs:1324:34:1326:9 | { ... } | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1324:34:1326:9 | { ... } | &T.&T | file://:0:0:0:0 | & | -| main.rs:1324:34:1326:9 | { ... } | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1324:34:1326:9 | { ... } | &T.&T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1325:13:1325:16 | &... | | file://:0:0:0:0 | & | -| main.rs:1325:13:1325:16 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1325:13:1325:16 | &... | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1325:13:1325:16 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1325:13:1325:16 | &... | &T.&T.&T | file://:0:0:0:0 | & | -| main.rs:1325:13:1325:16 | &... | &T.&T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1325:14:1325:16 | &... | | file://:0:0:0:0 | & | -| main.rs:1325:14:1325:16 | &... | | main.rs:1309:5:1309:13 | S | -| main.rs:1325:14:1325:16 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1325:14:1325:16 | &... | &T.&T | file://:0:0:0:0 | & | -| main.rs:1325:14:1325:16 | &... | &T.&T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1325:15:1325:16 | &x | | file://:0:0:0:0 | & | -| main.rs:1325:15:1325:16 | &x | &T | file://:0:0:0:0 | & | -| main.rs:1325:15:1325:16 | &x | &T.&T | main.rs:1309:5:1309:13 | S | -| main.rs:1325:16:1325:16 | x | | file://:0:0:0:0 | & | -| main.rs:1325:16:1325:16 | x | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1330:13:1330:13 | x | | main.rs:1309:5:1309:13 | S | -| main.rs:1330:17:1330:20 | S {...} | | main.rs:1309:5:1309:13 | S | -| main.rs:1331:9:1331:9 | x | | main.rs:1309:5:1309:13 | S | -| main.rs:1331:9:1331:14 | x.f1() | | file://:0:0:0:0 | & | -| main.rs:1331:9:1331:14 | x.f1() | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1332:9:1332:9 | x | | main.rs:1309:5:1309:13 | S | -| main.rs:1332:9:1332:14 | x.f2() | | file://:0:0:0:0 | & | -| main.rs:1332:9:1332:14 | x.f2() | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1333:9:1333:17 | ...::f3(...) | | file://:0:0:0:0 | & | -| main.rs:1333:9:1333:17 | ...::f3(...) | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1333:15:1333:16 | &x | | file://:0:0:0:0 | & | -| main.rs:1333:15:1333:16 | &x | &T | main.rs:1309:5:1309:13 | S | -| main.rs:1333:16:1333:16 | x | | main.rs:1309:5:1309:13 | S | -| main.rs:1335:13:1335:13 | n | | {EXTERNAL LOCATION} | bool | -| main.rs:1335:17:1335:24 | * ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1335:18:1335:24 | * ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1335:18:1335:24 | * ... | | file://:0:0:0:0 | & | -| main.rs:1335:18:1335:24 | * ... | &T | {EXTERNAL LOCATION} | bool | -| main.rs:1335:19:1335:24 | &... | | file://:0:0:0:0 | & | -| main.rs:1335:19:1335:24 | &... | &T | {EXTERNAL LOCATION} | bool | -| main.rs:1335:19:1335:24 | &... | &T | file://:0:0:0:0 | & | -| main.rs:1335:19:1335:24 | &... | &T.&T | {EXTERNAL LOCATION} | bool | -| main.rs:1335:20:1335:24 | &true | | {EXTERNAL LOCATION} | bool | -| main.rs:1335:20:1335:24 | &true | | file://:0:0:0:0 | & | -| main.rs:1335:20:1335:24 | &true | &T | {EXTERNAL LOCATION} | bool | -| main.rs:1335:21:1335:24 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1339:17:1339:20 | flag | | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1339:24:1339:41 | ...::default(...) | | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1340:22:1340:30 | &mut flag | | file://:0:0:0:0 | & | -| main.rs:1340:22:1340:30 | &mut flag | &T | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1340:27:1340:30 | flag | | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1341:18:1341:23 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1341:18:1341:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1341:18:1341:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1341:18:1341:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1341:26:1341:29 | flag | | main.rs:1298:5:1301:5 | MyFlag | -| main.rs:1356:43:1359:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1356:43:1359:5 | { ... } | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1356:43:1359:5 | { ... } | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1357:13:1357:13 | x | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1357:17:1357:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1357:17:1357:30 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1357:17:1357:31 | TryExpr | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1357:28:1357:29 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1358:9:1358:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1358:9:1358:22 | ...::Ok(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1358:9:1358:22 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1358:20:1358:21 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1363:46:1367:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1363:46:1367:5 | { ... } | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1363:46:1367:5 | { ... } | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1364:13:1364:13 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1364:13:1364:13 | x | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1364:17:1364:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1364:17:1364:30 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1364:28:1364:29 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1365:13:1365:13 | y | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1365:17:1365:17 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1365:17:1365:17 | x | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1365:17:1365:18 | TryExpr | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1366:9:1366:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1366:9:1366:22 | ...::Ok(...) | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1366:9:1366:22 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1366:20:1366:21 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1371:40:1376:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1371:40:1376:5 | { ... } | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1371:40:1376:5 | { ... } | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1372:13:1372:13 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1372:13:1372:13 | x | T | {EXTERNAL LOCATION} | Result | -| main.rs:1372:13:1372:13 | x | T.T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1372:17:1372:42 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1372:17:1372:42 | ...::Ok(...) | T | {EXTERNAL LOCATION} | Result | -| main.rs:1372:17:1372:42 | ...::Ok(...) | T.T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1372:28:1372:41 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1372:28:1372:41 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1372:39:1372:40 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1374:17:1374:17 | x | | {EXTERNAL LOCATION} | Result | -| main.rs:1374:17:1374:17 | x | T | {EXTERNAL LOCATION} | Result | -| main.rs:1374:17:1374:17 | x | T.T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1374:17:1374:18 | TryExpr | | {EXTERNAL LOCATION} | Result | -| main.rs:1374:17:1374:18 | TryExpr | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1374:17:1374:29 | ... .map(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1375:9:1375:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1375:9:1375:22 | ...::Ok(...) | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1375:9:1375:22 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1375:20:1375:21 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1380:30:1380:34 | input | | {EXTERNAL LOCATION} | Result | -| main.rs:1380:30:1380:34 | input | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1380:30:1380:34 | input | T | main.rs:1380:20:1380:27 | T | -| main.rs:1380:69:1387:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1380:69:1387:5 | { ... } | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1380:69:1387:5 | { ... } | T | main.rs:1380:20:1380:27 | T | -| main.rs:1381:13:1381:17 | value | | main.rs:1380:20:1380:27 | T | -| main.rs:1381:21:1381:25 | input | | {EXTERNAL LOCATION} | Result | -| main.rs:1381:21:1381:25 | input | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1381:21:1381:25 | input | T | main.rs:1380:20:1380:27 | T | -| main.rs:1381:21:1381:26 | TryExpr | | main.rs:1380:20:1380:27 | T | -| main.rs:1382:22:1382:38 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1382:22:1382:38 | ...::Ok(...) | T | main.rs:1380:20:1380:27 | T | -| main.rs:1382:22:1385:10 | ... .and_then(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1382:33:1382:37 | value | | main.rs:1380:20:1380:27 | T | -| main.rs:1382:53:1385:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1382:53:1385:9 | { ... } | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1383:22:1383:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1383:22:1383:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1383:22:1383:30 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1383:22:1383:30 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1384:13:1384:34 | ...::Ok::<...>(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1384:13:1384:34 | ...::Ok::<...>(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1386:9:1386:23 | ...::Err(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1386:9:1386:23 | ...::Err(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1386:9:1386:23 | ...::Err(...) | T | main.rs:1380:20:1380:27 | T | -| main.rs:1386:21:1386:22 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1391:16:1391:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1391:16:1391:33 | ...::Ok(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1391:16:1391:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1391:27:1391:32 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1391:37:1391:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1391:37:1391:52 | try_same_error(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1391:37:1391:52 | try_same_error(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1392:22:1392:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1392:22:1392:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1392:22:1392:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1392:22:1392:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1392:30:1392:35 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1395:16:1395:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1395:16:1395:33 | ...::Ok(...) | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1395:16:1395:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1395:27:1395:32 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1395:37:1395:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1395:37:1395:55 | try_convert_error(...) | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1395:37:1395:55 | try_convert_error(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1396:22:1396:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1396:22:1396:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1396:22:1396:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1396:22:1396:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1396:30:1396:35 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1399:16:1399:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1399:16:1399:33 | ...::Ok(...) | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1399:16:1399:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1399:27:1399:32 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1399:37:1399:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1399:37:1399:49 | try_chained(...) | E | main.rs:1351:5:1352:14 | S2 | -| main.rs:1399:37:1399:49 | try_chained(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1400:22:1400:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1400:22:1400:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1400:22:1400:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1400:22:1400:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1400:30:1400:35 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:16:1403:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1403:16:1403:33 | ...::Ok(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:16:1403:33 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:27:1403:32 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:37:1403:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1403:37:1403:63 | try_complex(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:37:1403:63 | try_complex(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:49:1403:62 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1403:49:1403:62 | ...::Ok(...) | E | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:49:1403:62 | ...::Ok(...) | T | main.rs:1348:5:1349:14 | S1 | -| main.rs:1403:60:1403:61 | S1 | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1404:22:1404:27 | "{:?}\\n" | | file://:0:0:0:0 | & | -| main.rs:1404:22:1404:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1404:22:1404:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1404:22:1404:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1404:30:1404:35 | result | | main.rs:1348:5:1349:14 | S1 | -| main.rs:1411:13:1411:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1411:22:1411:22 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1412:13:1412:13 | y | | {EXTERNAL LOCATION} | i32 | -| main.rs:1412:17:1412:17 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1413:13:1413:13 | z | | {EXTERNAL LOCATION} | i32 | -| main.rs:1413:17:1413:17 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1413:17:1413:21 | ... + ... | | {EXTERNAL LOCATION} | i32 | -| main.rs:1413:21:1413:21 | y | | {EXTERNAL LOCATION} | i32 | -| main.rs:1414:13:1414:13 | z | | {EXTERNAL LOCATION} | i32 | -| main.rs:1414:17:1414:17 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1414:17:1414:23 | x.abs() | | {EXTERNAL LOCATION} | i32 | -| main.rs:1415:13:1415:13 | c | | {EXTERNAL LOCATION} | char | -| main.rs:1415:17:1415:19 | 'c' | | {EXTERNAL LOCATION} | char | -| main.rs:1416:13:1416:17 | hello | | file://:0:0:0:0 | & | -| main.rs:1416:13:1416:17 | hello | &T | {EXTERNAL LOCATION} | str | -| main.rs:1416:21:1416:27 | "Hello" | | file://:0:0:0:0 | & | -| main.rs:1416:21:1416:27 | "Hello" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1417:13:1417:13 | f | | {EXTERNAL LOCATION} | f64 | -| main.rs:1417:17:1417:24 | 123.0f64 | | {EXTERNAL LOCATION} | f64 | -| main.rs:1418:13:1418:13 | t | | {EXTERNAL LOCATION} | bool | -| main.rs:1418:17:1418:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1419:13:1419:13 | f | | {EXTERNAL LOCATION} | bool | -| main.rs:1419:17:1419:21 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1426:13:1426:13 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:1426:17:1426:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1426:17:1426:29 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1426:25:1426:29 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1427:13:1427:13 | y | | {EXTERNAL LOCATION} | bool | -| main.rs:1427:17:1427:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1427:17:1427:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1427:25:1427:29 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:1429:17:1429:17 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1430:13:1430:16 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:1430:20:1430:21 | 34 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1430:20:1430:27 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1430:26:1430:27 | 33 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1431:12:1431:15 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:1432:17:1432:17 | z | | file://:0:0:0:0 | () | -| main.rs:1432:21:1432:27 | (...) | | file://:0:0:0:0 | () | -| main.rs:1432:22:1432:22 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1432:22:1432:26 | ... = ... | | file://:0:0:0:0 | () | -| main.rs:1432:26:1432:26 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1434:13:1434:13 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1434:13:1434:17 | ... = ... | | file://:0:0:0:0 | () | -| main.rs:1434:17:1434:17 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1436:9:1436:9 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:1450:30:1452:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1451:13:1451:31 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1451:23:1451:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1451:23:1451:23 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1451:29:1451:29 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1451:29:1451:29 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1458:16:1458:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1458:22:1458:24 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1458:41:1463:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1459:13:1462:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1460:20:1460:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1460:20:1460:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1460:20:1460:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1460:29:1460:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1460:29:1460:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1461:20:1461:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1461:20:1461:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1461:20:1461:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1461:29:1461:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1461:29:1461:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1468:23:1468:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1468:23:1468:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1468:34:1468:36 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1469:13:1469:16 | self | | file://:0:0:0:0 | & | -| main.rs:1469:13:1469:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1469:13:1469:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1469:13:1469:27 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1469:23:1469:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1469:23:1469:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1470:13:1470:16 | self | | file://:0:0:0:0 | & | -| main.rs:1470:13:1470:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1470:13:1470:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1470:13:1470:27 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1470:23:1470:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1470:23:1470:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1476:16:1476:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1476:22:1476:24 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1476:41:1481:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1477:13:1480:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1478:20:1478:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1478:20:1478:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1478:20:1478:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1478:29:1478:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1478:29:1478:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1479:20:1479:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1479:20:1479:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1479:20:1479:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1479:29:1479:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1479:29:1479:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1486:23:1486:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1486:23:1486:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1486:34:1486:36 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1487:13:1487:16 | self | | file://:0:0:0:0 | & | -| main.rs:1487:13:1487:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1487:13:1487:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1487:13:1487:27 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1487:23:1487:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1487:23:1487:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1488:13:1488:16 | self | | file://:0:0:0:0 | & | -| main.rs:1488:13:1488:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1488:13:1488:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1488:13:1488:27 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1488:23:1488:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1488:23:1488:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1494:16:1494:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1494:22:1494:24 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1494:41:1499:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1495:13:1498:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1496:20:1496:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1496:20:1496:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1496:20:1496:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1496:29:1496:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1496:29:1496:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1497:20:1497:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1497:20:1497:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1497:20:1497:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1497:29:1497:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1497:29:1497:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1503:23:1503:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1503:23:1503:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1503:34:1503:36 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1504:13:1504:16 | self | | file://:0:0:0:0 | & | -| main.rs:1504:13:1504:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1504:13:1504:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1504:13:1504:27 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1504:23:1504:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1504:23:1504:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1505:13:1505:16 | self | | file://:0:0:0:0 | & | -| main.rs:1505:13:1505:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1505:13:1505:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1505:13:1505:27 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1505:23:1505:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1505:23:1505:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1511:16:1511:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1511:22:1511:24 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1511:41:1516:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1512:13:1515:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1513:20:1513:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1513:20:1513:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1513:20:1513:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1513:29:1513:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1513:29:1513:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1514:20:1514:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1514:20:1514:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1514:20:1514:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1514:29:1514:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1514:29:1514:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1520:23:1520:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1520:23:1520:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1520:34:1520:36 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1521:13:1521:16 | self | | file://:0:0:0:0 | & | -| main.rs:1521:13:1521:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1521:13:1521:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1521:13:1521:27 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1521:23:1521:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1521:23:1521:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1522:13:1522:16 | self | | file://:0:0:0:0 | & | -| main.rs:1522:13:1522:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1522:13:1522:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1522:13:1522:27 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1522:23:1522:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1522:23:1522:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1528:16:1528:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1528:22:1528:24 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1528:41:1533:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1529:13:1532:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1530:20:1530:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1530:20:1530:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1530:20:1530:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1530:29:1530:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1530:29:1530:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1531:20:1531:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1531:20:1531:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1531:20:1531:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1531:29:1531:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1531:29:1531:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1537:23:1537:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1537:23:1537:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1537:34:1537:36 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1538:13:1538:16 | self | | file://:0:0:0:0 | & | -| main.rs:1538:13:1538:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1538:13:1538:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1538:13:1538:27 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1538:23:1538:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1538:23:1538:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1539:13:1539:16 | self | | file://:0:0:0:0 | & | -| main.rs:1539:13:1539:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1539:13:1539:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1539:13:1539:27 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1539:23:1539:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1539:23:1539:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1545:19:1545:22 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1545:25:1545:27 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1545:44:1550:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1546:13:1549:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1547:20:1547:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1547:20:1547:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1547:20:1547:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1547:29:1547:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1547:29:1547:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1548:20:1548:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1548:20:1548:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1548:20:1548:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1548:29:1548:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1548:29:1548:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1554:26:1554:34 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1554:26:1554:34 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1554:37:1554:39 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1555:13:1555:16 | self | | file://:0:0:0:0 | & | -| main.rs:1555:13:1555:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1555:13:1555:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1555:13:1555:27 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1555:23:1555:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1555:23:1555:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1556:13:1556:16 | self | | file://:0:0:0:0 | & | -| main.rs:1556:13:1556:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1556:13:1556:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1556:13:1556:27 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1556:23:1556:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1556:23:1556:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1562:18:1562:21 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1562:24:1562:26 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1562:43:1567:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1563:13:1566:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1564:20:1564:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1564:20:1564:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1564:20:1564:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1564:29:1564:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1564:29:1564:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1565:20:1565:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1565:20:1565:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1565:20:1565:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1565:29:1565:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1565:29:1565:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1571:25:1571:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1571:25:1571:33 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1571:36:1571:38 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1572:13:1572:16 | self | | file://:0:0:0:0 | & | -| main.rs:1572:13:1572:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1572:13:1572:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1572:13:1572:27 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1572:23:1572:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1572:23:1572:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1573:13:1573:16 | self | | file://:0:0:0:0 | & | -| main.rs:1573:13:1573:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1573:13:1573:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1573:13:1573:27 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1573:23:1573:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1573:23:1573:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1579:19:1579:22 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1579:25:1579:27 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1579:44:1584:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1580:13:1583:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1581:20:1581:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1581:20:1581:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1581:20:1581:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1581:29:1581:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1581:29:1581:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1582:20:1582:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1582:20:1582:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1582:20:1582:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1582:29:1582:31 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1582:29:1582:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1588:26:1588:34 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1588:26:1588:34 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1588:37:1588:39 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1589:13:1589:16 | self | | file://:0:0:0:0 | & | -| main.rs:1589:13:1589:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1589:13:1589:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1589:13:1589:27 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1589:23:1589:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1589:23:1589:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1590:13:1590:16 | self | | file://:0:0:0:0 | & | -| main.rs:1590:13:1590:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1590:13:1590:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1590:13:1590:27 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1590:23:1590:25 | rhs | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1590:23:1590:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1596:16:1596:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1596:22:1596:24 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1596:40:1601:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1597:13:1600:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1598:20:1598:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1598:20:1598:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1598:20:1598:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1598:30:1598:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1599:20:1599:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1599:20:1599:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1599:20:1599:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1599:30:1599:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1605:23:1605:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1605:23:1605:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1605:34:1605:36 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1606:13:1606:16 | self | | file://:0:0:0:0 | & | -| main.rs:1606:13:1606:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1606:13:1606:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1606:13:1606:26 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1606:24:1606:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1607:13:1607:16 | self | | file://:0:0:0:0 | & | -| main.rs:1607:13:1607:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1607:13:1607:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1607:13:1607:26 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1607:24:1607:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1613:16:1613:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1613:22:1613:24 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1613:40:1618:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1614:13:1617:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1615:20:1615:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1615:20:1615:25 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1615:20:1615:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1615:30:1615:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1616:20:1616:23 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1616:20:1616:25 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1616:20:1616:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1616:30:1616:32 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1622:23:1622:31 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1622:23:1622:31 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1622:34:1622:36 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1623:13:1623:16 | self | | file://:0:0:0:0 | & | -| main.rs:1623:13:1623:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1623:13:1623:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1623:13:1623:26 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1623:24:1623:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1624:13:1624:16 | self | | file://:0:0:0:0 | & | -| main.rs:1624:13:1624:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1624:13:1624:18 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1624:13:1624:26 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1624:24:1624:26 | rhs | | {EXTERNAL LOCATION} | u32 | -| main.rs:1630:16:1630:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1630:30:1635:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1631:13:1634:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1632:20:1632:26 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1632:21:1632:24 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1632:21:1632:26 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1633:20:1633:26 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1633:21:1633:24 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1633:21:1633:26 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1640:16:1640:19 | SelfParam | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1640:30:1645:9 | { ... } | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1641:13:1644:13 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1642:20:1642:26 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1642:21:1642:24 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1642:21:1642:26 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1643:20:1643:26 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1643:21:1643:24 | self | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1643:21:1643:26 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1649:15:1649:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1649:15:1649:19 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1649:22:1649:26 | other | | file://:0:0:0:0 | & | -| main.rs:1649:22:1649:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1649:44:1651:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1222:18:1222:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1222:18:1222:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1222:26:1222:61 | ...::flatten(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1222:26:1222:61 | ...::flatten(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1222:59:1222:60 | x6 | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1222:59:1222:60 | x6 | T | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1222:59:1222:60 | x6 | T.T | main.rs:1198:5:1199:13 | S | +| main.rs:1225:13:1225:19 | from_if | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1225:13:1225:19 | from_if | T | main.rs:1198:5:1199:13 | S | +| main.rs:1225:23:1229:9 | if ... {...} else {...} | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1225:23:1229:9 | if ... {...} else {...} | T | main.rs:1198:5:1199:13 | S | +| main.rs:1225:26:1225:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1225:26:1225:30 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1225:30:1225:30 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1225:32:1227:9 | { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1225:32:1227:9 | { ... } | T | main.rs:1198:5:1199:13 | S | +| main.rs:1226:13:1226:30 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1226:13:1226:30 | ...::MyNone(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1227:16:1229:9 | { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1227:16:1229:9 | { ... } | T | main.rs:1198:5:1199:13 | S | +| main.rs:1228:13:1228:31 | ...::MySome(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1228:13:1228:31 | ...::MySome(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1228:30:1228:30 | S | | main.rs:1198:5:1199:13 | S | +| main.rs:1230:18:1230:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1230:18:1230:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1230:18:1230:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1230:18:1230:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1230:26:1230:32 | from_if | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1230:26:1230:32 | from_if | T | main.rs:1198:5:1199:13 | S | +| main.rs:1233:13:1233:22 | from_match | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1233:13:1233:22 | from_match | T | main.rs:1198:5:1199:13 | S | +| main.rs:1233:26:1236:9 | match ... { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1233:26:1236:9 | match ... { ... } | T | main.rs:1198:5:1199:13 | S | +| main.rs:1233:32:1233:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1233:32:1233:36 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1233:36:1233:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1234:13:1234:16 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1234:21:1234:38 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1234:21:1234:38 | ...::MyNone(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1235:13:1235:17 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1235:22:1235:40 | ...::MySome(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1235:22:1235:40 | ...::MySome(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1235:39:1235:39 | S | | main.rs:1198:5:1199:13 | S | +| main.rs:1237:18:1237:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1237:18:1237:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1237:18:1237:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1237:18:1237:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1237:26:1237:35 | from_match | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1237:26:1237:35 | from_match | T | main.rs:1198:5:1199:13 | S | +| main.rs:1240:13:1240:21 | from_loop | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1240:13:1240:21 | from_loop | T | main.rs:1198:5:1199:13 | S | +| main.rs:1240:25:1245:9 | loop { ... } | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1240:25:1245:9 | loop { ... } | T | main.rs:1198:5:1199:13 | S | +| main.rs:1241:16:1241:16 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1241:16:1241:20 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1241:20:1241:20 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1242:23:1242:40 | ...::MyNone(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1242:23:1242:40 | ...::MyNone(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1244:19:1244:37 | ...::MySome(...) | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1244:19:1244:37 | ...::MySome(...) | T | main.rs:1198:5:1199:13 | S | +| main.rs:1244:36:1244:36 | S | | main.rs:1198:5:1199:13 | S | +| main.rs:1246:18:1246:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1246:18:1246:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1246:18:1246:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1246:18:1246:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1246:26:1246:34 | from_loop | | main.rs:1163:5:1167:5 | MyOption | +| main.rs:1246:26:1246:34 | from_loop | T | main.rs:1198:5:1199:13 | S | +| main.rs:1264:15:1264:18 | SelfParam | | main.rs:1252:5:1253:19 | S | +| main.rs:1264:15:1264:18 | SelfParam | T | main.rs:1263:10:1263:10 | T | +| main.rs:1264:26:1266:9 | { ... } | | main.rs:1263:10:1263:10 | T | +| main.rs:1265:13:1265:16 | self | | main.rs:1252:5:1253:19 | S | +| main.rs:1265:13:1265:16 | self | T | main.rs:1263:10:1263:10 | T | +| main.rs:1265:13:1265:18 | self.0 | | main.rs:1263:10:1263:10 | T | +| main.rs:1268:15:1268:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1268:15:1268:19 | SelfParam | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1268:15:1268:19 | SelfParam | &T.T | main.rs:1263:10:1263:10 | T | +| main.rs:1268:28:1270:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1268:28:1270:9 | { ... } | &T | main.rs:1263:10:1263:10 | T | +| main.rs:1269:13:1269:19 | &... | | file://:0:0:0:0 | & | +| main.rs:1269:13:1269:19 | &... | &T | main.rs:1263:10:1263:10 | T | +| main.rs:1269:14:1269:17 | self | | file://:0:0:0:0 | & | +| main.rs:1269:14:1269:17 | self | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1269:14:1269:17 | self | &T.T | main.rs:1263:10:1263:10 | T | +| main.rs:1269:14:1269:19 | self.0 | | main.rs:1263:10:1263:10 | T | +| main.rs:1272:15:1272:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1272:15:1272:25 | SelfParam | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1272:15:1272:25 | SelfParam | &T.T | main.rs:1263:10:1263:10 | T | +| main.rs:1272:34:1274:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1272:34:1274:9 | { ... } | &T | main.rs:1263:10:1263:10 | T | +| main.rs:1273:13:1273:19 | &... | | file://:0:0:0:0 | & | +| main.rs:1273:13:1273:19 | &... | &T | main.rs:1263:10:1263:10 | T | +| main.rs:1273:14:1273:17 | self | | file://:0:0:0:0 | & | +| main.rs:1273:14:1273:17 | self | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1273:14:1273:17 | self | &T.T | main.rs:1263:10:1263:10 | T | +| main.rs:1273:14:1273:19 | self.0 | | main.rs:1263:10:1263:10 | T | +| main.rs:1278:29:1278:33 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1278:29:1278:33 | SelfParam | &T | main.rs:1277:5:1280:5 | Self [trait ATrait] | +| main.rs:1279:33:1279:36 | SelfParam | | main.rs:1277:5:1280:5 | Self [trait ATrait] | +| main.rs:1285:29:1285:33 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1285:29:1285:33 | SelfParam | &T | file://:0:0:0:0 | & | +| main.rs:1285:29:1285:33 | SelfParam | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1285:29:1285:33 | SelfParam | &T.&T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1285:43:1287:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:1286:13:1286:22 | (...) | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:13:1286:24 | ... .a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1286:14:1286:21 | * ... | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:15:1286:21 | (...) | | file://:0:0:0:0 | & | +| main.rs:1286:15:1286:21 | (...) | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:15:1286:21 | (...) | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:16:1286:20 | * ... | | file://:0:0:0:0 | & | +| main.rs:1286:16:1286:20 | * ... | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:16:1286:20 | * ... | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:17:1286:20 | self | | file://:0:0:0:0 | & | +| main.rs:1286:17:1286:20 | self | &T | file://:0:0:0:0 | & | +| main.rs:1286:17:1286:20 | self | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1286:17:1286:20 | self | &T.&T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1290:33:1290:36 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1290:33:1290:36 | SelfParam | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1290:46:1292:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:1291:13:1291:19 | (...) | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1291:13:1291:21 | ... .a | | {EXTERNAL LOCATION} | i64 | +| main.rs:1291:14:1291:18 | * ... | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1291:15:1291:18 | self | | file://:0:0:0:0 | & | +| main.rs:1291:15:1291:18 | self | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1296:13:1296:14 | x1 | | main.rs:1252:5:1253:19 | S | +| main.rs:1296:13:1296:14 | x1 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1296:18:1296:22 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1296:18:1296:22 | S(...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1296:20:1296:21 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1297:18:1297:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1297:18:1297:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1297:18:1297:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1297:18:1297:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1297:26:1297:27 | x1 | | main.rs:1252:5:1253:19 | S | +| main.rs:1297:26:1297:27 | x1 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1297:26:1297:32 | x1.m1() | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1299:13:1299:14 | x2 | | main.rs:1252:5:1253:19 | S | +| main.rs:1299:13:1299:14 | x2 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1299:18:1299:22 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1299:18:1299:22 | S(...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1299:20:1299:21 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1301:18:1301:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1301:18:1301:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1301:18:1301:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1301:18:1301:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1301:26:1301:27 | x2 | | main.rs:1252:5:1253:19 | S | +| main.rs:1301:26:1301:27 | x2 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1301:26:1301:32 | x2.m2() | | file://:0:0:0:0 | & | +| main.rs:1301:26:1301:32 | x2.m2() | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1302:18:1302:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1302:18:1302:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1302:18:1302:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1302:18:1302:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1302:26:1302:27 | x2 | | main.rs:1252:5:1253:19 | S | +| main.rs:1302:26:1302:27 | x2 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1302:26:1302:32 | x2.m3() | | file://:0:0:0:0 | & | +| main.rs:1302:26:1302:32 | x2.m3() | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1304:13:1304:14 | x3 | | main.rs:1252:5:1253:19 | S | +| main.rs:1304:13:1304:14 | x3 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1304:18:1304:22 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1304:18:1304:22 | S(...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1304:20:1304:21 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1306:18:1306:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1306:18:1306:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1306:18:1306:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1306:18:1306:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1306:26:1306:41 | ...::m2(...) | | file://:0:0:0:0 | & | +| main.rs:1306:26:1306:41 | ...::m2(...) | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1306:38:1306:40 | &x3 | | file://:0:0:0:0 | & | +| main.rs:1306:38:1306:40 | &x3 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1306:38:1306:40 | &x3 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1306:39:1306:40 | x3 | | main.rs:1252:5:1253:19 | S | +| main.rs:1306:39:1306:40 | x3 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1307:18:1307:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1307:18:1307:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1307:18:1307:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1307:18:1307:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1307:26:1307:41 | ...::m3(...) | | file://:0:0:0:0 | & | +| main.rs:1307:26:1307:41 | ...::m3(...) | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1307:38:1307:40 | &x3 | | file://:0:0:0:0 | & | +| main.rs:1307:38:1307:40 | &x3 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1307:38:1307:40 | &x3 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1307:39:1307:40 | x3 | | main.rs:1252:5:1253:19 | S | +| main.rs:1307:39:1307:40 | x3 | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1309:13:1309:14 | x4 | | file://:0:0:0:0 | & | +| main.rs:1309:13:1309:14 | x4 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1309:13:1309:14 | x4 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1309:18:1309:23 | &... | | file://:0:0:0:0 | & | +| main.rs:1309:18:1309:23 | &... | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1309:18:1309:23 | &... | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1309:19:1309:23 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1309:19:1309:23 | S(...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1309:21:1309:22 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1311:18:1311:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1311:18:1311:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1311:18:1311:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1311:18:1311:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1311:26:1311:27 | x4 | | file://:0:0:0:0 | & | +| main.rs:1311:26:1311:27 | x4 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1311:26:1311:27 | x4 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1311:26:1311:32 | x4.m2() | | file://:0:0:0:0 | & | +| main.rs:1311:26:1311:32 | x4.m2() | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1312:18:1312:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1312:18:1312:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1312:18:1312:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1312:18:1312:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1312:26:1312:27 | x4 | | file://:0:0:0:0 | & | +| main.rs:1312:26:1312:27 | x4 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1312:26:1312:27 | x4 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1312:26:1312:32 | x4.m3() | | file://:0:0:0:0 | & | +| main.rs:1312:26:1312:32 | x4.m3() | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1314:13:1314:14 | x5 | | file://:0:0:0:0 | & | +| main.rs:1314:13:1314:14 | x5 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1314:13:1314:14 | x5 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1314:18:1314:23 | &... | | file://:0:0:0:0 | & | +| main.rs:1314:18:1314:23 | &... | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1314:18:1314:23 | &... | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1314:19:1314:23 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1314:19:1314:23 | S(...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1314:21:1314:22 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1316:18:1316:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1316:18:1316:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1316:18:1316:32 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1316:18:1316:32 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1316:26:1316:27 | x5 | | file://:0:0:0:0 | & | +| main.rs:1316:26:1316:27 | x5 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1316:26:1316:27 | x5 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1316:26:1316:32 | x5.m1() | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1317:18:1317:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1317:18:1317:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1317:18:1317:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1317:18:1317:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1317:26:1317:27 | x5 | | file://:0:0:0:0 | & | +| main.rs:1317:26:1317:27 | x5 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1317:26:1317:27 | x5 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1317:26:1317:29 | x5.0 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1319:13:1319:14 | x6 | | file://:0:0:0:0 | & | +| main.rs:1319:13:1319:14 | x6 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1319:13:1319:14 | x6 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1319:18:1319:23 | &... | | file://:0:0:0:0 | & | +| main.rs:1319:18:1319:23 | &... | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1319:18:1319:23 | &... | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1319:19:1319:23 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1319:19:1319:23 | S(...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1319:21:1319:22 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1322:18:1322:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1322:18:1322:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1322:18:1322:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1322:18:1322:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1322:26:1322:30 | (...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1322:26:1322:30 | (...) | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1322:26:1322:35 | ... .m1() | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1322:27:1322:29 | * ... | | main.rs:1252:5:1253:19 | S | +| main.rs:1322:27:1322:29 | * ... | T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1322:28:1322:29 | x6 | | file://:0:0:0:0 | & | +| main.rs:1322:28:1322:29 | x6 | &T | main.rs:1252:5:1253:19 | S | +| main.rs:1322:28:1322:29 | x6 | &T.T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1324:13:1324:14 | x7 | | main.rs:1252:5:1253:19 | S | +| main.rs:1324:13:1324:14 | x7 | T | file://:0:0:0:0 | & | +| main.rs:1324:13:1324:14 | x7 | T.&T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1324:18:1324:23 | S(...) | | main.rs:1252:5:1253:19 | S | +| main.rs:1324:18:1324:23 | S(...) | T | file://:0:0:0:0 | & | +| main.rs:1324:18:1324:23 | S(...) | T.&T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1324:20:1324:22 | &S2 | | file://:0:0:0:0 | & | +| main.rs:1324:20:1324:22 | &S2 | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1324:21:1324:22 | S2 | | main.rs:1255:5:1256:14 | S2 | +| main.rs:1327:13:1327:13 | t | | file://:0:0:0:0 | & | +| main.rs:1327:13:1327:13 | t | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1327:17:1327:18 | x7 | | main.rs:1252:5:1253:19 | S | +| main.rs:1327:17:1327:18 | x7 | T | file://:0:0:0:0 | & | +| main.rs:1327:17:1327:18 | x7 | T.&T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1327:17:1327:23 | x7.m1() | | file://:0:0:0:0 | & | +| main.rs:1327:17:1327:23 | x7.m1() | &T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1328:18:1328:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1328:18:1328:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1328:18:1328:27 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1328:18:1328:27 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1328:26:1328:27 | x7 | | main.rs:1252:5:1253:19 | S | +| main.rs:1328:26:1328:27 | x7 | T | file://:0:0:0:0 | & | +| main.rs:1328:26:1328:27 | x7 | T.&T | main.rs:1255:5:1256:14 | S2 | +| main.rs:1330:13:1330:14 | x9 | | {EXTERNAL LOCATION} | String | +| main.rs:1330:26:1330:32 | "Hello" | | file://:0:0:0:0 | & | +| main.rs:1330:26:1330:32 | "Hello" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1330:26:1330:44 | "Hello".to_string() | | {EXTERNAL LOCATION} | String | +| main.rs:1334:13:1334:13 | u | | {EXTERNAL LOCATION} | Result | +| main.rs:1334:13:1334:13 | u | T | {EXTERNAL LOCATION} | u32 | +| main.rs:1334:17:1334:18 | x9 | | {EXTERNAL LOCATION} | String | +| main.rs:1334:17:1334:33 | x9.parse() | | {EXTERNAL LOCATION} | Result | +| main.rs:1334:17:1334:33 | x9.parse() | T | {EXTERNAL LOCATION} | u32 | +| main.rs:1336:13:1336:20 | my_thing | | file://:0:0:0:0 | & | +| main.rs:1336:13:1336:20 | my_thing | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1336:24:1336:39 | &... | | file://:0:0:0:0 | & | +| main.rs:1336:24:1336:39 | &... | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1336:25:1336:39 | MyInt {...} | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1336:36:1336:37 | 37 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1336:36:1336:37 | 37 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1338:17:1338:24 | my_thing | | file://:0:0:0:0 | & | +| main.rs:1338:17:1338:24 | my_thing | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1339:18:1339:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1339:18:1339:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1339:18:1339:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1339:18:1339:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1342:13:1342:20 | my_thing | | file://:0:0:0:0 | & | +| main.rs:1342:13:1342:20 | my_thing | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1342:24:1342:39 | &... | | file://:0:0:0:0 | & | +| main.rs:1342:24:1342:39 | &... | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1342:25:1342:39 | MyInt {...} | | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1342:36:1342:37 | 38 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1342:36:1342:37 | 38 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1343:17:1343:24 | my_thing | | file://:0:0:0:0 | & | +| main.rs:1343:17:1343:24 | my_thing | &T | main.rs:1258:5:1261:5 | MyInt | +| main.rs:1344:18:1344:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1344:18:1344:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1344:18:1344:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1344:18:1344:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1351:16:1351:20 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1351:16:1351:20 | SelfParam | &T | main.rs:1349:5:1357:5 | Self [trait MyTrait] | +| main.rs:1354:16:1354:20 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1354:16:1354:20 | SelfParam | &T | main.rs:1349:5:1357:5 | Self [trait MyTrait] | +| main.rs:1354:32:1356:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1354:32:1356:9 | { ... } | &T | main.rs:1349:5:1357:5 | Self [trait MyTrait] | +| main.rs:1355:13:1355:16 | self | | file://:0:0:0:0 | & | +| main.rs:1355:13:1355:16 | self | &T | main.rs:1349:5:1357:5 | Self [trait MyTrait] | +| main.rs:1355:13:1355:22 | self.foo() | | file://:0:0:0:0 | & | +| main.rs:1355:13:1355:22 | self.foo() | &T | main.rs:1349:5:1357:5 | Self [trait MyTrait] | +| main.rs:1363:16:1363:20 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1363:16:1363:20 | SelfParam | &T | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1363:36:1365:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1363:36:1365:9 | { ... } | &T | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1364:13:1364:16 | self | | file://:0:0:0:0 | & | +| main.rs:1364:13:1364:16 | self | &T | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1369:13:1369:13 | x | | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1369:17:1369:24 | MyStruct | | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1370:9:1370:9 | x | | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1370:9:1370:15 | x.bar() | | file://:0:0:0:0 | & | +| main.rs:1370:9:1370:15 | x.bar() | &T | main.rs:1359:5:1359:20 | MyStruct | +| main.rs:1380:16:1380:20 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1380:16:1380:20 | SelfParam | &T | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1380:16:1380:20 | SelfParam | &T.T | main.rs:1379:10:1379:10 | T | +| main.rs:1380:32:1382:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1380:32:1382:9 | { ... } | &T | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1380:32:1382:9 | { ... } | &T.T | main.rs:1379:10:1379:10 | T | +| main.rs:1381:13:1381:16 | self | | file://:0:0:0:0 | & | +| main.rs:1381:13:1381:16 | self | &T | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1381:13:1381:16 | self | &T.T | main.rs:1379:10:1379:10 | T | +| main.rs:1386:13:1386:13 | x | | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1386:13:1386:13 | x | T | main.rs:1375:5:1375:13 | S | +| main.rs:1386:17:1386:27 | MyStruct(...) | | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1386:17:1386:27 | MyStruct(...) | T | main.rs:1375:5:1375:13 | S | +| main.rs:1386:26:1386:26 | S | | main.rs:1375:5:1375:13 | S | +| main.rs:1387:9:1387:9 | x | | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1387:9:1387:9 | x | T | main.rs:1375:5:1375:13 | S | +| main.rs:1387:9:1387:15 | x.foo() | | file://:0:0:0:0 | & | +| main.rs:1387:9:1387:15 | x.foo() | &T | main.rs:1377:5:1377:26 | MyStruct | +| main.rs:1387:9:1387:15 | x.foo() | &T.T | main.rs:1375:5:1375:13 | S | +| main.rs:1398:17:1398:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1398:17:1398:25 | SelfParam | &T | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1399:13:1399:16 | self | | file://:0:0:0:0 | & | +| main.rs:1399:13:1399:16 | self | &T | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1399:13:1399:21 | self.bool | | {EXTERNAL LOCATION} | bool | +| main.rs:1399:13:1399:34 | ... = ... | | file://:0:0:0:0 | () | +| main.rs:1399:25:1399:34 | ! ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1399:26:1399:29 | self | | file://:0:0:0:0 | & | +| main.rs:1399:26:1399:29 | self | &T | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1399:26:1399:34 | self.bool | | {EXTERNAL LOCATION} | bool | +| main.rs:1406:15:1406:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1406:15:1406:19 | SelfParam | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1406:31:1408:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1406:31:1408:9 | { ... } | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1407:13:1407:19 | &... | | file://:0:0:0:0 | & | +| main.rs:1407:13:1407:19 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1407:13:1407:19 | &... | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1407:13:1407:19 | &... | &T.&T | file://:0:0:0:0 | & | +| main.rs:1407:13:1407:19 | &... | &T.&T.&T | file://:0:0:0:0 | & | +| main.rs:1407:13:1407:19 | &... | &T.&T.&T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1407:14:1407:19 | &... | | file://:0:0:0:0 | & | +| main.rs:1407:14:1407:19 | &... | | main.rs:1403:5:1403:13 | S | +| main.rs:1407:14:1407:19 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1407:14:1407:19 | &... | &T.&T | file://:0:0:0:0 | & | +| main.rs:1407:14:1407:19 | &... | &T.&T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1407:15:1407:19 | &self | | file://:0:0:0:0 | & | +| main.rs:1407:15:1407:19 | &self | &T | file://:0:0:0:0 | & | +| main.rs:1407:15:1407:19 | &self | &T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1407:16:1407:19 | self | | file://:0:0:0:0 | & | +| main.rs:1407:16:1407:19 | self | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1410:15:1410:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1410:15:1410:25 | SelfParam | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1410:37:1412:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1410:37:1412:9 | { ... } | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1411:13:1411:19 | &... | | file://:0:0:0:0 | & | +| main.rs:1411:13:1411:19 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1411:13:1411:19 | &... | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1411:13:1411:19 | &... | &T.&T | file://:0:0:0:0 | & | +| main.rs:1411:13:1411:19 | &... | &T.&T.&T | file://:0:0:0:0 | & | +| main.rs:1411:13:1411:19 | &... | &T.&T.&T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1411:14:1411:19 | &... | | file://:0:0:0:0 | & | +| main.rs:1411:14:1411:19 | &... | | main.rs:1403:5:1403:13 | S | +| main.rs:1411:14:1411:19 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1411:14:1411:19 | &... | &T.&T | file://:0:0:0:0 | & | +| main.rs:1411:14:1411:19 | &... | &T.&T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1411:15:1411:19 | &self | | file://:0:0:0:0 | & | +| main.rs:1411:15:1411:19 | &self | &T | file://:0:0:0:0 | & | +| main.rs:1411:15:1411:19 | &self | &T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1411:16:1411:19 | self | | file://:0:0:0:0 | & | +| main.rs:1411:16:1411:19 | self | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1414:15:1414:15 | x | | file://:0:0:0:0 | & | +| main.rs:1414:15:1414:15 | x | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1414:34:1416:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1414:34:1416:9 | { ... } | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1415:13:1415:13 | x | | file://:0:0:0:0 | & | +| main.rs:1415:13:1415:13 | x | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1418:15:1418:15 | x | | file://:0:0:0:0 | & | +| main.rs:1418:15:1418:15 | x | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1418:34:1420:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:1418:34:1420:9 | { ... } | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1419:13:1419:16 | &... | | file://:0:0:0:0 | & | +| main.rs:1419:13:1419:16 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1419:13:1419:16 | &... | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1419:13:1419:16 | &... | &T.&T | file://:0:0:0:0 | & | +| main.rs:1419:13:1419:16 | &... | &T.&T.&T | file://:0:0:0:0 | & | +| main.rs:1419:13:1419:16 | &... | &T.&T.&T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1419:14:1419:16 | &... | | file://:0:0:0:0 | & | +| main.rs:1419:14:1419:16 | &... | | main.rs:1403:5:1403:13 | S | +| main.rs:1419:14:1419:16 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1419:14:1419:16 | &... | &T.&T | file://:0:0:0:0 | & | +| main.rs:1419:14:1419:16 | &... | &T.&T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1419:15:1419:16 | &x | | file://:0:0:0:0 | & | +| main.rs:1419:15:1419:16 | &x | &T | file://:0:0:0:0 | & | +| main.rs:1419:15:1419:16 | &x | &T.&T | main.rs:1403:5:1403:13 | S | +| main.rs:1419:16:1419:16 | x | | file://:0:0:0:0 | & | +| main.rs:1419:16:1419:16 | x | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1424:13:1424:13 | x | | main.rs:1403:5:1403:13 | S | +| main.rs:1424:17:1424:20 | S {...} | | main.rs:1403:5:1403:13 | S | +| main.rs:1425:9:1425:9 | x | | main.rs:1403:5:1403:13 | S | +| main.rs:1425:9:1425:14 | x.f1() | | file://:0:0:0:0 | & | +| main.rs:1425:9:1425:14 | x.f1() | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1426:9:1426:9 | x | | main.rs:1403:5:1403:13 | S | +| main.rs:1426:9:1426:14 | x.f2() | | file://:0:0:0:0 | & | +| main.rs:1426:9:1426:14 | x.f2() | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1427:9:1427:17 | ...::f3(...) | | file://:0:0:0:0 | & | +| main.rs:1427:9:1427:17 | ...::f3(...) | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1427:15:1427:16 | &x | | file://:0:0:0:0 | & | +| main.rs:1427:15:1427:16 | &x | &T | main.rs:1403:5:1403:13 | S | +| main.rs:1427:16:1427:16 | x | | main.rs:1403:5:1403:13 | S | +| main.rs:1429:13:1429:13 | n | | {EXTERNAL LOCATION} | bool | +| main.rs:1429:17:1429:24 | * ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1429:18:1429:24 | * ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1429:18:1429:24 | * ... | | file://:0:0:0:0 | & | +| main.rs:1429:18:1429:24 | * ... | &T | {EXTERNAL LOCATION} | bool | +| main.rs:1429:19:1429:24 | &... | | file://:0:0:0:0 | & | +| main.rs:1429:19:1429:24 | &... | &T | {EXTERNAL LOCATION} | bool | +| main.rs:1429:19:1429:24 | &... | &T | file://:0:0:0:0 | & | +| main.rs:1429:19:1429:24 | &... | &T.&T | {EXTERNAL LOCATION} | bool | +| main.rs:1429:20:1429:24 | &true | | {EXTERNAL LOCATION} | bool | +| main.rs:1429:20:1429:24 | &true | | file://:0:0:0:0 | & | +| main.rs:1429:20:1429:24 | &true | &T | {EXTERNAL LOCATION} | bool | +| main.rs:1429:21:1429:24 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1433:17:1433:20 | flag | | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1433:24:1433:41 | ...::default(...) | | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1434:22:1434:30 | &mut flag | | file://:0:0:0:0 | & | +| main.rs:1434:22:1434:30 | &mut flag | &T | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1434:27:1434:30 | flag | | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1435:18:1435:23 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1435:18:1435:23 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1435:18:1435:29 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1435:18:1435:29 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1435:26:1435:29 | flag | | main.rs:1392:5:1395:5 | MyFlag | +| main.rs:1450:43:1453:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1450:43:1453:5 | { ... } | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1450:43:1453:5 | { ... } | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1451:13:1451:13 | x | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1451:17:1451:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1451:17:1451:30 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1451:17:1451:31 | TryExpr | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1451:28:1451:29 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1452:9:1452:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1452:9:1452:22 | ...::Ok(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1452:9:1452:22 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1452:20:1452:21 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1457:46:1461:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1457:46:1461:5 | { ... } | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1457:46:1461:5 | { ... } | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1458:13:1458:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1458:13:1458:13 | x | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1458:17:1458:30 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1458:17:1458:30 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1458:28:1458:29 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1459:13:1459:13 | y | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1459:17:1459:17 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1459:17:1459:17 | x | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1459:17:1459:18 | TryExpr | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1460:9:1460:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1460:9:1460:22 | ...::Ok(...) | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1460:9:1460:22 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1460:20:1460:21 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1465:40:1470:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1465:40:1470:5 | { ... } | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1465:40:1470:5 | { ... } | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1466:13:1466:13 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1466:13:1466:13 | x | T | {EXTERNAL LOCATION} | Result | +| main.rs:1466:13:1466:13 | x | T.T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1466:17:1466:42 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1466:17:1466:42 | ...::Ok(...) | T | {EXTERNAL LOCATION} | Result | +| main.rs:1466:17:1466:42 | ...::Ok(...) | T.T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1466:28:1466:41 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1466:28:1466:41 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1466:39:1466:40 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1468:17:1468:17 | x | | {EXTERNAL LOCATION} | Result | +| main.rs:1468:17:1468:17 | x | T | {EXTERNAL LOCATION} | Result | +| main.rs:1468:17:1468:17 | x | T.T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1468:17:1468:18 | TryExpr | | {EXTERNAL LOCATION} | Result | +| main.rs:1468:17:1468:18 | TryExpr | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1468:17:1468:29 | ... .map(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1468:24:1468:28 | \|...\| s | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:1468:24:1468:28 | \|...\| s | dyn(Args) | file://:0:0:0:0 | (T_1) | +| main.rs:1469:9:1469:22 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1469:9:1469:22 | ...::Ok(...) | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1469:9:1469:22 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1469:20:1469:21 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1474:30:1474:34 | input | | {EXTERNAL LOCATION} | Result | +| main.rs:1474:30:1474:34 | input | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1474:30:1474:34 | input | T | main.rs:1474:20:1474:27 | T | +| main.rs:1474:69:1481:5 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1474:69:1481:5 | { ... } | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1474:69:1481:5 | { ... } | T | main.rs:1474:20:1474:27 | T | +| main.rs:1475:13:1475:17 | value | | main.rs:1474:20:1474:27 | T | +| main.rs:1475:21:1475:25 | input | | {EXTERNAL LOCATION} | Result | +| main.rs:1475:21:1475:25 | input | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1475:21:1475:25 | input | T | main.rs:1474:20:1474:27 | T | +| main.rs:1475:21:1475:26 | TryExpr | | main.rs:1474:20:1474:27 | T | +| main.rs:1476:22:1476:38 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1476:22:1476:38 | ...::Ok(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1476:22:1476:38 | ...::Ok(...) | T | main.rs:1474:20:1474:27 | T | +| main.rs:1476:22:1479:10 | ... .and_then(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1476:22:1479:10 | ... .and_then(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1476:33:1476:37 | value | | main.rs:1474:20:1474:27 | T | +| main.rs:1476:49:1479:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:1476:49:1479:9 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| main.rs:1476:49:1479:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | Result | +| main.rs:1476:49:1479:9 | \|...\| ... | dyn(Output).E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1476:53:1479:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:1476:53:1479:9 | { ... } | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1477:22:1477:27 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1477:22:1477:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1477:22:1477:30 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1477:22:1477:30 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1478:13:1478:34 | ...::Ok::<...>(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1478:13:1478:34 | ...::Ok::<...>(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1480:9:1480:23 | ...::Err(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1480:9:1480:23 | ...::Err(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1480:9:1480:23 | ...::Err(...) | T | main.rs:1474:20:1474:27 | T | +| main.rs:1480:21:1480:22 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1485:16:1485:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1485:16:1485:33 | ...::Ok(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1485:16:1485:33 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1485:27:1485:32 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1485:37:1485:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1485:37:1485:52 | try_same_error(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1485:37:1485:52 | try_same_error(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1486:22:1486:27 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1486:22:1486:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1486:22:1486:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1486:22:1486:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1486:30:1486:35 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1489:16:1489:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1489:16:1489:33 | ...::Ok(...) | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1489:16:1489:33 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1489:27:1489:32 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1489:37:1489:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1489:37:1489:55 | try_convert_error(...) | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1489:37:1489:55 | try_convert_error(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1490:22:1490:27 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1490:22:1490:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1490:22:1490:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1490:22:1490:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1490:30:1490:35 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1493:16:1493:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1493:16:1493:33 | ...::Ok(...) | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1493:16:1493:33 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1493:27:1493:32 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1493:37:1493:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1493:37:1493:49 | try_chained(...) | E | main.rs:1445:5:1446:14 | S2 | +| main.rs:1493:37:1493:49 | try_chained(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1494:22:1494:27 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1494:22:1494:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1494:22:1494:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1494:22:1494:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1494:30:1494:35 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:16:1497:33 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1497:16:1497:33 | ...::Ok(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:16:1497:33 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:27:1497:32 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:37:1497:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1497:37:1497:63 | try_complex(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:37:1497:63 | try_complex(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:49:1497:62 | ...::Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:1497:49:1497:62 | ...::Ok(...) | E | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:49:1497:62 | ...::Ok(...) | T | main.rs:1442:5:1443:14 | S1 | +| main.rs:1497:60:1497:61 | S1 | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1498:22:1498:27 | "{:?}\\n" | | file://:0:0:0:0 | & | +| main.rs:1498:22:1498:27 | "{:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1498:22:1498:35 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1498:22:1498:35 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:1498:30:1498:35 | result | | main.rs:1442:5:1443:14 | S1 | +| main.rs:1505:13:1505:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1505:22:1505:22 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1506:13:1506:13 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:1506:17:1506:17 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1507:13:1507:13 | z | | {EXTERNAL LOCATION} | i32 | +| main.rs:1507:17:1507:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1507:17:1507:21 | ... + ... | | {EXTERNAL LOCATION} | i32 | +| main.rs:1507:21:1507:21 | y | | {EXTERNAL LOCATION} | i32 | +| main.rs:1508:13:1508:13 | z | | {EXTERNAL LOCATION} | i32 | +| main.rs:1508:17:1508:17 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:1508:17:1508:23 | x.abs() | | {EXTERNAL LOCATION} | i32 | +| main.rs:1509:13:1509:13 | c | | {EXTERNAL LOCATION} | char | +| main.rs:1509:17:1509:19 | 'c' | | {EXTERNAL LOCATION} | char | +| main.rs:1510:13:1510:17 | hello | | file://:0:0:0:0 | & | +| main.rs:1510:13:1510:17 | hello | &T | {EXTERNAL LOCATION} | str | +| main.rs:1510:21:1510:27 | "Hello" | | file://:0:0:0:0 | & | +| main.rs:1510:21:1510:27 | "Hello" | &T | {EXTERNAL LOCATION} | str | +| main.rs:1511:13:1511:13 | f | | {EXTERNAL LOCATION} | f64 | +| main.rs:1511:17:1511:24 | 123.0f64 | | {EXTERNAL LOCATION} | f64 | +| main.rs:1512:13:1512:13 | t | | {EXTERNAL LOCATION} | bool | +| main.rs:1512:17:1512:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1513:13:1513:13 | f | | {EXTERNAL LOCATION} | bool | +| main.rs:1513:17:1513:21 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1520:13:1520:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:1520:17:1520:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1520:17:1520:29 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1520:25:1520:29 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1521:13:1521:13 | y | | {EXTERNAL LOCATION} | bool | +| main.rs:1521:17:1521:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:1521:17:1521:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1521:25:1521:29 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1523:17:1523:17 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1524:13:1524:16 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:1524:20:1524:21 | 34 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1524:20:1524:27 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1524:26:1524:27 | 33 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1525:12:1525:15 | cond | | {EXTERNAL LOCATION} | bool | +| main.rs:1526:17:1526:17 | z | | file://:0:0:0:0 | () | +| main.rs:1526:21:1526:27 | (...) | | file://:0:0:0:0 | () | +| main.rs:1526:22:1526:22 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1526:22:1526:26 | ... = ... | | file://:0:0:0:0 | () | +| main.rs:1526:26:1526:26 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1528:13:1528:13 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1528:13:1528:17 | ... = ... | | file://:0:0:0:0 | () | +| main.rs:1528:17:1528:17 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1530:9:1530:9 | a | | {EXTERNAL LOCATION} | i32 | +| main.rs:1544:30:1546:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1545:13:1545:31 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1545:23:1545:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1545:23:1545:23 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1545:29:1545:29 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1545:29:1545:29 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1552:16:1552:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1552:22:1552:24 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1552:41:1557:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1553:13:1556:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1554:20:1554:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1554:20:1554:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1554:20:1554:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1554:29:1554:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1554:29:1554:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1555:20:1555:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1555:20:1555:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1555:20:1555:33 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1555:29:1555:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1555:29:1555:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1562:23:1562:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1562:23:1562:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1562:34:1562:36 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1563:13:1563:16 | self | | file://:0:0:0:0 | & | +| main.rs:1563:13:1563:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1563:13:1563:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1563:13:1563:27 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:1563:23:1563:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1563:23:1563:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1564:13:1564:16 | self | | file://:0:0:0:0 | & | +| main.rs:1564:13:1564:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1564:13:1564:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1564:13:1564:27 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:1564:23:1564:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1564:23:1564:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1570:16:1570:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1570:22:1570:24 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1570:41:1575:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1571:13:1574:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1572:20:1572:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1572:20:1572:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1572:20:1572:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1572:29:1572:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1572:29:1572:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1573:20:1573:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1573:20:1573:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1573:20:1573:33 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1573:29:1573:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1573:29:1573:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1580:23:1580:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1580:23:1580:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1580:34:1580:36 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1581:13:1581:16 | self | | file://:0:0:0:0 | & | +| main.rs:1581:13:1581:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1581:13:1581:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1581:13:1581:27 | ... -= ... | | file://:0:0:0:0 | () | +| main.rs:1581:23:1581:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1581:23:1581:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1582:13:1582:16 | self | | file://:0:0:0:0 | & | +| main.rs:1582:13:1582:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1582:13:1582:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1582:13:1582:27 | ... -= ... | | file://:0:0:0:0 | () | +| main.rs:1582:23:1582:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1582:23:1582:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1588:16:1588:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1588:22:1588:24 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1588:41:1593:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1589:13:1592:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1590:20:1590:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1590:20:1590:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1590:20:1590:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1590:29:1590:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1590:29:1590:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1591:20:1591:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1591:20:1591:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1591:20:1591:33 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1591:29:1591:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1591:29:1591:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1597:23:1597:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1597:23:1597:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1597:34:1597:36 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1598:13:1598:16 | self | | file://:0:0:0:0 | & | +| main.rs:1598:13:1598:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1598:13:1598:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1598:13:1598:27 | ... *= ... | | file://:0:0:0:0 | () | +| main.rs:1598:23:1598:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1598:23:1598:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1599:13:1599:16 | self | | file://:0:0:0:0 | & | +| main.rs:1599:13:1599:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1599:13:1599:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1599:13:1599:27 | ... *= ... | | file://:0:0:0:0 | () | +| main.rs:1599:23:1599:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1599:23:1599:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1605:16:1605:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1605:22:1605:24 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1605:41:1610:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1606:13:1609:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1607:20:1607:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1607:20:1607:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1607:20:1607:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1607:29:1607:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1607:29:1607:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1608:20:1608:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1608:20:1608:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1608:20:1608:33 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1608:29:1608:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1608:29:1608:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1614:23:1614:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1614:23:1614:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1614:34:1614:36 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1615:13:1615:16 | self | | file://:0:0:0:0 | & | +| main.rs:1615:13:1615:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1615:13:1615:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1615:13:1615:27 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1615:23:1615:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1615:23:1615:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1616:13:1616:16 | self | | file://:0:0:0:0 | & | +| main.rs:1616:13:1616:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1616:13:1616:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1616:13:1616:27 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1616:23:1616:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1616:23:1616:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1622:16:1622:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1622:22:1622:24 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1622:41:1627:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1623:13:1626:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1624:20:1624:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1624:20:1624:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1624:20:1624:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1624:29:1624:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1624:29:1624:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1625:20:1625:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1625:20:1625:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1625:20:1625:33 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1625:29:1625:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1625:29:1625:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1631:23:1631:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1631:23:1631:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1631:34:1631:36 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1632:13:1632:16 | self | | file://:0:0:0:0 | & | +| main.rs:1632:13:1632:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1632:13:1632:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1632:13:1632:27 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1632:23:1632:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1632:23:1632:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1633:13:1633:16 | self | | file://:0:0:0:0 | & | +| main.rs:1633:13:1633:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1633:13:1633:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1633:13:1633:27 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1633:23:1633:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1633:23:1633:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1639:19:1639:22 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1639:25:1639:27 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1639:44:1644:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1640:13:1643:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1641:20:1641:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1641:20:1641:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1641:20:1641:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1641:29:1641:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1641:29:1641:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1642:20:1642:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1642:20:1642:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1642:20:1642:33 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1642:29:1642:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1642:29:1642:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1648:26:1648:34 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1648:26:1648:34 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1648:37:1648:39 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1649:13:1649:16 | self | | file://:0:0:0:0 | & | +| main.rs:1649:13:1649:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1649:13:1649:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1649:13:1649:27 | ... &= ... | | file://:0:0:0:0 | () | +| main.rs:1649:23:1649:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1649:23:1649:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | | main.rs:1650:13:1650:16 | self | | file://:0:0:0:0 | & | -| main.rs:1650:13:1650:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1650:13:1650:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1650:13:1650:29 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1650:13:1650:50 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1650:23:1650:27 | other | | file://:0:0:0:0 | & | -| main.rs:1650:23:1650:27 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1650:23:1650:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1650:34:1650:37 | self | | file://:0:0:0:0 | & | -| main.rs:1650:34:1650:37 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1650:34:1650:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1650:34:1650:50 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1650:44:1650:48 | other | | file://:0:0:0:0 | & | -| main.rs:1650:44:1650:48 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1650:44:1650:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1653:15:1653:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1653:15:1653:19 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1653:22:1653:26 | other | | file://:0:0:0:0 | & | -| main.rs:1653:22:1653:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1653:44:1655:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1654:13:1654:16 | self | | file://:0:0:0:0 | & | -| main.rs:1654:13:1654:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1654:13:1654:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1654:13:1654:29 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1654:13:1654:50 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1654:23:1654:27 | other | | file://:0:0:0:0 | & | -| main.rs:1654:23:1654:27 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1654:23:1654:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1654:34:1654:37 | self | | file://:0:0:0:0 | & | -| main.rs:1654:34:1654:37 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1654:34:1654:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1654:34:1654:50 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1654:44:1654:48 | other | | file://:0:0:0:0 | & | -| main.rs:1654:44:1654:48 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1654:44:1654:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1659:24:1659:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1659:24:1659:28 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1659:31:1659:35 | other | | file://:0:0:0:0 | & | -| main.rs:1659:31:1659:35 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1659:75:1661:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:1659:75:1661:9 | { ... } | T | {EXTERNAL LOCATION} | Ordering | -| main.rs:1660:13:1660:29 | (...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:13:1660:63 | ... .partial_cmp(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:1660:13:1660:63 | ... .partial_cmp(...) | T | {EXTERNAL LOCATION} | Ordering | -| main.rs:1660:14:1660:17 | self | | file://:0:0:0:0 | & | -| main.rs:1660:14:1660:17 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1660:14:1660:19 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:14:1660:28 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:23:1660:26 | self | | file://:0:0:0:0 | & | -| main.rs:1660:23:1660:26 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1660:23:1660:28 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:43:1660:62 | &... | | file://:0:0:0:0 | & | -| main.rs:1660:43:1660:62 | &... | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:44:1660:62 | (...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:45:1660:49 | other | | file://:0:0:0:0 | & | -| main.rs:1660:45:1660:49 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1660:45:1660:51 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:45:1660:61 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1660:55:1660:59 | other | | file://:0:0:0:0 | & | -| main.rs:1660:55:1660:59 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1660:55:1660:61 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1663:15:1663:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1663:15:1663:19 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1663:22:1663:26 | other | | file://:0:0:0:0 | & | -| main.rs:1663:22:1663:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1663:44:1665:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1664:13:1664:16 | self | | file://:0:0:0:0 | & | -| main.rs:1664:13:1664:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1664:13:1664:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1664:13:1664:28 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1664:13:1664:48 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1664:22:1664:26 | other | | file://:0:0:0:0 | & | -| main.rs:1664:22:1664:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1664:22:1664:28 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1664:33:1664:36 | self | | file://:0:0:0:0 | & | -| main.rs:1664:33:1664:36 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1664:33:1664:38 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1664:33:1664:48 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1664:42:1664:46 | other | | file://:0:0:0:0 | & | -| main.rs:1664:42:1664:46 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1664:42:1664:48 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1667:15:1667:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1667:15:1667:19 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1667:22:1667:26 | other | | file://:0:0:0:0 | & | -| main.rs:1667:22:1667:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1667:44:1669:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1668:13:1668:16 | self | | file://:0:0:0:0 | & | -| main.rs:1668:13:1668:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1668:13:1668:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1668:13:1668:29 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1668:13:1668:50 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1668:23:1668:27 | other | | file://:0:0:0:0 | & | -| main.rs:1668:23:1668:27 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1668:23:1668:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1668:34:1668:37 | self | | file://:0:0:0:0 | & | -| main.rs:1668:34:1668:37 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1668:34:1668:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1668:34:1668:50 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1668:44:1668:48 | other | | file://:0:0:0:0 | & | -| main.rs:1668:44:1668:48 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1668:44:1668:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1671:15:1671:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1671:15:1671:19 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1671:22:1671:26 | other | | file://:0:0:0:0 | & | -| main.rs:1671:22:1671:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1671:44:1673:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1672:13:1672:16 | self | | file://:0:0:0:0 | & | -| main.rs:1672:13:1672:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1672:13:1672:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1672:13:1672:28 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1672:13:1672:48 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1672:22:1672:26 | other | | file://:0:0:0:0 | & | -| main.rs:1672:22:1672:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1672:22:1672:28 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1672:33:1672:36 | self | | file://:0:0:0:0 | & | -| main.rs:1672:33:1672:36 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1672:33:1672:38 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1672:33:1672:48 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1672:42:1672:46 | other | | file://:0:0:0:0 | & | -| main.rs:1672:42:1672:46 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1672:42:1672:48 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1675:15:1675:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1675:15:1675:19 | SelfParam | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1675:22:1675:26 | other | | file://:0:0:0:0 | & | -| main.rs:1675:22:1675:26 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1675:44:1677:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:1676:13:1676:16 | self | | file://:0:0:0:0 | & | -| main.rs:1676:13:1676:16 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1676:13:1676:18 | self.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1676:13:1676:29 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1676:13:1676:50 | ... && ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1676:23:1676:27 | other | | file://:0:0:0:0 | & | -| main.rs:1676:23:1676:27 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1676:23:1676:29 | other.x | | {EXTERNAL LOCATION} | i64 | -| main.rs:1676:34:1676:37 | self | | file://:0:0:0:0 | & | -| main.rs:1676:34:1676:37 | self | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1676:34:1676:39 | self.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1676:34:1676:50 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1676:44:1676:48 | other | | file://:0:0:0:0 | & | -| main.rs:1676:44:1676:48 | other | &T | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1676:44:1676:50 | other.y | | {EXTERNAL LOCATION} | i64 | -| main.rs:1683:13:1683:18 | i64_eq | | {EXTERNAL LOCATION} | bool | -| main.rs:1683:22:1683:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1683:23:1683:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1683:23:1683:34 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1683:31:1683:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1684:13:1684:18 | i64_ne | | {EXTERNAL LOCATION} | bool | -| main.rs:1684:22:1684:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1684:23:1684:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1684:23:1684:34 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1684:31:1684:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1685:13:1685:18 | i64_lt | | {EXTERNAL LOCATION} | bool | -| main.rs:1685:22:1685:34 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1685:23:1685:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1685:23:1685:33 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1685:30:1685:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1686:13:1686:18 | i64_le | | {EXTERNAL LOCATION} | bool | -| main.rs:1686:22:1686:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1686:23:1686:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1686:23:1686:34 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1686:31:1686:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1687:13:1687:18 | i64_gt | | {EXTERNAL LOCATION} | bool | -| main.rs:1687:22:1687:35 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1687:23:1687:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1687:23:1687:34 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1687:30:1687:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1688:13:1688:18 | i64_ge | | {EXTERNAL LOCATION} | bool | -| main.rs:1688:22:1688:37 | (...) | | {EXTERNAL LOCATION} | bool | -| main.rs:1688:23:1688:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1688:23:1688:36 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1688:32:1688:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1691:13:1691:19 | i64_add | | {EXTERNAL LOCATION} | i64 | -| main.rs:1691:23:1691:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1691:23:1691:35 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1691:31:1691:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1692:13:1692:19 | i64_sub | | {EXTERNAL LOCATION} | i64 | -| main.rs:1692:23:1692:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1692:23:1692:35 | ... - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1692:31:1692:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1693:13:1693:19 | i64_mul | | {EXTERNAL LOCATION} | i64 | -| main.rs:1693:23:1693:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1693:23:1693:35 | ... * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1693:31:1693:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1694:13:1694:19 | i64_div | | {EXTERNAL LOCATION} | i64 | -| main.rs:1694:23:1694:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1694:23:1694:35 | ... / ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1694:31:1694:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1695:13:1695:19 | i64_rem | | {EXTERNAL LOCATION} | i64 | -| main.rs:1695:23:1695:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1695:23:1695:35 | ... % ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1695:31:1695:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1698:17:1698:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1698:34:1698:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1699:9:1699:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1699:9:1699:31 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1699:27:1699:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1701:17:1701:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1701:34:1701:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1702:9:1702:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1702:9:1702:31 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1702:27:1702:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1704:17:1704:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1704:34:1704:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1705:9:1705:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1705:9:1705:31 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1705:27:1705:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1707:17:1707:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1707:34:1707:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1708:9:1708:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1708:9:1708:31 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1708:27:1708:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1710:17:1710:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1710:34:1710:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1711:9:1711:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1711:9:1711:31 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1711:27:1711:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1714:13:1714:22 | i64_bitand | | {EXTERNAL LOCATION} | i64 | -| main.rs:1714:26:1714:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1714:26:1714:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1714:34:1714:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1715:13:1715:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | -| main.rs:1715:25:1715:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1715:25:1715:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1715:33:1715:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1716:13:1716:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | -| main.rs:1716:26:1716:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1716:26:1716:38 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1716:34:1716:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1717:13:1717:19 | i64_shl | | {EXTERNAL LOCATION} | i64 | -| main.rs:1717:23:1717:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1717:23:1717:36 | ... << ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1717:32:1717:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1718:13:1718:19 | i64_shr | | {EXTERNAL LOCATION} | i64 | -| main.rs:1718:23:1718:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1718:23:1718:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1718:32:1718:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1721:17:1721:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1721:37:1721:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1722:9:1722:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1722:9:1722:34 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1722:30:1722:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1724:17:1724:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1724:36:1724:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1725:9:1725:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1725:9:1725:33 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1725:29:1725:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1727:17:1727:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1727:37:1727:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1728:9:1728:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1728:9:1728:34 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1728:30:1728:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1730:17:1730:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1730:34:1730:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1731:9:1731:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1731:9:1731:32 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1731:28:1731:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1733:17:1733:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1733:34:1733:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1734:9:1734:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | -| main.rs:1734:9:1734:32 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1734:28:1734:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1736:13:1736:19 | i64_neg | | {EXTERNAL LOCATION} | i64 | -| main.rs:1736:23:1736:28 | - ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1736:24:1736:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1737:13:1737:19 | i64_not | | {EXTERNAL LOCATION} | i64 | -| main.rs:1737:23:1737:28 | ! ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:1737:24:1737:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1740:13:1740:14 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1740:18:1740:36 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1740:28:1740:28 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1740:28:1740:28 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1740:34:1740:34 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1740:34:1740:34 | 2 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1741:13:1741:14 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1741:18:1741:36 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1741:28:1741:28 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1741:28:1741:28 | 3 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1741:34:1741:34 | 4 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1741:34:1741:34 | 4 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1744:13:1744:19 | vec2_eq | | {EXTERNAL LOCATION} | bool | -| main.rs:1744:23:1744:24 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1744:23:1744:30 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1744:29:1744:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1745:13:1745:19 | vec2_ne | | {EXTERNAL LOCATION} | bool | -| main.rs:1745:23:1745:24 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1745:23:1745:30 | ... != ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1745:29:1745:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1746:13:1746:19 | vec2_lt | | {EXTERNAL LOCATION} | bool | -| main.rs:1746:23:1746:24 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1746:23:1746:29 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1746:28:1746:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1747:13:1747:19 | vec2_le | | {EXTERNAL LOCATION} | bool | -| main.rs:1747:23:1747:24 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1747:23:1747:30 | ... <= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1747:29:1747:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1748:13:1748:19 | vec2_gt | | {EXTERNAL LOCATION} | bool | -| main.rs:1748:23:1748:24 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1748:23:1748:29 | ... > ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1748:28:1748:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1749:13:1749:19 | vec2_ge | | {EXTERNAL LOCATION} | bool | -| main.rs:1749:23:1749:24 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1749:23:1749:30 | ... >= ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1749:29:1749:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1752:13:1752:20 | vec2_add | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1752:24:1752:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1752:24:1752:30 | ... + ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1752:29:1752:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1753:13:1753:20 | vec2_sub | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1753:24:1753:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1753:24:1753:30 | ... - ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1753:29:1753:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1754:13:1754:20 | vec2_mul | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1754:24:1754:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1754:24:1754:30 | ... * ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1754:29:1754:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1755:13:1755:20 | vec2_div | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1755:24:1755:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1755:24:1755:30 | ... / ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1755:29:1755:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1756:13:1756:20 | vec2_rem | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1756:24:1756:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1756:24:1756:30 | ... % ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1756:29:1756:30 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1759:17:1759:31 | vec2_add_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1759:35:1759:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1760:9:1760:23 | vec2_add_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1760:9:1760:29 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:1760:28:1760:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1762:17:1762:31 | vec2_sub_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1762:35:1762:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1763:9:1763:23 | vec2_sub_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1763:9:1763:29 | ... -= ... | | file://:0:0:0:0 | () | -| main.rs:1763:28:1763:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1765:17:1765:31 | vec2_mul_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1765:35:1765:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1766:9:1766:23 | vec2_mul_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1766:9:1766:29 | ... *= ... | | file://:0:0:0:0 | () | -| main.rs:1766:28:1766:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1768:17:1768:31 | vec2_div_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1768:35:1768:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1769:9:1769:23 | vec2_div_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1769:9:1769:29 | ... /= ... | | file://:0:0:0:0 | () | -| main.rs:1769:28:1769:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1771:17:1771:31 | vec2_rem_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1771:35:1771:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1772:9:1772:23 | vec2_rem_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1772:9:1772:29 | ... %= ... | | file://:0:0:0:0 | () | -| main.rs:1772:28:1772:29 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1775:13:1775:23 | vec2_bitand | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1775:27:1775:28 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1775:27:1775:33 | ... & ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1775:32:1775:33 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1776:13:1776:22 | vec2_bitor | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1776:26:1776:27 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1776:26:1776:32 | ... \| ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1776:31:1776:32 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1777:13:1777:23 | vec2_bitxor | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1777:27:1777:28 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1777:27:1777:33 | ... ^ ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1777:32:1777:33 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1778:13:1778:20 | vec2_shl | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1778:24:1778:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1778:24:1778:33 | ... << ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1778:30:1778:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1779:13:1779:20 | vec2_shr | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1779:24:1779:25 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1779:24:1779:33 | ... >> ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1779:30:1779:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1782:17:1782:34 | vec2_bitand_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1782:38:1782:39 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1783:9:1783:26 | vec2_bitand_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1783:9:1783:32 | ... &= ... | | file://:0:0:0:0 | () | -| main.rs:1783:31:1783:32 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1785:17:1785:33 | vec2_bitor_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1785:37:1785:38 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1786:9:1786:25 | vec2_bitor_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1786:9:1786:31 | ... \|= ... | | file://:0:0:0:0 | () | -| main.rs:1786:30:1786:31 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1788:17:1788:34 | vec2_bitxor_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1788:38:1788:39 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1789:9:1789:26 | vec2_bitxor_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1789:9:1789:32 | ... ^= ... | | file://:0:0:0:0 | () | -| main.rs:1789:31:1789:32 | v2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1791:17:1791:31 | vec2_shl_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1791:35:1791:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1792:9:1792:23 | vec2_shl_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1792:9:1792:32 | ... <<= ... | | file://:0:0:0:0 | () | -| main.rs:1792:29:1792:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1794:17:1794:31 | vec2_shr_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1794:35:1794:36 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1795:9:1795:23 | vec2_shr_assign | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1795:9:1795:32 | ... >>= ... | | file://:0:0:0:0 | () | -| main.rs:1795:29:1795:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:1798:13:1798:20 | vec2_neg | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1798:24:1798:26 | - ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1798:25:1798:26 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1799:13:1799:20 | vec2_not | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1799:24:1799:26 | ! ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1799:25:1799:26 | v1 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1802:13:1802:24 | default_vec2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1802:28:1802:45 | ...::default(...) | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1803:13:1803:26 | vec2_zero_plus | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1803:30:1803:48 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1803:30:1803:63 | ... + ... | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1803:40:1803:40 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1803:40:1803:40 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1803:46:1803:46 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1803:46:1803:46 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1803:52:1803:63 | default_vec2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1807:13:1807:24 | default_vec2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1807:28:1807:45 | ...::default(...) | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1808:13:1808:26 | vec2_zero_plus | | {EXTERNAL LOCATION} | bool | -| main.rs:1808:30:1808:48 | Vec2 {...} | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1808:30:1808:64 | ... == ... | | {EXTERNAL LOCATION} | bool | -| main.rs:1808:40:1808:40 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1808:40:1808:40 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1808:46:1808:46 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1808:46:1808:46 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:1808:53:1808:64 | default_vec2 | | main.rs:1443:5:1448:5 | Vec2 | -| main.rs:1818:18:1818:21 | SelfParam | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1821:25:1823:5 | { ... } | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1822:9:1822:10 | S1 | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1825:41:1827:5 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1825:41:1827:5 | { ... } | | main.rs:1825:16:1825:39 | ImplTraitTypeRepr | -| main.rs:1825:41:1827:5 | { ... } | Output | main.rs:1815:5:1815:14 | S1 | -| main.rs:1826:9:1826:20 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1826:9:1826:20 | { ... } | | main.rs:1825:16:1825:39 | ImplTraitTypeRepr | -| main.rs:1826:9:1826:20 | { ... } | Output | main.rs:1815:5:1815:14 | S1 | -| main.rs:1826:17:1826:18 | S1 | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1835:13:1835:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | -| main.rs:1835:13:1835:42 | SelfParam | Ptr | file://:0:0:0:0 | & | -| main.rs:1835:13:1835:42 | SelfParam | Ptr.&T | main.rs:1829:5:1829:14 | S2 | -| main.rs:1836:13:1836:15 | _cx | | file://:0:0:0:0 | & | -| main.rs:1836:13:1836:15 | _cx | &T | {EXTERNAL LOCATION} | Context | -| main.rs:1837:44:1839:9 | { ... } | | {EXTERNAL LOCATION} | Poll | -| main.rs:1837:44:1839:9 | { ... } | T | main.rs:1815:5:1815:14 | S1 | -| main.rs:1838:13:1838:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | -| main.rs:1838:13:1838:38 | ...::Ready(...) | T | main.rs:1815:5:1815:14 | S1 | -| main.rs:1838:36:1838:37 | S1 | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1842:41:1844:5 | { ... } | | main.rs:1829:5:1829:14 | S2 | -| main.rs:1842:41:1844:5 | { ... } | | main.rs:1842:16:1842:39 | ImplTraitTypeRepr | -| main.rs:1843:9:1843:10 | S2 | | main.rs:1829:5:1829:14 | S2 | -| main.rs:1843:9:1843:10 | S2 | | main.rs:1842:16:1842:39 | ImplTraitTypeRepr | -| main.rs:1847:9:1847:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1847:9:1847:12 | f1(...) | Output | main.rs:1815:5:1815:14 | S1 | -| main.rs:1847:9:1847:18 | await ... | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1848:9:1848:12 | f2(...) | | main.rs:1825:16:1825:39 | ImplTraitTypeRepr | -| main.rs:1848:9:1848:18 | await ... | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1849:9:1849:12 | f3(...) | | main.rs:1842:16:1842:39 | ImplTraitTypeRepr | -| main.rs:1849:9:1849:18 | await ... | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1850:9:1850:10 | S2 | | main.rs:1829:5:1829:14 | S2 | -| main.rs:1850:9:1850:16 | await S2 | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1851:13:1851:13 | b | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1851:13:1851:13 | b | Output | main.rs:1815:5:1815:14 | S1 | -| main.rs:1851:17:1851:28 | { ... } | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1851:17:1851:28 | { ... } | Output | main.rs:1815:5:1815:14 | S1 | -| main.rs:1851:25:1851:26 | S1 | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1852:9:1852:9 | b | | {EXTERNAL LOCATION} | trait Future | -| main.rs:1852:9:1852:9 | b | Output | main.rs:1815:5:1815:14 | S1 | -| main.rs:1852:9:1852:15 | await b | | main.rs:1815:5:1815:14 | S1 | -| main.rs:1861:15:1861:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1861:15:1861:19 | SelfParam | &T | main.rs:1860:5:1862:5 | Self [trait Trait1] | -| main.rs:1865:15:1865:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1865:15:1865:19 | SelfParam | &T | main.rs:1864:5:1866:5 | Self [trait Trait2] | -| main.rs:1869:15:1869:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1869:15:1869:19 | SelfParam | &T | main.rs:1857:5:1857:14 | S1 | -| main.rs:1873:15:1873:19 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1873:15:1873:19 | SelfParam | &T | main.rs:1857:5:1857:14 | S1 | -| main.rs:1876:37:1878:5 | { ... } | | main.rs:1857:5:1857:14 | S1 | -| main.rs:1876:37:1878:5 | { ... } | | main.rs:1876:16:1876:35 | ImplTraitTypeRepr | -| main.rs:1877:9:1877:10 | S1 | | main.rs:1857:5:1857:14 | S1 | -| main.rs:1877:9:1877:10 | S1 | | main.rs:1876:16:1876:35 | ImplTraitTypeRepr | -| main.rs:1881:18:1881:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1881:18:1881:22 | SelfParam | &T | main.rs:1880:5:1882:5 | Self [trait MyTrait] | -| main.rs:1885:18:1885:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1885:18:1885:22 | SelfParam | &T | main.rs:1857:5:1857:14 | S1 | -| main.rs:1885:31:1887:9 | { ... } | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1886:13:1886:14 | S2 | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1890:45:1892:5 | { ... } | | main.rs:1857:5:1857:14 | S1 | -| main.rs:1890:45:1892:5 | { ... } | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1891:9:1891:10 | S1 | | main.rs:1857:5:1857:14 | S1 | -| main.rs:1891:9:1891:10 | S1 | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1894:41:1894:41 | t | | main.rs:1894:26:1894:38 | B | -| main.rs:1894:52:1896:5 | { ... } | | main.rs:1894:23:1894:23 | A | -| main.rs:1895:9:1895:9 | t | | main.rs:1894:26:1894:38 | B | -| main.rs:1895:9:1895:17 | t.get_a() | | main.rs:1894:23:1894:23 | A | -| main.rs:1898:26:1898:26 | t | | main.rs:1898:29:1898:43 | ImplTraitTypeRepr | -| main.rs:1898:51:1900:5 | { ... } | | main.rs:1898:23:1898:23 | A | -| main.rs:1899:9:1899:9 | t | | main.rs:1898:29:1898:43 | ImplTraitTypeRepr | -| main.rs:1899:9:1899:17 | t.get_a() | | main.rs:1898:23:1898:23 | A | -| main.rs:1903:13:1903:13 | x | | main.rs:1876:16:1876:35 | ImplTraitTypeRepr | -| main.rs:1903:17:1903:20 | f1(...) | | main.rs:1876:16:1876:35 | ImplTraitTypeRepr | -| main.rs:1904:9:1904:9 | x | | main.rs:1876:16:1876:35 | ImplTraitTypeRepr | -| main.rs:1905:9:1905:9 | x | | main.rs:1876:16:1876:35 | ImplTraitTypeRepr | -| main.rs:1906:13:1906:13 | a | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1906:17:1906:32 | get_a_my_trait(...) | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1907:13:1907:13 | b | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1907:17:1907:33 | uses_my_trait1(...) | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1907:32:1907:32 | a | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1908:13:1908:13 | a | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1908:17:1908:32 | get_a_my_trait(...) | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1909:13:1909:13 | c | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1909:17:1909:33 | uses_my_trait2(...) | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1909:32:1909:32 | a | | main.rs:1890:28:1890:43 | ImplTraitTypeRepr | -| main.rs:1910:13:1910:13 | d | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1910:17:1910:34 | uses_my_trait2(...) | | main.rs:1858:5:1858:14 | S2 | -| main.rs:1910:32:1910:33 | S1 | | main.rs:1857:5:1857:14 | S1 | -| main.rs:1921:16:1921:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1921:16:1921:20 | SelfParam | &T | main.rs:1917:5:1918:13 | S | -| main.rs:1921:31:1923:9 | { ... } | | main.rs:1917:5:1918:13 | S | -| main.rs:1922:13:1922:13 | S | | main.rs:1917:5:1918:13 | S | -| main.rs:1932:26:1934:9 | { ... } | | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1932:26:1934:9 | { ... } | T | main.rs:1931:10:1931:10 | T | -| main.rs:1933:13:1933:38 | MyVec {...} | | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1933:13:1933:38 | MyVec {...} | T | main.rs:1931:10:1931:10 | T | -| main.rs:1933:27:1933:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:1933:27:1933:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:1933:27:1933:36 | ...::new(...) | T | main.rs:1931:10:1931:10 | T | -| main.rs:1936:17:1936:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1936:17:1936:25 | SelfParam | &T | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1936:17:1936:25 | SelfParam | &T.T | main.rs:1931:10:1931:10 | T | -| main.rs:1936:28:1936:32 | value | | main.rs:1931:10:1931:10 | T | -| main.rs:1937:13:1937:16 | self | | file://:0:0:0:0 | & | -| main.rs:1937:13:1937:16 | self | &T | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1937:13:1937:16 | self | &T.T | main.rs:1931:10:1931:10 | T | -| main.rs:1937:13:1937:21 | self.data | | {EXTERNAL LOCATION} | Vec | -| main.rs:1937:13:1937:21 | self.data | A | {EXTERNAL LOCATION} | Global | -| main.rs:1937:13:1937:21 | self.data | T | main.rs:1931:10:1931:10 | T | -| main.rs:1937:28:1937:32 | value | | main.rs:1931:10:1931:10 | T | -| main.rs:1945:18:1945:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:1945:18:1945:22 | SelfParam | &T | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1945:18:1945:22 | SelfParam | &T.T | main.rs:1941:10:1941:10 | T | -| main.rs:1945:25:1945:29 | index | | {EXTERNAL LOCATION} | usize | -| main.rs:1945:56:1947:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:1945:56:1947:9 | { ... } | &T | main.rs:1941:10:1941:10 | T | -| main.rs:1946:13:1946:29 | &... | | file://:0:0:0:0 | & | -| main.rs:1946:13:1946:29 | &... | &T | main.rs:1941:10:1941:10 | T | -| main.rs:1946:14:1946:17 | self | | file://:0:0:0:0 | & | -| main.rs:1946:14:1946:17 | self | &T | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1946:14:1946:17 | self | &T.T | main.rs:1941:10:1941:10 | T | -| main.rs:1946:14:1946:22 | self.data | | {EXTERNAL LOCATION} | Vec | -| main.rs:1946:14:1946:22 | self.data | A | {EXTERNAL LOCATION} | Global | -| main.rs:1946:14:1946:22 | self.data | T | main.rs:1941:10:1941:10 | T | -| main.rs:1946:14:1946:29 | ...[index] | | main.rs:1941:10:1941:10 | T | -| main.rs:1946:24:1946:28 | index | | {EXTERNAL LOCATION} | usize | -| main.rs:1950:22:1950:26 | slice | | file://:0:0:0:0 | & | -| main.rs:1950:22:1950:26 | slice | | file://:0:0:0:0 | [] | -| main.rs:1950:22:1950:26 | slice | &T | file://:0:0:0:0 | [] | -| main.rs:1950:22:1950:26 | slice | &T.[T] | main.rs:1917:5:1918:13 | S | -| main.rs:1957:13:1957:13 | x | | main.rs:1917:5:1918:13 | S | -| main.rs:1957:17:1957:21 | slice | | file://:0:0:0:0 | & | -| main.rs:1957:17:1957:21 | slice | | file://:0:0:0:0 | [] | -| main.rs:1957:17:1957:21 | slice | &T | file://:0:0:0:0 | [] | -| main.rs:1957:17:1957:21 | slice | &T.[T] | main.rs:1917:5:1918:13 | S | -| main.rs:1957:17:1957:24 | slice[0] | | main.rs:1917:5:1918:13 | S | -| main.rs:1957:17:1957:30 | ... .foo() | | main.rs:1917:5:1918:13 | S | -| main.rs:1957:23:1957:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1961:17:1961:19 | vec | | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1961:17:1961:19 | vec | T | main.rs:1917:5:1918:13 | S | -| main.rs:1961:23:1961:34 | ...::new(...) | | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1961:23:1961:34 | ...::new(...) | T | main.rs:1917:5:1918:13 | S | -| main.rs:1962:9:1962:11 | vec | | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1962:9:1962:11 | vec | T | main.rs:1917:5:1918:13 | S | -| main.rs:1962:18:1962:18 | S | | main.rs:1917:5:1918:13 | S | -| main.rs:1963:9:1963:11 | vec | | main.rs:1926:5:1929:5 | MyVec | -| main.rs:1963:9:1963:11 | vec | T | main.rs:1917:5:1918:13 | S | -| main.rs:1963:9:1963:14 | vec[0] | | main.rs:1917:5:1918:13 | S | -| main.rs:1963:9:1963:20 | ... .foo() | | main.rs:1917:5:1918:13 | S | -| main.rs:1963:13:1963:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1963:13:1963:13 | 0 | | {EXTERNAL LOCATION} | usize | -| main.rs:1965:13:1965:14 | xs | | file://:0:0:0:0 | [] | -| main.rs:1965:13:1965:14 | xs | | file://:0:0:0:0 | [] | -| main.rs:1965:13:1965:14 | xs | [T;...] | main.rs:1917:5:1918:13 | S | -| main.rs:1965:13:1965:14 | xs | [T] | main.rs:1917:5:1918:13 | S | -| main.rs:1965:21:1965:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1965:26:1965:28 | [...] | | file://:0:0:0:0 | [] | -| main.rs:1965:26:1965:28 | [...] | | file://:0:0:0:0 | [] | -| main.rs:1965:26:1965:28 | [...] | [T;...] | main.rs:1917:5:1918:13 | S | -| main.rs:1965:26:1965:28 | [...] | [T] | main.rs:1917:5:1918:13 | S | -| main.rs:1965:27:1965:27 | S | | main.rs:1917:5:1918:13 | S | -| main.rs:1966:13:1966:13 | x | | main.rs:1917:5:1918:13 | S | -| main.rs:1966:17:1966:18 | xs | | file://:0:0:0:0 | [] | -| main.rs:1966:17:1966:18 | xs | | file://:0:0:0:0 | [] | -| main.rs:1966:17:1966:18 | xs | [T;...] | main.rs:1917:5:1918:13 | S | -| main.rs:1966:17:1966:18 | xs | [T] | main.rs:1917:5:1918:13 | S | -| main.rs:1966:17:1966:21 | xs[0] | | main.rs:1917:5:1918:13 | S | -| main.rs:1966:17:1966:27 | ... .foo() | | main.rs:1917:5:1918:13 | S | -| main.rs:1966:20:1966:20 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:1968:23:1968:25 | &xs | | file://:0:0:0:0 | & | -| main.rs:1968:23:1968:25 | &xs | &T | file://:0:0:0:0 | [] | -| main.rs:1968:23:1968:25 | &xs | &T | file://:0:0:0:0 | [] | -| main.rs:1968:23:1968:25 | &xs | &T.[T;...] | main.rs:1917:5:1918:13 | S | -| main.rs:1968:23:1968:25 | &xs | &T.[T] | main.rs:1917:5:1918:13 | S | -| main.rs:1968:24:1968:25 | xs | | file://:0:0:0:0 | [] | -| main.rs:1968:24:1968:25 | xs | | file://:0:0:0:0 | [] | -| main.rs:1968:24:1968:25 | xs | [T;...] | main.rs:1917:5:1918:13 | S | -| main.rs:1968:24:1968:25 | xs | [T] | main.rs:1917:5:1918:13 | S | -| main.rs:1974:13:1974:13 | x | | {EXTERNAL LOCATION} | String | -| main.rs:1974:17:1974:46 | MacroExpr | | {EXTERNAL LOCATION} | String | -| main.rs:1974:25:1974:35 | "Hello, {}" | | file://:0:0:0:0 | & | -| main.rs:1974:25:1974:35 | "Hello, {}" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1974:25:1974:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | -| main.rs:1974:25:1974:45 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | -| main.rs:1974:25:1974:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1974:25:1974:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:1974:25:1974:45 | { ... } | | {EXTERNAL LOCATION} | String | -| main.rs:1974:38:1974:45 | "World!" | | file://:0:0:0:0 | & | -| main.rs:1974:38:1974:45 | "World!" | &T | {EXTERNAL LOCATION} | str | -| main.rs:1983:19:1983:22 | SelfParam | | main.rs:1979:5:1984:5 | Self [trait MyAdd] | -| main.rs:1983:25:1983:27 | rhs | | main.rs:1979:17:1979:26 | Rhs | -| main.rs:1990:19:1990:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:1990:25:1990:29 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:1990:45:1992:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:1991:13:1991:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:1999:19:1999:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:1999:25:1999:29 | value | | file://:0:0:0:0 | & | -| main.rs:1999:25:1999:29 | value | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:1999:46:2001:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2000:13:2000:18 | * ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2000:14:2000:18 | value | | file://:0:0:0:0 | & | -| main.rs:2000:14:2000:18 | value | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2008:19:2008:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | -| main.rs:2008:25:2008:29 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2008:46:2010:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2008:46:2010:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2009:13:2009:37 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2009:13:2009:37 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| main.rs:2009:16:2009:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2009:22:2009:26 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2009:22:2009:26 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2009:24:2009:24 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2009:24:2009:24 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2009:33:2009:37 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2009:33:2009:37 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2009:35:2009:35 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2009:35:2009:35 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2019:19:2019:22 | SelfParam | | main.rs:2013:5:2013:19 | S | -| main.rs:2019:19:2019:22 | SelfParam | T | main.rs:2015:10:2015:17 | T | -| main.rs:2019:25:2019:29 | other | | main.rs:2013:5:2013:19 | S | -| main.rs:2019:25:2019:29 | other | T | main.rs:1979:5:1984:5 | Self [trait MyAdd] | -| main.rs:2019:25:2019:29 | other | T | main.rs:2015:10:2015:17 | T | -| main.rs:2019:54:2021:9 | { ... } | | main.rs:2013:5:2013:19 | S | -| main.rs:2019:54:2021:9 | { ... } | T | main.rs:1980:9:1980:20 | Output | -| main.rs:2020:13:2020:39 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2020:13:2020:39 | S(...) | T | main.rs:1980:9:1980:20 | Output | -| main.rs:2020:15:2020:22 | (...) | | main.rs:2015:10:2015:17 | T | -| main.rs:2020:15:2020:38 | ... .my_add(...) | | main.rs:1980:9:1980:20 | Output | -| main.rs:2020:16:2020:19 | self | | main.rs:2013:5:2013:19 | S | -| main.rs:2020:16:2020:19 | self | T | main.rs:2015:10:2015:17 | T | -| main.rs:2020:16:2020:21 | self.0 | | main.rs:2015:10:2015:17 | T | -| main.rs:2020:31:2020:35 | other | | main.rs:2013:5:2013:19 | S | -| main.rs:2020:31:2020:35 | other | T | main.rs:1979:5:1984:5 | Self [trait MyAdd] | -| main.rs:2020:31:2020:35 | other | T | main.rs:2015:10:2015:17 | T | -| main.rs:2020:31:2020:37 | other.0 | | main.rs:1979:5:1984:5 | Self [trait MyAdd] | -| main.rs:2020:31:2020:37 | other.0 | | main.rs:2015:10:2015:17 | T | -| main.rs:2028:19:2028:22 | SelfParam | | main.rs:2013:5:2013:19 | S | -| main.rs:2028:19:2028:22 | SelfParam | T | main.rs:2024:10:2024:17 | T | -| main.rs:2028:25:2028:29 | other | | main.rs:1979:5:1984:5 | Self [trait MyAdd] | -| main.rs:2028:25:2028:29 | other | | main.rs:2024:10:2024:17 | T | -| main.rs:2028:51:2030:9 | { ... } | | main.rs:2013:5:2013:19 | S | -| main.rs:2028:51:2030:9 | { ... } | T | main.rs:1980:9:1980:20 | Output | -| main.rs:2029:13:2029:37 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2029:13:2029:37 | S(...) | T | main.rs:1980:9:1980:20 | Output | -| main.rs:2029:15:2029:22 | (...) | | main.rs:2024:10:2024:17 | T | -| main.rs:2029:15:2029:36 | ... .my_add(...) | | main.rs:1980:9:1980:20 | Output | -| main.rs:2029:16:2029:19 | self | | main.rs:2013:5:2013:19 | S | -| main.rs:2029:16:2029:19 | self | T | main.rs:2024:10:2024:17 | T | -| main.rs:2029:16:2029:21 | self.0 | | main.rs:2024:10:2024:17 | T | -| main.rs:2029:31:2029:35 | other | | main.rs:1979:5:1984:5 | Self [trait MyAdd] | -| main.rs:2029:31:2029:35 | other | | main.rs:2024:10:2024:17 | T | -| main.rs:2040:19:2040:22 | SelfParam | | main.rs:2013:5:2013:19 | S | -| main.rs:2040:19:2040:22 | SelfParam | T | main.rs:2033:14:2033:14 | T | -| main.rs:2040:25:2040:29 | other | | file://:0:0:0:0 | & | -| main.rs:2040:25:2040:29 | other | &T | main.rs:2033:14:2033:14 | T | -| main.rs:2040:55:2042:9 | { ... } | | main.rs:2013:5:2013:19 | S | -| main.rs:2041:13:2041:37 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2041:15:2041:22 | (...) | | main.rs:2033:14:2033:14 | T | -| main.rs:2041:16:2041:19 | self | | main.rs:2013:5:2013:19 | S | -| main.rs:2041:16:2041:19 | self | T | main.rs:2033:14:2033:14 | T | -| main.rs:2041:16:2041:21 | self.0 | | main.rs:2033:14:2033:14 | T | -| main.rs:2041:31:2041:35 | other | | file://:0:0:0:0 | & | -| main.rs:2041:31:2041:35 | other | &T | main.rs:2033:14:2033:14 | T | -| main.rs:2047:20:2047:24 | value | | main.rs:2045:18:2045:18 | T | -| main.rs:2052:20:2052:24 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2052:40:2054:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2053:13:2053:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2059:20:2059:24 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2059:41:2061:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2059:41:2061:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2060:13:2060:37 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2060:13:2060:37 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | -| main.rs:2060:16:2060:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2060:22:2060:26 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2060:22:2060:26 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2060:24:2060:24 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2060:24:2060:24 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2060:33:2060:37 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2060:33:2060:37 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2060:35:2060:35 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2060:35:2060:35 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2066:21:2066:25 | value | | main.rs:2064:19:2064:19 | T | -| main.rs:2066:31:2066:31 | x | | main.rs:2064:5:2067:5 | Self [trait MyFrom2] | -| main.rs:2071:21:2071:25 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2071:33:2071:33 | _ | | {EXTERNAL LOCATION} | i64 | -| main.rs:2072:13:2072:17 | value | | {EXTERNAL LOCATION} | i64 | -| main.rs:2078:21:2078:25 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2078:34:2078:34 | _ | | {EXTERNAL LOCATION} | i64 | -| main.rs:2079:13:2083:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2079:16:2079:20 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2079:22:2081:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2080:17:2080:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2081:20:2083:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2082:17:2082:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2089:15:2089:15 | x | | main.rs:2087:5:2093:5 | Self [trait MySelfTrait] | -| main.rs:2092:15:2092:15 | x | | main.rs:2087:5:2093:5 | Self [trait MySelfTrait] | -| main.rs:2097:15:2097:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2097:31:2099:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2098:13:2098:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2098:13:2098:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2098:17:2098:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2102:15:2102:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2102:32:2104:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2103:13:2103:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2103:13:2103:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | -| main.rs:2103:17:2103:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2109:15:2109:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2109:31:2111:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2109:31:2111:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2110:13:2110:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2110:13:2110:13 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2114:15:2114:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2114:32:2116:9 | { ... } | | {EXTERNAL LOCATION} | bool | -| main.rs:2115:13:2115:13 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2120:13:2120:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2120:13:2120:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2120:22:2120:23 | 73 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2120:22:2120:23 | 73 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2121:9:2121:9 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2121:9:2121:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2121:9:2121:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2121:18:2121:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2122:9:2122:9 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2122:9:2122:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2122:9:2122:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2122:18:2122:22 | &5i64 | | file://:0:0:0:0 | & | -| main.rs:2122:18:2122:22 | &5i64 | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2122:19:2122:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2123:9:2123:9 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2123:9:2123:9 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2123:9:2123:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2123:18:2123:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2125:9:2125:15 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2125:9:2125:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2125:9:2125:31 | ... .my_add(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2125:11:2125:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2125:24:2125:30 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2125:24:2125:30 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2125:26:2125:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2126:9:2126:15 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2126:9:2126:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2126:11:2126:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2126:24:2126:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2127:9:2127:15 | S(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2127:9:2127:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2127:9:2127:29 | ... .my_add(...) | | main.rs:2013:5:2013:19 | S | -| main.rs:2127:11:2127:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2127:24:2127:28 | &3i64 | | file://:0:0:0:0 | & | -| main.rs:2127:24:2127:28 | &3i64 | &T | {EXTERNAL LOCATION} | i64 | -| main.rs:2127:25:2127:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2129:13:2129:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2129:17:2129:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2129:30:2129:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2130:13:2130:13 | y | | {EXTERNAL LOCATION} | i64 | -| main.rs:2130:17:2130:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2130:30:2130:33 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2131:13:2131:13 | z | | {EXTERNAL LOCATION} | i64 | -| main.rs:2131:22:2131:43 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2131:38:2131:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2132:23:2132:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2132:30:2132:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2133:23:2133:26 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2133:29:2133:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2134:27:2134:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2134:34:2134:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2136:9:2136:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2136:17:2136:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2137:9:2137:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2137:17:2137:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2138:9:2138:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2138:18:2138:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2139:9:2139:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2139:18:2139:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2140:9:2140:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2140:25:2140:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2141:9:2141:30 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2141:25:2141:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2142:9:2142:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2142:25:2142:28 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2143:9:2143:29 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | -| main.rs:2143:25:2143:28 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2151:26:2153:9 | { ... } | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2152:13:2152:25 | MyCallable {...} | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2155:17:2155:21 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2155:17:2155:21 | SelfParam | &T | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2155:31:2157:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2155:31:2157:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2156:13:2156:13 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2156:13:2156:13 | 1 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2163:13:2163:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2163:18:2163:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2163:18:2163:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2163:19:2163:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2163:22:2163:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2163:25:2163:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2164:18:2164:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2164:18:2164:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2164:18:2164:41 | ... .map(...) | | file://:0:0:0:0 | [] | -| main.rs:2164:19:2164:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2164:22:2164:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2164:25:2164:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2164:40:2164:40 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2165:18:2165:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2165:18:2165:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2165:19:2165:19 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2165:22:2165:22 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2165:25:2165:25 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2167:13:2167:17 | vals1 | | file://:0:0:0:0 | [] | -| main.rs:2167:13:2167:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2167:13:2167:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2167:21:2167:31 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2167:21:2167:31 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2167:21:2167:31 | [...] | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2167:22:2167:24 | 1u8 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2167:22:2167:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2167:27:2167:27 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2167:27:2167:27 | 2 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2167:30:2167:30 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2167:30:2167:30 | 3 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2168:13:2168:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2168:13:2168:13 | u | | {EXTERNAL LOCATION} | u8 | -| main.rs:2168:18:2168:22 | vals1 | | file://:0:0:0:0 | [] | -| main.rs:2168:18:2168:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2168:18:2168:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | -| main.rs:2170:13:2170:17 | vals2 | | file://:0:0:0:0 | [] | -| main.rs:2170:13:2170:17 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2170:21:2170:29 | [1u16; 3] | | file://:0:0:0:0 | [] | -| main.rs:2170:21:2170:29 | [1u16; 3] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2170:22:2170:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2170:28:2170:28 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2171:13:2171:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2171:18:2171:22 | vals2 | | file://:0:0:0:0 | [] | -| main.rs:2171:18:2171:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2173:13:2173:17 | vals3 | | file://:0:0:0:0 | [] | -| main.rs:2173:13:2173:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:13:2173:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2173:26:2173:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:31:2173:39 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2173:31:2173:39 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:31:2173:39 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2173:32:2173:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:32:2173:32 | 1 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2173:35:2173:35 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:35:2173:35 | 2 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2173:38:2173:38 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:38:2173:38 | 3 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2174:13:2174:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2174:13:2174:13 | u | | {EXTERNAL LOCATION} | u32 | -| main.rs:2174:18:2174:22 | vals3 | | file://:0:0:0:0 | [] | -| main.rs:2174:18:2174:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2174:18:2174:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2176:13:2176:17 | vals4 | | file://:0:0:0:0 | [] | -| main.rs:2176:13:2176:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2176:13:2176:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2176:26:2176:26 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2176:31:2176:36 | [1; 3] | | file://:0:0:0:0 | [] | -| main.rs:2176:31:2176:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2176:31:2176:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2176:32:2176:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2176:32:2176:32 | 1 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2176:35:2176:35 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2177:13:2177:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2177:13:2177:13 | u | | {EXTERNAL LOCATION} | u64 | -| main.rs:2177:18:2177:22 | vals4 | | file://:0:0:0:0 | [] | -| main.rs:2177:18:2177:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2177:18:2177:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2179:17:2179:24 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2179:17:2179:24 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2179:17:2179:24 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2179:28:2179:48 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2179:28:2179:48 | [...] | [T;...] | file://:0:0:0:0 | & | -| main.rs:2179:28:2179:48 | [...] | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2179:29:2179:33 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2179:29:2179:33 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2179:36:2179:40 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2179:36:2179:40 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2179:43:2179:47 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2179:43:2179:47 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2180:13:2180:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2180:13:2180:13 | s | | file://:0:0:0:0 | & | -| main.rs:2180:13:2180:13 | s | &T | file://:0:0:0:0 | & | -| main.rs:2180:13:2180:13 | s | &T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2180:18:2180:26 | &strings1 | | file://:0:0:0:0 | & | -| main.rs:2180:18:2180:26 | &strings1 | &T | file://:0:0:0:0 | [] | -| main.rs:2180:18:2180:26 | &strings1 | &T.[T;...] | file://:0:0:0:0 | & | -| main.rs:2180:18:2180:26 | &strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2180:19:2180:26 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2180:19:2180:26 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2180:19:2180:26 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2181:13:2181:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2181:13:2181:13 | s | | file://:0:0:0:0 | & | -| main.rs:2181:13:2181:13 | s | &T | file://:0:0:0:0 | & | -| main.rs:2181:13:2181:13 | s | &T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2181:18:2181:30 | &mut strings1 | | file://:0:0:0:0 | & | -| main.rs:2181:18:2181:30 | &mut strings1 | &T | file://:0:0:0:0 | [] | -| main.rs:2181:18:2181:30 | &mut strings1 | &T.[T;...] | file://:0:0:0:0 | & | -| main.rs:2181:18:2181:30 | &mut strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2181:23:2181:30 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2181:23:2181:30 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2181:23:2181:30 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2182:13:2182:13 | s | | file://:0:0:0:0 | & | -| main.rs:2182:13:2182:13 | s | &T | {EXTERNAL LOCATION} | str | -| main.rs:2182:18:2182:25 | strings1 | | file://:0:0:0:0 | [] | -| main.rs:2182:18:2182:25 | strings1 | [T;...] | file://:0:0:0:0 | & | -| main.rs:2182:18:2182:25 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | -| main.rs:2184:13:2184:20 | strings2 | | file://:0:0:0:0 | [] | -| main.rs:2184:13:2184:20 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2185:9:2189:9 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2185:9:2189:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2186:13:2186:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2186:26:2186:30 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2186:26:2186:30 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2187:13:2187:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2187:26:2187:30 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2187:26:2187:30 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2188:13:2188:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2188:26:2188:30 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2188:26:2188:30 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2190:13:2190:13 | s | | {EXTERNAL LOCATION} | String | -| main.rs:2190:18:2190:25 | strings2 | | file://:0:0:0:0 | [] | -| main.rs:2190:18:2190:25 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2192:13:2192:20 | strings3 | | file://:0:0:0:0 | & | -| main.rs:2192:13:2192:20 | strings3 | &T | file://:0:0:0:0 | [] | -| main.rs:2192:13:2192:20 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2193:9:2197:9 | &... | | file://:0:0:0:0 | & | -| main.rs:2193:9:2197:9 | &... | &T | file://:0:0:0:0 | [] | -| main.rs:2193:9:2197:9 | &... | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2193:10:2197:9 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2193:10:2197:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2194:13:2194:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2194:26:2194:30 | "foo" | | file://:0:0:0:0 | & | -| main.rs:2194:26:2194:30 | "foo" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2195:13:2195:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2195:26:2195:30 | "bar" | | file://:0:0:0:0 | & | -| main.rs:2195:26:2195:30 | "bar" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2196:13:2196:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2196:26:2196:30 | "baz" | | file://:0:0:0:0 | & | -| main.rs:2196:26:2196:30 | "baz" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2198:13:2198:13 | s | | {EXTERNAL LOCATION} | Item | -| main.rs:2198:13:2198:13 | s | | file://:0:0:0:0 | & | -| main.rs:2198:13:2198:13 | s | &T | {EXTERNAL LOCATION} | String | -| main.rs:2198:18:2198:25 | strings3 | | file://:0:0:0:0 | & | -| main.rs:2198:18:2198:25 | strings3 | &T | file://:0:0:0:0 | [] | -| main.rs:2198:18:2198:25 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | -| main.rs:2200:13:2200:21 | callables | | file://:0:0:0:0 | [] | -| main.rs:2200:13:2200:21 | callables | [T;...] | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2200:25:2200:81 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2200:25:2200:81 | [...] | [T;...] | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2200:26:2200:42 | ...::new(...) | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2200:45:2200:61 | ...::new(...) | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2200:64:2200:80 | ...::new(...) | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2201:13:2201:13 | c | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2202:12:2202:20 | callables | | file://:0:0:0:0 | [] | -| main.rs:2202:12:2202:20 | callables | [T;...] | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2204:17:2204:22 | result | | {EXTERNAL LOCATION} | i64 | -| main.rs:2204:26:2204:26 | c | | main.rs:2148:5:2148:24 | MyCallable | -| main.rs:2204:26:2204:33 | c.call() | | {EXTERNAL LOCATION} | i64 | -| main.rs:2209:13:2209:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2209:13:2209:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2209:18:2209:18 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2209:18:2209:22 | 0..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2209:18:2209:22 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2209:21:2209:22 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2210:13:2210:13 | u | | {EXTERNAL LOCATION} | Range | -| main.rs:2210:13:2210:13 | u | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2210:13:2210:13 | u | Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2210:18:2210:26 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2210:18:2210:26 | [...] | [T;...] | {EXTERNAL LOCATION} | Range | -| main.rs:2210:18:2210:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2210:18:2210:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2210:19:2210:21 | 0u8 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2210:19:2210:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2210:19:2210:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2210:19:2210:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2210:19:2210:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | -| main.rs:2210:24:2210:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2210:24:2210:25 | 10 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2211:13:2211:17 | range | | {EXTERNAL LOCATION} | Range | -| main.rs:2211:13:2211:17 | range | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2211:21:2211:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2211:21:2211:25 | 0..10 | | {EXTERNAL LOCATION} | Range | -| main.rs:2211:21:2211:25 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2211:24:2211:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2212:13:2212:13 | i | | {EXTERNAL LOCATION} | Item | -| main.rs:2212:13:2212:13 | i | | {EXTERNAL LOCATION} | i32 | -| main.rs:2212:18:2212:22 | range | | {EXTERNAL LOCATION} | Range | -| main.rs:2212:18:2212:22 | range | Idx | {EXTERNAL LOCATION} | i32 | -| main.rs:2214:13:2214:18 | range1 | | {EXTERNAL LOCATION} | Range | -| main.rs:2214:13:2214:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2215:9:2218:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | -| main.rs:2215:9:2218:9 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2216:20:2216:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2217:18:2217:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2219:13:2219:13 | u | | {EXTERNAL LOCATION} | Item | -| main.rs:2219:13:2219:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2219:18:2219:23 | range1 | | {EXTERNAL LOCATION} | Range | -| main.rs:2219:18:2219:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 | -| main.rs:2223:26:2223:26 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2223:29:2223:29 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2223:32:2223:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2226:13:2226:18 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2226:13:2226:18 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2226:13:2226:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2226:32:2226:43 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2226:32:2226:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2226:32:2226:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2226:32:2226:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2226:32:2226:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2226:32:2226:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2226:33:2226:36 | 1u16 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2226:33:2226:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2226:39:2226:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2226:39:2226:39 | 2 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2226:42:2226:42 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2226:42:2226:42 | 3 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2227:13:2227:13 | u | | {EXTERNAL LOCATION} | Vec | -| main.rs:2227:13:2227:13 | u | | {EXTERNAL LOCATION} | u16 | -| main.rs:2227:13:2227:13 | u | | file://:0:0:0:0 | & | -| main.rs:2227:13:2227:13 | u | A | {EXTERNAL LOCATION} | Global | -| main.rs:2227:13:2227:13 | u | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2227:18:2227:23 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2227:18:2227:23 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2227:18:2227:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2229:22:2229:33 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2229:22:2229:33 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2229:22:2229:33 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | -| main.rs:2229:23:2229:26 | 1u16 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2229:23:2229:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2229:29:2229:29 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2229:29:2229:29 | 2 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2229:32:2229:32 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2229:32:2229:32 | 3 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2232:13:2232:17 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2232:13:2232:17 | vals5 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2232:13:2232:17 | vals5 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2232:13:2232:17 | vals5 | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2232:21:2232:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2232:21:2232:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2232:21:2232:43 | ...::from(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2232:21:2232:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2232:31:2232:42 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2232:31:2232:42 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2232:31:2232:42 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | -| main.rs:2232:32:2232:35 | 1u32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2232:32:2232:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2232:38:2232:38 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2232:38:2232:38 | 2 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2232:41:2232:41 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2232:41:2232:41 | 3 | | {EXTERNAL LOCATION} | u32 | -| main.rs:2233:13:2233:13 | u | | {EXTERNAL LOCATION} | Vec | -| main.rs:2233:13:2233:13 | u | | {EXTERNAL LOCATION} | i32 | -| main.rs:2233:13:2233:13 | u | | {EXTERNAL LOCATION} | u32 | -| main.rs:2233:13:2233:13 | u | | file://:0:0:0:0 | & | -| main.rs:2233:13:2233:13 | u | A | {EXTERNAL LOCATION} | Global | -| main.rs:2233:13:2233:13 | u | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2233:13:2233:13 | u | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2233:18:2233:22 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2233:18:2233:22 | vals5 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2233:18:2233:22 | vals5 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2233:18:2233:22 | vals5 | T | {EXTERNAL LOCATION} | u32 | -| main.rs:2235:13:2235:17 | vals6 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2235:13:2235:17 | vals6 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2235:13:2235:17 | vals6 | T | file://:0:0:0:0 | & | -| main.rs:2235:13:2235:17 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2235:32:2235:43 | [...] | | file://:0:0:0:0 | [] | -| main.rs:2235:32:2235:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | -| main.rs:2235:32:2235:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u64 | -| main.rs:2235:32:2235:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2235:32:2235:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2235:32:2235:60 | ... .collect() | T | file://:0:0:0:0 | & | -| main.rs:2235:32:2235:60 | ... .collect() | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2235:33:2235:36 | 1u64 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2235:33:2235:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2235:39:2235:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2235:39:2235:39 | 2 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2235:42:2235:42 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2235:42:2235:42 | 3 | | {EXTERNAL LOCATION} | u64 | -| main.rs:2236:13:2236:13 | u | | {EXTERNAL LOCATION} | Vec | -| main.rs:2236:13:2236:13 | u | | file://:0:0:0:0 | & | -| main.rs:2236:13:2236:13 | u | &T | {EXTERNAL LOCATION} | u64 | -| main.rs:2236:13:2236:13 | u | A | {EXTERNAL LOCATION} | Global | -| main.rs:2236:13:2236:13 | u | T | file://:0:0:0:0 | & | -| main.rs:2236:13:2236:13 | u | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2236:18:2236:22 | vals6 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2236:18:2236:22 | vals6 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2236:18:2236:22 | vals6 | T | file://:0:0:0:0 | & | -| main.rs:2236:18:2236:22 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | -| main.rs:2238:17:2238:21 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2238:17:2238:21 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2238:17:2238:21 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2238:25:2238:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2238:25:2238:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2238:25:2238:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2239:9:2239:13 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2239:9:2239:13 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2239:9:2239:13 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2239:20:2239:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | -| main.rs:2240:13:2240:13 | u | | {EXTERNAL LOCATION} | Vec | -| main.rs:2240:13:2240:13 | u | | {EXTERNAL LOCATION} | u8 | -| main.rs:2240:13:2240:13 | u | | file://:0:0:0:0 | & | -| main.rs:2240:13:2240:13 | u | A | {EXTERNAL LOCATION} | Global | -| main.rs:2240:13:2240:13 | u | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2240:18:2240:22 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2240:18:2240:22 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2240:18:2240:22 | vals7 | T | {EXTERNAL LOCATION} | u8 | -| main.rs:2242:33:2242:33 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2242:36:2242:36 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2242:45:2242:45 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2242:48:2242:48 | 4 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2249:17:2249:20 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2249:17:2249:20 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2249:17:2249:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2249:17:2249:20 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2249:17:2249:20 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2249:17:2249:20 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2249:17:2249:20 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2249:24:2249:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2249:24:2249:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2249:24:2249:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2249:24:2249:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | -| main.rs:2249:24:2249:55 | ...::new(...) | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2249:24:2249:55 | ...::new(...) | V.T | file://:0:0:0:0 | & | -| main.rs:2249:24:2249:55 | ...::new(...) | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2250:9:2250:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2250:9:2250:12 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2250:9:2250:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2250:9:2250:12 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2250:9:2250:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2250:9:2250:12 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2250:9:2250:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2250:9:2250:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2250:9:2250:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2250:9:2250:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2250:9:2250:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | -| main.rs:2250:9:2250:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2250:21:2250:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2250:24:2250:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2250:24:2250:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2250:24:2250:38 | ...::new(...) | T | file://:0:0:0:0 | & | -| main.rs:2250:24:2250:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2250:33:2250:37 | "one" | | file://:0:0:0:0 | & | -| main.rs:2250:33:2250:37 | "one" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2251:9:2251:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2251:9:2251:12 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2251:9:2251:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2251:9:2251:12 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2251:9:2251:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2251:9:2251:12 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2251:9:2251:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2251:9:2251:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2251:9:2251:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2251:9:2251:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2251:9:2251:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | -| main.rs:2251:9:2251:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2251:21:2251:21 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2251:24:2251:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2251:24:2251:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2251:24:2251:38 | ...::new(...) | T | file://:0:0:0:0 | & | -| main.rs:2251:24:2251:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2251:33:2251:37 | "two" | | file://:0:0:0:0 | & | -| main.rs:2251:33:2251:37 | "two" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2252:13:2252:15 | key | | {EXTERNAL LOCATION} | Item | -| main.rs:2252:13:2252:15 | key | | file://:0:0:0:0 | & | -| main.rs:2252:13:2252:15 | key | &T | {EXTERNAL LOCATION} | i32 | -| main.rs:2252:20:2252:23 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2252:20:2252:23 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2252:20:2252:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2252:20:2252:23 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2252:20:2252:23 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2252:20:2252:23 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2252:20:2252:23 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2252:20:2252:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys | -| main.rs:2252:20:2252:30 | map1.keys() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2252:20:2252:30 | map1.keys() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2252:20:2252:30 | map1.keys() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2252:20:2252:30 | map1.keys() | V.T | file://:0:0:0:0 | & | -| main.rs:2252:20:2252:30 | map1.keys() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2253:13:2253:17 | value | | {EXTERNAL LOCATION} | Item | -| main.rs:2253:13:2253:17 | value | | file://:0:0:0:0 | & | -| main.rs:2253:13:2253:17 | value | &T | {EXTERNAL LOCATION} | Box | -| main.rs:2253:13:2253:17 | value | &T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2253:13:2253:17 | value | &T.T | file://:0:0:0:0 | & | -| main.rs:2253:13:2253:17 | value | &T.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2253:22:2253:25 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2253:22:2253:25 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2253:22:2253:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2253:22:2253:25 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2253:22:2253:25 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2253:22:2253:25 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2253:22:2253:25 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2253:22:2253:34 | map1.values() | | {EXTERNAL LOCATION} | Values | -| main.rs:2253:22:2253:34 | map1.values() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2253:22:2253:34 | map1.values() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2253:22:2253:34 | map1.values() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2253:22:2253:34 | map1.values() | V.T | file://:0:0:0:0 | & | -| main.rs:2253:22:2253:34 | map1.values() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2254:13:2254:24 | TuplePat | | {EXTERNAL LOCATION} | Item | -| main.rs:2254:29:2254:32 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2254:29:2254:32 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2254:29:2254:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2254:29:2254:32 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2254:29:2254:32 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2254:29:2254:32 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2254:29:2254:32 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2254:29:2254:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter | -| main.rs:2254:29:2254:39 | map1.iter() | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2254:29:2254:39 | map1.iter() | V | {EXTERNAL LOCATION} | Box | -| main.rs:2254:29:2254:39 | map1.iter() | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2254:29:2254:39 | map1.iter() | V.T | file://:0:0:0:0 | & | -| main.rs:2254:29:2254:39 | map1.iter() | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2255:13:2255:24 | TuplePat | | {EXTERNAL LOCATION} | Item | -| main.rs:2255:29:2255:33 | &map1 | | file://:0:0:0:0 | & | -| main.rs:2255:29:2255:33 | &map1 | &T | {EXTERNAL LOCATION} | HashMap | -| main.rs:2255:29:2255:33 | &map1 | &T.K | {EXTERNAL LOCATION} | i32 | -| main.rs:2255:29:2255:33 | &map1 | &T.S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2255:29:2255:33 | &map1 | &T.V | {EXTERNAL LOCATION} | Box | -| main.rs:2255:29:2255:33 | &map1 | &T.V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2255:29:2255:33 | &map1 | &T.V.T | file://:0:0:0:0 | & | -| main.rs:2255:29:2255:33 | &map1 | &T.V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2255:30:2255:33 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2255:30:2255:33 | map1 | K | {EXTERNAL LOCATION} | i32 | -| main.rs:2255:30:2255:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2255:30:2255:33 | map1 | V | {EXTERNAL LOCATION} | Box | -| main.rs:2255:30:2255:33 | map1 | V.A | {EXTERNAL LOCATION} | Global | -| main.rs:2255:30:2255:33 | map1 | V.T | file://:0:0:0:0 | & | -| main.rs:2255:30:2255:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | -| main.rs:2259:17:2259:17 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:2259:17:2259:17 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2259:26:2259:26 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2259:26:2259:26 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2261:23:2261:23 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:2261:23:2261:23 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2261:23:2261:28 | ... < ... | | {EXTERNAL LOCATION} | bool | -| main.rs:2261:27:2261:28 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2261:27:2261:28 | 10 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2263:13:2263:13 | a | | {EXTERNAL LOCATION} | i32 | -| main.rs:2263:13:2263:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2263:13:2263:18 | ... += ... | | file://:0:0:0:0 | () | -| main.rs:2263:18:2263:18 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2277:40:2279:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2277:40:2279:9 | { ... } | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2277:40:2279:9 | { ... } | T.T | main.rs:2276:10:2276:19 | T | -| main.rs:2278:13:2278:16 | None | | {EXTERNAL LOCATION} | Option | -| main.rs:2278:13:2278:16 | None | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2278:13:2278:16 | None | T.T | main.rs:2276:10:2276:19 | T | -| main.rs:2281:30:2283:9 | { ... } | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2281:30:2283:9 | { ... } | T | main.rs:2276:10:2276:19 | T | -| main.rs:2282:13:2282:28 | S1(...) | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2282:13:2282:28 | S1(...) | T | main.rs:2276:10:2276:19 | T | -| main.rs:2282:16:2282:27 | ...::default(...) | | main.rs:2276:10:2276:19 | T | -| main.rs:2285:19:2285:22 | SelfParam | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2285:19:2285:22 | SelfParam | T | main.rs:2276:10:2276:19 | T | -| main.rs:2285:33:2287:9 | { ... } | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2285:33:2287:9 | { ... } | T | main.rs:2276:10:2276:19 | T | -| main.rs:2286:13:2286:16 | self | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2286:13:2286:16 | self | T | main.rs:2276:10:2276:19 | T | -| main.rs:2298:15:2298:15 | x | | main.rs:2298:12:2298:12 | T | -| main.rs:2298:26:2300:5 | { ... } | | main.rs:2298:12:2298:12 | T | -| main.rs:2299:9:2299:9 | x | | main.rs:2298:12:2298:12 | T | -| main.rs:2303:13:2303:14 | x1 | | {EXTERNAL LOCATION} | Option | -| main.rs:2303:13:2303:14 | x1 | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2303:13:2303:14 | x1 | T.T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2303:34:2303:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2303:34:2303:48 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2303:34:2303:48 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2304:13:2304:14 | x2 | | {EXTERNAL LOCATION} | Option | -| main.rs:2304:13:2304:14 | x2 | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2304:13:2304:14 | x2 | T.T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2304:18:2304:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2304:18:2304:38 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2304:18:2304:38 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2305:13:2305:14 | x3 | | {EXTERNAL LOCATION} | Option | -| main.rs:2305:13:2305:14 | x3 | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2305:13:2305:14 | x3 | T.T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2305:18:2305:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2305:18:2305:32 | ...::assoc_fun(...) | T | main.rs:2271:5:2271:20 | S1 | -| main.rs:2305:18:2305:32 | ...::assoc_fun(...) | T.T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2306:13:2306:14 | x4 | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2306:13:2306:14 | x4 | T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2306:18:2306:48 | ...::method(...) | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2306:18:2306:48 | ...::method(...) | T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2306:35:2306:47 | ...::default(...) | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2306:35:2306:47 | ...::default(...) | T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2307:13:2307:14 | x5 | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2307:13:2307:14 | x5 | T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2307:18:2307:42 | ...::method(...) | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2307:18:2307:42 | ...::method(...) | T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2307:29:2307:41 | ...::default(...) | | main.rs:2271:5:2271:20 | S1 | -| main.rs:2307:29:2307:41 | ...::default(...) | T | main.rs:2273:5:2274:14 | S2 | -| main.rs:2308:13:2308:14 | x6 | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2308:13:2308:14 | x6 | T4 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2308:18:2308:45 | S4::<...>(...) | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2308:18:2308:45 | S4::<...>(...) | T4 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2308:27:2308:44 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 | -| main.rs:2309:13:2309:14 | x7 | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2309:13:2309:14 | x7 | T4 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2309:18:2309:23 | S4(...) | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2309:18:2309:23 | S4(...) | T4 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2309:21:2309:22 | S2 | | main.rs:2273:5:2274:14 | S2 | -| main.rs:2310:13:2310:14 | x8 | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2310:13:2310:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 | -| main.rs:2310:18:2310:22 | S4(...) | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2310:18:2310:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | -| main.rs:2310:21:2310:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2311:13:2311:14 | x9 | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2311:13:2311:14 | x9 | T4 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2311:18:2311:34 | S4(...) | | main.rs:2292:5:2292:27 | S4 | -| main.rs:2311:18:2311:34 | S4(...) | T4 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2311:21:2311:33 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 | -| main.rs:2312:13:2312:15 | x10 | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2312:13:2312:15 | x10 | T5 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2312:19:2315:9 | S5::<...> {...} | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2312:19:2315:9 | S5::<...> {...} | T5 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2314:20:2314:37 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 | -| main.rs:2316:13:2316:15 | x11 | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2316:13:2316:15 | x11 | T5 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2316:19:2316:34 | S5 {...} | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2316:19:2316:34 | S5 {...} | T5 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2316:31:2316:32 | S2 | | main.rs:2273:5:2274:14 | S2 | -| main.rs:2317:13:2317:15 | x12 | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2317:13:2317:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:2317:19:2317:33 | S5 {...} | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2317:19:2317:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | -| main.rs:2317:31:2317:31 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2318:13:2318:15 | x13 | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2318:13:2318:15 | x13 | T5 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2318:19:2321:9 | S5 {...} | | main.rs:2294:5:2296:5 | S5 | -| main.rs:2318:19:2321:9 | S5 {...} | T5 | main.rs:2273:5:2274:14 | S2 | -| main.rs:2320:20:2320:32 | ...::default(...) | | main.rs:2273:5:2274:14 | S2 | -| main.rs:2322:13:2322:15 | x14 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2322:19:2322:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2322:30:2322:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2331:14:2331:18 | S1 {...} | | main.rs:2327:5:2327:16 | S1 | -| main.rs:2331:21:2331:25 | S1 {...} | | main.rs:2327:5:2327:16 | S1 | -| main.rs:2333:16:2333:19 | SelfParam | | main.rs:2327:5:2327:16 | S1 | -| main.rs:2357:13:2357:23 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2357:13:2357:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2357:13:2357:23 | boxed_value | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2357:27:2357:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2357:27:2357:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2357:27:2357:42 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2357:36:2357:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2360:15:2360:25 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2360:15:2360:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2360:15:2360:25 | boxed_value | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2361:13:2361:19 | box 100 | | {EXTERNAL LOCATION} | Box | -| main.rs:2361:13:2361:19 | box 100 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2361:13:2361:19 | box 100 | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2361:17:2361:19 | 100 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2362:26:2362:36 | "Boxed 100\\n" | | file://:0:0:0:0 | & | -| main.rs:2362:26:2362:36 | "Boxed 100\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2362:26:2362:36 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2362:26:2362:36 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2364:13:2364:17 | box ... | | {EXTERNAL LOCATION} | Box | -| main.rs:2364:13:2364:17 | box ... | A | {EXTERNAL LOCATION} | Global | -| main.rs:2364:13:2364:17 | box ... | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2366:26:2366:42 | "Boxed value: {}\\n" | | file://:0:0:0:0 | & | -| main.rs:2366:26:2366:42 | "Boxed value: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2366:26:2366:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2366:26:2366:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2371:13:2371:22 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2371:13:2371:22 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2371:13:2371:22 | nested_box | T | {EXTERNAL LOCATION} | Box | -| main.rs:2371:13:2371:22 | nested_box | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2371:13:2371:22 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2371:26:2371:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2371:26:2371:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2371:26:2371:50 | ...::new(...) | T | {EXTERNAL LOCATION} | Box | -| main.rs:2371:26:2371:50 | ...::new(...) | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2371:26:2371:50 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2371:35:2371:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2371:35:2371:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2371:35:2371:49 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2371:44:2371:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2372:15:2372:24 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2372:15:2372:24 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2372:15:2372:24 | nested_box | T | {EXTERNAL LOCATION} | Box | -| main.rs:2372:15:2372:24 | nested_box | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2372:15:2372:24 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2373:13:2373:21 | box ... | | {EXTERNAL LOCATION} | Box | -| main.rs:2373:13:2373:21 | box ... | A | {EXTERNAL LOCATION} | Global | -| main.rs:2373:13:2373:21 | box ... | T | {EXTERNAL LOCATION} | Box | -| main.rs:2373:13:2373:21 | box ... | T.A | {EXTERNAL LOCATION} | Global | -| main.rs:2373:13:2373:21 | box ... | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2375:26:2375:43 | "Nested boxed: {}\\n" | | file://:0:0:0:0 | & | -| main.rs:2375:26:2375:43 | "Nested boxed: {}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2375:26:2375:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2375:26:2375:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2387:16:2387:20 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2387:16:2387:20 | SelfParam | &T | main.rs:2382:5:2384:5 | Row | -| main.rs:2387:30:2389:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2388:13:2388:16 | self | | file://:0:0:0:0 | & | -| main.rs:2388:13:2388:16 | self | &T | main.rs:2382:5:2384:5 | Row | -| main.rs:2388:13:2388:21 | self.data | | {EXTERNAL LOCATION} | i64 | -| main.rs:2397:26:2399:9 | { ... } | | main.rs:2392:5:2394:5 | Table | -| main.rs:2398:13:2398:38 | Table {...} | | main.rs:2392:5:2394:5 | Table | -| main.rs:2398:27:2398:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2398:27:2398:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2398:27:2398:36 | ...::new(...) | T | main.rs:2382:5:2384:5 | Row | -| main.rs:2401:23:2401:27 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2401:23:2401:27 | SelfParam | &T | main.rs:2392:5:2394:5 | Table | -| main.rs:2401:30:2401:37 | property | | main.rs:2401:40:2401:59 | ImplTraitTypeRepr | -| main.rs:2401:69:2403:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2401:69:2403:9 | { ... } | | {EXTERNAL LOCATION} | i64 | -| main.rs:2402:13:2402:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2402:13:2402:13 | 0 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2407:9:2407:15 | Some(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2407:9:2407:15 | Some(...) | T | {EXTERNAL LOCATION} | i32 | -| main.rs:2407:9:2410:10 | ... .map(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2407:14:2407:14 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2409:22:2409:26 | "{x}\\n" | | file://:0:0:0:0 | & | -| main.rs:2409:22:2409:26 | "{x}\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2409:22:2409:26 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2409:22:2409:26 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2412:13:2412:17 | table | | main.rs:2392:5:2394:5 | Table | -| main.rs:2412:21:2412:32 | ...::new(...) | | main.rs:2392:5:2394:5 | Table | -| main.rs:2413:13:2413:18 | result | | {EXTERNAL LOCATION} | i64 | -| main.rs:2413:22:2413:26 | table | | main.rs:2392:5:2394:5 | Table | -| main.rs:2413:22:2417:14 | table.count_with(...) | | {EXTERNAL LOCATION} | i64 | -| main.rs:2416:21:2416:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2423:5:2423:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2424:5:2424:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2424:20:2424:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2424:41:2424:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2440:5:2440:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1650:13:1650:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1650:13:1650:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1650:13:1650:27 | ... &= ... | | file://:0:0:0:0 | () | +| main.rs:1650:23:1650:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1650:23:1650:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1656:18:1656:21 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1656:24:1656:26 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1656:43:1661:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1657:13:1660:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1658:20:1658:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1658:20:1658:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1658:20:1658:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1658:29:1658:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1658:29:1658:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1659:20:1659:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1659:20:1659:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1659:20:1659:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1659:29:1659:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1659:29:1659:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1665:25:1665:33 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1665:25:1665:33 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1665:36:1665:38 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1666:13:1666:16 | self | | file://:0:0:0:0 | & | +| main.rs:1666:13:1666:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1666:13:1666:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1666:13:1666:27 | ... \|= ... | | file://:0:0:0:0 | () | +| main.rs:1666:23:1666:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1666:23:1666:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1667:13:1667:16 | self | | file://:0:0:0:0 | & | +| main.rs:1667:13:1667:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1667:13:1667:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1667:13:1667:27 | ... \|= ... | | file://:0:0:0:0 | () | +| main.rs:1667:23:1667:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1667:23:1667:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1673:19:1673:22 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1673:25:1673:27 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1673:44:1678:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1674:13:1677:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1675:20:1675:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1675:20:1675:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1675:20:1675:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1675:29:1675:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1675:29:1675:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1676:20:1676:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1676:20:1676:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1676:20:1676:33 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1676:29:1676:31 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1676:29:1676:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1682:26:1682:34 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1682:26:1682:34 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1682:37:1682:39 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1683:13:1683:16 | self | | file://:0:0:0:0 | & | +| main.rs:1683:13:1683:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1683:13:1683:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1683:13:1683:27 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1683:23:1683:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1683:23:1683:27 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1684:13:1684:16 | self | | file://:0:0:0:0 | & | +| main.rs:1684:13:1684:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1684:13:1684:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1684:13:1684:27 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1684:23:1684:25 | rhs | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1684:23:1684:27 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1690:16:1690:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1690:22:1690:24 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1690:40:1695:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1691:13:1694:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1692:20:1692:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1692:20:1692:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1692:20:1692:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1692:30:1692:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1693:20:1693:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1693:20:1693:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1693:20:1693:32 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1693:30:1693:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1699:23:1699:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1699:23:1699:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1699:34:1699:36 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1700:13:1700:16 | self | | file://:0:0:0:0 | & | +| main.rs:1700:13:1700:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1700:13:1700:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1700:13:1700:26 | ... <<= ... | | file://:0:0:0:0 | () | +| main.rs:1700:24:1700:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1701:13:1701:16 | self | | file://:0:0:0:0 | & | +| main.rs:1701:13:1701:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1701:13:1701:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1701:13:1701:26 | ... <<= ... | | file://:0:0:0:0 | () | +| main.rs:1701:24:1701:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1707:16:1707:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1707:22:1707:24 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1707:40:1712:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1708:13:1711:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1709:20:1709:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1709:20:1709:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1709:20:1709:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1709:30:1709:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1710:20:1710:23 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1710:20:1710:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1710:20:1710:32 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1710:30:1710:32 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1716:23:1716:31 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1716:23:1716:31 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1716:34:1716:36 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1717:13:1717:16 | self | | file://:0:0:0:0 | & | +| main.rs:1717:13:1717:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1717:13:1717:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1717:13:1717:26 | ... >>= ... | | file://:0:0:0:0 | () | +| main.rs:1717:24:1717:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1718:13:1718:16 | self | | file://:0:0:0:0 | & | +| main.rs:1718:13:1718:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1718:13:1718:18 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1718:13:1718:26 | ... >>= ... | | file://:0:0:0:0 | () | +| main.rs:1718:24:1718:26 | rhs | | {EXTERNAL LOCATION} | u32 | +| main.rs:1724:16:1724:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1724:30:1729:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1725:13:1728:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1726:20:1726:26 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1726:21:1726:24 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1726:21:1726:26 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1727:20:1727:26 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1727:21:1727:24 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1727:21:1727:26 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1734:16:1734:19 | SelfParam | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1734:30:1739:9 | { ... } | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1735:13:1738:13 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1736:20:1736:26 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1736:21:1736:24 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1736:21:1736:26 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1737:20:1737:26 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1737:21:1737:24 | self | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1737:21:1737:26 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1743:15:1743:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1743:15:1743:19 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1743:22:1743:26 | other | | file://:0:0:0:0 | & | +| main.rs:1743:22:1743:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1743:44:1745:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1744:13:1744:16 | self | | file://:0:0:0:0 | & | +| main.rs:1744:13:1744:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1744:13:1744:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1744:13:1744:29 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1744:13:1744:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1744:23:1744:27 | other | | file://:0:0:0:0 | & | +| main.rs:1744:23:1744:27 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1744:23:1744:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1744:34:1744:37 | self | | file://:0:0:0:0 | & | +| main.rs:1744:34:1744:37 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1744:34:1744:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1744:34:1744:50 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1744:44:1744:48 | other | | file://:0:0:0:0 | & | +| main.rs:1744:44:1744:48 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1744:44:1744:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1747:15:1747:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1747:15:1747:19 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1747:22:1747:26 | other | | file://:0:0:0:0 | & | +| main.rs:1747:22:1747:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1747:44:1749:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1748:13:1748:16 | self | | file://:0:0:0:0 | & | +| main.rs:1748:13:1748:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1748:13:1748:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1748:13:1748:29 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1748:13:1748:50 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1748:23:1748:27 | other | | file://:0:0:0:0 | & | +| main.rs:1748:23:1748:27 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1748:23:1748:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1748:34:1748:37 | self | | file://:0:0:0:0 | & | +| main.rs:1748:34:1748:37 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1748:34:1748:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1748:34:1748:50 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1748:44:1748:48 | other | | file://:0:0:0:0 | & | +| main.rs:1748:44:1748:48 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1748:44:1748:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1753:24:1753:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1753:24:1753:28 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1753:31:1753:35 | other | | file://:0:0:0:0 | & | +| main.rs:1753:31:1753:35 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1753:75:1755:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:1753:75:1755:9 | { ... } | T | {EXTERNAL LOCATION} | Ordering | +| main.rs:1754:13:1754:29 | (...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:13:1754:63 | ... .partial_cmp(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:1754:13:1754:63 | ... .partial_cmp(...) | T | {EXTERNAL LOCATION} | Ordering | +| main.rs:1754:14:1754:17 | self | | file://:0:0:0:0 | & | +| main.rs:1754:14:1754:17 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1754:14:1754:19 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:14:1754:28 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:23:1754:26 | self | | file://:0:0:0:0 | & | +| main.rs:1754:23:1754:26 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1754:23:1754:28 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:43:1754:62 | &... | | file://:0:0:0:0 | & | +| main.rs:1754:43:1754:62 | &... | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:44:1754:62 | (...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:45:1754:49 | other | | file://:0:0:0:0 | & | +| main.rs:1754:45:1754:49 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1754:45:1754:51 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:45:1754:61 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1754:55:1754:59 | other | | file://:0:0:0:0 | & | +| main.rs:1754:55:1754:59 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1754:55:1754:61 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1757:15:1757:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1757:15:1757:19 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1757:22:1757:26 | other | | file://:0:0:0:0 | & | +| main.rs:1757:22:1757:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1757:44:1759:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1758:13:1758:16 | self | | file://:0:0:0:0 | & | +| main.rs:1758:13:1758:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1758:13:1758:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1758:13:1758:28 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1758:13:1758:48 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1758:22:1758:26 | other | | file://:0:0:0:0 | & | +| main.rs:1758:22:1758:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1758:22:1758:28 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1758:33:1758:36 | self | | file://:0:0:0:0 | & | +| main.rs:1758:33:1758:36 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1758:33:1758:38 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1758:33:1758:48 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1758:42:1758:46 | other | | file://:0:0:0:0 | & | +| main.rs:1758:42:1758:46 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1758:42:1758:48 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1761:15:1761:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1761:15:1761:19 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1761:22:1761:26 | other | | file://:0:0:0:0 | & | +| main.rs:1761:22:1761:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1761:44:1763:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1762:13:1762:16 | self | | file://:0:0:0:0 | & | +| main.rs:1762:13:1762:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1762:13:1762:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1762:13:1762:29 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1762:13:1762:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1762:23:1762:27 | other | | file://:0:0:0:0 | & | +| main.rs:1762:23:1762:27 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1762:23:1762:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1762:34:1762:37 | self | | file://:0:0:0:0 | & | +| main.rs:1762:34:1762:37 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1762:34:1762:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1762:34:1762:50 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1762:44:1762:48 | other | | file://:0:0:0:0 | & | +| main.rs:1762:44:1762:48 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1762:44:1762:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1765:15:1765:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1765:15:1765:19 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1765:22:1765:26 | other | | file://:0:0:0:0 | & | +| main.rs:1765:22:1765:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1765:44:1767:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1766:13:1766:16 | self | | file://:0:0:0:0 | & | +| main.rs:1766:13:1766:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1766:13:1766:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1766:13:1766:28 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1766:13:1766:48 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1766:22:1766:26 | other | | file://:0:0:0:0 | & | +| main.rs:1766:22:1766:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1766:22:1766:28 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1766:33:1766:36 | self | | file://:0:0:0:0 | & | +| main.rs:1766:33:1766:36 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1766:33:1766:38 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1766:33:1766:48 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1766:42:1766:46 | other | | file://:0:0:0:0 | & | +| main.rs:1766:42:1766:46 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1766:42:1766:48 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1769:15:1769:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1769:15:1769:19 | SelfParam | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1769:22:1769:26 | other | | file://:0:0:0:0 | & | +| main.rs:1769:22:1769:26 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1769:44:1771:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:1770:13:1770:16 | self | | file://:0:0:0:0 | & | +| main.rs:1770:13:1770:16 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1770:13:1770:18 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1770:13:1770:29 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1770:13:1770:50 | ... && ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1770:23:1770:27 | other | | file://:0:0:0:0 | & | +| main.rs:1770:23:1770:27 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1770:23:1770:29 | other.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1770:34:1770:37 | self | | file://:0:0:0:0 | & | +| main.rs:1770:34:1770:37 | self | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1770:34:1770:39 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1770:34:1770:50 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1770:44:1770:48 | other | | file://:0:0:0:0 | & | +| main.rs:1770:44:1770:48 | other | &T | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1770:44:1770:50 | other.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1777:13:1777:18 | i64_eq | | {EXTERNAL LOCATION} | bool | +| main.rs:1777:22:1777:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1777:23:1777:26 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1777:23:1777:34 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1777:31:1777:34 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1778:13:1778:18 | i64_ne | | {EXTERNAL LOCATION} | bool | +| main.rs:1778:22:1778:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1778:23:1778:26 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1778:23:1778:34 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1778:31:1778:34 | 4i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1779:13:1779:18 | i64_lt | | {EXTERNAL LOCATION} | bool | +| main.rs:1779:22:1779:34 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1779:23:1779:26 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1779:23:1779:33 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1779:30:1779:33 | 6i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1780:13:1780:18 | i64_le | | {EXTERNAL LOCATION} | bool | +| main.rs:1780:22:1780:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1780:23:1780:26 | 7i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1780:23:1780:34 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1780:31:1780:34 | 8i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1781:13:1781:18 | i64_gt | | {EXTERNAL LOCATION} | bool | +| main.rs:1781:22:1781:35 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1781:23:1781:26 | 9i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1781:23:1781:34 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1781:30:1781:34 | 10i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1782:13:1782:18 | i64_ge | | {EXTERNAL LOCATION} | bool | +| main.rs:1782:22:1782:37 | (...) | | {EXTERNAL LOCATION} | bool | +| main.rs:1782:23:1782:27 | 11i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1782:23:1782:36 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1782:32:1782:36 | 12i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1785:13:1785:19 | i64_add | | {EXTERNAL LOCATION} | i64 | +| main.rs:1785:23:1785:27 | 13i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1785:23:1785:35 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1785:31:1785:35 | 14i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1786:13:1786:19 | i64_sub | | {EXTERNAL LOCATION} | i64 | +| main.rs:1786:23:1786:27 | 15i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1786:23:1786:35 | ... - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1786:31:1786:35 | 16i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1787:13:1787:19 | i64_mul | | {EXTERNAL LOCATION} | i64 | +| main.rs:1787:23:1787:27 | 17i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1787:23:1787:35 | ... * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1787:31:1787:35 | 18i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1788:13:1788:19 | i64_div | | {EXTERNAL LOCATION} | i64 | +| main.rs:1788:23:1788:27 | 19i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1788:23:1788:35 | ... / ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1788:31:1788:35 | 20i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1789:13:1789:19 | i64_rem | | {EXTERNAL LOCATION} | i64 | +| main.rs:1789:23:1789:27 | 21i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1789:23:1789:35 | ... % ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1789:31:1789:35 | 22i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1792:17:1792:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1792:34:1792:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1793:9:1793:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1793:9:1793:31 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:1793:27:1793:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1795:17:1795:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1795:34:1795:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1796:9:1796:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1796:9:1796:31 | ... -= ... | | file://:0:0:0:0 | () | +| main.rs:1796:27:1796:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1798:17:1798:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1798:34:1798:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1799:9:1799:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1799:9:1799:31 | ... *= ... | | file://:0:0:0:0 | () | +| main.rs:1799:27:1799:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1801:17:1801:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1801:34:1801:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1802:9:1802:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1802:9:1802:31 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1802:27:1802:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1804:17:1804:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1804:34:1804:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1805:9:1805:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1805:9:1805:31 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1805:27:1805:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1808:13:1808:22 | i64_bitand | | {EXTERNAL LOCATION} | i64 | +| main.rs:1808:26:1808:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1808:26:1808:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1808:34:1808:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1809:13:1809:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | +| main.rs:1809:25:1809:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1809:25:1809:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1809:33:1809:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1810:13:1810:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | +| main.rs:1810:26:1810:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1810:26:1810:38 | ... ^ ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1810:34:1810:38 | 38i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1811:13:1811:19 | i64_shl | | {EXTERNAL LOCATION} | i64 | +| main.rs:1811:23:1811:27 | 39i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1811:23:1811:36 | ... << ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1811:32:1811:36 | 40i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1812:13:1812:19 | i64_shr | | {EXTERNAL LOCATION} | i64 | +| main.rs:1812:23:1812:27 | 41i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1812:23:1812:36 | ... >> ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1812:32:1812:36 | 42i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1815:17:1815:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1815:37:1815:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1816:9:1816:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1816:9:1816:34 | ... &= ... | | file://:0:0:0:0 | () | +| main.rs:1816:30:1816:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1818:17:1818:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1818:36:1818:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1819:9:1819:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1819:9:1819:33 | ... \|= ... | | file://:0:0:0:0 | () | +| main.rs:1819:29:1819:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1821:17:1821:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1821:37:1821:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1822:9:1822:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1822:9:1822:34 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1822:30:1822:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1824:17:1824:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1824:34:1824:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1825:9:1825:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1825:9:1825:32 | ... <<= ... | | file://:0:0:0:0 | () | +| main.rs:1825:28:1825:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1827:17:1827:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1827:34:1827:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1828:9:1828:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1828:9:1828:32 | ... >>= ... | | file://:0:0:0:0 | () | +| main.rs:1828:28:1828:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1830:13:1830:19 | i64_neg | | {EXTERNAL LOCATION} | i64 | +| main.rs:1830:23:1830:28 | - ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1830:24:1830:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1831:13:1831:19 | i64_not | | {EXTERNAL LOCATION} | i64 | +| main.rs:1831:23:1831:28 | ! ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1831:24:1831:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1834:13:1834:14 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1834:18:1834:36 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1834:28:1834:28 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1834:28:1834:28 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1834:34:1834:34 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1834:34:1834:34 | 2 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1835:13:1835:14 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1835:18:1835:36 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1835:28:1835:28 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1835:28:1835:28 | 3 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1835:34:1835:34 | 4 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1835:34:1835:34 | 4 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1838:13:1838:19 | vec2_eq | | {EXTERNAL LOCATION} | bool | +| main.rs:1838:23:1838:24 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1838:23:1838:30 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1838:29:1838:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1839:13:1839:19 | vec2_ne | | {EXTERNAL LOCATION} | bool | +| main.rs:1839:23:1839:24 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1839:23:1839:30 | ... != ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1839:29:1839:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1840:13:1840:19 | vec2_lt | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:23:1840:24 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1840:23:1840:29 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1840:28:1840:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1841:13:1841:19 | vec2_le | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:23:1841:24 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1841:23:1841:30 | ... <= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1841:29:1841:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1842:13:1842:19 | vec2_gt | | {EXTERNAL LOCATION} | bool | +| main.rs:1842:23:1842:24 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1842:23:1842:29 | ... > ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1842:28:1842:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1843:13:1843:19 | vec2_ge | | {EXTERNAL LOCATION} | bool | +| main.rs:1843:23:1843:24 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1843:23:1843:30 | ... >= ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1843:29:1843:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1846:13:1846:20 | vec2_add | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1846:24:1846:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1846:24:1846:30 | ... + ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1846:29:1846:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1847:13:1847:20 | vec2_sub | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1847:24:1847:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1847:24:1847:30 | ... - ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1847:29:1847:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1848:13:1848:20 | vec2_mul | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1848:24:1848:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1848:24:1848:30 | ... * ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1848:29:1848:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1849:13:1849:20 | vec2_div | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1849:24:1849:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1849:24:1849:30 | ... / ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1849:29:1849:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1850:13:1850:20 | vec2_rem | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1850:24:1850:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1850:24:1850:30 | ... % ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1850:29:1850:30 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1853:17:1853:31 | vec2_add_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1853:35:1853:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1854:9:1854:23 | vec2_add_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1854:9:1854:29 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:1854:28:1854:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1856:17:1856:31 | vec2_sub_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1856:35:1856:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1857:9:1857:23 | vec2_sub_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1857:9:1857:29 | ... -= ... | | file://:0:0:0:0 | () | +| main.rs:1857:28:1857:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1859:17:1859:31 | vec2_mul_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1859:35:1859:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1860:9:1860:23 | vec2_mul_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1860:9:1860:29 | ... *= ... | | file://:0:0:0:0 | () | +| main.rs:1860:28:1860:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1862:17:1862:31 | vec2_div_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1862:35:1862:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1863:9:1863:23 | vec2_div_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1863:9:1863:29 | ... /= ... | | file://:0:0:0:0 | () | +| main.rs:1863:28:1863:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1865:17:1865:31 | vec2_rem_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1865:35:1865:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1866:9:1866:23 | vec2_rem_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1866:9:1866:29 | ... %= ... | | file://:0:0:0:0 | () | +| main.rs:1866:28:1866:29 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1869:13:1869:23 | vec2_bitand | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1869:27:1869:28 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1869:27:1869:33 | ... & ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1869:32:1869:33 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1870:13:1870:22 | vec2_bitor | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1870:26:1870:27 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1870:26:1870:32 | ... \| ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1870:31:1870:32 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1871:13:1871:23 | vec2_bitxor | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1871:27:1871:28 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1871:27:1871:33 | ... ^ ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1871:32:1871:33 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1872:13:1872:20 | vec2_shl | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1872:24:1872:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1872:24:1872:33 | ... << ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1872:30:1872:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1873:13:1873:20 | vec2_shr | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1873:24:1873:25 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1873:24:1873:33 | ... >> ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1873:30:1873:33 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1876:17:1876:34 | vec2_bitand_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1876:38:1876:39 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1877:9:1877:26 | vec2_bitand_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1877:9:1877:32 | ... &= ... | | file://:0:0:0:0 | () | +| main.rs:1877:31:1877:32 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1879:17:1879:33 | vec2_bitor_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1879:37:1879:38 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1880:9:1880:25 | vec2_bitor_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1880:9:1880:31 | ... \|= ... | | file://:0:0:0:0 | () | +| main.rs:1880:30:1880:31 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1882:17:1882:34 | vec2_bitxor_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1882:38:1882:39 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1883:9:1883:26 | vec2_bitxor_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1883:9:1883:32 | ... ^= ... | | file://:0:0:0:0 | () | +| main.rs:1883:31:1883:32 | v2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1885:17:1885:31 | vec2_shl_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1885:35:1885:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1886:9:1886:23 | vec2_shl_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1886:9:1886:32 | ... <<= ... | | file://:0:0:0:0 | () | +| main.rs:1886:29:1886:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1888:17:1888:31 | vec2_shr_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1888:35:1888:36 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1889:9:1889:23 | vec2_shr_assign | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1889:9:1889:32 | ... >>= ... | | file://:0:0:0:0 | () | +| main.rs:1889:29:1889:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:1892:13:1892:20 | vec2_neg | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1892:24:1892:26 | - ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1892:25:1892:26 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1893:13:1893:20 | vec2_not | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1893:24:1893:26 | ! ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1893:25:1893:26 | v1 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1896:13:1896:24 | default_vec2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1896:28:1896:45 | ...::default(...) | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1897:13:1897:26 | vec2_zero_plus | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1897:30:1897:48 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1897:30:1897:63 | ... + ... | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1897:40:1897:40 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1897:40:1897:40 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1897:46:1897:46 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1897:46:1897:46 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1897:52:1897:63 | default_vec2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1901:13:1901:24 | default_vec2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1901:28:1901:45 | ...::default(...) | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1902:13:1902:26 | vec2_zero_plus | | {EXTERNAL LOCATION} | bool | +| main.rs:1902:30:1902:48 | Vec2 {...} | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1902:30:1902:64 | ... == ... | | {EXTERNAL LOCATION} | bool | +| main.rs:1902:40:1902:40 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1902:40:1902:40 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1902:46:1902:46 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:1902:46:1902:46 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1902:53:1902:64 | default_vec2 | | main.rs:1537:5:1542:5 | Vec2 | +| main.rs:1912:18:1912:21 | SelfParam | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1915:25:1917:5 | { ... } | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1916:9:1916:10 | S1 | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1919:41:1921:5 | { ... } | | main.rs:1919:16:1919:39 | ImplTraitTypeRepr | +| main.rs:1920:9:1920:20 | { ... } | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1920:9:1920:20 | { ... } | | main.rs:1919:16:1919:39 | ImplTraitTypeRepr | +| main.rs:1920:9:1920:20 | { ... } | Output | main.rs:1909:5:1909:14 | S1 | +| main.rs:1920:17:1920:18 | S1 | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1929:13:1929:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | +| main.rs:1929:13:1929:42 | SelfParam | Ptr | file://:0:0:0:0 | & | +| main.rs:1929:13:1929:42 | SelfParam | Ptr.&T | main.rs:1923:5:1923:14 | S2 | +| main.rs:1930:13:1930:15 | _cx | | file://:0:0:0:0 | & | +| main.rs:1930:13:1930:15 | _cx | &T | {EXTERNAL LOCATION} | Context | +| main.rs:1931:44:1933:9 | { ... } | | {EXTERNAL LOCATION} | Poll | +| main.rs:1931:44:1933:9 | { ... } | T | main.rs:1909:5:1909:14 | S1 | +| main.rs:1932:13:1932:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | +| main.rs:1932:13:1932:38 | ...::Ready(...) | T | main.rs:1909:5:1909:14 | S1 | +| main.rs:1932:36:1932:37 | S1 | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1936:41:1938:5 | { ... } | | main.rs:1936:16:1936:39 | ImplTraitTypeRepr | +| main.rs:1937:9:1937:10 | S2 | | main.rs:1923:5:1923:14 | S2 | +| main.rs:1937:9:1937:10 | S2 | | main.rs:1936:16:1936:39 | ImplTraitTypeRepr | +| main.rs:1941:9:1941:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1941:9:1941:12 | f1(...) | Output | main.rs:1909:5:1909:14 | S1 | +| main.rs:1941:9:1941:18 | await ... | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1942:9:1942:12 | f2(...) | | main.rs:1919:16:1919:39 | ImplTraitTypeRepr | +| main.rs:1942:9:1942:18 | await ... | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1943:9:1943:12 | f3(...) | | main.rs:1936:16:1936:39 | ImplTraitTypeRepr | +| main.rs:1943:9:1943:18 | await ... | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1944:9:1944:10 | S2 | | main.rs:1923:5:1923:14 | S2 | +| main.rs:1944:9:1944:16 | await S2 | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1945:13:1945:13 | b | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1945:13:1945:13 | b | Output | main.rs:1909:5:1909:14 | S1 | +| main.rs:1945:17:1945:28 | { ... } | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1945:17:1945:28 | { ... } | Output | main.rs:1909:5:1909:14 | S1 | +| main.rs:1945:25:1945:26 | S1 | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1946:9:1946:9 | b | | {EXTERNAL LOCATION} | trait Future | +| main.rs:1946:9:1946:9 | b | Output | main.rs:1909:5:1909:14 | S1 | +| main.rs:1946:9:1946:15 | await b | | main.rs:1909:5:1909:14 | S1 | +| main.rs:1957:15:1957:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1957:15:1957:19 | SelfParam | &T | main.rs:1956:5:1958:5 | Self [trait Trait1] | +| main.rs:1961:15:1961:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1961:15:1961:19 | SelfParam | &T | main.rs:1960:5:1962:5 | Self [trait Trait2] | +| main.rs:1965:15:1965:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1965:15:1965:19 | SelfParam | &T | main.rs:1951:5:1952:14 | S1 | +| main.rs:1969:15:1969:19 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1969:15:1969:19 | SelfParam | &T | main.rs:1951:5:1952:14 | S1 | +| main.rs:1972:37:1974:5 | { ... } | | main.rs:1972:16:1972:35 | ImplTraitTypeRepr | +| main.rs:1973:9:1973:10 | S1 | | main.rs:1951:5:1952:14 | S1 | +| main.rs:1973:9:1973:10 | S1 | | main.rs:1972:16:1972:35 | ImplTraitTypeRepr | +| main.rs:1977:18:1977:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1977:18:1977:22 | SelfParam | &T | main.rs:1976:5:1978:5 | Self [trait MyTrait] | +| main.rs:1981:18:1981:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1981:18:1981:22 | SelfParam | &T | main.rs:1951:5:1952:14 | S1 | +| main.rs:1981:31:1983:9 | { ... } | | main.rs:1953:5:1953:14 | S2 | +| main.rs:1982:13:1982:14 | S2 | | main.rs:1953:5:1953:14 | S2 | +| main.rs:1987:18:1987:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:1987:18:1987:22 | SelfParam | | main.rs:1954:5:1954:22 | S3 | +| main.rs:1987:18:1987:22 | SelfParam | &T | main.rs:1954:5:1954:22 | S3 | +| main.rs:1987:18:1987:22 | SelfParam | &T.T3 | main.rs:1986:10:1986:17 | T | +| main.rs:1987:30:1990:9 | { ... } | | main.rs:1986:10:1986:17 | T | +| main.rs:1988:17:1988:21 | S3(...) | | file://:0:0:0:0 | & | +| main.rs:1988:17:1988:21 | S3(...) | | main.rs:1954:5:1954:22 | S3 | +| main.rs:1988:17:1988:21 | S3(...) | &T | main.rs:1954:5:1954:22 | S3 | +| main.rs:1988:17:1988:21 | S3(...) | &T.T3 | main.rs:1986:10:1986:17 | T | +| main.rs:1988:25:1988:28 | self | | file://:0:0:0:0 | & | +| main.rs:1988:25:1988:28 | self | | main.rs:1954:5:1954:22 | S3 | +| main.rs:1988:25:1988:28 | self | &T | main.rs:1954:5:1954:22 | S3 | +| main.rs:1988:25:1988:28 | self | &T.T3 | main.rs:1986:10:1986:17 | T | +| main.rs:1989:13:1989:21 | t.clone() | | main.rs:1986:10:1986:17 | T | +| main.rs:1993:45:1995:5 | { ... } | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:1994:9:1994:10 | S1 | | main.rs:1951:5:1952:14 | S1 | +| main.rs:1994:9:1994:10 | S1 | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:1997:41:1997:41 | t | | main.rs:1997:26:1997:38 | B | +| main.rs:1997:52:1999:5 | { ... } | | main.rs:1997:23:1997:23 | A | +| main.rs:1998:9:1998:9 | t | | main.rs:1997:26:1997:38 | B | +| main.rs:1998:9:1998:17 | t.get_a() | | main.rs:1997:23:1997:23 | A | +| main.rs:2001:34:2001:34 | x | | main.rs:2001:24:2001:31 | T | +| main.rs:2001:59:2003:5 | { ... } | | main.rs:2001:43:2001:57 | ImplTraitTypeRepr | +| main.rs:2001:59:2003:5 | { ... } | impl(T) | main.rs:2001:24:2001:31 | T | +| main.rs:2002:9:2002:13 | S3(...) | | main.rs:1954:5:1954:22 | S3 | +| main.rs:2002:9:2002:13 | S3(...) | | main.rs:2001:43:2001:57 | ImplTraitTypeRepr | +| main.rs:2002:9:2002:13 | S3(...) | T3 | main.rs:2001:24:2001:31 | T | +| main.rs:2002:9:2002:13 | S3(...) | impl(T) | main.rs:2001:24:2001:31 | T | +| main.rs:2002:12:2002:12 | x | | main.rs:2001:24:2001:31 | T | +| main.rs:2005:34:2005:34 | x | | main.rs:2005:24:2005:31 | T | +| main.rs:2005:67:2007:5 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2005:67:2007:5 | { ... } | T | main.rs:2005:50:2005:64 | ImplTraitTypeRepr | +| main.rs:2005:67:2007:5 | { ... } | T.impl(T) | main.rs:2005:24:2005:31 | T | +| main.rs:2006:9:2006:19 | Some(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2006:9:2006:19 | Some(...) | T | main.rs:1954:5:1954:22 | S3 | +| main.rs:2006:9:2006:19 | Some(...) | T | main.rs:2005:50:2005:64 | ImplTraitTypeRepr | +| main.rs:2006:9:2006:19 | Some(...) | T.T3 | main.rs:2005:24:2005:31 | T | +| main.rs:2006:9:2006:19 | Some(...) | T.impl(T) | main.rs:2005:24:2005:31 | T | +| main.rs:2006:14:2006:18 | S3(...) | | main.rs:1954:5:1954:22 | S3 | +| main.rs:2006:14:2006:18 | S3(...) | | main.rs:2005:50:2005:64 | ImplTraitTypeRepr | +| main.rs:2006:14:2006:18 | S3(...) | T3 | main.rs:2005:24:2005:31 | T | +| main.rs:2006:14:2006:18 | S3(...) | impl(T) | main.rs:2005:24:2005:31 | T | +| main.rs:2006:17:2006:17 | x | | main.rs:2005:24:2005:31 | T | +| main.rs:2009:34:2009:34 | x | | main.rs:2009:24:2009:31 | T | +| main.rs:2009:78:2011:5 | { ... } | | file://:0:0:0:0 | (T_2) | +| main.rs:2009:78:2011:5 | { ... } | 0(2) | main.rs:2009:44:2009:58 | ImplTraitTypeRepr | +| main.rs:2009:78:2011:5 | { ... } | 0(2).impl(T) | main.rs:2009:24:2009:31 | T | +| main.rs:2009:78:2011:5 | { ... } | 1(2) | main.rs:2009:61:2009:75 | ImplTraitTypeRepr | +| main.rs:2009:78:2011:5 | { ... } | 1(2).impl(T) | main.rs:2009:24:2009:31 | T | +| main.rs:2010:9:2010:30 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| main.rs:2010:9:2010:30 | TupleExpr | 0(2) | main.rs:1954:5:1954:22 | S3 | +| main.rs:2010:9:2010:30 | TupleExpr | 0(2) | main.rs:2009:44:2009:58 | ImplTraitTypeRepr | +| main.rs:2010:9:2010:30 | TupleExpr | 0(2).T3 | main.rs:2009:24:2009:31 | T | +| main.rs:2010:9:2010:30 | TupleExpr | 0(2).impl(T) | main.rs:2009:24:2009:31 | T | +| main.rs:2010:9:2010:30 | TupleExpr | 1(2) | main.rs:1954:5:1954:22 | S3 | +| main.rs:2010:9:2010:30 | TupleExpr | 1(2) | main.rs:2009:61:2009:75 | ImplTraitTypeRepr | +| main.rs:2010:9:2010:30 | TupleExpr | 1(2).T3 | main.rs:2009:24:2009:31 | T | +| main.rs:2010:9:2010:30 | TupleExpr | 1(2).impl(T) | main.rs:2009:24:2009:31 | T | +| main.rs:2010:10:2010:22 | S3(...) | | main.rs:1954:5:1954:22 | S3 | +| main.rs:2010:10:2010:22 | S3(...) | | main.rs:2009:44:2009:58 | ImplTraitTypeRepr | +| main.rs:2010:10:2010:22 | S3(...) | T3 | main.rs:2009:24:2009:31 | T | +| main.rs:2010:10:2010:22 | S3(...) | impl(T) | main.rs:2009:24:2009:31 | T | +| main.rs:2010:13:2010:13 | x | | main.rs:2009:24:2009:31 | T | +| main.rs:2010:13:2010:21 | x.clone() | | main.rs:2009:24:2009:31 | T | +| main.rs:2010:25:2010:29 | S3(...) | | main.rs:1954:5:1954:22 | S3 | +| main.rs:2010:25:2010:29 | S3(...) | | main.rs:2009:61:2009:75 | ImplTraitTypeRepr | +| main.rs:2010:25:2010:29 | S3(...) | T3 | main.rs:2009:24:2009:31 | T | +| main.rs:2010:25:2010:29 | S3(...) | impl(T) | main.rs:2009:24:2009:31 | T | +| main.rs:2010:28:2010:28 | x | | main.rs:2009:24:2009:31 | T | +| main.rs:2013:26:2013:26 | t | | main.rs:2013:29:2013:43 | ImplTraitTypeRepr | +| main.rs:2013:51:2015:5 | { ... } | | main.rs:2013:23:2013:23 | A | +| main.rs:2014:9:2014:9 | t | | main.rs:2013:29:2013:43 | ImplTraitTypeRepr | +| main.rs:2014:9:2014:17 | t.get_a() | | main.rs:2013:23:2013:23 | A | +| main.rs:2018:13:2018:13 | x | | main.rs:1972:16:1972:35 | ImplTraitTypeRepr | +| main.rs:2018:17:2018:20 | f1(...) | | main.rs:1972:16:1972:35 | ImplTraitTypeRepr | +| main.rs:2019:9:2019:9 | x | | main.rs:1972:16:1972:35 | ImplTraitTypeRepr | +| main.rs:2020:9:2020:9 | x | | main.rs:1972:16:1972:35 | ImplTraitTypeRepr | +| main.rs:2021:13:2021:13 | a | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:2021:17:2021:32 | get_a_my_trait(...) | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:2022:13:2022:13 | b | | main.rs:1953:5:1953:14 | S2 | +| main.rs:2022:17:2022:33 | uses_my_trait1(...) | | main.rs:1953:5:1953:14 | S2 | +| main.rs:2022:32:2022:32 | a | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:2023:13:2023:13 | a | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:2023:17:2023:32 | get_a_my_trait(...) | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:2024:13:2024:13 | c | | main.rs:1953:5:1953:14 | S2 | +| main.rs:2024:17:2024:33 | uses_my_trait2(...) | | main.rs:1953:5:1953:14 | S2 | +| main.rs:2024:32:2024:32 | a | | main.rs:1993:28:1993:43 | ImplTraitTypeRepr | +| main.rs:2025:13:2025:13 | d | | main.rs:1953:5:1953:14 | S2 | +| main.rs:2025:17:2025:34 | uses_my_trait2(...) | | main.rs:1953:5:1953:14 | S2 | +| main.rs:2025:32:2025:33 | S1 | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2026:13:2026:13 | e | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2026:17:2026:35 | get_a_my_trait2(...) | | main.rs:2001:43:2001:57 | ImplTraitTypeRepr | +| main.rs:2026:17:2026:35 | get_a_my_trait2(...) | impl(T) | main.rs:1951:5:1952:14 | S1 | +| main.rs:2026:17:2026:43 | ... .get_a() | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2026:33:2026:34 | S1 | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2029:13:2029:13 | f | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2029:17:2029:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2029:17:2029:35 | get_a_my_trait3(...) | T | main.rs:2005:50:2005:64 | ImplTraitTypeRepr | +| main.rs:2029:17:2029:35 | get_a_my_trait3(...) | T.impl(T) | main.rs:1951:5:1952:14 | S1 | +| main.rs:2029:17:2029:44 | ... .unwrap() | | main.rs:2005:50:2005:64 | ImplTraitTypeRepr | +| main.rs:2029:17:2029:44 | ... .unwrap() | impl(T) | main.rs:1951:5:1952:14 | S1 | +| main.rs:2029:17:2029:52 | ... .get_a() | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2029:33:2029:34 | S1 | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2030:13:2030:13 | g | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2030:17:2030:35 | get_a_my_trait4(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2030:17:2030:35 | get_a_my_trait4(...) | 0(2) | main.rs:2009:44:2009:58 | ImplTraitTypeRepr | +| main.rs:2030:17:2030:35 | get_a_my_trait4(...) | 0(2).impl(T) | main.rs:1951:5:1952:14 | S1 | +| main.rs:2030:17:2030:35 | get_a_my_trait4(...) | 1(2) | main.rs:2009:61:2009:75 | ImplTraitTypeRepr | +| main.rs:2030:17:2030:35 | get_a_my_trait4(...) | 1(2).impl(T) | main.rs:1951:5:1952:14 | S1 | +| main.rs:2030:17:2030:37 | ... .0 | | main.rs:2009:44:2009:58 | ImplTraitTypeRepr | +| main.rs:2030:17:2030:37 | ... .0 | impl(T) | main.rs:1951:5:1952:14 | S1 | +| main.rs:2030:17:2030:45 | ... .get_a() | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2030:33:2030:34 | S1 | | main.rs:1951:5:1952:14 | S1 | +| main.rs:2041:16:2041:20 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2041:16:2041:20 | SelfParam | &T | main.rs:2037:5:2038:13 | S | +| main.rs:2041:31:2043:9 | { ... } | | main.rs:2037:5:2038:13 | S | +| main.rs:2042:13:2042:13 | S | | main.rs:2037:5:2038:13 | S | +| main.rs:2052:26:2054:9 | { ... } | | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2052:26:2054:9 | { ... } | T | main.rs:2051:10:2051:10 | T | +| main.rs:2053:13:2053:38 | MyVec {...} | | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2053:13:2053:38 | MyVec {...} | T | main.rs:2051:10:2051:10 | T | +| main.rs:2053:27:2053:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2053:27:2053:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2053:27:2053:36 | ...::new(...) | T | main.rs:2051:10:2051:10 | T | +| main.rs:2056:17:2056:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2056:17:2056:25 | SelfParam | &T | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2056:17:2056:25 | SelfParam | &T.T | main.rs:2051:10:2051:10 | T | +| main.rs:2056:28:2056:32 | value | | main.rs:2051:10:2051:10 | T | +| main.rs:2057:13:2057:16 | self | | file://:0:0:0:0 | & | +| main.rs:2057:13:2057:16 | self | &T | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2057:13:2057:16 | self | &T.T | main.rs:2051:10:2051:10 | T | +| main.rs:2057:13:2057:21 | self.data | | {EXTERNAL LOCATION} | Vec | +| main.rs:2057:13:2057:21 | self.data | A | {EXTERNAL LOCATION} | Global | +| main.rs:2057:13:2057:21 | self.data | T | main.rs:2051:10:2051:10 | T | +| main.rs:2057:28:2057:32 | value | | main.rs:2051:10:2051:10 | T | +| main.rs:2065:18:2065:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2065:18:2065:22 | SelfParam | &T | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2065:18:2065:22 | SelfParam | &T.T | main.rs:2061:10:2061:10 | T | +| main.rs:2065:25:2065:29 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2065:56:2067:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:2065:56:2067:9 | { ... } | &T | main.rs:2061:10:2061:10 | T | +| main.rs:2066:13:2066:29 | &... | | file://:0:0:0:0 | & | +| main.rs:2066:13:2066:29 | &... | &T | main.rs:2061:10:2061:10 | T | +| main.rs:2066:14:2066:17 | self | | file://:0:0:0:0 | & | +| main.rs:2066:14:2066:17 | self | &T | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2066:14:2066:17 | self | &T.T | main.rs:2061:10:2061:10 | T | +| main.rs:2066:14:2066:22 | self.data | | {EXTERNAL LOCATION} | Vec | +| main.rs:2066:14:2066:22 | self.data | A | {EXTERNAL LOCATION} | Global | +| main.rs:2066:14:2066:22 | self.data | T | main.rs:2061:10:2061:10 | T | +| main.rs:2066:14:2066:29 | ...[index] | | main.rs:2061:10:2061:10 | T | +| main.rs:2066:24:2066:28 | index | | {EXTERNAL LOCATION} | usize | +| main.rs:2070:22:2070:26 | slice | | file://:0:0:0:0 | & | +| main.rs:2070:22:2070:26 | slice | &T | file://:0:0:0:0 | [] | +| main.rs:2070:22:2070:26 | slice | &T.[T] | main.rs:2037:5:2038:13 | S | +| main.rs:2077:13:2077:13 | x | | main.rs:2037:5:2038:13 | S | +| main.rs:2077:17:2077:21 | slice | | file://:0:0:0:0 | & | +| main.rs:2077:17:2077:21 | slice | | file://:0:0:0:0 | [] | +| main.rs:2077:17:2077:21 | slice | &T | file://:0:0:0:0 | [] | +| main.rs:2077:17:2077:21 | slice | &T.[T] | main.rs:2037:5:2038:13 | S | +| main.rs:2077:17:2077:24 | slice[0] | | main.rs:2037:5:2038:13 | S | +| main.rs:2077:17:2077:30 | ... .foo() | | main.rs:2037:5:2038:13 | S | +| main.rs:2077:23:2077:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2081:17:2081:19 | vec | | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2081:17:2081:19 | vec | T | main.rs:2037:5:2038:13 | S | +| main.rs:2081:23:2081:34 | ...::new(...) | | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2081:23:2081:34 | ...::new(...) | T | main.rs:2037:5:2038:13 | S | +| main.rs:2082:9:2082:11 | vec | | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2082:9:2082:11 | vec | T | main.rs:2037:5:2038:13 | S | +| main.rs:2082:18:2082:18 | S | | main.rs:2037:5:2038:13 | S | +| main.rs:2083:9:2083:11 | vec | | main.rs:2046:5:2049:5 | MyVec | +| main.rs:2083:9:2083:11 | vec | T | main.rs:2037:5:2038:13 | S | +| main.rs:2083:9:2083:14 | vec[0] | | main.rs:2037:5:2038:13 | S | +| main.rs:2083:9:2083:20 | ... .foo() | | main.rs:2037:5:2038:13 | S | +| main.rs:2083:13:2083:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2083:13:2083:13 | 0 | | {EXTERNAL LOCATION} | usize | +| main.rs:2085:13:2085:14 | xs | | file://:0:0:0:0 | [] | +| main.rs:2085:13:2085:14 | xs | [T;...] | main.rs:2037:5:2038:13 | S | +| main.rs:2085:21:2085:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2085:26:2085:28 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2085:26:2085:28 | [...] | [T;...] | main.rs:2037:5:2038:13 | S | +| main.rs:2085:27:2085:27 | S | | main.rs:2037:5:2038:13 | S | +| main.rs:2086:13:2086:13 | x | | main.rs:2037:5:2038:13 | S | +| main.rs:2086:17:2086:18 | xs | | file://:0:0:0:0 | [] | +| main.rs:2086:17:2086:18 | xs | [T;...] | main.rs:2037:5:2038:13 | S | +| main.rs:2086:17:2086:21 | xs[0] | | main.rs:2037:5:2038:13 | S | +| main.rs:2086:17:2086:27 | ... .foo() | | main.rs:2037:5:2038:13 | S | +| main.rs:2086:20:2086:20 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2088:23:2088:25 | &xs | | file://:0:0:0:0 | & | +| main.rs:2088:23:2088:25 | &xs | &T | file://:0:0:0:0 | [] | +| main.rs:2088:23:2088:25 | &xs | &T | file://:0:0:0:0 | [] | +| main.rs:2088:23:2088:25 | &xs | &T.[T;...] | main.rs:2037:5:2038:13 | S | +| main.rs:2088:23:2088:25 | &xs | &T.[T] | main.rs:2037:5:2038:13 | S | +| main.rs:2088:24:2088:25 | xs | | file://:0:0:0:0 | [] | +| main.rs:2088:24:2088:25 | xs | [T;...] | main.rs:2037:5:2038:13 | S | +| main.rs:2094:13:2094:13 | x | | {EXTERNAL LOCATION} | String | +| main.rs:2094:17:2094:46 | MacroExpr | | {EXTERNAL LOCATION} | String | +| main.rs:2094:25:2094:35 | "Hello, {}" | | file://:0:0:0:0 | & | +| main.rs:2094:25:2094:35 | "Hello, {}" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2094:25:2094:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2094:25:2094:45 | ...::must_use(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2094:25:2094:45 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2094:25:2094:45 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2094:25:2094:45 | { ... } | | {EXTERNAL LOCATION} | String | +| main.rs:2094:38:2094:45 | "World!" | | file://:0:0:0:0 | & | +| main.rs:2094:38:2094:45 | "World!" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2103:19:2103:22 | SelfParam | | main.rs:2099:5:2104:5 | Self [trait MyAdd] | +| main.rs:2103:25:2103:27 | rhs | | main.rs:2099:17:2099:26 | Rhs | +| main.rs:2110:19:2110:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:25:2110:29 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2110:45:2112:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2111:13:2111:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:19:2119:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:25:2119:29 | value | | file://:0:0:0:0 | & | +| main.rs:2119:25:2119:29 | value | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2119:46:2121:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2120:13:2120:18 | * ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2120:14:2120:18 | value | | file://:0:0:0:0 | & | +| main.rs:2120:14:2120:18 | value | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2128:19:2128:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | +| main.rs:2128:25:2128:29 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2128:46:2134:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2129:13:2133:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2129:13:2133:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| main.rs:2129:16:2129:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2129:22:2131:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2129:22:2131:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2130:17:2130:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2130:17:2130:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2131:20:2133:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2131:20:2133:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2132:17:2132:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2132:17:2132:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2143:19:2143:22 | SelfParam | | main.rs:2137:5:2137:19 | S | +| main.rs:2143:19:2143:22 | SelfParam | T | main.rs:2139:10:2139:17 | T | +| main.rs:2143:25:2143:29 | other | | main.rs:2137:5:2137:19 | S | +| main.rs:2143:25:2143:29 | other | T | main.rs:2139:10:2139:17 | T | +| main.rs:2143:54:2145:9 | { ... } | | main.rs:2137:5:2137:19 | S | +| main.rs:2143:54:2145:9 | { ... } | T | main.rs:2100:9:2100:20 | Output | +| main.rs:2144:13:2144:39 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2144:13:2144:39 | S(...) | T | main.rs:2100:9:2100:20 | Output | +| main.rs:2144:15:2144:22 | (...) | | main.rs:2139:10:2139:17 | T | +| main.rs:2144:15:2144:38 | ... .my_add(...) | | main.rs:2100:9:2100:20 | Output | +| main.rs:2144:16:2144:19 | self | | main.rs:2137:5:2137:19 | S | +| main.rs:2144:16:2144:19 | self | T | main.rs:2139:10:2139:17 | T | +| main.rs:2144:16:2144:21 | self.0 | | main.rs:2139:10:2139:17 | T | +| main.rs:2144:31:2144:35 | other | | main.rs:2137:5:2137:19 | S | +| main.rs:2144:31:2144:35 | other | T | main.rs:2099:5:2104:5 | Self [trait MyAdd] | +| main.rs:2144:31:2144:35 | other | T | main.rs:2139:10:2139:17 | T | +| main.rs:2144:31:2144:37 | other.0 | | main.rs:2099:5:2104:5 | Self [trait MyAdd] | +| main.rs:2144:31:2144:37 | other.0 | | main.rs:2139:10:2139:17 | T | +| main.rs:2152:19:2152:22 | SelfParam | | main.rs:2137:5:2137:19 | S | +| main.rs:2152:19:2152:22 | SelfParam | T | main.rs:2148:10:2148:17 | T | +| main.rs:2152:25:2152:29 | other | | main.rs:2148:10:2148:17 | T | +| main.rs:2152:51:2154:9 | { ... } | | main.rs:2137:5:2137:19 | S | +| main.rs:2152:51:2154:9 | { ... } | T | main.rs:2100:9:2100:20 | Output | +| main.rs:2153:13:2153:37 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2153:13:2153:37 | S(...) | T | main.rs:2100:9:2100:20 | Output | +| main.rs:2153:15:2153:22 | (...) | | main.rs:2148:10:2148:17 | T | +| main.rs:2153:15:2153:36 | ... .my_add(...) | | main.rs:2100:9:2100:20 | Output | +| main.rs:2153:16:2153:19 | self | | main.rs:2137:5:2137:19 | S | +| main.rs:2153:16:2153:19 | self | T | main.rs:2148:10:2148:17 | T | +| main.rs:2153:16:2153:21 | self.0 | | main.rs:2148:10:2148:17 | T | +| main.rs:2153:31:2153:35 | other | | main.rs:2099:5:2104:5 | Self [trait MyAdd] | +| main.rs:2153:31:2153:35 | other | | main.rs:2148:10:2148:17 | T | +| main.rs:2164:19:2164:22 | SelfParam | | main.rs:2137:5:2137:19 | S | +| main.rs:2164:19:2164:22 | SelfParam | T | main.rs:2157:14:2157:14 | T | +| main.rs:2164:25:2164:29 | other | | file://:0:0:0:0 | & | +| main.rs:2164:25:2164:29 | other | &T | main.rs:2157:14:2157:14 | T | +| main.rs:2164:55:2166:9 | { ... } | | main.rs:2137:5:2137:19 | S | +| main.rs:2165:13:2165:37 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2165:15:2165:22 | (...) | | main.rs:2157:14:2157:14 | T | +| main.rs:2165:16:2165:19 | self | | main.rs:2137:5:2137:19 | S | +| main.rs:2165:16:2165:19 | self | T | main.rs:2157:14:2157:14 | T | +| main.rs:2165:16:2165:21 | self.0 | | main.rs:2157:14:2157:14 | T | +| main.rs:2165:31:2165:35 | other | | file://:0:0:0:0 | & | +| main.rs:2165:31:2165:35 | other | &T | main.rs:2157:14:2157:14 | T | +| main.rs:2171:20:2171:24 | value | | main.rs:2169:18:2169:18 | T | +| main.rs:2176:20:2176:24 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2176:40:2178:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2177:13:2177:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2183:20:2183:24 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2183:41:2189:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2184:13:2188:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2184:13:2188:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | +| main.rs:2184:16:2184:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2184:22:2186:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2184:22:2186:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2185:17:2185:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2185:17:2185:17 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2186:20:2188:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2186:20:2188:13 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2187:17:2187:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2187:17:2187:17 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2194:21:2194:25 | value | | main.rs:2192:19:2192:19 | T | +| main.rs:2194:31:2194:31 | x | | main.rs:2192:5:2195:5 | Self [trait MyFrom2] | +| main.rs:2199:21:2199:25 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2199:33:2199:33 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2199:48:2201:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:2200:13:2200:17 | value | | {EXTERNAL LOCATION} | i64 | +| main.rs:2206:21:2206:25 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2206:34:2206:34 | _ | | {EXTERNAL LOCATION} | i64 | +| main.rs:2206:49:2212:9 | { ... } | | file://:0:0:0:0 | () | +| main.rs:2207:13:2211:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| main.rs:2207:16:2207:20 | value | | {EXTERNAL LOCATION} | bool | +| main.rs:2207:22:2209:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2208:17:2208:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2209:20:2211:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2210:17:2210:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2217:15:2217:15 | x | | main.rs:2215:5:2221:5 | Self [trait MySelfTrait] | +| main.rs:2220:15:2220:15 | x | | main.rs:2215:5:2221:5 | Self [trait MySelfTrait] | +| main.rs:2225:15:2225:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2225:31:2227:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2226:13:2226:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2226:13:2226:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2226:17:2226:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2230:15:2230:15 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2230:32:2232:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2231:13:2231:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2231:13:2231:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:2231:17:2231:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2237:15:2237:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2237:31:2239:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2238:13:2238:13 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2238:13:2238:13 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2242:15:2242:15 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2242:32:2244:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| main.rs:2243:13:2243:13 | x | | {EXTERNAL LOCATION} | bool | +| main.rs:2248:13:2248:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2248:22:2248:23 | 73 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2248:22:2248:23 | 73 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2249:9:2249:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2249:9:2249:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2249:18:2249:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2250:9:2250:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2250:9:2250:23 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2250:18:2250:22 | &5i64 | | file://:0:0:0:0 | & | +| main.rs:2250:18:2250:22 | &5i64 | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2250:19:2250:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2251:9:2251:9 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2251:9:2251:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2251:18:2251:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2253:9:2253:15 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2253:9:2253:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2253:9:2253:31 | ... .my_add(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2253:11:2253:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2253:24:2253:30 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2253:24:2253:30 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2253:26:2253:29 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2254:9:2254:15 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2254:9:2254:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2254:11:2254:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2254:24:2254:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2255:9:2255:15 | S(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2255:9:2255:15 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| main.rs:2255:9:2255:29 | ... .my_add(...) | | main.rs:2137:5:2137:19 | S | +| main.rs:2255:11:2255:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2255:24:2255:28 | &3i64 | | file://:0:0:0:0 | & | +| main.rs:2255:24:2255:28 | &3i64 | &T | {EXTERNAL LOCATION} | i64 | +| main.rs:2255:25:2255:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2257:13:2257:13 | x | | {EXTERNAL LOCATION} | i64 | +| main.rs:2257:17:2257:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2257:30:2257:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2258:13:2258:13 | y | | {EXTERNAL LOCATION} | i64 | +| main.rs:2258:17:2258:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2258:30:2258:33 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2259:13:2259:13 | z | | {EXTERNAL LOCATION} | i64 | +| main.rs:2259:22:2259:43 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2259:38:2259:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2260:9:2260:34 | ...::my_from2(...) | | file://:0:0:0:0 | () | +| main.rs:2260:23:2260:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2260:30:2260:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2261:9:2261:33 | ...::my_from2(...) | | file://:0:0:0:0 | () | +| main.rs:2261:23:2261:26 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2261:29:2261:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2262:9:2262:38 | ...::my_from2(...) | | file://:0:0:0:0 | () | +| main.rs:2262:27:2262:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2262:34:2262:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2264:9:2264:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2264:17:2264:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2265:9:2265:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2265:17:2265:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2266:9:2266:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2266:18:2266:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2267:9:2267:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2267:18:2267:21 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2268:9:2268:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2268:25:2268:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2269:9:2269:30 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2269:25:2269:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2270:9:2270:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2270:25:2270:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2271:9:2271:29 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2271:25:2271:28 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2279:26:2281:9 | { ... } | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2280:13:2280:25 | MyCallable {...} | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2283:17:2283:21 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2283:17:2283:21 | SelfParam | &T | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2283:31:2285:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2284:13:2284:13 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2284:13:2284:13 | 1 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2291:13:2291:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2291:18:2291:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2291:18:2291:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2291:19:2291:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2291:22:2291:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2291:25:2291:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2292:18:2292:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2292:18:2292:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2292:18:2292:41 | ... .map(...) | | file://:0:0:0:0 | [] | +| main.rs:2292:19:2292:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2292:22:2292:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2292:25:2292:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2292:32:2292:40 | \|...\| ... | | {EXTERNAL LOCATION} | dyn FnOnce | +| main.rs:2292:32:2292:40 | \|...\| ... | dyn(Args) | file://:0:0:0:0 | (T_1) | +| main.rs:2292:40:2292:40 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2293:13:2293:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2293:13:2293:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2293:18:2293:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2293:18:2293:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2293:18:2293:38 | ... .into_iter() | | {EXTERNAL LOCATION} | IntoIter | +| main.rs:2293:18:2293:38 | ... .into_iter() | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2293:19:2293:19 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2293:22:2293:22 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2293:25:2293:25 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:13:2295:17 | vals1 | | file://:0:0:0:0 | [] | +| main.rs:2295:13:2295:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:13:2295:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | +| main.rs:2295:21:2295:31 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2295:21:2295:31 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:21:2295:31 | [...] | [T;...] | {EXTERNAL LOCATION} | u8 | +| main.rs:2295:22:2295:24 | 1u8 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:22:2295:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2295:27:2295:27 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:27:2295:27 | 2 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2295:30:2295:30 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2295:30:2295:30 | 3 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2296:13:2296:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2296:13:2296:13 | u | | {EXTERNAL LOCATION} | u8 | +| main.rs:2296:18:2296:22 | vals1 | | file://:0:0:0:0 | [] | +| main.rs:2296:18:2296:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2296:18:2296:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 | +| main.rs:2298:13:2298:17 | vals2 | | file://:0:0:0:0 | [] | +| main.rs:2298:13:2298:17 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2298:21:2298:29 | [1u16; 3] | | file://:0:0:0:0 | [] | +| main.rs:2298:21:2298:29 | [1u16; 3] | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2298:22:2298:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2298:28:2298:28 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2299:13:2299:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2299:18:2299:22 | vals2 | | file://:0:0:0:0 | [] | +| main.rs:2299:18:2299:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2301:13:2301:17 | vals3 | | file://:0:0:0:0 | [] | +| main.rs:2301:13:2301:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2301:26:2301:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2301:31:2301:39 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2301:31:2301:39 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2301:31:2301:39 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2301:32:2301:32 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2301:32:2301:32 | 1 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2301:35:2301:35 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2301:35:2301:35 | 2 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2301:38:2301:38 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2301:38:2301:38 | 3 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2302:13:2302:13 | u | | {EXTERNAL LOCATION} | u32 | +| main.rs:2302:18:2302:22 | vals3 | | file://:0:0:0:0 | [] | +| main.rs:2302:18:2302:22 | vals3 | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2304:13:2304:17 | vals4 | | file://:0:0:0:0 | [] | +| main.rs:2304:13:2304:17 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2304:26:2304:26 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2304:31:2304:36 | [1; 3] | | file://:0:0:0:0 | [] | +| main.rs:2304:31:2304:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2304:31:2304:36 | [1; 3] | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2304:32:2304:32 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2304:32:2304:32 | 1 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2304:35:2304:35 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2305:13:2305:13 | u | | {EXTERNAL LOCATION} | u64 | +| main.rs:2305:18:2305:22 | vals4 | | file://:0:0:0:0 | [] | +| main.rs:2305:18:2305:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2307:17:2307:24 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2307:17:2307:24 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2307:17:2307:24 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2307:28:2307:48 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2307:28:2307:48 | [...] | [T;...] | file://:0:0:0:0 | & | +| main.rs:2307:28:2307:48 | [...] | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2307:29:2307:33 | "foo" | | file://:0:0:0:0 | & | +| main.rs:2307:29:2307:33 | "foo" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2307:36:2307:40 | "bar" | | file://:0:0:0:0 | & | +| main.rs:2307:36:2307:40 | "bar" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2307:43:2307:47 | "baz" | | file://:0:0:0:0 | & | +| main.rs:2307:43:2307:47 | "baz" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2308:13:2308:13 | s | | {EXTERNAL LOCATION} | Item | +| main.rs:2308:13:2308:13 | s | | file://:0:0:0:0 | & | +| main.rs:2308:13:2308:13 | s | &T | file://:0:0:0:0 | & | +| main.rs:2308:13:2308:13 | s | &T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2308:18:2308:26 | &strings1 | | file://:0:0:0:0 | & | +| main.rs:2308:18:2308:26 | &strings1 | &T | file://:0:0:0:0 | [] | +| main.rs:2308:18:2308:26 | &strings1 | &T.[T;...] | file://:0:0:0:0 | & | +| main.rs:2308:18:2308:26 | &strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2308:19:2308:26 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2308:19:2308:26 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2308:19:2308:26 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2309:13:2309:13 | s | | {EXTERNAL LOCATION} | Item | +| main.rs:2309:13:2309:13 | s | | file://:0:0:0:0 | & | +| main.rs:2309:13:2309:13 | s | &T | file://:0:0:0:0 | & | +| main.rs:2309:13:2309:13 | s | &T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2309:18:2309:30 | &mut strings1 | | file://:0:0:0:0 | & | +| main.rs:2309:18:2309:30 | &mut strings1 | &T | file://:0:0:0:0 | [] | +| main.rs:2309:18:2309:30 | &mut strings1 | &T.[T;...] | file://:0:0:0:0 | & | +| main.rs:2309:18:2309:30 | &mut strings1 | &T.[T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2309:23:2309:30 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2309:23:2309:30 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2309:23:2309:30 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2310:13:2310:13 | s | | file://:0:0:0:0 | & | +| main.rs:2310:13:2310:13 | s | &T | {EXTERNAL LOCATION} | str | +| main.rs:2310:18:2310:25 | strings1 | | file://:0:0:0:0 | [] | +| main.rs:2310:18:2310:25 | strings1 | [T;...] | file://:0:0:0:0 | & | +| main.rs:2310:18:2310:25 | strings1 | [T;...].&T | {EXTERNAL LOCATION} | str | +| main.rs:2312:13:2312:20 | strings2 | | file://:0:0:0:0 | [] | +| main.rs:2312:13:2312:20 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2313:9:2317:9 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2313:9:2317:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2314:13:2314:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2314:26:2314:30 | "foo" | | file://:0:0:0:0 | & | +| main.rs:2314:26:2314:30 | "foo" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2315:13:2315:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2315:26:2315:30 | "bar" | | file://:0:0:0:0 | & | +| main.rs:2315:26:2315:30 | "bar" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2316:13:2316:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2316:26:2316:30 | "baz" | | file://:0:0:0:0 | & | +| main.rs:2316:26:2316:30 | "baz" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2318:13:2318:13 | s | | {EXTERNAL LOCATION} | String | +| main.rs:2318:18:2318:25 | strings2 | | file://:0:0:0:0 | [] | +| main.rs:2318:18:2318:25 | strings2 | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2320:13:2320:20 | strings3 | | file://:0:0:0:0 | & | +| main.rs:2320:13:2320:20 | strings3 | &T | file://:0:0:0:0 | [] | +| main.rs:2320:13:2320:20 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2321:9:2325:9 | &... | | file://:0:0:0:0 | & | +| main.rs:2321:9:2325:9 | &... | &T | file://:0:0:0:0 | [] | +| main.rs:2321:9:2325:9 | &... | &T.[T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2321:10:2325:9 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2321:10:2325:9 | [...] | [T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2322:13:2322:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2322:26:2322:30 | "foo" | | file://:0:0:0:0 | & | +| main.rs:2322:26:2322:30 | "foo" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2323:13:2323:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2323:26:2323:30 | "bar" | | file://:0:0:0:0 | & | +| main.rs:2323:26:2323:30 | "bar" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2324:13:2324:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | +| main.rs:2324:26:2324:30 | "baz" | | file://:0:0:0:0 | & | +| main.rs:2324:26:2324:30 | "baz" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2326:13:2326:13 | s | | {EXTERNAL LOCATION} | Item | +| main.rs:2326:13:2326:13 | s | | file://:0:0:0:0 | & | +| main.rs:2326:13:2326:13 | s | &T | {EXTERNAL LOCATION} | String | +| main.rs:2326:18:2326:25 | strings3 | | file://:0:0:0:0 | & | +| main.rs:2326:18:2326:25 | strings3 | &T | file://:0:0:0:0 | [] | +| main.rs:2326:18:2326:25 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String | +| main.rs:2328:13:2328:21 | callables | | file://:0:0:0:0 | [] | +| main.rs:2328:13:2328:21 | callables | [T;...] | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2328:25:2328:81 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2328:25:2328:81 | [...] | [T;...] | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2328:26:2328:42 | ...::new(...) | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2328:45:2328:61 | ...::new(...) | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2328:64:2328:80 | ...::new(...) | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2329:13:2329:13 | c | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2330:12:2330:20 | callables | | file://:0:0:0:0 | [] | +| main.rs:2330:12:2330:20 | callables | [T;...] | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2332:17:2332:22 | result | | {EXTERNAL LOCATION} | i64 | +| main.rs:2332:26:2332:26 | c | | main.rs:2276:5:2276:24 | MyCallable | +| main.rs:2332:26:2332:33 | c.call() | | {EXTERNAL LOCATION} | i64 | +| main.rs:2337:13:2337:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2337:13:2337:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2337:18:2337:18 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2337:18:2337:22 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2337:18:2337:22 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2337:21:2337:22 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2338:13:2338:13 | u | | {EXTERNAL LOCATION} | Range | +| main.rs:2338:13:2338:13 | u | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2338:13:2338:13 | u | Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2338:18:2338:26 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2338:18:2338:26 | [...] | [T;...] | {EXTERNAL LOCATION} | Range | +| main.rs:2338:18:2338:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2338:18:2338:26 | [...] | [T;...].Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2338:19:2338:21 | 0u8 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2338:19:2338:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2338:19:2338:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2338:19:2338:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2338:19:2338:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | +| main.rs:2338:24:2338:25 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2338:24:2338:25 | 10 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2339:13:2339:17 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2339:13:2339:17 | range | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2339:21:2339:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2339:21:2339:25 | 0..10 | | {EXTERNAL LOCATION} | Range | +| main.rs:2339:21:2339:25 | 0..10 | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2339:24:2339:25 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2340:13:2340:13 | i | | {EXTERNAL LOCATION} | Item | +| main.rs:2340:13:2340:13 | i | | {EXTERNAL LOCATION} | i32 | +| main.rs:2340:18:2340:22 | range | | {EXTERNAL LOCATION} | Range | +| main.rs:2340:18:2340:22 | range | Idx | {EXTERNAL LOCATION} | i32 | +| main.rs:2342:13:2342:18 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2342:13:2342:18 | range1 | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2343:9:2346:9 | ...::Range {...} | | {EXTERNAL LOCATION} | Range | +| main.rs:2343:9:2346:9 | ...::Range {...} | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2344:20:2344:23 | 0u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2345:18:2345:22 | 10u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2347:13:2347:13 | u | | {EXTERNAL LOCATION} | Item | +| main.rs:2347:13:2347:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2347:18:2347:23 | range1 | | {EXTERNAL LOCATION} | Range | +| main.rs:2347:18:2347:23 | range1 | Idx | {EXTERNAL LOCATION} | u16 | +| main.rs:2351:26:2351:26 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:29:2351:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2351:32:2351:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:13:2354:18 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2354:13:2354:18 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2354:13:2354:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2354:32:2354:43 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2354:32:2354:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:32:2354:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2354:32:2354:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2354:32:2354:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2354:32:2354:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2354:33:2354:36 | 1u16 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:33:2354:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2354:39:2354:39 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:39:2354:39 | 2 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2354:42:2354:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2354:42:2354:42 | 3 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2355:13:2355:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2355:13:2355:13 | u | | file://:0:0:0:0 | & | +| main.rs:2355:18:2355:23 | vals4a | | {EXTERNAL LOCATION} | Vec | +| main.rs:2355:18:2355:23 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2355:18:2355:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2357:22:2357:33 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2357:22:2357:33 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2357:22:2357:33 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 | +| main.rs:2357:23:2357:26 | 1u16 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2357:23:2357:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2357:29:2357:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2357:29:2357:29 | 2 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2357:32:2357:32 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2357:32:2357:32 | 3 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2360:13:2360:17 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2360:13:2360:17 | vals5 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2360:13:2360:17 | vals5 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2360:13:2360:17 | vals5 | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:21:2360:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2360:21:2360:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2360:21:2360:43 | ...::from(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2360:21:2360:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:31:2360:42 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2360:31:2360:42 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2360:31:2360:42 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:32:2360:35 | 1u32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2360:32:2360:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:38:2360:38 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2360:38:2360:38 | 2 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2360:41:2360:41 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2360:41:2360:41 | 3 | | {EXTERNAL LOCATION} | u32 | +| main.rs:2361:13:2361:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2361:13:2361:13 | u | | {EXTERNAL LOCATION} | u32 | +| main.rs:2361:13:2361:13 | u | | file://:0:0:0:0 | & | +| main.rs:2361:18:2361:22 | vals5 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2361:18:2361:22 | vals5 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2361:18:2361:22 | vals5 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2361:18:2361:22 | vals5 | T | {EXTERNAL LOCATION} | u32 | +| main.rs:2363:13:2363:17 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2363:13:2363:17 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2363:13:2363:17 | vals6 | T | file://:0:0:0:0 | & | +| main.rs:2363:13:2363:17 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | +| main.rs:2363:32:2363:43 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2363:32:2363:43 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2363:32:2363:43 | [...] | [T;...] | {EXTERNAL LOCATION} | u64 | +| main.rs:2363:32:2363:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2363:32:2363:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2363:32:2363:60 | ... .collect() | T | file://:0:0:0:0 | & | +| main.rs:2363:32:2363:60 | ... .collect() | T.&T | {EXTERNAL LOCATION} | u64 | +| main.rs:2363:33:2363:36 | 1u64 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2363:33:2363:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2363:39:2363:39 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2363:39:2363:39 | 2 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2363:42:2363:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2363:42:2363:42 | 3 | | {EXTERNAL LOCATION} | u64 | +| main.rs:2364:13:2364:13 | u | | file://:0:0:0:0 | & | +| main.rs:2364:13:2364:13 | u | &T | {EXTERNAL LOCATION} | u64 | +| main.rs:2364:18:2364:22 | vals6 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2364:18:2364:22 | vals6 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2364:18:2364:22 | vals6 | T | file://:0:0:0:0 | & | +| main.rs:2364:18:2364:22 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 | +| main.rs:2366:17:2366:21 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2366:17:2366:21 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2366:17:2366:21 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2366:25:2366:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | +| main.rs:2366:25:2366:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2366:25:2366:34 | ...::new(...) | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2367:9:2367:13 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2367:9:2367:13 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2367:9:2367:13 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2367:20:2367:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | +| main.rs:2368:13:2368:13 | u | | {EXTERNAL LOCATION} | u8 | +| main.rs:2368:13:2368:13 | u | | file://:0:0:0:0 | & | +| main.rs:2368:18:2368:22 | vals7 | | {EXTERNAL LOCATION} | Vec | +| main.rs:2368:18:2368:22 | vals7 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2368:18:2368:22 | vals7 | T | {EXTERNAL LOCATION} | u8 | +| main.rs:2370:33:2370:33 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2370:36:2370:36 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2370:45:2370:45 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2370:48:2370:48 | 4 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2377:17:2377:20 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2377:17:2377:20 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2377:17:2377:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2377:17:2377:20 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2377:17:2377:20 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2377:17:2377:20 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2377:17:2377:20 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2377:24:2377:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2377:24:2377:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2377:24:2377:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2377:24:2377:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | +| main.rs:2377:24:2377:55 | ...::new(...) | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2377:24:2377:55 | ...::new(...) | V.T | file://:0:0:0:0 | & | +| main.rs:2377:24:2377:55 | ...::new(...) | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2378:9:2378:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2378:9:2378:12 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2378:9:2378:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2378:9:2378:12 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2378:9:2378:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2378:9:2378:12 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2378:9:2378:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2378:9:2378:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2378:9:2378:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2378:9:2378:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2378:9:2378:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | +| main.rs:2378:9:2378:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2378:21:2378:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2378:24:2378:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2378:24:2378:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2378:24:2378:38 | ...::new(...) | T | file://:0:0:0:0 | & | +| main.rs:2378:24:2378:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2378:33:2378:37 | "one" | | file://:0:0:0:0 | & | +| main.rs:2378:33:2378:37 | "one" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2379:9:2379:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2379:9:2379:12 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2379:9:2379:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2379:9:2379:12 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2379:9:2379:12 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2379:9:2379:12 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2379:9:2379:12 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2379:9:2379:39 | map1.insert(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2379:9:2379:39 | map1.insert(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2379:9:2379:39 | map1.insert(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2379:9:2379:39 | map1.insert(...) | T.T | file://:0:0:0:0 | & | +| main.rs:2379:9:2379:39 | map1.insert(...) | T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2379:21:2379:21 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2379:24:2379:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2379:24:2379:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2379:24:2379:38 | ...::new(...) | T | file://:0:0:0:0 | & | +| main.rs:2379:24:2379:38 | ...::new(...) | T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2379:33:2379:37 | "two" | | file://:0:0:0:0 | & | +| main.rs:2379:33:2379:37 | "two" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2380:13:2380:15 | key | | {EXTERNAL LOCATION} | Item | +| main.rs:2380:13:2380:15 | key | | file://:0:0:0:0 | & | +| main.rs:2380:13:2380:15 | key | &T | {EXTERNAL LOCATION} | i32 | +| main.rs:2380:20:2380:23 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2380:20:2380:23 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2380:20:2380:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2380:20:2380:23 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2380:20:2380:23 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2380:20:2380:23 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2380:20:2380:23 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2380:20:2380:30 | map1.keys() | | {EXTERNAL LOCATION} | Keys | +| main.rs:2380:20:2380:30 | map1.keys() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2380:20:2380:30 | map1.keys() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2380:20:2380:30 | map1.keys() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2380:20:2380:30 | map1.keys() | V.T | file://:0:0:0:0 | & | +| main.rs:2380:20:2380:30 | map1.keys() | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2381:13:2381:17 | value | | {EXTERNAL LOCATION} | Item | +| main.rs:2381:13:2381:17 | value | | file://:0:0:0:0 | & | +| main.rs:2381:13:2381:17 | value | &T | {EXTERNAL LOCATION} | Box | +| main.rs:2381:13:2381:17 | value | &T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2381:13:2381:17 | value | &T.T | file://:0:0:0:0 | & | +| main.rs:2381:13:2381:17 | value | &T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2381:22:2381:25 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2381:22:2381:25 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2381:22:2381:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2381:22:2381:25 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2381:22:2381:25 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2381:22:2381:25 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2381:22:2381:25 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2381:22:2381:34 | map1.values() | | {EXTERNAL LOCATION} | Values | +| main.rs:2381:22:2381:34 | map1.values() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2381:22:2381:34 | map1.values() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2381:22:2381:34 | map1.values() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2381:22:2381:34 | map1.values() | V.T | file://:0:0:0:0 | & | +| main.rs:2381:22:2381:34 | map1.values() | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2382:13:2382:24 | TuplePat | | {EXTERNAL LOCATION} | Item | +| main.rs:2382:13:2382:24 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2382:13:2382:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | +| main.rs:2382:13:2382:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | +| main.rs:2382:13:2382:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | +| main.rs:2382:13:2382:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | +| main.rs:2382:13:2382:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2382:13:2382:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | +| main.rs:2382:13:2382:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2382:14:2382:16 | key | | file://:0:0:0:0 | & | +| main.rs:2382:14:2382:16 | key | &T | {EXTERNAL LOCATION} | i32 | +| main.rs:2382:19:2382:23 | value | | file://:0:0:0:0 | & | +| main.rs:2382:19:2382:23 | value | &T | {EXTERNAL LOCATION} | Box | +| main.rs:2382:19:2382:23 | value | &T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2382:19:2382:23 | value | &T.T | file://:0:0:0:0 | & | +| main.rs:2382:19:2382:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2382:29:2382:32 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2382:29:2382:32 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2382:29:2382:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2382:29:2382:32 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2382:29:2382:32 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2382:29:2382:32 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2382:29:2382:32 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2382:29:2382:39 | map1.iter() | | {EXTERNAL LOCATION} | Iter | +| main.rs:2382:29:2382:39 | map1.iter() | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2382:29:2382:39 | map1.iter() | V | {EXTERNAL LOCATION} | Box | +| main.rs:2382:29:2382:39 | map1.iter() | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2382:29:2382:39 | map1.iter() | V.T | file://:0:0:0:0 | & | +| main.rs:2382:29:2382:39 | map1.iter() | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2383:13:2383:24 | TuplePat | | {EXTERNAL LOCATION} | Item | +| main.rs:2383:13:2383:24 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2383:13:2383:24 | TuplePat | 0(2) | file://:0:0:0:0 | & | +| main.rs:2383:13:2383:24 | TuplePat | 0(2).&T | {EXTERNAL LOCATION} | i32 | +| main.rs:2383:13:2383:24 | TuplePat | 1(2) | file://:0:0:0:0 | & | +| main.rs:2383:13:2383:24 | TuplePat | 1(2).&T | {EXTERNAL LOCATION} | Box | +| main.rs:2383:13:2383:24 | TuplePat | 1(2).&T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2383:13:2383:24 | TuplePat | 1(2).&T.T | file://:0:0:0:0 | & | +| main.rs:2383:13:2383:24 | TuplePat | 1(2).&T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2383:14:2383:16 | key | | file://:0:0:0:0 | & | +| main.rs:2383:14:2383:16 | key | &T | {EXTERNAL LOCATION} | i32 | +| main.rs:2383:19:2383:23 | value | | file://:0:0:0:0 | & | +| main.rs:2383:19:2383:23 | value | &T | {EXTERNAL LOCATION} | Box | +| main.rs:2383:19:2383:23 | value | &T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2383:19:2383:23 | value | &T.T | file://:0:0:0:0 | & | +| main.rs:2383:19:2383:23 | value | &T.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2383:29:2383:33 | &map1 | | file://:0:0:0:0 | & | +| main.rs:2383:29:2383:33 | &map1 | &T | {EXTERNAL LOCATION} | HashMap | +| main.rs:2383:29:2383:33 | &map1 | &T.K | {EXTERNAL LOCATION} | i32 | +| main.rs:2383:29:2383:33 | &map1 | &T.S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2383:29:2383:33 | &map1 | &T.V | {EXTERNAL LOCATION} | Box | +| main.rs:2383:29:2383:33 | &map1 | &T.V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2383:29:2383:33 | &map1 | &T.V.T | file://:0:0:0:0 | & | +| main.rs:2383:29:2383:33 | &map1 | &T.V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2383:30:2383:33 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2383:30:2383:33 | map1 | K | {EXTERNAL LOCATION} | i32 | +| main.rs:2383:30:2383:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | +| main.rs:2383:30:2383:33 | map1 | V | {EXTERNAL LOCATION} | Box | +| main.rs:2383:30:2383:33 | map1 | V.A | {EXTERNAL LOCATION} | Global | +| main.rs:2383:30:2383:33 | map1 | V.T | file://:0:0:0:0 | & | +| main.rs:2383:30:2383:33 | map1 | V.T.&T | {EXTERNAL LOCATION} | str | +| main.rs:2387:17:2387:17 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2387:26:2387:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2387:26:2387:26 | 0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2389:23:2389:23 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2389:23:2389:28 | ... < ... | | {EXTERNAL LOCATION} | bool | +| main.rs:2389:27:2389:28 | 10 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2389:27:2389:28 | 10 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2391:13:2391:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2391:13:2391:18 | ... += ... | | file://:0:0:0:0 | () | +| main.rs:2391:18:2391:18 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2403:40:2405:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| main.rs:2403:40:2405:9 | { ... } | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2403:40:2405:9 | { ... } | T.T | main.rs:2402:10:2402:19 | T | +| main.rs:2404:13:2404:16 | None | | {EXTERNAL LOCATION} | Option | +| main.rs:2404:13:2404:16 | None | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2404:13:2404:16 | None | T.T | main.rs:2402:10:2402:19 | T | +| main.rs:2407:30:2409:9 | { ... } | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2407:30:2409:9 | { ... } | T | main.rs:2402:10:2402:19 | T | +| main.rs:2408:13:2408:28 | S1(...) | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2408:13:2408:28 | S1(...) | T | main.rs:2402:10:2402:19 | T | +| main.rs:2408:16:2408:27 | ...::default(...) | | main.rs:2402:10:2402:19 | T | +| main.rs:2411:19:2411:22 | SelfParam | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2411:19:2411:22 | SelfParam | T | main.rs:2402:10:2402:19 | T | +| main.rs:2411:33:2413:9 | { ... } | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2411:33:2413:9 | { ... } | T | main.rs:2402:10:2402:19 | T | +| main.rs:2412:13:2412:16 | self | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2412:13:2412:16 | self | T | main.rs:2402:10:2402:19 | T | +| main.rs:2424:15:2424:15 | x | | main.rs:2424:12:2424:12 | T | +| main.rs:2424:26:2426:5 | { ... } | | main.rs:2424:12:2424:12 | T | +| main.rs:2425:9:2425:9 | x | | main.rs:2424:12:2424:12 | T | +| main.rs:2429:13:2429:14 | x1 | | {EXTERNAL LOCATION} | Option | +| main.rs:2429:13:2429:14 | x1 | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2429:13:2429:14 | x1 | T.T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2429:34:2429:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2429:34:2429:48 | ...::assoc_fun(...) | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2429:34:2429:48 | ...::assoc_fun(...) | T.T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2430:13:2430:14 | x2 | | {EXTERNAL LOCATION} | Option | +| main.rs:2430:13:2430:14 | x2 | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2430:13:2430:14 | x2 | T.T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2430:18:2430:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2430:18:2430:38 | ...::assoc_fun(...) | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2430:18:2430:38 | ...::assoc_fun(...) | T.T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2431:13:2431:14 | x3 | | {EXTERNAL LOCATION} | Option | +| main.rs:2431:13:2431:14 | x3 | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2431:13:2431:14 | x3 | T.T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2431:18:2431:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:2431:18:2431:32 | ...::assoc_fun(...) | T | main.rs:2397:5:2397:20 | S1 | +| main.rs:2431:18:2431:32 | ...::assoc_fun(...) | T.T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2432:13:2432:14 | x4 | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2432:13:2432:14 | x4 | T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2432:18:2432:48 | ...::method(...) | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2432:18:2432:48 | ...::method(...) | T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2432:35:2432:47 | ...::default(...) | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2432:35:2432:47 | ...::default(...) | T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2433:13:2433:14 | x5 | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2433:13:2433:14 | x5 | T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2433:18:2433:42 | ...::method(...) | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2433:18:2433:42 | ...::method(...) | T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2433:29:2433:41 | ...::default(...) | | main.rs:2397:5:2397:20 | S1 | +| main.rs:2433:29:2433:41 | ...::default(...) | T | main.rs:2399:5:2400:14 | S2 | +| main.rs:2434:13:2434:14 | x6 | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2434:13:2434:14 | x6 | T4 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2434:18:2434:45 | S4::<...>(...) | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2434:18:2434:45 | S4::<...>(...) | T4 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2434:27:2434:44 | ...::default(...) | | main.rs:2399:5:2400:14 | S2 | +| main.rs:2435:13:2435:14 | x7 | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2435:13:2435:14 | x7 | T4 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2435:18:2435:23 | S4(...) | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2435:18:2435:23 | S4(...) | T4 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2435:21:2435:22 | S2 | | main.rs:2399:5:2400:14 | S2 | +| main.rs:2436:13:2436:14 | x8 | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2436:13:2436:14 | x8 | T4 | {EXTERNAL LOCATION} | i32 | +| main.rs:2436:18:2436:22 | S4(...) | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2436:18:2436:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | +| main.rs:2436:21:2436:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2437:13:2437:14 | x9 | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2437:13:2437:14 | x9 | T4 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2437:18:2437:34 | S4(...) | | main.rs:2418:5:2418:27 | S4 | +| main.rs:2437:18:2437:34 | S4(...) | T4 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2437:21:2437:33 | ...::default(...) | | main.rs:2399:5:2400:14 | S2 | +| main.rs:2438:13:2438:15 | x10 | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2438:13:2438:15 | x10 | T5 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2438:19:2441:9 | S5::<...> {...} | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2438:19:2441:9 | S5::<...> {...} | T5 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2440:20:2440:37 | ...::default(...) | | main.rs:2399:5:2400:14 | S2 | +| main.rs:2442:13:2442:15 | x11 | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2442:13:2442:15 | x11 | T5 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2442:19:2442:34 | S5 {...} | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2442:19:2442:34 | S5 {...} | T5 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2442:31:2442:32 | S2 | | main.rs:2399:5:2400:14 | S2 | +| main.rs:2443:13:2443:15 | x12 | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2443:13:2443:15 | x12 | T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:2443:19:2443:33 | S5 {...} | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2443:19:2443:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | +| main.rs:2443:31:2443:31 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2444:13:2444:15 | x13 | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2444:13:2444:15 | x13 | T5 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2444:19:2447:9 | S5 {...} | | main.rs:2420:5:2422:5 | S5 | +| main.rs:2444:19:2447:9 | S5 {...} | T5 | main.rs:2399:5:2400:14 | S2 | +| main.rs:2446:20:2446:32 | ...::default(...) | | main.rs:2399:5:2400:14 | S2 | +| main.rs:2448:13:2448:15 | x14 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2448:19:2448:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2448:30:2448:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2456:35:2458:9 | { ... } | | file://:0:0:0:0 | (T_2) | +| main.rs:2456:35:2458:9 | { ... } | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2456:35:2458:9 | { ... } | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2457:13:2457:26 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| main.rs:2457:13:2457:26 | TupleExpr | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2457:13:2457:26 | TupleExpr | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2457:14:2457:18 | S1 {...} | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2457:21:2457:25 | S1 {...} | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2459:16:2459:19 | SelfParam | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2463:13:2463:13 | a | | file://:0:0:0:0 | (T_2) | +| main.rs:2463:13:2463:13 | a | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2463:13:2463:13 | a | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2463:17:2463:30 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2463:17:2463:30 | ...::get_pair(...) | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2463:17:2463:30 | ...::get_pair(...) | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2464:17:2464:17 | b | | file://:0:0:0:0 | (T_2) | +| main.rs:2464:17:2464:17 | b | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2464:17:2464:17 | b | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2464:21:2464:34 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2464:21:2464:34 | ...::get_pair(...) | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2464:21:2464:34 | ...::get_pair(...) | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2465:13:2465:18 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2465:13:2465:18 | TuplePat | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2465:13:2465:18 | TuplePat | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2465:14:2465:14 | c | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2465:17:2465:17 | d | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2465:22:2465:35 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2465:22:2465:35 | ...::get_pair(...) | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2465:22:2465:35 | ...::get_pair(...) | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2466:13:2466:22 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2466:13:2466:22 | TuplePat | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2466:13:2466:22 | TuplePat | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2466:18:2466:18 | e | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2466:21:2466:21 | f | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2466:26:2466:39 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2466:26:2466:39 | ...::get_pair(...) | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2466:26:2466:39 | ...::get_pair(...) | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2467:13:2467:26 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2467:13:2467:26 | TuplePat | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2467:13:2467:26 | TuplePat | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2467:18:2467:18 | g | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2467:25:2467:25 | h | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2467:30:2467:43 | ...::get_pair(...) | | file://:0:0:0:0 | (T_2) | +| main.rs:2467:30:2467:43 | ...::get_pair(...) | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2467:30:2467:43 | ...::get_pair(...) | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2469:9:2469:9 | a | | file://:0:0:0:0 | (T_2) | +| main.rs:2469:9:2469:9 | a | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2469:9:2469:9 | a | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2469:9:2469:11 | a.0 | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2470:9:2470:9 | b | | file://:0:0:0:0 | (T_2) | +| main.rs:2470:9:2470:9 | b | 0(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2470:9:2470:9 | b | 1(2) | main.rs:2453:5:2453:16 | S1 | +| main.rs:2470:9:2470:11 | b.1 | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2471:9:2471:9 | c | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2472:9:2472:9 | d | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2473:9:2473:9 | e | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2474:9:2474:9 | f | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2475:9:2475:9 | g | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2476:9:2476:9 | h | | main.rs:2453:5:2453:16 | S1 | +| main.rs:2481:13:2481:13 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2481:17:2481:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | +| main.rs:2482:13:2482:13 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2482:17:2482:34 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| main.rs:2483:13:2483:16 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2483:13:2483:16 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2483:13:2483:16 | pair | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2483:20:2483:25 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| main.rs:2483:20:2483:25 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2483:20:2483:25 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2483:21:2483:21 | a | | {EXTERNAL LOCATION} | i64 | +| main.rs:2483:24:2483:24 | b | | {EXTERNAL LOCATION} | bool | +| main.rs:2484:13:2484:13 | i | | {EXTERNAL LOCATION} | i64 | +| main.rs:2484:22:2484:25 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2484:22:2484:25 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2484:22:2484:25 | pair | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2484:22:2484:27 | pair.0 | | {EXTERNAL LOCATION} | i64 | +| main.rs:2485:13:2485:13 | j | | {EXTERNAL LOCATION} | bool | +| main.rs:2485:23:2485:26 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2485:23:2485:26 | pair | 0(2) | {EXTERNAL LOCATION} | i64 | +| main.rs:2485:23:2485:26 | pair | 1(2) | {EXTERNAL LOCATION} | bool | +| main.rs:2485:23:2485:28 | pair.1 | | {EXTERNAL LOCATION} | bool | +| main.rs:2487:13:2487:16 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2487:13:2487:16 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2487:13:2487:16 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2487:20:2487:25 | [...] | | file://:0:0:0:0 | [] | +| main.rs:2487:20:2487:25 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 | +| main.rs:2487:20:2487:32 | ... .into() | | file://:0:0:0:0 | (T_2) | +| main.rs:2487:20:2487:32 | ... .into() | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2487:20:2487:32 | ... .into() | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2487:21:2487:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2487:24:2487:24 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2488:15:2488:18 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2488:15:2488:18 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2488:15:2488:18 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2489:13:2489:18 | TuplePat | | file://:0:0:0:0 | (T_2) | +| main.rs:2489:13:2489:18 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2489:13:2489:18 | TuplePat | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2489:14:2489:14 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2489:17:2489:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2489:30:2489:41 | "unexpected" | | file://:0:0:0:0 | & | +| main.rs:2489:30:2489:41 | "unexpected" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2489:30:2489:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2489:30:2489:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2490:13:2490:13 | _ | | file://:0:0:0:0 | (T_2) | +| main.rs:2490:13:2490:13 | _ | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2490:13:2490:13 | _ | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2490:25:2490:34 | "expected" | | file://:0:0:0:0 | & | +| main.rs:2490:25:2490:34 | "expected" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2490:25:2490:34 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2490:25:2490:34 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2492:13:2492:13 | x | | {EXTERNAL LOCATION} | i32 | +| main.rs:2492:17:2492:20 | pair | | file://:0:0:0:0 | (T_2) | +| main.rs:2492:17:2492:20 | pair | 0(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2492:17:2492:20 | pair | 1(2) | {EXTERNAL LOCATION} | i32 | +| main.rs:2492:17:2492:22 | pair.0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2499:13:2499:23 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2499:13:2499:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2499:13:2499:23 | boxed_value | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2499:27:2499:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2499:27:2499:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2499:27:2499:42 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2499:36:2499:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2502:15:2502:25 | boxed_value | | {EXTERNAL LOCATION} | Box | +| main.rs:2502:15:2502:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | +| main.rs:2502:15:2502:25 | boxed_value | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2503:13:2503:19 | box 100 | | {EXTERNAL LOCATION} | Box | +| main.rs:2503:13:2503:19 | box 100 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2503:13:2503:19 | box 100 | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2503:17:2503:19 | 100 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2504:26:2504:36 | "Boxed 100\\n" | | file://:0:0:0:0 | & | +| main.rs:2504:26:2504:36 | "Boxed 100\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2504:26:2504:36 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2504:26:2504:36 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2506:13:2506:17 | box ... | | {EXTERNAL LOCATION} | Box | +| main.rs:2506:13:2506:17 | box ... | A | {EXTERNAL LOCATION} | Global | +| main.rs:2506:13:2506:17 | box ... | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2508:26:2508:42 | "Boxed value: {}\\n" | | file://:0:0:0:0 | & | +| main.rs:2508:26:2508:42 | "Boxed value: {}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2508:26:2508:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2508:26:2508:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2513:13:2513:22 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2513:13:2513:22 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2513:13:2513:22 | nested_box | T | {EXTERNAL LOCATION} | Box | +| main.rs:2513:13:2513:22 | nested_box | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2513:13:2513:22 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2513:26:2513:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2513:26:2513:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2513:26:2513:50 | ...::new(...) | T | {EXTERNAL LOCATION} | Box | +| main.rs:2513:26:2513:50 | ...::new(...) | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2513:26:2513:50 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2513:35:2513:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2513:35:2513:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2513:35:2513:49 | ...::new(...) | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2513:44:2513:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2514:15:2514:24 | nested_box | | {EXTERNAL LOCATION} | Box | +| main.rs:2514:15:2514:24 | nested_box | A | {EXTERNAL LOCATION} | Global | +| main.rs:2514:15:2514:24 | nested_box | T | {EXTERNAL LOCATION} | Box | +| main.rs:2514:15:2514:24 | nested_box | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2514:15:2514:24 | nested_box | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2515:13:2515:21 | box ... | | {EXTERNAL LOCATION} | Box | +| main.rs:2515:13:2515:21 | box ... | A | {EXTERNAL LOCATION} | Global | +| main.rs:2515:13:2515:21 | box ... | T | {EXTERNAL LOCATION} | Box | +| main.rs:2515:13:2515:21 | box ... | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2515:13:2515:21 | box ... | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2517:26:2517:43 | "Nested boxed: {}\\n" | | file://:0:0:0:0 | & | +| main.rs:2517:26:2517:43 | "Nested boxed: {}\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2517:26:2517:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2517:26:2517:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2529:21:2529:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2529:21:2529:25 | SelfParam | &T | main.rs:2528:5:2531:5 | Self [trait Executor] | +| main.rs:2530:24:2530:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2530:24:2530:28 | SelfParam | &T | main.rs:2528:5:2531:5 | Self [trait Executor] | +| main.rs:2530:31:2530:35 | query | | main.rs:2530:21:2530:21 | E | +| main.rs:2534:21:2534:25 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2534:21:2534:25 | SelfParam | &T | main.rs:2533:10:2533:22 | T | +| main.rs:2535:22:2535:41 | "Executor::execute1\\n" | | file://:0:0:0:0 | & | +| main.rs:2535:22:2535:41 | "Executor::execute1\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2535:22:2535:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2535:22:2535:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2538:24:2538:28 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2538:24:2538:28 | SelfParam | &T | main.rs:2533:10:2533:22 | T | +| main.rs:2538:31:2538:36 | _query | | main.rs:2538:21:2538:21 | E | +| main.rs:2539:22:2539:41 | "Executor::execute2\\n" | | file://:0:0:0:0 | & | +| main.rs:2539:22:2539:41 | "Executor::execute2\\n" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2539:22:2539:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2539:22:2539:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| main.rs:2548:13:2548:13 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2548:17:2548:34 | MySqlConnection {...} | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2550:9:2550:9 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2551:35:2551:36 | &c | | file://:0:0:0:0 | & | +| main.rs:2551:35:2551:36 | &c | &T | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2551:36:2551:36 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2553:9:2553:9 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2553:20:2553:40 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2553:20:2553:40 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2554:9:2554:9 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2554:28:2554:48 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2554:28:2554:48 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2555:35:2555:36 | &c | | file://:0:0:0:0 | & | +| main.rs:2555:35:2555:36 | &c | &T | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2555:36:2555:36 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2555:39:2555:59 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2555:39:2555:59 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2556:43:2556:44 | &c | | file://:0:0:0:0 | & | +| main.rs:2556:43:2556:44 | &c | &T | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2556:44:2556:44 | c | | main.rs:2543:5:2543:29 | MySqlConnection | +| main.rs:2556:47:2556:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| main.rs:2556:47:2556:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| main.rs:2566:5:2566:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2567:5:2567:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2567:20:2567:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2567:41:2567:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2583:5:2583:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | | pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:13:26:133:1 | { ... } | T | file://:0:0:0:0 | () | | pattern_matching.rs:14:9:14:13 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:14:9:14:13 | value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:14:17:14:24 | Some(...) | | {EXTERNAL LOCATION} | Option | @@ -4167,11 +4973,13 @@ inferType | pattern_matching.rs:17:18:17:25 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:17:18:17:25 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:17:20:17:23 | mesg | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:19:5:25:5 | match value { ... } | | file://:0:0:0:0 | () | | pattern_matching.rs:19:11:19:15 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:19:11:19:15 | value | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:20:9:20:18 | Some(...) | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:20:9:20:18 | Some(...) | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:20:14:20:17 | mesg | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:20:23:23:9 | { ... } | | file://:0:0:0:0 | () | | pattern_matching.rs:21:17:21:20 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:21:24:21:27 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | | file://:0:0:0:0 | & | @@ -4181,6 +4989,7 @@ inferType | pattern_matching.rs:22:24:22:27 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:24:9:24:12 | None | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:24:9:24:12 | None | T | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:24:17:24:18 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:26:9:26:12 | mesg | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:26:16:26:20 | value | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:26:16:26:20 | value | T | {EXTERNAL LOCATION} | i32 | @@ -4289,6 +5098,7 @@ inferType | pattern_matching.rs:58:17:58:22 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:59:13:59:13 | y | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:59:17:59:22 | value2 | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:60:9:60:10 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:63:9:63:23 | my_tuple_struct | | pattern_matching.rs:6:1:6:37 | MyTupleStruct | | pattern_matching.rs:63:9:63:23 | my_tuple_struct | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:63:9:63:23 | my_tuple_struct | T2 | {EXTERNAL LOCATION} | bool | @@ -4309,6 +5119,7 @@ inferType | pattern_matching.rs:65:17:65:22 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:66:13:66:13 | y | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:66:17:66:22 | value2 | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:67:9:67:10 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:70:9:70:16 | my_enum1 | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:70:9:70:16 | my_enum1 | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:70:9:70:16 | my_enum1 | T2 | {EXTERNAL LOCATION} | bool | @@ -4329,6 +5140,7 @@ inferType | pattern_matching.rs:76:21:76:26 | value1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:77:17:77:17 | y | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:77:21:77:26 | value2 | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:78:13:78:14 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:80:9:80:40 | ...::Variant2(...) | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:80:9:80:40 | ...::Variant2(...) | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:80:9:80:40 | ...::Variant2(...) | T2 | {EXTERNAL LOCATION} | bool | @@ -4338,6 +5150,7 @@ inferType | pattern_matching.rs:81:21:81:26 | value1 | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:82:17:82:17 | y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:82:21:82:26 | value2 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:83:13:83:14 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:87:9:87:22 | my_nested_enum | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:87:9:87:22 | my_nested_enum | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:87:9:87:22 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 | @@ -4358,6 +5171,7 @@ inferType | pattern_matching.rs:90:21:90:22 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:91:21:91:28 | "string" | | file://:0:0:0:0 | & | | pattern_matching.rs:91:21:91:28 | "string" | &T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:95:5:109:5 | match my_nested_enum { ... } | | file://:0:0:0:0 | () | | pattern_matching.rs:95:11:95:24 | my_nested_enum | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:95:11:95:24 | my_nested_enum | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:95:11:95:24 | my_nested_enum | T1.T1 | {EXTERNAL LOCATION} | i32 | @@ -4378,6 +5192,7 @@ inferType | pattern_matching.rs:99:25:99:25 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:100:25:100:25 | y | | file://:0:0:0:0 | & | | pattern_matching.rs:100:25:100:25 | y | &T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:102:14:107:9 | { ... } | | file://:0:0:0:0 | () | | pattern_matching.rs:103:17:103:17 | a | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:103:21:103:26 | value1 | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:104:17:104:17 | b | | {EXTERNAL LOCATION} | i32 | @@ -4386,12 +5201,14 @@ inferType | pattern_matching.rs:105:17:105:17 | c | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:105:21:105:21 | y | | file://:0:0:0:0 | & | | pattern_matching.rs:105:21:105:21 | y | &T | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:106:13:106:14 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:108:9:108:9 | _ | | pattern_matching.rs:8:1:11:1 | MyEnum | | pattern_matching.rs:108:9:108:9 | _ | T1 | pattern_matching.rs:1:1:4:1 | MyRecordStruct | | pattern_matching.rs:108:9:108:9 | _ | T1.T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:108:9:108:9 | _ | T1.T2 | file://:0:0:0:0 | & | | pattern_matching.rs:108:9:108:9 | _ | T1.T2.&T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:108:9:108:9 | _ | T2 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:108:14:108:15 | TupleExpr | | file://:0:0:0:0 | () | | pattern_matching.rs:111:9:111:12 | opt1 | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:111:9:111:12 | opt1 | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:111:16:111:39 | Some(...) | | {EXTERNAL LOCATION} | Option | @@ -4426,6 +5243,7 @@ inferType | pattern_matching.rs:127:45:127:48 | opt3 | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:129:9:129:9 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:132:5:132:8 | None | | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:132:5:132:8 | None | T | file://:0:0:0:0 | () | | pattern_matching.rs:169:9:169:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:169:17:169:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:171:11:171:15 | value | | {EXTERNAL LOCATION} | i32 | @@ -4906,33 +5724,136 @@ inferType | pattern_matching.rs:438:22:438:49 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:438:22:438:49 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:438:37:438:49 | wrapped_value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:9:444:13 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:444:9:444:13 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:9:444:13 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:9:444:13 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:444:9:444:13 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:444:9:444:13 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:444:17:444:36 | TupleExpr | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:444:17:444:36 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:444:18:444:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:444:24:444:27 | 2i64 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:444:24:444:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:444:30:444:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:444:30:444:35 | 3.0f32 | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:447:11:447:15 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:447:11:447:15 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:447:11:447:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:447:11:447:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:447:11:447:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:447:11:447:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:448:9:448:19 | TuplePat | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:448:9:448:19 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:448:9:448:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:448:9:448:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:448:9:448:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:448:9:448:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:448:10:448:10 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:448:13:448:13 | 2 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:448:13:448:13 | 2 | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:448:16:448:18 | 3.0 | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:448:16:448:18 | 3.0 | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:449:17:449:27 | exact_tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:449:17:449:27 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:449:31:449:35 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:449:31:449:35 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:31:449:35 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:449:31:449:35 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:449:31:449:35 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:449:31:449:35 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:450:22:450:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:450:22:450:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:450:43:450:53 | exact_tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:450:43:450:53 | exact_tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:450:43:450:53 | exact_tuple | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:452:9:452:17 | TuplePat | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:452:9:452:17 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:452:9:452:17 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:452:9:452:17 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:452:9:452:17 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:452:9:452:17 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:452:10:452:10 | a | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:452:13:452:13 | b | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:452:13:452:13 | b | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:452:16:452:16 | c | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:452:16:452:16 | c | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:453:17:453:26 | first_elem | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:453:30:453:30 | a | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:454:17:454:27 | second_elem | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:454:17:454:27 | second_elem | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:454:31:454:31 | b | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:454:31:454:31 | b | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:455:17:455:26 | third_elem | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:455:17:455:26 | third_elem | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:455:30:455:30 | c | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:455:30:455:30 | c | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:456:22:456:79 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:456:22:456:79 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:456:45:456:54 | first_elem | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:456:57:456:67 | second_elem | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:456:57:456:67 | second_elem | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:456:70:456:79 | third_elem | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:456:70:456:79 | third_elem | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:461:11:461:15 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:461:11:461:15 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:461:11:461:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:461:11:461:15 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:461:11:461:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:461:11:461:15 | tuple | 2(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:462:9:462:19 | TuplePat | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:462:9:462:19 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:462:9:462:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:462:9:462:19 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:462:9:462:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:462:9:462:19 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:464:22:464:53 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:464:22:464:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:469:9:469:12 | unit | | file://:0:0:0:0 | () | +| pattern_matching.rs:469:16:469:17 | TupleExpr | | file://:0:0:0:0 | () | +| pattern_matching.rs:470:11:470:14 | unit | | file://:0:0:0:0 | () | +| pattern_matching.rs:471:9:471:10 | TuplePat | | file://:0:0:0:0 | () | +| pattern_matching.rs:472:17:472:26 | unit_value | | file://:0:0:0:0 | () | +| pattern_matching.rs:472:30:472:33 | unit | | file://:0:0:0:0 | () | | pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:473:22:473:51 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:473:22:473:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:473:42:473:51 | unit_value | | file://:0:0:0:0 | () | +| pattern_matching.rs:478:9:478:14 | single | | file://:0:0:0:0 | (T_1) | +| pattern_matching.rs:478:9:478:14 | single | 0(1) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:478:18:478:25 | TupleExpr | | file://:0:0:0:0 | (T_1) | +| pattern_matching.rs:478:18:478:25 | TupleExpr | 0(1) | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:478:19:478:23 | 42i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:479:11:479:16 | single | | file://:0:0:0:0 | (T_1) | +| pattern_matching.rs:479:11:479:16 | single | 0(1) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:480:9:480:12 | TuplePat | | file://:0:0:0:0 | (T_1) | +| pattern_matching.rs:480:9:480:12 | TuplePat | 0(1) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:480:10:480:10 | x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:481:17:481:27 | single_elem | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:481:31:481:31 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:482:22:482:60 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:482:22:482:60 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:482:50:482:60 | single_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:488:9:488:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:488:17:488:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:491:11:491:15 | value | | {EXTERNAL LOCATION} | i32 | @@ -4945,16 +5866,35 @@ inferType | pattern_matching.rs:494:22:494:61 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:494:22:494:61 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:494:51:494:61 | paren_bound | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:499:9:499:13 | tuple | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:499:9:499:13 | tuple | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:499:9:499:13 | tuple | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:499:17:499:28 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:499:17:499:28 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:499:17:499:28 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:499:18:499:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:499:24:499:27 | 2i32 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:500:11:500:15 | tuple | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:500:11:500:15 | tuple | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:500:11:500:15 | tuple | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:501:9:501:16 | TuplePat | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:501:9:501:16 | TuplePat | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:501:9:501:16 | TuplePat | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:501:10:501:10 | x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:501:13:501:15 | (...) | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:501:14:501:14 | y | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:502:17:502:23 | paren_x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:502:27:502:27 | x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:503:17:503:23 | paren_y | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:503:27:503:27 | y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:504:22:504:53 | "Parenthesized in tuple: {}, {... | | file://:0:0:0:0 | & | | pattern_matching.rs:504:22:504:53 | "Parenthesized in tuple: {}, {... | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:504:22:504:71 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:504:22:504:71 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:504:56:504:62 | paren_x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:504:65:504:71 | paren_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:510:9:510:13 | slice | | file://:0:0:0:0 | & | | pattern_matching.rs:510:9:510:13 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:510:9:510:13 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:510:9:510:13 | slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:510:9:510:13 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:510:25:510:40 | &... | | file://:0:0:0:0 | & | | pattern_matching.rs:510:25:510:40 | &... | &T | file://:0:0:0:0 | [] | @@ -4972,23 +5912,15 @@ inferType | pattern_matching.rs:510:39:510:39 | 5 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:513:11:513:15 | slice | | file://:0:0:0:0 | & | | pattern_matching.rs:513:11:513:15 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:513:11:513:15 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:513:11:513:15 | slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:513:11:513:15 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:514:9:514:10 | SlicePat | | file://:0:0:0:0 | & | | pattern_matching.rs:514:9:514:10 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:514:9:514:10 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:514:9:514:10 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:514:9:514:10 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:515:17:515:27 | empty_slice | | file://:0:0:0:0 | & | | pattern_matching.rs:515:17:515:27 | empty_slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:515:17:515:27 | empty_slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:515:17:515:27 | empty_slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:515:17:515:27 | empty_slice | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:515:31:515:35 | slice | | file://:0:0:0:0 | & | | pattern_matching.rs:515:31:515:35 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:515:31:515:35 | slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:515:31:515:35 | slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:515:31:515:35 | slice | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:516:22:516:40 | "Empty slice: {:?}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:516:22:516:40 | "Empty slice: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | @@ -4996,13 +5928,9 @@ inferType | pattern_matching.rs:516:22:516:53 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:516:43:516:53 | empty_slice | | file://:0:0:0:0 | & | | pattern_matching.rs:516:43:516:53 | empty_slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:516:43:516:53 | empty_slice | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:516:43:516:53 | empty_slice | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:516:43:516:53 | empty_slice | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:518:9:518:11 | SlicePat | | file://:0:0:0:0 | & | | pattern_matching.rs:518:9:518:11 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:518:9:518:11 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:518:9:518:11 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:518:9:518:11 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:520:22:520:41 | "Single element: {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:520:22:520:41 | "Single element: {}\\n" | &T | {EXTERNAL LOCATION} | str | @@ -5010,8 +5938,6 @@ inferType | pattern_matching.rs:520:22:520:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:522:9:522:23 | SlicePat | | file://:0:0:0:0 | & | | pattern_matching.rs:522:9:522:23 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:522:9:522:23 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:522:9:522:23 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:522:9:522:23 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:525:22:525:43 | "Two elements: {}, {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:525:22:525:43 | "Two elements: {}, {}\\n" | &T | {EXTERNAL LOCATION} | str | @@ -5019,8 +5945,6 @@ inferType | pattern_matching.rs:525:22:525:70 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:527:9:527:34 | SlicePat | | file://:0:0:0:0 | & | | pattern_matching.rs:527:9:527:34 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:527:9:527:34 | SlicePat | &T | file://:0:0:0:0 | [] | -| pattern_matching.rs:527:9:527:34 | SlicePat | &T.[T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:527:9:527:34 | SlicePat | &T.[T] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:532:17:532:53 | "First: {}, last: {}, middle l... | | file://:0:0:0:0 | & | | pattern_matching.rs:532:17:532:53 | "First: {}, last: {}, middle l... | &T | {EXTERNAL LOCATION} | str | @@ -5169,18 +6093,58 @@ inferType | pattern_matching.rs:621:22:621:51 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:621:38:621:51 | range_or_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:623:9:623:9 | _ | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:628:9:628:13 | tuple | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:628:9:628:13 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:628:9:628:13 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:628:9:628:13 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:628:9:628:13 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:628:17:628:41 | TupleExpr | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:628:17:628:41 | TupleExpr | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:628:17:628:41 | TupleExpr | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:628:17:628:41 | TupleExpr | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:628:17:628:41 | TupleExpr | 3(4) | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:628:18:628:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:628:24:628:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:628:30:628:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:628:38:628:40 | 4u8 | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:631:11:631:15 | tuple | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:631:11:631:15 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:631:11:631:15 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:631:11:631:15 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:631:11:631:15 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:632:9:632:19 | TuplePat | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:632:9:632:19 | TuplePat | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:632:9:632:19 | TuplePat | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:632:9:632:19 | TuplePat | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:632:9:632:19 | TuplePat | 3(4) | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:634:22:634:42 | "First with rest: {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:634:22:634:42 | "First with rest: {}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:634:22:634:54 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:634:22:634:54 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:638:11:638:15 | tuple | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:638:11:638:15 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:638:11:638:15 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:638:11:638:15 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:638:11:638:15 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:639:9:639:18 | TuplePat | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:639:9:639:18 | TuplePat | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:639:9:639:18 | TuplePat | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:639:9:639:18 | TuplePat | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:639:9:639:18 | TuplePat | 3(4) | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:641:22:641:41 | "Last with rest: {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:641:22:641:41 | "Last with rest: {}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:641:22:641:52 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:641:22:641:52 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:645:11:645:15 | tuple | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:645:11:645:15 | tuple | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:645:11:645:15 | tuple | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:645:11:645:15 | tuple | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:645:11:645:15 | tuple | 3(4) | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:646:9:646:25 | TuplePat | | file://:0:0:0:0 | (T_4) | +| pattern_matching.rs:646:9:646:25 | TuplePat | 0(4) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:646:9:646:25 | TuplePat | 1(4) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:646:9:646:25 | TuplePat | 2(4) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:646:9:646:25 | TuplePat | 3(4) | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:649:22:649:45 | "First and last: {}, {}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:649:22:649:45 | "First and last: {}, {}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:649:22:649:67 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | @@ -5207,6 +6171,14 @@ inferType | pattern_matching.rs:682:21:682:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:682:21:682:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:682:28:682:28 | x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:687:9:687:20 | complex_data | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:687:9:687:20 | complex_data | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:687:9:687:20 | complex_data | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:687:9:687:20 | complex_data | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:687:24:687:79 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:687:24:687:79 | TupleExpr | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:687:24:687:79 | TupleExpr | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:687:24:687:79 | TupleExpr | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:687:25:687:44 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:687:36:687:36 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:687:42:687:42 | 2 | | {EXTERNAL LOCATION} | i32 | @@ -5219,6 +6191,14 @@ inferType | pattern_matching.rs:687:73:687:73 | 0 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:687:76:687:76 | 0 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:687:76:687:76 | 0 | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:689:11:689:22 | complex_data | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:689:11:689:22 | complex_data | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:689:11:689:22 | complex_data | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:689:11:689:22 | complex_data | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:691:9:691:61 | TuplePat | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:691:9:691:61 | TuplePat | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:691:9:691:61 | TuplePat | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:691:9:691:61 | TuplePat | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:691:10:691:26 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:691:21:691:21 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:691:24:691:24 | y | | {EXTERNAL LOCATION} | i32 | @@ -5242,11 +6222,27 @@ inferType | pattern_matching.rs:697:17:697:24 | nested_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:697:27:697:34 | nested_g | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:697:37:697:44 | nested_b | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:701:9:701:41 | TuplePat | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:701:9:701:41 | TuplePat | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:701:9:701:41 | TuplePat | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:701:9:701:41 | TuplePat | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:701:9:701:71 | ... \| ... | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:701:9:701:71 | ... \| ... | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:701:9:701:71 | ... \| ... | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:701:9:701:71 | ... \| ... | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:701:10:701:24 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:701:18:701:18 | x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:701:27:701:40 | ...::None | | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:701:27:701:40 | ...::None | T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:701:45:701:71 | TuplePat | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:701:45:701:71 | TuplePat | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:701:45:701:71 | TuplePat | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:701:45:701:71 | TuplePat | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:701:46:701:67 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:701:57:701:57 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:701:61:701:61 | 0 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:701:70:701:70 | _ | | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:701:70:701:70 | _ | T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:702:17:702:29 | alt_complex_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:702:33:702:33 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:703:22:703:50 | "Alternative complex: x={:?}\\n... | | file://:0:0:0:0 | & | @@ -5254,10 +6250,26 @@ inferType | pattern_matching.rs:703:22:703:65 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:703:22:703:65 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:703:53:703:65 | alt_complex_x | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:706:9:706:13 | other | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:706:9:706:13 | other | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:706:9:706:13 | other | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:706:9:706:13 | other | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:707:17:707:29 | other_complex | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:707:17:707:29 | other_complex | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:707:17:707:29 | other_complex | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:707:17:707:29 | other_complex | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:707:33:707:37 | other | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:707:33:707:37 | other | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:707:33:707:37 | other | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:707:33:707:37 | other | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:708:22:708:47 | "Other complex data: {:?}\\n" | | file://:0:0:0:0 | & | | pattern_matching.rs:708:22:708:47 | "Other complex data: {:?}\\n" | &T | {EXTERNAL LOCATION} | str | | pattern_matching.rs:708:22:708:62 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | pattern_matching.rs:708:22:708:62 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| pattern_matching.rs:708:50:708:62 | other_complex | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:708:50:708:62 | other_complex | 0(2) | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:708:50:708:62 | other_complex | 1(2) | pattern_matching.rs:152:1:156:1 | MyOption | +| pattern_matching.rs:708:50:708:62 | other_complex | 1(2).T | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:715:9:715:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:715:17:715:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:715:28:715:29 | 10 | | {EXTERNAL LOCATION} | i32 | @@ -5270,9 +6282,34 @@ inferType | pattern_matching.rs:717:17:717:17 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:718:9:718:13 | let_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:718:17:718:17 | y | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:720:9:720:13 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:720:9:720:13 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:720:9:720:13 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:720:9:720:13 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:720:17:720:36 | TupleExpr | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:720:17:720:36 | TupleExpr | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:720:17:720:36 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:720:17:720:36 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:720:18:720:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:720:24:720:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:720:30:720:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:721:9:721:17 | TuplePat | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:721:9:721:17 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:721:9:721:17 | TuplePat | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:721:9:721:17 | TuplePat | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:721:10:721:10 | a | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:721:13:721:13 | b | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:721:16:721:16 | c | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:721:21:721:25 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:721:21:721:25 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:721:21:721:25 | tuple | 1(3) | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:721:21:721:25 | tuple | 2(3) | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:722:9:722:13 | let_a | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:722:17:722:17 | a | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:723:9:723:13 | let_b | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:723:17:723:17 | b | | {EXTERNAL LOCATION} | i64 | +| pattern_matching.rs:724:9:724:13 | let_c | | {EXTERNAL LOCATION} | f32 | +| pattern_matching.rs:724:17:724:17 | c | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:726:9:726:13 | array | | file://:0:0:0:0 | [] | | pattern_matching.rs:726:9:726:13 | array | [T;...] | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:726:17:726:34 | [...] | | file://:0:0:0:0 | [] | @@ -5321,10 +6358,16 @@ inferType | pattern_matching.rs:750:22:750:35 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:750:30:750:30 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:750:33:750:33 | y | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:750:59:754:5 | { ... } | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:750:59:754:5 | { ... } | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:750:59:754:5 | { ... } | 1(2) | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:751:13:751:19 | param_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:751:23:751:23 | x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:752:13:752:19 | param_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:752:23:752:23 | y | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:753:9:753:26 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:753:9:753:26 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:753:9:753:26 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:753:10:753:16 | param_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:753:19:753:25 | param_y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:756:22:756:35 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | @@ -5335,10 +6378,35 @@ inferType | pattern_matching.rs:757:13:757:19 | param_r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:757:23:757:23 | r | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:758:9:758:15 | param_r | | {EXTERNAL LOCATION} | u8 | +| pattern_matching.rs:761:22:761:38 | TuplePat | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:761:22:761:38 | TuplePat | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:761:22:761:38 | TuplePat | 1(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:761:22:761:38 | TuplePat | 2(3) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:761:23:761:27 | first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:761:30:761:30 | _ | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:761:33:761:37 | third | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:761:74:765:5 | { ... } | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:761:74:765:5 | { ... } | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:761:74:765:5 | { ... } | 1(2) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:762:13:762:23 | param_first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:762:27:762:31 | first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:763:13:763:23 | param_third | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:763:27:763:31 | third | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:764:9:764:34 | TupleExpr | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:764:9:764:34 | TupleExpr | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:764:9:764:34 | TupleExpr | 1(2) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:764:10:764:20 | param_first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:764:23:764:33 | param_third | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:768:9:768:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:768:17:768:37 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:768:28:768:28 | 5 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:768:34:768:35 | 10 | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:769:9:769:17 | extracted | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:769:9:769:17 | extracted | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:769:9:769:17 | extracted | 1(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:769:21:769:40 | extract_point(...) | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:769:21:769:40 | extract_point(...) | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:769:21:769:40 | extract_point(...) | 1(2) | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:769:35:769:39 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:771:9:771:13 | color | | pattern_matching.rs:142:1:143:25 | Color | | pattern_matching.rs:771:17:771:35 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | @@ -5351,9 +6419,27 @@ inferType | pattern_matching.rs:772:9:772:11 | red | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:772:15:772:34 | extract_color(...) | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:772:29:772:33 | color | | pattern_matching.rs:142:1:143:25 | Color | +| pattern_matching.rs:774:9:774:13 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:774:9:774:13 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:9:774:13 | tuple | 1(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:774:9:774:13 | tuple | 2(3) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:774:17:774:38 | TupleExpr | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:774:17:774:38 | TupleExpr | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:17:774:38 | TupleExpr | 1(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:774:17:774:38 | TupleExpr | 2(3) | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:774:18:774:22 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:774:25:774:31 | 3.14f64 | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:774:34:774:37 | true | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:775:9:775:23 | tuple_extracted | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:775:9:775:23 | tuple_extracted | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:775:9:775:23 | tuple_extracted | 1(2) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:775:27:775:46 | extract_tuple(...) | | file://:0:0:0:0 | (T_2) | +| pattern_matching.rs:775:27:775:46 | extract_tuple(...) | 0(2) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:775:27:775:46 | extract_tuple(...) | 1(2) | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:775:41:775:45 | tuple | | file://:0:0:0:0 | (T_3) | +| pattern_matching.rs:775:41:775:45 | tuple | 0(3) | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:775:41:775:45 | tuple | 1(3) | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:775:41:775:45 | tuple | 2(3) | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:781:23:781:42 | (...) | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:781:23:781:42 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:781:34:781:34 | 1 | | {EXTERNAL LOCATION} | i32 | @@ -5433,4 +6519,5 @@ inferType | pattern_matching.rs:807:38:807:44 | guard_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:809:9:809:9 | _ | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:814:5:814:7 | f(...) | | {EXTERNAL LOCATION} | Option | +| pattern_matching.rs:814:5:814:7 | f(...) | T | file://:0:0:0:0 | () | testFailures diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected index d8fcd1ec9f06..b5d4fea346d2 100644 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected @@ -6,7 +6,7 @@ multipleCallTargets | sqlx.rs:51:24:51:77 | ...::from(...) | | sqlx.rs:55:26:55:79 | ...::from(...) | | sqlx.rs:61:28:61:81 | ...::from(...) | -| sqlx.rs:64:26:64:46 | safe_query_1.as_str() | +| sqlx.rs:64:57:64:77 | safe_query_1.as_str() | | sqlx.rs:65:26:65:46 | safe_query_2.as_str() | | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | | sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/TypeInferenceConsistency.expected new file mode 100644 index 000000000000..6a60922b6f0f --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/TypeInferenceConsistency.expected @@ -0,0 +1,3 @@ +nonUniqueCertainType +| sqlx.rs:158:13:158:81 | { ... } | E | +| sqlx.rs:160:17:160:86 | { ... } | E | diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 97f5e996bb2a..cc00a44d9fc4 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -1,75 +1,64 @@ #select -| sqlx.rs:66:26:66:46 | safe_query_3.as_str() | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | -| sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | -| sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | -| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | -| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | -| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | +| sqlx.rs:77:13:77:23 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:77:13:77:23 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | +| sqlx.rs:78:13:78:23 | ...::query | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:13:78:23 | ...::query | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | +| sqlx.rs:80:17:80:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:17:80:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | edges | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | -| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:2 | -| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:3 | -| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:5 | +| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:3 | +| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:4 | +| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:6 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:9 | -| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:9 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:10 | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:10 | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | -| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:1 | -| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:6 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:10 | -| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:7 | +| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:2 | +| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:7 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:11 | +| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:8 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:49:9:49:21 | remote_number | sqlx.rs:52:32:52:87 | MacroExpr | provenance | | -| sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:7 | +| sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | provenance | MaD:8 | | sqlx.rs:49:25:49:65 | ... .unwrap_or(...) | sqlx.rs:49:9:49:21 | remote_number | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:66:26:66:37 | safe_query_3 | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | provenance | MaD:8 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | provenance | MaD:4 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | provenance | MaD:8 | | sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:36 | safe_query_3 | provenance | | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:8 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:4 | -| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:8 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:9 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:5 | +| sqlx.rs:52:9:52:20 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:9 | | sqlx.rs:52:24:52:88 | res | sqlx.rs:52:32:52:87 | { ... } | provenance | | | sqlx.rs:52:32:52:87 | ...::format(...) | sqlx.rs:52:24:52:88 | res | provenance | | | sqlx.rs:52:32:52:87 | ...::must_use(...) | sqlx.rs:52:9:52:20 | safe_query_3 | provenance | | -| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:11 | -| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:12 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | provenance | MaD:8 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | provenance | MaD:4 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | provenance | MaD:8 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | MaD:8 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | MaD:4 | -| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | MaD:8 | +| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:12 | +| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:13 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:5 | +| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:27:53:36 | arg_string | sqlx.rs:53:26:53:36 | &arg_string [&ref] | provenance | | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | provenance | MaD:8 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | provenance | MaD:4 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | provenance | MaD:8 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | provenance | MaD:8 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | provenance | MaD:4 | -| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | provenance | MaD:8 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:9 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:5 | +| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | -| sqlx.rs:66:26:66:37 | safe_query_3 | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | provenance | MaD:8 | -| sqlx.rs:66:26:66:37 | safe_query_3 | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | provenance | MaD:4 | -| sqlx.rs:66:26:66:37 | safe_query_3 | sqlx.rs:66:26:66:46 | safe_query_3.as_str() | provenance | MaD:8 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:8 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:4 | -| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | provenance | MaD:8 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:5 | +| sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | models -| 1 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 2 | Source: std::env::args; ReturnValue.Element; commandargs | -| 3 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 4 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 5 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 6 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 7 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 8 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 9 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 10 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 11 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 12 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 1 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | +| 2 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 3 | Source: std::env::args; ReturnValue.Element; commandargs | +| 4 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 5 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 6 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 8 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 9 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 10 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 11 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 12 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 13 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | sqlx.rs:47:9:47:18 | arg_string | semmle.label | arg_string | | sqlx.rs:47:22:47:35 | ...::args | semmle.label | ...::args | @@ -97,12 +86,12 @@ nodes | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | sqlx.rs:54:27:54:39 | remote_string | semmle.label | remote_string | -| sqlx.rs:66:26:66:37 | safe_query_3 | semmle.label | safe_query_3 | -| sqlx.rs:66:26:66:46 | safe_query_3.as_str() | semmle.label | safe_query_3.as_str() | -| sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | -| sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | semmle.label | unsafe_query_2.as_str() | +| sqlx.rs:77:13:77:23 | ...::query | semmle.label | ...::query | | sqlx.rs:77:25:77:36 | safe_query_3 | semmle.label | safe_query_3 | | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | semmle.label | safe_query_3.as_str() | -| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | -| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | semmle.label | unsafe_query_2.as_str() | +| sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | semmle.label | safe_query_3.as_str() [&ref] | +| sqlx.rs:78:13:78:23 | ...::query | semmle.label | ...::query | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | +| sqlx.rs:80:17:80:27 | ...::query | semmle.label | ...::query | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | semmle.label | unsafe_query_2.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-089/sqlx.rs b/rust/ql/test/query-tests/security/CWE-089/sqlx.rs index fd1153cffd38..8e1afa9f0e8f 100644 --- a/rust/ql/test/query-tests/security/CWE-089/sqlx.rs +++ b/rust/ql/test/query-tests/security/CWE-089/sqlx.rs @@ -39,8 +39,8 @@ use sqlx::Executor; async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Error> { // connect through a MySQL connection pool - let pool = sqlx::mysql::MySqlPool::connect(url).await?; - let mut conn = pool.acquire().await?; + let pool: sqlx::Pool = sqlx::mysql::MySqlPool::connect(url).await?; + let mut conn: sqlx::pool::PoolConnection = pool.acquire().await?; // construct queries (with extra variants) let const_string = String::from("Alice"); @@ -61,14 +61,14 @@ async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Err let prepared_query_1 = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) // direct execution - let _ = conn.execute(safe_query_1.as_str()).await?; // $ sql-sink - let _ = conn.execute(safe_query_2.as_str()).await?; // $ sql-sink - let _ = conn.execute(safe_query_3.as_str()).await?; // $ sql-sink $ SPURIOUS: Alert[rust/sql-injection]=remote1 - let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=args1 + let _: sqlx::mysql::MySqlQueryResult = conn.execute(safe_query_1.as_str()).await?; // $ MISSING: sql-sink + let _ = conn.execute(safe_query_2.as_str()).await?; // $ MISSING: sql-sink + let _ = conn.execute(safe_query_3.as_str()).await?; // $ MISSING: sql-sink + let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=args1 if enable_remote { - let _ = conn.execute(unsafe_query_2.as_str()).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 - let _ = conn.execute(unsafe_query_3.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 - let _ = conn.execute(unsafe_query_4.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 + let _ = conn.execute(unsafe_query_2.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote1 + let _ = conn.execute(unsafe_query_3.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote1 + let _ = conn.execute(unsafe_query_4.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote1 } // prepared queries @@ -103,9 +103,9 @@ async fn test_sqlx_sqlite(url: &str, enable_remote: bool) -> Result<(), sqlx::Er let prepared_query_1 = String::from("SELECT * FROM people WHERE firstname=?"); // (prepared arguments are safe) // direct execution (with extra variants) - let _ = conn.execute(safe_query_1.as_str()).await?; // $ sql-sink + let _ = conn.execute(safe_query_1.as_str()).await?; // $ MISSING: sql-sink if enable_remote { - let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote2 + let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote2 } // ... let _ = sqlx::raw_sql(safe_query_1.as_str()).execute(&mut conn).await?; // $ sql-sink @@ -176,9 +176,9 @@ async fn test_sqlx_postgres(url: &str, enable_remote: bool) -> Result<(), sqlx:: let prepared_query_1 = String::from("SELECT * FROM people WHERE firstname=$1"); // (prepared arguments are safe) // direct execution - let _ = conn.execute(safe_query_1.as_str()).await?; // $ sql-sink + let _ = conn.execute(safe_query_1.as_str()).await?; // $ MISSING: sql-sink if enable_remote { - let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote3 + let _ = conn.execute(unsafe_query_1.as_str()).await?; // $ MISSING: sql-sink Alert[rust/sql-injection]=remote3 } // prepared queries diff --git a/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected b/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected index 5f5ddd261b62..0a229c72d757 100644 --- a/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected +++ b/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected @@ -1,9 +1,9 @@ #select -| main.rs:7:5:7:26 | ...::get | main.rs:6:50:6:57 | password | main.rs:7:5:7:26 | ...::get | The operation '...::get', transmits data which may contain unencrypted sensitive data from $@. | main.rs:6:50:6:57 | password | password | -| main.rs:14:5:14:26 | ...::get | main.rs:12:50:12:57 | password | main.rs:14:5:14:26 | ...::get | The operation '...::get', transmits data which may contain unencrypted sensitive data from $@. | main.rs:12:50:12:57 | password | password | -| main.rs:21:12:21:15 | post | main.rs:19:50:19:57 | password | main.rs:21:12:21:15 | post | The operation 'post', transmits data which may contain unencrypted sensitive data from $@. | main.rs:19:50:19:57 | password | password | -| main.rs:28:12:28:18 | request | main.rs:26:50:26:57 | password | main.rs:28:12:28:18 | request | The operation 'request', transmits data which may contain unencrypted sensitive data from $@. | main.rs:26:50:26:57 | password | password | -| main.rs:35:12:35:18 | request | main.rs:33:50:33:57 | password | main.rs:35:12:35:18 | request | The operation 'request', transmits data which may contain unencrypted sensitive data from $@. | main.rs:33:50:33:57 | password | password | +| main.rs:7:5:7:26 | ...::get | main.rs:6:50:6:57 | password | main.rs:7:5:7:26 | ...::get | This '...::get' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:6:50:6:57 | password | password | +| main.rs:14:5:14:26 | ...::get | main.rs:12:50:12:57 | password | main.rs:14:5:14:26 | ...::get | This '...::get' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:12:50:12:57 | password | password | +| main.rs:21:12:21:15 | post | main.rs:19:50:19:57 | password | main.rs:21:12:21:15 | post | This 'post' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:19:50:19:57 | password | password | +| main.rs:28:12:28:18 | request | main.rs:26:50:26:57 | password | main.rs:28:12:28:18 | request | This 'request' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:26:50:26:57 | password | password | +| main.rs:35:12:35:18 | request | main.rs:33:50:33:57 | password | main.rs:35:12:35:18 | request | This 'request' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:33:50:33:57 | password | password | edges | main.rs:6:9:6:11 | url | main.rs:7:28:7:30 | url | provenance | | | main.rs:6:15:6:58 | res | main.rs:6:23:6:57 | { ... } | provenance | | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 20d413f5001f..0cf81cf9d776 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -143,8 +143,8 @@ edges | test_logging.rs:99:14:99:46 | res | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:14:99:46 | res | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:19 | ...::log | provenance | MaD:12 Sink:MaD:12 | | test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:42 | ...::log | provenance | MaD:12 Sink:MaD:12 | @@ -166,8 +166,8 @@ edges | test_logging.rs:176:34:176:79 | res | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:34:176:79 | res | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | | test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | @@ -176,12 +176,12 @@ edges | test_logging.rs:180:36:180:81 | res | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:36:180:81 | res | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 [Err] | provenance | | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | -| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | generated | +| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:16 | | test_logging.rs:183:51:183:67 | password2.clone() | test_logging.rs:183:47:183:68 | Err(...) [Err] | provenance | | | test_logging.rs:184:13:184:23 | err_result2 [Err] | test_logging.rs:184:25:184:34 | log_expect | provenance | MaD:4 Sink:MaD:4 | | test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 [Err] | provenance | | @@ -228,9 +228,9 @@ edges | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:13:226:60 | ...::assert_failed [Some] | provenance | MaD:10 | | test_logging.rs:226:36:226:59 | MacroExpr | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | MacroExpr | provenance | | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:19 | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:17 | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:19 | +| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:20 | +| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:18 | +| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:20 | | test_logging.rs:229:30:229:62 | res | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | @@ -238,59 +238,59 @@ edges | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:30:229:62 | res | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:19 | -| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:17 | -| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:19 | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:20 | +| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:18 | +| test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | MaD:20 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | -| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:18 | -| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:16 | +| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:19 | +| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:242:16:242:50 | res | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:16:242:61 | ... .as_bytes() | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref] | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:16:242:50 | res | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:18 | -| test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:16 | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:19 | +| test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | MaD:17 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | -| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:18 | -| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:16 | +| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:19 | +| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:245:20:245:54 | res | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:20:245:65 | ... .as_bytes() | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref] | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:20:245:54 | res | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:18 | -| test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:16 | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:19 | +| test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | MaD:17 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | -| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:18 | -| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:16 | +| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:19 | +| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:248:15:248:49 | res | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:15:248:60 | ... .as_bytes() | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref] | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:15:248:49 | res | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:18 | -| test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:16 | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:19 | +| test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | MaD:17 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | -| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:18 | -| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:16 | +| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:19 | +| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | provenance | MaD:17 | | test_logging.rs:251:15:251:49 | res | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:15:251:60 | ... .as_bytes() | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref] | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:15:251:49 | res | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:18 | -| test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:16 | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:20 | -| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:21 | +| test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:19 | +| test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | MaD:17 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:21 | +| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:22 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models | 1 | Sink: ::log_expect; Argument[0]; log-injection | @@ -308,12 +308,13 @@ models | 13 | Sink: log::__private_api::log; Argument[3]; log-injection | | 14 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | | 15 | Sink: std::io::stdio::_print; Argument[0]; log-injection | -| 16 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 17 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 18 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 19 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 20 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 16 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 17 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 18 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 19 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 20 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 21 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 22 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:5:42:36 | ...::log | semmle.label | ...::log | | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | diff --git a/rust/ql/test/query-tests/security/CWE-328/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-328/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index cb8b7cc4d6c5..000000000000 --- a/rust/ql/test/query-tests/security/CWE-328/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multipleCallTargets -| test.rs:82:26:82:44 | harmless.as_bytes() | -| test.rs:83:26:83:44 | password.as_bytes() | diff --git a/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..b0ca63000651 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,10 @@ +multipleCallTargets +| test_cipher.rs:15:30:15:77 | ...::new(...) | +| test_cipher.rs:19:30:19:80 | ...::new(...) | +| test_cipher.rs:22:30:22:98 | ...::new(...) | +| test_cipher.rs:26:30:26:101 | ...::new(...) | +| test_cipher.rs:30:30:30:102 | ...::new(...) | +| test_cipher.rs:38:30:38:81 | ...::new(...) | +| test_cipher.rs:42:30:42:80 | ...::new(...) | +| test_cipher.rs:47:30:47:85 | ...::new(...) | +| test_cipher.rs:51:31:51:83 | ...::new(...) | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected new file mode 100644 index 000000000000..2155fef0d407 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -0,0 +1,122 @@ +#select +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | +edges +| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | +| test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | +| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | +| test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | +| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | +| test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | +| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | +| test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:2 Sink:MaD:2 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:7 | +| test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | +| test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | +| test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:2 Sink:MaD:2 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:7 | +| test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:6 | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | +| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | +| test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | +| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | +| test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +models +| 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | +| 2 | Sink: ::new; Argument[0]; credentials-key | +| 3 | Sink: ::new; Argument[1]; credentials-iv | +| 4 | Sink: ::new; Argument[0]; credentials-key | +| 5 | Sink: ::new; Argument[1]; credentials-iv | +| 6 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | +| 7 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +nodes +| test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | +| test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:18:30:18:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | +| test_cipher.rs:25:9:25:14 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | +| test_cipher.rs:25:28:25:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:25:30:25:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | semmle.label | const4 [&ref, element] | +| test_cipher.rs:29:9:29:14 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | +| test_cipher.rs:29:28:29:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | semmle.label | [0u8; 16] [element] | +| test_cipher.rs:29:30:29:32 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | semmle.label | const5 [&ref, element] | +| test_cipher.rs:37:9:37:14 | const7 | semmle.label | const7 | +| test_cipher.rs:37:27:37:74 | [...] | semmle.label | [...] | +| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | semmle.label | &const7 [&ref] | +| test_cipher.rs:38:74:38:79 | const7 | semmle.label | const7 | +| test_cipher.rs:41:9:41:14 | const8 [&ref] | semmle.label | const8 [&ref] | +| test_cipher.rs:41:28:41:76 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:41:29:41:76 | [...] | semmle.label | [...] | +| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | semmle.label | const8 [&ref] | +| test_cipher.rs:50:9:50:15 | const10 [element] | semmle.label | const10 [element] | +| test_cipher.rs:50:37:50:52 | ...::zeroed | semmle.label | ...::zeroed | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | semmle.label | ...::zeroed(...) [element] | +| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | +| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | semmle.label | &const10 [&ref, element] | +| test_cipher.rs:51:75:51:81 | const10 [element] | semmle.label | const10 [element] | +| test_cipher.rs:73:9:73:14 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cipher.rs:73:18:73:26 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | semmle.label | [0u8; 32] [element] | +| test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | +| test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | +| test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref new file mode 100644 index 000000000000..77c0b90160ca --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-798/HardcodedCryptographicValue.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-798/options.yml b/rust/ql/test/query-tests/security/CWE-798/options.yml new file mode 100644 index 000000000000..6713251d3ebd --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/options.yml @@ -0,0 +1,10 @@ +qltest_cargo_check: true +qltest_dependencies: + - cipher = { version = "0.4.4" } + - rabbit = { version = "0.4.1" } + - aes = { version = "0.8.4" } + - aes-gcm = { version = "0.10.3" } + - cfb-mode = { version = "0.8.2" } + - base64 = { version = "0.22.1" } + - getrandom = { version = "0.3.1" } + - getrandom2 = { package = "getrandom", version = "0.2.15" } diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs new file mode 100644 index 000000000000..7278f786b100 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -0,0 +1,147 @@ + +use cipher::{consts::*, StreamCipher, AsyncStreamCipher, KeyInit, KeyIvInit, BlockEncrypt}; +use rabbit::{Rabbit, RabbitKeyOnly}; +use aes::Aes256; + +// --- tests --- + +fn test_stream_cipher_rabbit( + key: &[u8;16], iv: &[u8;16], plaintext: &str +) { + let mut data = plaintext.as_bytes().to_vec(); + + // rabbit + + let mut rabbit_cipher1 = RabbitKeyOnly::new(rabbit::Key::from_slice(key)); + rabbit_cipher1.apply_keystream(&mut data); + + let const1: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] + let mut rabbit_cipher2 = RabbitKeyOnly::new(rabbit::Key::from_slice(const1)); // $ Sink + rabbit_cipher2.apply_keystream(&mut data); + + let mut rabbit_cipher3 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(iv)); + rabbit_cipher3.apply_keystream(&mut data); + + let const4: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] + let mut rabbit_cipher4 = Rabbit::new(rabbit::Key::from_slice(const4), rabbit::Iv::from_slice(iv)); // $ Sink + rabbit_cipher4.apply_keystream(&mut data); + + let const5: &[u8;16] = &[0u8;16]; // $ Alert[rust/hard-coded-cryptographic-value] + let mut rabbit_cipher5 = Rabbit::new(rabbit::Key::from_slice(key), rabbit::Iv::from_slice(const5)); // $ Sink + rabbit_cipher5.apply_keystream(&mut data); + + // various expressions of constant arrays + + let const6: &[u8;16] = &[0u8;16]; // (unused, so good) + + let const7: [u8;16] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hard-coded-cryptographic-value] + let mut rabbit_cipher7 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const7)); // $ Sink + rabbit_cipher7.apply_keystream(&mut data); + + let const8: &[u8;16] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // $ Alert[rust/hard-coded-cryptographic-value] + let mut rabbit_cipher8 = RabbitKeyOnly::new(rabbit::Key::from_slice(const8)); // $ Sink + rabbit_cipher8.apply_keystream(&mut data); + + let const9: [u16;8] = [0, 0, 0, 0, 0, 0, 0, 0]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let const9_conv = unsafe { const9.align_to::().1 }; // convert [u16;8] -> [u8;8] + let mut rabbit_cipher9 = RabbitKeyOnly::new(rabbit::Key::from_slice(const9_conv)); // $ MISSING: Sink + rabbit_cipher9.apply_keystream(&mut data); + + let const10: [u8;16] = unsafe { std::mem::zeroed() }; // $ Alert[rust/hard-coded-cryptographic-value] + let mut rabbit_cipher10 = RabbitKeyOnly::new(rabbit::Key::from_slice(&const10)); // $ Sink + rabbit_cipher10.apply_keystream(&mut data); +} + +use base64::Engine; + +fn test_block_cipher_aes( + key: &[u8], iv: &[u8], key256: &[u8;32], key_str: &str, + block128: &mut [u8;16], input: &[u8], output: &mut [u8] +) { + // aes + + let aes_cipher1 = Aes256::new(key256.into()); + aes_cipher1.encrypt_block(block128.into()); + + let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher2 = Aes256::new(const2.into()); // $ MISSING: Sink + aes_cipher2.encrypt_block(block128.into()); + + let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); + aes_cipher3.encrypt_block(block128.into()); + + let const2 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] + let aes_cipher4 = Aes256::new_from_slice(const2).unwrap(); // $ Sink + aes_cipher4.encrypt_block(block128.into()); + + let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); + _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); + + let const6 = &[0u8;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ MISSING: Sink + _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); + + let const7 = &[0u8; 16]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ MISSING: Sink + _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); + + // various string conversions + + let key8: &[u8] = key_str.as_bytes(); + let aes_cipher8 = cfb_mode::Encryptor::::new(key8.into(), iv.into()); + _ = aes_cipher8.encrypt_b2b(input, output).unwrap(); + + let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let aes_cipher9 = cfb_mode::Encryptor::::new(key9.into(), iv.into()); + _ = aes_cipher9.encrypt_b2b(input, output).unwrap(); + + let key10: [u8; 32] = match base64::engine::general_purpose::STANDARD.decode(key_str) { + Ok(x) => x.try_into().unwrap(), + Err(_) => "1234567890123456".as_bytes().try_into().unwrap() // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + }; + let aes_cipher10 = Aes256::new(&key10.into()); + aes_cipher10.encrypt_block(block128.into()); + + if let Ok(const11) = base64::engine::general_purpose::STANDARD.decode("1234567890123456") { // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let key11: [u8; 32] = const11.try_into().unwrap(); + let aes_cipher11 = Aes256::new(&key11.into()); + aes_cipher11.encrypt_block(block128.into()); + } +} + +use aes_gcm::aead::{Aead, AeadCore, OsRng}; +use aes_gcm::{Aes256Gcm, Key, Nonce}; + +fn test_aes_gcm( +) { + // aes (GCM) + + let key1 = Aes256Gcm::generate_key(aes_gcm::aead::OsRng); + let nonce1 = Aes256Gcm::generate_nonce(aes_gcm::aead::OsRng); + let cipher1 = Aes256Gcm::new(&key1); + let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); + + let key2: [u8;32] = [0;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let nonce2 = [0;12]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let cipher2 = Aes256Gcm::new(&key2.into()); // $ MISSING: Sink + let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ MISSING: Sink + + let key3_array: &[u8;32] = &[0xff;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let key3 = Key::::from_slice(key3_array); + let nonce3: [u8;12] = [0xff;12]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let cipher3 = Aes256Gcm::new(&key3); // $ MISSING: Sink + let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ MISSING: Sink + + // with barrier + + let mut key4 = [0u8;32]; + let mut nonce4 = [0u8;12]; + _ = getrandom::fill(&mut key4).unwrap(); + _ = getrandom2::getrandom(&mut nonce4).unwrap(); + let cipher4 = Aes256Gcm::new(&key4.into()); + let _ = cipher4.encrypt(&nonce4.into(), b"plaintext".as_ref()).unwrap(); + + let mut key5 = [0u8;32]; + _ = getrandom::fill(&mut key5).unwrap(); + let _ = Aes256::new_from_slice(&key5).unwrap(); +} diff --git a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected index bd02a006dc88..22e607bfa486 100644 --- a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected @@ -9,8 +9,6 @@ multipleCallTargets | lifetime.rs:612:41:612:52 | bar.as_str() | | lifetime.rs:628:13:628:31 | ...::from(...) | | lifetime.rs:629:32:629:43 | baz.as_str() | -| main.rs:41:8:41:24 | ...::into_raw(...) | -| main.rs:80:11:80:27 | ...::into_raw(...) | multiplePathResolutions | deallocation.rs:106:16:106:19 | libc | | deallocation.rs:112:3:112:6 | libc | diff --git a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/TypeInferenceConsistency.expected deleted file mode 100644 index 56ce1df5c894..000000000000 --- a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/TypeInferenceConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -illFormedTypeMention -| main.rs:403:18:403:24 | FuncPtr | diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md new file mode 100644 index 000000000000..bafab76efba1 --- /dev/null +++ b/shared/concepts/CHANGELOG.md @@ -0,0 +1,9 @@ +## 0.0.2 + +No user-facing changes. + +## 0.0.1 + +### Minor Analysis Improvements + +* Initial release. Moves the shared concepts library into its own qlpack. diff --git a/shared/concepts/change-notes/released/0.0.1.md b/shared/concepts/change-notes/released/0.0.1.md new file mode 100644 index 000000000000..f0aa669c6709 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.1.md @@ -0,0 +1,5 @@ +## 0.0.1 + +### Minor Analysis Improvements + +* Initial release. Moves the shared concepts library into its own qlpack. diff --git a/shared/concepts/change-notes/released/0.0.2.md b/shared/concepts/change-notes/released/0.0.2.md new file mode 100644 index 000000000000..5ab250998ed4 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.2.md @@ -0,0 +1,3 @@ +## 0.0.2 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml new file mode 100644 index 000000000000..55dc06fbd76a --- /dev/null +++ b/shared/concepts/codeql-pack.release.yml @@ -0,0 +1,2 @@ +--- +lastReleaseVersion: 0.0.2 diff --git a/shared/concepts/codeql/concepts/ConceptsShared.qll b/shared/concepts/codeql/concepts/ConceptsShared.qll new file mode 100644 index 000000000000..2202110be05e --- /dev/null +++ b/shared/concepts/codeql/concepts/ConceptsShared.qll @@ -0,0 +1,192 @@ +/** + * Provides Concepts which are shared across languages. + * + * Each language has a language specific `Concepts.qll` file that can import the + * shared concepts from this file. A language can either re-export the concept directly, + * or can add additional member-predicates that are needed for that language. + * + * Moving forward, `Concepts.qll` will be the staging ground for brand new concepts from + * each language, but we will maintain a discipline of moving those concepts to + * `ConceptsShared.qll` ASAP. + */ +overlay[local?] +module; + +private import CryptoAlgorithms as CA +private import codeql.dataflow.DataFlow as DF +private import codeql.util.Location + +/** + * Construct the shared concepts modules. + */ +module ConceptsMake DataFlowLang> { + final private class DataFlowNode = DataFlowLang::Node; + + /** + * Provides models for cryptographic concepts. + * + * Note: The `CryptographicAlgorithm` class currently doesn't take weak keys into + * consideration for the `isWeak` member predicate. So RSA is always considered + * secure, although using a low number of bits will actually make it insecure. We plan + * to improve our libraries in the future to more precisely capture this aspect. + */ + module Cryptography { + class CryptographicAlgorithm = CA::CryptographicAlgorithm; + + class EncryptionAlgorithm = CA::EncryptionAlgorithm; + + class HashingAlgorithm = CA::HashingAlgorithm; + + class PasswordHashingAlgorithm = CA::PasswordHashingAlgorithm; + + /** + * A data flow node that is an application of a cryptographic algorithm. For example, + * encryption, decryption, signature-validation. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `CryptographicOperation::Range` instead. + */ + class CryptographicOperation extends DataFlowNode instanceof CryptographicOperation::Range { + /** Gets the algorithm used, if it matches a known `CryptographicAlgorithm`. */ + CryptographicAlgorithm getAlgorithm() { result = super.getAlgorithm() } + + /** Gets the data flow node where the cryptographic algorithm used in this operation is configured. */ + DataFlowNode getInitialization() { result = super.getInitialization() } + + /** Gets an input the algorithm is used on, for example the plain text input to be encrypted. */ + DataFlowNode getAnInput() { result = super.getAnInput() } + + /** + * Gets the block mode used to perform this cryptographic operation. + * + * This predicate is only expected to have a result if two conditions hold: + * 1. The operation is an encryption operation, i.e. the algorithm used is an `EncryptionAlgorithm`, and + * 2. The algorithm used is a block cipher (not a stream cipher). + * + * If either of these conditions do not hold, then this predicate should have no result. + */ + BlockMode getBlockMode() { result = super.getBlockMode() } + } + + /** Provides classes for modeling new applications of a cryptographic algorithms. */ + module CryptographicOperation { + /** + * A data flow node that is an application of a cryptographic algorithm. For example, + * encryption, decryption, signature-validation. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `CryptographicOperation` instead. + */ + abstract class Range extends DataFlowNode { + /** Gets the data flow node where the cryptographic algorithm used in this operation is configured. */ + abstract DataFlowNode getInitialization(); + + /** Gets the algorithm used, if it matches a known `CryptographicAlgorithm`. */ + abstract CryptographicAlgorithm getAlgorithm(); + + /** Gets an input the algorithm is used on, for example the plain text input to be encrypted. */ + abstract DataFlowNode getAnInput(); + + /** + * Gets the block mode used to perform this cryptographic operation. + * + * This predicate is only expected to have a result if two conditions hold: + * 1. The operation is an encryption operation, i.e. the algorithm used is an `EncryptionAlgorithm`, and + * 2. The algorithm used is a block cipher (not a stream cipher). + * + * If either of these conditions do not hold, then this predicate should have no result. + */ + abstract BlockMode getBlockMode(); + } + } + + /** + * A cryptographic block cipher mode of operation. This can be used to encrypt + * data of arbitrary length using a block encryption algorithm. + */ + class BlockMode extends string { + BlockMode() { + this = + [ + "ECB", "CBC", "GCM", "CCM", "CFB", "OFB", "CTR", "OPENPGP", + "XTS", // https://csrc.nist.gov/publications/detail/sp/800-38e/final + "EAX" // https://en.wikipedia.org/wiki/EAX_mode + ] + } + + /** Holds if this block mode is considered to be insecure. */ + predicate isWeak() { this = "ECB" } + + /** Holds if the given string appears to match this block mode. */ + bindingset[s] + predicate matchesString(string s) { s.toUpperCase().matches("%" + this + "%") } + } + } + + /** Provides classes for modeling HTTP-related APIs. */ + module Http { + /** Provides classes for modeling HTTP clients. */ + module Client { + /** + * A data flow node that makes an outgoing HTTP request. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `Http::Client::Request::Range` instead. + */ + class Request extends DataFlowNode instanceof Request::Range { + /** + * Gets a data flow node that contributes to the URL of the request. + * Depending on the framework, a request may have multiple nodes which contribute to the URL. + */ + DataFlowNode getAUrlPart() { result = super.getAUrlPart() } + + /** Gets a string that identifies the framework used for this request. */ + string getFramework() { result = super.getFramework() } + + /** + * Holds if this request is made using a mode that disables SSL/TLS + * certificate validation, where `disablingNode` represents the point at + * which the validation was disabled, and `argumentOrigin` represents the origin + * of the argument that disabled the validation (which could be the same node as + * `disablingNode`). + */ + predicate disablesCertificateValidation( + DataFlowNode disablingNode, DataFlowNode argumentOrigin + ) { + super.disablesCertificateValidation(disablingNode, argumentOrigin) + } + } + + /** Provides a class for modeling new HTTP requests. */ + module Request { + /** + * A data flow node that makes an outgoing HTTP request. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `Http::Client::Request` instead. + */ + abstract class Range extends DataFlowNode { + /** + * Gets a data flow node that contributes to the URL of the request. + * Depending on the framework, a request may have multiple nodes which contribute to the URL. + */ + abstract DataFlowNode getAUrlPart(); + + /** Gets a string that identifies the framework used for this request. */ + abstract string getFramework(); + + /** + * Holds if this request is made using a mode that disables SSL/TLS + * certificate validation, where `disablingNode` represents the point at + * which the validation was disabled, and `argumentOrigin` represents the origin + * of the argument that disabled the validation (which could be the same node as + * `disablingNode`). + */ + abstract predicate disablesCertificateValidation( + DataFlowNode disablingNode, DataFlowNode argumentOrigin + ); + } + } + } + } +} diff --git a/shared/concepts/codeql/concepts/CryptoAlgorithms.qll b/shared/concepts/codeql/concepts/CryptoAlgorithms.qll new file mode 100644 index 000000000000..23a45027cf14 --- /dev/null +++ b/shared/concepts/codeql/concepts/CryptoAlgorithms.qll @@ -0,0 +1,119 @@ +/** + * Provides classes modeling cryptographic algorithms, separated into strong and weak variants. + * + * The classification into strong and weak are based on Wikipedia, OWASP and Google (2021). + */ +overlay[local?] +module; + +private import codeql.concepts.internal.CryptoAlgorithmNames + +/** + * A cryptographic algorithm. + */ +private newtype TCryptographicAlgorithm = + MkHashingAlgorithm(string name, boolean isWeak) { + isStrongHashingAlgorithm(name) and isWeak = false + or + isWeakHashingAlgorithm(name) and isWeak = true + } or + MkEncryptionAlgorithm(string name, boolean isWeak) { + isStrongEncryptionAlgorithm(name) and isWeak = false + or + isWeakEncryptionAlgorithm(name) and isWeak = true + } or + MkPasswordHashingAlgorithm(string name, boolean isWeak) { + isStrongPasswordHashingAlgorithm(name) and isWeak = false + or + isWeakPasswordHashingAlgorithm(name) and isWeak = true + } + +/** + * Gets the most specific `CryptographicAlgorithm` that matches the given `name`. + * A matching algorithm is one where the name of the algorithm matches the start of name, with allowances made for different name formats. + * In the case that multiple `CryptographicAlgorithm`s match the given `name`, the algorithm(s) with the longest name will be selected. This is intended to select more specific versions of algorithms when multiple versions could match - for example "SHA3_224" matches against both "SHA3" and "SHA3224", but the latter is a more precise match. + */ +bindingset[name] +private CryptographicAlgorithm getBestAlgorithmForName(string name) { + result = + max(CryptographicAlgorithm algorithm | + algorithm.getName() = + [ + name.toUpperCase(), // the full name + name.toUpperCase().regexpCapture("^([\\w]+)(?:-.*)?$", 1), // the name prior to any dashes or spaces + name.toUpperCase().regexpCapture("^([A-Z0-9]+)(?:(-|_).*)?$", 1) // the name prior to any dashes, spaces, or underscores + ].regexpReplaceAll("[-_ ]", "") // strip dashes, underscores, and spaces + | + algorithm order by algorithm.getName().length() + ) +} + +/** + * A cryptographic algorithm. + */ +abstract class CryptographicAlgorithm extends TCryptographicAlgorithm { + /** Gets a textual representation of this element. */ + string toString() { result = this.getName() } + + /** + * Gets the normalized name of this algorithm (upper-case, no spaces, dashes or underscores). + */ + abstract string getName(); + + /** + * Holds if the name of this algorithm is the most specific match for `name`. + * This predicate matches quite liberally to account for different ways of formatting algorithm names, e.g. using dashes, underscores, or spaces as separators, including or not including block modes of operation, etc. + */ + bindingset[name] + predicate matchesName(string name) { this = getBestAlgorithmForName(name) } + + /** + * Holds if this algorithm is weak. + */ + abstract predicate isWeak(); +} + +/** + * A hashing algorithm such as `MD5` or `SHA512`. + */ +class HashingAlgorithm extends MkHashingAlgorithm, CryptographicAlgorithm { + string name; + boolean isWeak; + + HashingAlgorithm() { this = MkHashingAlgorithm(name, isWeak) } + + override string getName() { result = name } + + override predicate isWeak() { isWeak = true } +} + +/** + * An encryption algorithm such as `DES` or `AES512`. + */ +class EncryptionAlgorithm extends MkEncryptionAlgorithm, CryptographicAlgorithm { + string name; + boolean isWeak; + + EncryptionAlgorithm() { this = MkEncryptionAlgorithm(name, isWeak) } + + override string getName() { result = name } + + override predicate isWeak() { isWeak = true } + + /** Holds if this algorithm is a stream cipher. */ + predicate isStreamCipher() { isStreamCipher(name) } +} + +/** + * A password hashing algorithm such as `PBKDF2` or `SCRYPT`. + */ +class PasswordHashingAlgorithm extends MkPasswordHashingAlgorithm, CryptographicAlgorithm { + string name; + boolean isWeak; + + PasswordHashingAlgorithm() { this = MkPasswordHashingAlgorithm(name, isWeak) } + + override string getName() { result = name } + + override predicate isWeak() { isWeak = true } +} diff --git a/javascript/ql/lib/semmle/javascript/security/internal/CryptoAlgorithmNames.qll b/shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll similarity index 99% rename from javascript/ql/lib/semmle/javascript/security/internal/CryptoAlgorithmNames.qll rename to shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll index 8bb63d97876a..efcd870c724a 100644 --- a/javascript/ql/lib/semmle/javascript/security/internal/CryptoAlgorithmNames.qll +++ b/shared/concepts/codeql/concepts/internal/CryptoAlgorithmNames.qll @@ -7,6 +7,8 @@ * * The classification into strong and weak are based on Wikipedia, OWASP and Google (2021). */ +overlay[local?] +module; /** * Holds if `name` corresponds to a strong hashing algorithm. diff --git a/ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll b/shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll similarity index 87% rename from ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll rename to shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll index ede88ebf8149..4271784577f0 100644 --- a/ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll +++ b/shared/concepts/codeql/concepts/internal/SensitiveDataHeuristics.qll @@ -6,6 +6,8 @@ * * 'Sensitive' data in general is anything that should not be sent around in unencrypted form. */ +overlay[local?] +module; /** * A classification of different kinds of sensitive data: @@ -54,15 +56,16 @@ module HeuristicNames { * Gets a regular expression that identifies strings that may indicate the presence of secret * or trusted data. */ - string maybeSecret() { result = "(?is).*((? { class SuccessorType { @@ -79,6 +80,9 @@ signature module InputSig { Location getLocation(); } + /** A control flow node indicating normal termination of a callable. */ + class NormalExitNode extends ControlFlowNode; + /** * A basic block, that is, a maximal straight-line sequence of control flow nodes * without branches or joins. @@ -207,6 +211,46 @@ signature module InputSig { /** Gets the false branch of this expression. */ Expr getElse(); } + + class Parameter { + /** Gets a textual representation of this parameter. */ + string toString(); + + /** Gets the location of this parameter. */ + Location getLocation(); + } + + class ParameterPosition { + /** Gets a textual representation of this element. */ + bindingset[this] + string toString(); + } + + class ArgumentPosition { + /** Gets a textual representation of this element. */ + bindingset[this] + string toString(); + } + + /** + * Holds if the parameter position `ppos` matches the argument position + * `apos`. + */ + predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos); + + /** A non-overridable method. */ + class NonOverridableMethod { + Parameter getParameter(ParameterPosition ppos); + + /** Gets an expression being returned by this method. */ + Expr getAReturnExpr(); + } + + class NonOverridableMethodCall extends Expr { + NonOverridableMethod getMethod(); + + Expr getArgument(ArgumentPosition apos); + } } /** Provides guards-related predicates and classes. */ @@ -480,6 +524,8 @@ module Make Input> { ) } + private predicate normalExitBlock(BasicBlock bb) { bb.getNode(_) instanceof NormalExitNode } + signature module LogicInputSig { class SsaDefinition { /** Gets the basic block to which this SSA definition belongs. */ @@ -503,6 +549,8 @@ module Make Input> { predicate hasInputFromBlock(SsaDefinition inp, BasicBlock bb); } + predicate parameterDefinition(Parameter p, SsaDefinition def); + /** * Holds if `guard` evaluating to `val` ensures that: * `e <= k` when `upper = true` @@ -525,8 +573,6 @@ module Make Input> { * Holds if the assumption that `g1` has been evaluated to `v1` implies that * `g2` has been evaluated to `v2`, that is, the evaluation of `g2` to `v2` * dominates the evaluation of `g1` to `v1`. - * - * This predicate can be instantiated with `CustomGuard<..>::additionalImpliesStep`. */ default predicate additionalImpliesStep(PreGuard g1, GuardValue v1, PreGuard g2, GuardValue v2) { none() @@ -859,6 +905,11 @@ module Make Input> { impliesStepSsaGuard(def0, v0, guard, v) ) or + exists(Guard g0, GuardValue v0 | + guardControls(g0, v0, tgtGuard, tgtVal) and + WrapperGuard::wrapperImpliesStep(g0, v0, guard, v) + ) + or exists(Guard g0, GuardValue v0 | guardControls(g0, v0, tgtGuard, tgtVal) and additionalImpliesStep(g0, v0, guard, v) @@ -902,6 +953,7 @@ module Make Input> { */ predicate nullGuard(Guard guard, GuardValue v, Expr e, boolean isNull) { impliesStep2(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) or + WrapperGuard::wrapperImpliesStep(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) or additionalImpliesStep(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) } @@ -944,61 +996,45 @@ module Make Input> { ) } - signature module CustomGuardInputSig { - class ParameterPosition { - /** Gets a textual representation of this element. */ - bindingset[this] - string toString(); - } - - class ArgumentPosition { - /** Gets a textual representation of this element. */ - bindingset[this] - string toString(); - } - - /** - * Holds if the parameter position `ppos` matches the argument position - * `apos`. - */ - predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos); - - /** A non-overridable method with a boolean return value. */ - class BooleanMethod { - SsaDefinition getParameter(ParameterPosition ppos); - - Expr getAReturnExpr(); - } - - class BooleanMethodCall extends Expr { - BooleanMethod getMethod(); - - Expr getArgument(ArgumentPosition apos); - } - } - /** - * Provides an implementation of guard implication logic for custom - * wrappers. This can be used to instantiate the `additionalImpliesStep` - * predicate. + * Provides an implementation of guard implication logic for guard + * wrappers. */ - module CustomGuard { - private import CustomGuardInput - + private module WrapperGuard { final private class FinalExpr = Expr; - private class ReturnExpr extends FinalExpr { - ReturnExpr() { any(BooleanMethod m).getAReturnExpr() = this } + class ReturnExpr extends FinalExpr { + ReturnExpr() { any(NonOverridableMethod m).getAReturnExpr() = this } + + NonOverridableMethod getMethod() { result.getAReturnExpr() = this } pragma[nomagic] BasicBlock getBasicBlock() { result = super.getBasicBlock() } } - private predicate booleanReturnGuard(Guard guard, GuardValue val) { - guard instanceof ReturnExpr and exists(val.asBooleanValue()) + private predicate relevantCallValue(NonOverridableMethodCall call, GuardValue val) { + BranchImplies::guardControls(call, val, _, _) or + ReturnImplies::guardControls(call, val, _, _) } - private module ReturnImplies = ImpliesTC; + predicate relevantReturnValue(NonOverridableMethod m, GuardValue val) { + exists(NonOverridableMethodCall call | + relevantCallValue(call, val) and + call.getMethod() = m and + not val instanceof TException + ) + } + + private predicate returnGuard(Guard guard, GuardValue val) { + relevantReturnValue(guard.(ReturnExpr).getMethod(), val) + } + + module ReturnImplies = ImpliesTC; + + pragma[nomagic] + private predicate directlyControlsReturn(Guard guard, GuardValue val, ReturnExpr ret) { + guard.directlyValueControls(ret.getBasicBlock(), val) + } /** * Holds if `ret` is a return expression in a non-overridable method that @@ -1006,35 +1042,53 @@ module Make Input> { * parameter has the value `val`. */ private predicate validReturnInCustomGuard( - ReturnExpr ret, ParameterPosition ppos, boolean retval, GuardValue val + ReturnExpr ret, ParameterPosition ppos, GuardValue retval, GuardValue val ) { - exists(BooleanMethod m, SsaDefinition param | + exists(NonOverridableMethod m, SsaDefinition param | m.getAReturnExpr() = ret and - m.getParameter(ppos) = param + parameterDefinition(m.getParameter(ppos), param) | exists(Guard g0, GuardValue v0 | - g0.directlyValueControls(ret.getBasicBlock(), v0) and + directlyControlsReturn(g0, v0, ret) and BranchImplies::ssaControls(param, val, g0, v0) and - retval = [true, false] + relevantReturnValue(m, retval) ) or - ReturnImplies::ssaControls(param, val, ret, - any(GuardValue r | r.asBooleanValue() = retval)) + ReturnImplies::ssaControls(param, val, ret, retval) + ) + } + + private predicate guardDirectlyControlsExit(Guard guard, GuardValue val) { + exists(BasicBlock bb | + guard.directlyValueControls(bb, val) and + normalExitBlock(bb) ) } /** - * Gets a non-overridable method with a boolean return value that performs a check - * on the `ppos`th parameter. A return value equal to `retval` allows us to conclude + * Gets a non-overridable method that performs a check on the `ppos`th + * parameter. A return value equal to `retval` allows us to conclude * that the argument has the value `val`. */ - private BooleanMethod customGuard(ParameterPosition ppos, boolean retval, GuardValue val) { + private NonOverridableMethod wrapperGuard( + ParameterPosition ppos, GuardValue retval, GuardValue val + ) { forex(ReturnExpr ret | result.getAReturnExpr() = ret and - not ret.(ConstantExpr).asBooleanValue() = retval.booleanNot() + not exists(GuardValue notRetval | + exprHasValue(ret, notRetval) and + disjointValues(notRetval, retval) + ) | validReturnInCustomGuard(ret, ppos, retval, val) ) + or + exists(SsaDefinition param, Guard g0, GuardValue v0 | + parameterDefinition(result.getParameter(ppos), param) and + guardDirectlyControlsExit(g0, v0) and + retval = TException(false) and + BranchImplies::ssaControls(param, val, g0, v0) + ) } /** @@ -1043,13 +1097,111 @@ module Make Input> { * dominates the evaluation of `g1` to `v1`. * * This predicate covers the implication steps that arise from calls to - * custom guard wrappers. + * guard wrappers. */ - predicate additionalImpliesStep(PreGuard g1, GuardValue v1, PreGuard g2, GuardValue v2) { - exists(BooleanMethodCall call, ParameterPosition ppos, ArgumentPosition apos | + predicate wrapperImpliesStep(PreGuard g1, GuardValue v1, PreGuard g2, GuardValue v2) { + exists(NonOverridableMethodCall call, ParameterPosition ppos, ArgumentPosition apos | g1 = call and - call.getMethod() = customGuard(ppos, v1.asBooleanValue(), v2) and + call.getMethod() = wrapperGuard(ppos, v1, v2) and call.getArgument(apos) = g2 and + parameterMatch(pragma[only_bind_out](ppos), pragma[only_bind_out](apos)) and + not exprHasValue(g2, v2) // disregard trivial guard + ) + } + } + + signature predicate guardChecksSig(Guard g, Expr e, boolean branch); + + bindingset[this] + signature class StateSig; + + private module WithState { + signature predicate guardChecksSig(Guard g, Expr e, boolean branch, State state); + } + + /** + * Extends a `BarrierGuard` input predicate with wrapped invocations. + */ + module ValidationWrapper { + private predicate guardChecksWithState(Guard g, Expr e, boolean branch, Unit state) { + guardChecks0(g, e, branch) and exists(state) + } + + private module StatefulWrapper = ValidationWrapperWithState; + + /** + * Holds if the guard `g` validates the expression `e` upon evaluating to `val`. + */ + predicate guardChecks(Guard g, Expr e, GuardValue val) { + StatefulWrapper::guardChecks(g, e, val, _) + } + } + + /** + * Extends a `BarrierGuard` input predicate with wrapped invocations. + */ + module ValidationWrapperWithState< + StateSig State, WithState::guardChecksSig/4 guardChecks0> + { + private import WrapperGuard + + /** + * Holds if `ret` is a return expression in a non-overridable method that + * on a return value of `retval` allows the conclusion that the `ppos`th + * parameter has been validated by the given guard. + */ + private predicate validReturnInValidationWrapper( + ReturnExpr ret, ParameterPosition ppos, GuardValue retval, State state + ) { + exists(NonOverridableMethod m, SsaDefinition param, Guard guard, GuardValue val | + m.getAReturnExpr() = ret and + parameterDefinition(m.getParameter(ppos), param) and + guardChecks(guard, param.getARead(), val, state) + | + guard.valueControls(ret.getBasicBlock(), val) and + relevantReturnValue(m, retval) + or + ReturnImplies::guardControls(guard, val, ret, retval) + ) + } + + /** + * Gets a non-overridable method that performs a check on the `ppos`th + * parameter. A return value equal to `retval` allows us to conclude + * that the argument has been validated by the given guard. + */ + private NonOverridableMethod validationWrapper( + ParameterPosition ppos, GuardValue retval, State state + ) { + forex(ReturnExpr ret | + result.getAReturnExpr() = ret and + not exists(GuardValue notRetval | + exprHasValue(ret, notRetval) and + disjointValues(notRetval, retval) + ) + | + validReturnInValidationWrapper(ret, ppos, retval, state) + ) + or + exists(SsaDefinition param, BasicBlock bb, Guard guard, GuardValue val | + parameterDefinition(result.getParameter(ppos), param) and + guardChecks(guard, param.getARead(), val, state) and + guard.valueControls(bb, val) and + normalExitBlock(bb) and + retval = TException(false) + ) + } + + /** + * Holds if the guard `g` validates the expression `e` upon evaluating to `val`. + */ + predicate guardChecks(Guard g, Expr e, GuardValue val, State state) { + guardChecks0(g, e, val.asBooleanValue(), state) + or + exists(NonOverridableMethodCall call, ParameterPosition ppos, ArgumentPosition apos | + g = call and + call.getMethod() = validationWrapper(ppos, val, state) and + call.getArgument(apos) = e and parameterMatch(pragma[only_bind_out](ppos), pragma[only_bind_out](apos)) ) } diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index dbe347d87813..9daf1b8e60e7 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.12-dev +version: 2.0.13-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index ef723958db5a..2e77e1a942df 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.12 + +No user-facing changes. + ## 2.0.11 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.12.md b/shared/dataflow/change-notes/released/2.0.12.md new file mode 100644 index 000000000000..c93809466de8 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.12.md @@ -0,0 +1,3 @@ +## 2.0.12 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 3cbe73b4cadc..b856d9a13f21 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.11 +lastReleaseVersion: 2.0.12 diff --git a/shared/dataflow/codeql/dataflow/VariableCapture.qll b/shared/dataflow/codeql/dataflow/VariableCapture.qll index 4df415f90ad9..922391221a40 100644 --- a/shared/dataflow/codeql/dataflow/VariableCapture.qll +++ b/shared/dataflow/codeql/dataflow/VariableCapture.qll @@ -733,13 +733,15 @@ module Flow Input> implements OutputSig predicate hasCfgNode(BasicBlock bb, int i) { bb.getNode(i) = this } } + class GuardValue = Void; + class Guard extends Void { - predicate hasBranchEdge(BasicBlock bb1, BasicBlock bb2, boolean branch) { none() } + predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue val) { none() } - predicate controlsBranchEdge(BasicBlock bb1, BasicBlock bb2, boolean branch) { none() } + predicate valueControlsBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue val) { none() } } - predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, boolean branch) { none() } + predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { none() } predicate includeWriteDefsInFlowStep() { none() } diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 46984a4be6ca..759c844c1100 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.0.12-dev +version: 2.0.13-dev groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 7d61f9eb4c96..db8e38ba03e8 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.28.md b/shared/mad/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/mad/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/mad/codeql/mad/ModelValidation.qll b/shared/mad/codeql/mad/ModelValidation.qll index 98b2a212c316..018c1797ddcd 100644 --- a/shared/mad/codeql/mad/ModelValidation.qll +++ b/shared/mad/codeql/mad/ModelValidation.qll @@ -29,8 +29,9 @@ module KindValidation { [ // shared "code-injection", "command-injection", "environment-injection", "file-content-store", - "html-injection", "js-injection", "ldap-injection", "log-injection", "path-injection", - "request-forgery", "sql-injection", "url-redirection", "xpath-injection", + "html-injection", "js-injection", "ldap-injection", "log-injection", "nosql-injection", + "path-injection", "request-forgery", "sql-injection", "url-redirection", + "xpath-injection", "unsafe-deserialization", // Java-only currently, but may be shared in the future "bean-validation", "fragment-injection", "groovy-injection", "hostname-verification", "information-leak", "intent-redirection", "jexl-injection", "jndi-injection", @@ -38,7 +39,7 @@ module KindValidation { "response-splitting", "trust-boundary-violation", "template-injection", "url-forward", "xslt-injection", // JavaScript-only currently, but may be shared in the future - "mongodb.sink", "nosql-injection", "unsafe-deserialization", + "mongodb.sink", // Swift-only currently, but may be shared in the future "database-store", "format-string", "hash-iteration-count", "predicate-injection", "preferences-store", "tls-protocol-version", "transmission", "webview-fetch", "xxe", diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index dea6c6d1d497..9b5895697f00 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 9b269441c000..ad2e63eb4709 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.6.md b/shared/quantum/change-notes/released/0.0.6.md new file mode 100644 index 000000000000..ccbce856079d --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index bb45a1ab0182..cf398ce02aa4 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 5d74a4f6a38e..9046eb79e24b 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.6-dev +version: 0.0.7-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 4dbae4dbdad0..41d2e7d037c4 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.28.md b/shared/rangeanalysis/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index b97e4a57ec2a..3af1d03945d5 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 1220229c9d4e..b985a679eaa0 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.28.md b/shared/regex/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/regex/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 855ec439eca3..f29d547adc41 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 742b8645ac88..b628a618c2b4 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.4 + +No user-facing changes. + ## 2.0.3 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.4.md b/shared/ssa/change-notes/released/2.0.4.md new file mode 100644 index 000000000000..8e002b6db642 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.4.md @@ -0,0 +1,3 @@ +## 2.0.4 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index fabf1e865966..0f306f8bd3bd 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.3 +lastReleaseVersion: 2.0.4 diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index d9a017920171..2aa136ff7197 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1566,23 +1566,29 @@ module Make Input> { */ default predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) { none() } + /** An abstract value that a `Guard` may evaluate to. */ + class GuardValue { + /** Gets a textual representation of this value. */ + string toString(); + } + /** A (potential) guard. */ class Guard { /** Gets a textual representation of this guard. */ string toString(); /** - * Holds if the evaluation of this guard to `branch` corresponds to the edge + * Holds if the evaluation of this guard to `val` corresponds to the edge * from `bb1` to `bb2`. */ - predicate hasBranchEdge(BasicBlock bb1, BasicBlock bb2, boolean branch); + predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue val); /** - * Holds if this guard evaluating to `branch` controls the control-flow + * Holds if this guard evaluating to `val` controls the control-flow * branch edge from `bb1` to `bb2`. That is, following the edge from - * `bb1` to `bb2` implies that this guard evaluated to `branch`. + * `bb1` to `bb2` implies that this guard evaluated to `val`. * - * This predicate differs from `hasBranchEdge` in that it also covers + * This predicate differs from `hasValueBranchEdge` in that it also covers * indirect guards, such as: * ``` * b = guard; @@ -1590,15 +1596,15 @@ module Make Input> { * if (b) { ... } * ``` */ - predicate controlsBranchEdge(BasicBlock bb1, BasicBlock bb2, boolean branch); + predicate valueControlsBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue val); } - /** Holds if `guard` directly controls block `bb` upon evaluating to `branch`. */ - predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, boolean branch); + /** Holds if `guard` directly controls block `bb` upon evaluating to `val`. */ + predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val); - /** Holds if `guard` controls block `bb` upon evaluating to `branch`. */ - default predicate guardControlsBlock(Guard guard, BasicBlock bb, boolean branch) { - guardDirectlyControlsBlock(guard, bb, branch) + /** Holds if `guard` controls block `bb` upon evaluating to `val`. */ + default predicate guardControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { + guardDirectlyControlsBlock(guard, bb, val) } /** @@ -1683,7 +1689,7 @@ module Make Input> { ( // The input node is relevant either if it sits directly on a branch // edge for a guard, - exists(DfInput::Guard g | g.hasBranchEdge(input, phi.getBasicBlock(), _)) + exists(DfInput::Guard g | g.hasValueBranchEdge(input, phi.getBasicBlock(), _)) or // or if the unique predecessor is not an equivalent substitute in // terms of being controlled by the same guards. @@ -1702,9 +1708,9 @@ module Make Input> { AdjacentSsaRefs::adjacentRefPhi(prev, _, input, phi.getBasicBlock(), phi.getSourceVariable()) and prev != input and - exists(DfInput::Guard g, boolean branch | - DfInput::guardDirectlyControlsBlock(g, input, branch) and - not DfInput::guardDirectlyControlsBlock(g, prev, branch) + exists(DfInput::Guard g, DfInput::GuardValue val | + DfInput::guardDirectlyControlsBlock(g, input, val) and + not DfInput::guardDirectlyControlsBlock(g, prev, val) ) ) ) @@ -2118,13 +2124,13 @@ module Make Input> { } /** - * Holds if the guard `g` validates the expression `e` upon evaluating to `branch`. + * Holds if the guard `g` validates the expression `e` upon evaluating to `val`. * * The expression `e` is expected to be a syntactic part of the guard `g`. * For example, the guard `g` might be a call `isSafe(x)` and the expression `e` * the argument `x`. */ - signature predicate guardChecksSig(DfInput::Guard g, DfInput::Expr e, boolean branch); + signature predicate guardChecksSig(DfInput::Guard g, DfInput::Expr e, DfInput::GuardValue val); pragma[nomagic] private Definition getAPhiInputDef(SsaInputNodeImpl n) { @@ -2139,7 +2145,7 @@ module Make Input> { private module WithState { /** - * Holds if the guard `g` validates the expression `e` upon evaluating to `branch`, blocking + * Holds if the guard `g` validates the expression `e` upon evaluating to `val`, blocking * flow in the given `state`. * * The expression `e` is expected to be a syntactic part of the guard `g`. @@ -2147,15 +2153,15 @@ module Make Input> { * the argument `x`. */ signature predicate guardChecksSig( - DfInput::Guard g, DfInput::Expr e, boolean branch, State state + DfInput::Guard g, DfInput::Expr e, DfInput::GuardValue val, State state ); /** * Holds if the guard `g` validates the SSA definition `def` upon - * evaluating to `branch`, blocking flow in the given `state`. + * evaluating to `val`, blocking flow in the given `state`. */ signature predicate guardChecksDefSig( - DfInput::Guard g, Definition def, boolean branch, State state + DfInput::Guard g, Definition def, DfInput::GuardValue val, State state ); } @@ -2167,9 +2173,9 @@ module Make Input> { */ module BarrierGuard { private predicate guardChecksWithState( - DfInput::Guard g, DfInput::Expr e, boolean branch, Unit state + DfInput::Guard g, DfInput::Expr e, DfInput::GuardValue val, Unit state ) { - guardChecks(g, e, branch) and exists(state) + guardChecks(g, e, val) and exists(state) } private module StatefulBarrier = BarrierGuardWithState; @@ -2188,9 +2194,9 @@ module Make Input> { module BarrierGuardWithState::guardChecksSig/4 guardChecks> { pragma[nomagic] private predicate guardChecksSsaDef( - DfInput::Guard g, Definition def, boolean branch, State state + DfInput::Guard g, Definition def, DfInput::GuardValue val, State state ) { - guardChecks(g, DfInput::getARead(def), branch, state) + guardChecks(g, DfInput::getARead(def), val, state) } private module Barrier = BarrierGuardDefWithState; @@ -2210,14 +2216,14 @@ module Make Input> { /** Gets a node that is safely guarded by the given guard check. */ pragma[nomagic] Node getABarrierNode(State state) { - exists(DfInput::Guard g, boolean branch, Definition def, BasicBlock bb | - guardChecksSsaDef(g, def, branch, state) + exists(DfInput::Guard g, DfInput::GuardValue val, Definition def, BasicBlock bb | + guardChecksSsaDef(g, def, val, state) | // guard controls a read exists(DfInput::Expr e | e = DfInput::getARead(def) and e.hasCfgNode(bb, _) and - DfInput::guardControlsBlock(g, bb, branch) and + DfInput::guardControlsBlock(g, bb, val) and result.(ExprNode).getExpr() = e ) or @@ -2226,9 +2232,9 @@ module Make Input> { def = getAPhiInputDef(result) and result.(SsaInputNodeImpl).isInputInto(phi, bb) | - DfInput::guardControlsBlock(g, bb, branch) + DfInput::guardControlsBlock(g, bb, val) or - g.controlsBranchEdge(bb, phi.getBasicBlock(), branch) + g.valueControlsBranchEdge(bb, phi.getBasicBlock(), val) ) ) } diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index e7954d933ca4..6912467b5081 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.4-dev +version: 2.0.5-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 7b90353d01a8..6e50e04a5141 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.28.md b/shared/threat-models/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index a3901b88a000..5e8c43c8bbf6 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.28-dev +version: 1.0.29-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index e15c2f135c39..d1848f17c53c 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.28.md b/shared/tutorial/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index b6f495d545bd..998c513f7c66 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index a7b0ce51066a..d63b01de987a 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.28.md b/shared/typeflow/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 42b2d54ac6fd..f1969d52e2bd 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index fba2a8703562..a59e560c4155 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.9.md b/shared/typeinference/change-notes/released/0.0.9.md new file mode 100644 index 000000000000..c9e17c6d6cf2 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index 58fdc6b45deb..ecdd64fbab86 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 0234d42e5e19..1eaf6ef8e840 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -796,6 +796,14 @@ module Make1 Input1> { ) } + /** + * Holds if there is multiple ways in which a type with `conditionRoot` at + * the root can satisfy a constraint with `constraintRoot` at the root. + */ + predicate multipleConstraintImplementations(Type conditionRoot, Type constraintRoot) { + countConstraintImplementations(conditionRoot, constraintRoot) > 1 + } + /** * Holds if `baseMention` is a (transitive) base type mention of `sub`, * and `t` is mentioned (implicitly) at `path` inside `baseMention`. For @@ -902,14 +910,20 @@ module Make1 Input1> { { private import Input + /** Holds if the type tree has the type `type` and should satisfy `constraint`. */ + pragma[nomagic] + private predicate hasTypeConstraint(HasTypeTree term, Type type, Type constraint) { + type = term.getTypeAt(TypePath::nil()) and + relevantConstraint(term, constraint) + } + private module IsInstantiationOfInput implements IsInstantiationOfInputSig { predicate potentialInstantiationOf(HasTypeTree tt, TypeAbstraction abs, TypeMention cond) { exists(Type constraint, Type type | - type = tt.getTypeAt(TypePath::nil()) and - relevantConstraint(tt, constraint) and + hasTypeConstraint(tt, type, constraint) and rootTypesSatisfaction(type, constraint, abs, cond, _) and // We only need to check instantiations where there are multiple candidates. - countConstraintImplementations(type, constraint) > 1 + multipleConstraintImplementations(type, constraint) ) } @@ -918,13 +932,6 @@ module Make1 Input1> { } } - /** Holds if the type tree has the type `type` and should satisfy `constraint`. */ - pragma[nomagic] - private predicate hasTypeConstraint(HasTypeTree term, Type type, Type constraint) { - type = term.getTypeAt(TypePath::nil()) and - relevantConstraint(term, constraint) - } - /** * Holds if `tt` satisfies `constraint` through `abs`, `sub`, and `constraintMention`. */ @@ -944,7 +951,7 @@ module Make1 Input1> { // When there are multiple ways the type could implement the // constraint we need to find the right implementation, which is the // one where the type instantiates the precondition. - if countConstraintImplementations(type, constraint) > 1 + if multipleConstraintImplementations(type, constraint) then IsInstantiationOf::isInstantiationOf(tt, abs, sub) else any() @@ -989,7 +996,7 @@ module Make1 Input1> { path = prefix0.append(suffix) ) or - tt.getTypeAt(TypePath::nil()) = constraint and + hasTypeConstraint(tt, constraint, constraint) and t = tt.getTypeAt(path) } } @@ -1229,11 +1236,8 @@ module Make1 Input1> { predicate relevantAccessConstraint( Access a, Declaration target, AccessPosition apos, TypePath path, Type constraint ) { - exists(DeclarationPosition dpos | - accessDeclarationPositionMatch(apos, dpos) and - target = a.getTarget() and - typeParameterConstraintHasTypeParameter(target, dpos, path, _, constraint, _, _) - ) + target = a.getTarget() and + typeParameterConstraintHasTypeParameter(target, apos, path, constraint, _, _) } private newtype TRelevantAccess = @@ -1276,12 +1280,11 @@ module Make1 Input1> { } predicate satisfiesConstraintType( - Access a, AccessPosition apos, TypePath prefix, Type constraint, TypePath path, Type t + Access a, Declaration target, AccessPosition apos, TypePath prefix, Type constraint, + TypePath path, Type t ) { - exists(RelevantAccess at | at = MkRelevantAccess(a, _, apos, prefix) | - SatisfiesConstraint::satisfiesConstraintType(at, - constraint, path, t) - ) + SatisfiesConstraint::satisfiesConstraintType(MkRelevantAccess(a, + target, apos, prefix), constraint, path, t) } } @@ -1370,37 +1373,38 @@ module Make1 Input1> { } /** - * Holds if `tp1` and `tp2` are distinct type parameters of `target`, the - * declared type at `dpos` mentions `tp1` at `path1`, `tp1` has a base - * type mention of type `constraint` that mentions `tp2` at the path - * `path2`. + * Holds if the declared type of `target` contains a type parameter at + * `apos` and `pathToConstrained` that must satisfy `constraint` and `tp` + * occurs at `pathToTp` in `constraint`. * - * For this example + * For example, in * ```csharp * interface IFoo { } * T1 M(T2 item) where T2 : IFoo { } * ``` - * with the method declaration being the target and the for the first - * parameter position, we have the following - * - `path1 = ""`, - * - `tp1 = T2`, + * with the method declaration being the target and with `apos` + * corresponding to `item`, we have the following + * - `pathToConstrained = ""`, + * - `tp = T1`, * - `constraint = IFoo`, - * - `path2 = "A"`, and - * - `tp2 = T1`. + * - `pathToTp = "A"`. */ pragma[nomagic] private predicate typeParameterConstraintHasTypeParameter( - Declaration target, DeclarationPosition dpos, TypePath path1, TypeParameter tp1, - Type constraint, TypePath path2, TypeParameter tp2 + Declaration target, AccessPosition apos, TypePath pathToConstrained, Type constraint, + TypePath pathToTp, TypeParameter tp ) { - tp1 = target.getTypeParameter(_) and - tp2 = target.getTypeParameter(_) and - tp1 != tp2 and - tp1 = target.getDeclaredType(dpos, path1) and - exists(TypeMention tm | - tm = getATypeParameterConstraint(tp1) and - tm.resolveTypeAt(path2) = tp2 and - constraint = resolveTypeMentionRoot(tm) + exists(DeclarationPosition dpos, TypeParameter constrainedTp | + accessDeclarationPositionMatch(apos, dpos) and + constrainedTp = target.getTypeParameter(_) and + tp = target.getTypeParameter(_) and + constrainedTp != tp and + constrainedTp = target.getDeclaredType(dpos, pathToConstrained) and + exists(TypeMention tm | + tm = getATypeParameterConstraint(constrainedTp) and + tm.resolveTypeAt(pathToTp) = tp and + constraint = resolveTypeMentionRoot(tm) + ) ) } @@ -1409,15 +1413,9 @@ module Make1 Input1> { Access a, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and - target = a.getTarget() and - exists( - Type constraint, AccessPosition apos, DeclarationPosition dpos, TypePath pathToTp, - TypePath pathToTp2 - | - accessDeclarationPositionMatch(apos, dpos) and - typeParameterConstraintHasTypeParameter(target, dpos, pathToTp2, _, constraint, pathToTp, - tp) and - AccessConstraint::satisfiesConstraintType(a, apos, pathToTp2, constraint, + exists(Type constraint, AccessPosition apos, TypePath pathToTp, TypePath pathToTp2 | + typeParameterConstraintHasTypeParameter(target, apos, pathToTp2, constraint, pathToTp, tp) and + AccessConstraint::satisfiesConstraintType(a, target, apos, pathToTp2, constraint, pathToTp.appendInverse(path), t) ) } diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 22f2381e814a..311bc370c093 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.9-dev +version: 0.0.10-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index cab09405aed5..d13d7ed092a3 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.12 + +No user-facing changes. + ## 2.0.11 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.12.md b/shared/typetracking/change-notes/released/2.0.12.md new file mode 100644 index 000000000000..c93809466de8 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.12.md @@ -0,0 +1,3 @@ +## 2.0.12 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 3cbe73b4cadc..b856d9a13f21 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.11 +lastReleaseVersion: 2.0.12 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index c8d6b1b76bb8..143381c68281 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.12-dev +version: 2.0.13-dev groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index f41328bb4a9f..40cca0121002 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.28.md b/shared/typos/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/typos/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 00ae6b46e540..cfbe48595f7e 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index e3b58791ecb3..99afc785e5d5 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.15 + +No user-facing changes. + ## 2.0.14 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.15.md b/shared/util/change-notes/released/2.0.15.md new file mode 100644 index 000000000000..3b59db4224a0 --- /dev/null +++ b/shared/util/change-notes/released/2.0.15.md @@ -0,0 +1,3 @@ +## 2.0.15 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 23aa0864b298..0377ae283a31 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.14 +lastReleaseVersion: 2.0.15 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 45175d039cdf..18f2e50e6360 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.15-dev +version: 2.0.16-dev groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 431918d41a20..8688583b1d42 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.28.md b/shared/xml/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/xml/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 75994a4f1ed7..81781de29969 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 91e1186bfc3d..4651f486f24c 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.28 + +No user-facing changes. + ## 1.0.27 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.28.md b/shared/yaml/change-notes/released/1.0.28.md new file mode 100644 index 000000000000..d851ee200cbe --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.28.md @@ -0,0 +1,3 @@ +## 1.0.28 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 1d6c59bacdbf..328402fb34f0 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.27 +lastReleaseVersion: 1.0.28 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index f9d572fe894d..f7fd571722e8 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.28-dev +version: 1.0.29-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index c859d8670385..46341f158e79 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 5.0.4 + +### Minor Analysis Improvements + +* The regular expressions in `SensitiveDataHeuristics.qll` have been extended to find more instances of sensitive data such as secrets used in authentication, finance and health information, and device data. The heuristics have also been refined to find fewer false positive matches. This will improve results for queries related to sensitive information. + ## 5.0.3 No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/5.0.4.md b/swift/ql/lib/change-notes/released/5.0.4.md new file mode 100644 index 000000000000..6b0cc20d7cfa --- /dev/null +++ b/swift/ql/lib/change-notes/released/5.0.4.md @@ -0,0 +1,5 @@ +## 5.0.4 + +### Minor Analysis Improvements + +* The regular expressions in `SensitiveDataHeuristics.qll` have been extended to find more instances of sensitive data such as secrets used in authentication, finance and health information, and device data. The heuristics have also been refined to find fewer false positive matches. This will improve results for queries related to sensitive information. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 6997554f6ddd..8cb0167caf0c 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.3 +lastReleaseVersion: 5.0.4 diff --git a/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll b/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll index 0f2d28480cdb..989d928a8c71 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextStorageDatabaseQuery.qll @@ -48,6 +48,17 @@ module CleartextStorageDatabaseConfig implements DataFlow::ConfigSig { node.asExpr().getType().getUnderlyingType() instanceof DictionaryType and c.getAReadContent().(DataFlow::Content::TupleContent).getIndex() = 1 } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(DataFlow::Node cleanSink | result = cleanSink.getLocation() | + cleanSink = sink.(DataFlow::PostUpdateNode).getPreUpdateNode() + or + not sink instanceof DataFlow::PostUpdateNode and + cleanSink = sink + ) + } } /** diff --git a/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll b/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll index 2a7bec5dc47f..c3665589482a 100644 --- a/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll +++ b/swift/ql/lib/codeql/swift/security/CleartextStoragePreferencesQuery.qll @@ -30,6 +30,17 @@ module CleartextStoragePreferencesConfig implements DataFlow::ConfigSig { // make sources barriers so that we only report the closest instance isSource(node) } + + predicate observeDiffInformedIncrementalMode() { any() } + + Location getASelectedSinkLocation(DataFlow::Node sink) { + exists(DataFlow::Node cleanSink | result = cleanSink.getLocation() | + cleanSink = sink.(DataFlow::PostUpdateNode).getPreUpdateNode() + or + not sink instanceof DataFlow::PostUpdateNode and + cleanSink = sink + ) + } } /** diff --git a/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll b/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll index 769c385d4d66..53952f3e1d14 100644 --- a/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll +++ b/swift/ql/lib/codeql/swift/security/InsecureTLSQuery.qll @@ -21,6 +21,10 @@ module InsecureTlsConfig implements DataFlow::ConfigSig { predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { any(InsecureTlsExtensionsAdditionalFlowStep s).step(nodeFrom, nodeTo) } + + predicate observeDiffInformedIncrementalMode() { + none() // query selects some Swift nodes (e.g. "[post] self") that have location file://:0:0:0:0, which always fall outside the diff range. + } } module InsecureTlsFlow = TaintTracking::Global; diff --git a/swift/ql/lib/codeql/swift/security/SensitiveExprs.qll b/swift/ql/lib/codeql/swift/security/SensitiveExprs.qll index 044b2a054d7f..d78f9b405327 100644 --- a/swift/ql/lib/codeql/swift/security/SensitiveExprs.qll +++ b/swift/ql/lib/codeql/swift/security/SensitiveExprs.qll @@ -5,7 +5,7 @@ */ import swift -import internal.SensitiveDataHeuristics +import codeql.concepts.internal.SensitiveDataHeuristics private import codeql.swift.dataflow.DataFlow private import codeql.swift.dataflow.ExternalFlow diff --git a/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll b/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll index ba24f63231f4..5aba75c18c26 100644 --- a/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll +++ b/swift/ql/lib/codeql/swift/security/UnsafeWebViewFetchQuery.qll @@ -28,6 +28,10 @@ module UnsafeWebViewFetchConfig implements DataFlow::ConfigSig { predicate isAdditionalFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { any(UnsafeWebViewFetchAdditionalFlowStep s).step(nodeFrom, nodeTo) } + + predicate observeDiffInformedIncrementalMode() { + none() // can't override location accurately because of secondary use in select. + } } /** diff --git a/swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll b/swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll deleted file mode 100644 index ede88ebf8149..000000000000 --- a/swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll +++ /dev/null @@ -1,188 +0,0 @@ -/** - * INTERNAL: Do not use. - * - * Provides classes and predicates for identifying strings that may indicate the presence of sensitive data. - * Such that we can share this logic across our CodeQL analysis of different languages. - * - * 'Sensitive' data in general is anything that should not be sent around in unencrypted form. - */ - -/** - * A classification of different kinds of sensitive data: - * - * - secret: generic secret or trusted data; - * - id: a user name or other account information; - * - password: a password or authorization key; - * - certificate: a certificate. - * - private: private data such as credit card numbers - * - * While classifications are represented as strings, this should not be relied upon. - * Instead, use the predicates in `SensitiveDataClassification::` to work with - * classifications. - */ -class SensitiveDataClassification extends string { - SensitiveDataClassification() { this in ["secret", "id", "password", "certificate", "private"] } -} - -/** - * Provides predicates to select the different kinds of sensitive data we support. - */ -module SensitiveDataClassification { - /** Gets the classification for secret or trusted data. */ - SensitiveDataClassification secret() { result = "secret" } - - /** Gets the classification for user names or other account information. */ - SensitiveDataClassification id() { result = "id" } - - /** Gets the classification for passwords or authorization keys. */ - SensitiveDataClassification password() { result = "password" } - - /** Gets the classification for certificates. */ - SensitiveDataClassification certificate() { result = "certificate" } - - /** Gets the classification for private data. */ - SensitiveDataClassification private() { result = "private" } -} - -/** - * INTERNAL: Do not use. - * - * Provides heuristics for identifying names related to sensitive information. - */ -module HeuristicNames { - /** - * Gets a regular expression that identifies strings that may indicate the presence of secret - * or trusted data. - */ - string maybeSecret() { result = "(?is).*((?