mirror of
https://github.com/github/codeql.git
synced 2026-04-23 15:55:18 +02:00
Merge pull request #15370 from hvitved/ruby/erb-flow
Ruby: Model flow through `ViewComponent` render methods
This commit is contained in:
4
ruby/ql/lib/change-notes/2024-01-22-erb-render-flow.md
Normal file
4
ruby/ql/lib/change-notes/2024-01-22-erb-render-flow.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Flow is now tracked through Rails `render` calls, when the argument is a `ViewComponent`. In this case, data flow is tracked into the accompanying `.html.erb` file.
|
||||
@@ -38,3 +38,4 @@ private import codeql.ruby.frameworks.Yaml
|
||||
private import codeql.ruby.frameworks.Sequel
|
||||
private import codeql.ruby.frameworks.Ldap
|
||||
private import codeql.ruby.frameworks.Jwt
|
||||
private import codeql.ruby.frameworks.ViewComponent
|
||||
|
||||
@@ -2,7 +2,7 @@ private import codeql.ruby.AST
|
||||
private import codeql.ruby.CFG
|
||||
private import DataFlowPrivate
|
||||
private import codeql.ruby.typetracking.internal.TypeTrackingImpl
|
||||
private import codeql.ruby.ast.internal.Module
|
||||
private import codeql.ruby.ast.internal.Module as Module
|
||||
private import FlowSummaryImpl as FlowSummaryImpl
|
||||
private import codeql.ruby.dataflow.FlowSummary
|
||||
private import codeql.ruby.dataflow.SSA
|
||||
@@ -82,6 +82,12 @@ abstract class LibraryCallable extends string {
|
||||
Call getACallSimple() { none() }
|
||||
}
|
||||
|
||||
/** A callable defined in library code, which should be taken into account in type tracking. */
|
||||
abstract class LibraryCallableToIncludeInTypeTracking extends LibraryCallable {
|
||||
bindingset[this]
|
||||
LibraryCallableToIncludeInTypeTracking() { exists(this) }
|
||||
}
|
||||
|
||||
/**
|
||||
* A callable. This includes callables from source code, as well as callables
|
||||
* defined in library code.
|
||||
@@ -184,6 +190,91 @@ class NormalCall extends DataFlowCall, TNormalCall {
|
||||
override Location getLocation() { result = c.getLocation() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides modeling of flow through the `render` method of view components.
|
||||
*
|
||||
* ```rb
|
||||
* # view.rb
|
||||
* class View < ViewComponent::Base
|
||||
* def initialize(x)
|
||||
* @x = x
|
||||
* end
|
||||
*
|
||||
* def foo
|
||||
* sink(@x)
|
||||
* end
|
||||
* end
|
||||
* ```
|
||||
*
|
||||
* ```erb
|
||||
* # view.html.erb
|
||||
* <%= foo() %> # 1
|
||||
* ```
|
||||
*
|
||||
* ```rb
|
||||
* # app.rb
|
||||
* class App
|
||||
* def run
|
||||
* view = View.new(taint) # 2
|
||||
* render(view) # 3
|
||||
* end
|
||||
* end
|
||||
* ```
|
||||
*
|
||||
* The `render` call (3) is modeled using a flow summary. The summary specifies
|
||||
* that the first argument (`view`) will have a special method invoked on it (we
|
||||
* call the method `__invoke__toplevel__erb__`), which targets the top-level of the
|
||||
* matching ERB file (`view.html.erb`). The `view` argument will flow into the receiver
|
||||
* of the synthesized method call, from there into the implicit `self` parameter of
|
||||
* the ERB file, and from there to the implicit `self` receiver of the call to `foo` (1).
|
||||
*
|
||||
* Since it is not actually possible to specify such flow summaries, we instead
|
||||
* specify a call-back summary, and adjust the generated call to target the special
|
||||
* `__invoke__toplevel__erb__` method.
|
||||
*
|
||||
* In order to resolve the target of the adjusted method call, we need to take
|
||||
* the `render` summary into account when constructing the call graph. That is, we
|
||||
* need to track the `View` instance (2) into the receiver of the adjusted method
|
||||
* call, in order to figure out that the call target is in fact `view.html.erb`.
|
||||
*/
|
||||
private module ViewComponentRenderModeling {
|
||||
private import codeql.ruby.frameworks.ViewComponent
|
||||
|
||||
private class RenderMethod extends SummarizedCallable, LibraryCallableToIncludeInTypeTracking {
|
||||
RenderMethod() { this = "render view component" }
|
||||
|
||||
override MethodCall getACallSimple() { result.getMethodName() = "render" }
|
||||
|
||||
override predicate propagatesFlow(string input, string output, boolean preservesValue) {
|
||||
input = "Argument[0]" and
|
||||
// use a call-back summary, and adjust it to a method call below
|
||||
output = "Argument[0].Parameter[self]" and
|
||||
preservesValue = true
|
||||
}
|
||||
}
|
||||
|
||||
private string invokeToplevelName() { result = "__invoke__toplevel__erb__" }
|
||||
|
||||
/** Holds if `call` should be adjusted to be a method call to `name` on `receiver`. */
|
||||
predicate adjustedMethodCall(DataFlowCall call, FlowSummaryNode receiver, string name) {
|
||||
exists(RenderMethod render |
|
||||
call = TSummaryCall(render, receiver.getSummaryNode()) and
|
||||
name = invokeToplevelName()
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if `self` belongs to the top-level of an ERB file with matching view class `view`. */
|
||||
pragma[nomagic]
|
||||
predicate selfInErbToplevel(SelfVariable self, ViewComponent::ComponentClass view) {
|
||||
self.getDeclaringScope().(Toplevel).getFile() = view.getTemplate()
|
||||
}
|
||||
|
||||
Toplevel lookupMethod(ViewComponent::ComponentClass m, string name) {
|
||||
result.getFile() = m.getTemplate() and
|
||||
name = invokeToplevelName()
|
||||
}
|
||||
}
|
||||
|
||||
/** A call for which we want to compute call targets. */
|
||||
private class RelevantCall extends CfgNodes::ExprNodes::CallCfgNode {
|
||||
pragma[nomagic]
|
||||
@@ -200,6 +291,8 @@ private predicate methodCall(DataFlowCall call, DataFlow::Node receiver, string
|
||||
method = rc.getExpr().(MethodCall).getMethodName() and
|
||||
receiver.asExpr() = rc.getReceiver()
|
||||
)
|
||||
or
|
||||
ViewComponentRenderModeling::adjustedMethodCall(call, receiver, method)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
@@ -253,8 +346,11 @@ private predicate selfInMethod(SelfVariable self, MethodBase method, Module m) {
|
||||
/** Holds if `self` belongs to the top-level. */
|
||||
pragma[nomagic]
|
||||
private predicate selfInToplevel(SelfVariable self, Module m) {
|
||||
ViewComponentRenderModeling::selfInErbToplevel(self, m)
|
||||
or
|
||||
not ViewComponentRenderModeling::selfInErbToplevel(self, _) and
|
||||
self.getDeclaringScope() instanceof Toplevel and
|
||||
m = TResolved("Object")
|
||||
m = Module::TResolved("Object")
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -271,7 +367,7 @@ private predicate selfInToplevel(SelfVariable self, Module m) {
|
||||
*/
|
||||
private predicate asModulePattern(SsaDefinitionExtNode def, Module m) {
|
||||
exists(AsPattern ap |
|
||||
m = resolveConstantReadAccess(ap.getPattern()) and
|
||||
m = Module::resolveConstantReadAccess(ap.getPattern()) and
|
||||
def.getDefinitionExt().(Ssa::WriteDefinition).getWriteAccess().getAstNode() =
|
||||
ap.getVariableAccess()
|
||||
)
|
||||
@@ -295,7 +391,7 @@ private predicate hasAdjacentTypeCheckedReads(
|
||||
exists(
|
||||
CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case
|
||||
|
|
||||
m = resolveConstantReadAccess(pattern.getExpr()) and
|
||||
m = Module::resolveConstantReadAccess(pattern.getExpr()) and
|
||||
cb.getLastNode() = pattern and
|
||||
cb.controls(read2.getBasicBlock(),
|
||||
any(SuccessorTypes::MatchingSuccessor match | match.getValue() = true)) and
|
||||
@@ -313,7 +409,7 @@ predicate isUserDefinedNew(SingletonMethod new) {
|
||||
exists(Expr object | singletonMethod(new, "new", object) |
|
||||
selfInModule(object.(SelfVariableReadAccess).getVariable(), _)
|
||||
or
|
||||
exists(resolveConstantReadAccess(object))
|
||||
exists(Module::resolveConstantReadAccess(object))
|
||||
)
|
||||
}
|
||||
|
||||
@@ -351,7 +447,7 @@ private predicate extendCall(DataFlow::ExprNode receiver, Module m) {
|
||||
extendCall.getMethodName() = "extend" and
|
||||
exists(DataFlow::LocalSourceNode sourceNode | sourceNode.flowsTo(extendCall.getArgument(_)) |
|
||||
selfInModule(sourceNode.(SelfLocalSourceNode).getVariable(), m) or
|
||||
m = resolveConstantReadAccess(sourceNode.asExpr().getExpr())
|
||||
m = Module::resolveConstantReadAccess(sourceNode.asExpr().getExpr())
|
||||
) and
|
||||
receiver = extendCall.getReceiver()
|
||||
)
|
||||
@@ -364,10 +460,16 @@ private predicate extendCallModule(Module m, Module n) {
|
||||
receiver.flowsTo(e) and extendCall(e, n)
|
||||
|
|
||||
selfInModule(receiver.(SelfLocalSourceNode).getVariable(), m) or
|
||||
m = resolveConstantReadAccess(receiver.asExpr().getExpr())
|
||||
m = Module::resolveConstantReadAccess(receiver.asExpr().getExpr())
|
||||
)
|
||||
}
|
||||
|
||||
private CfgScope lookupMethod(Module m, string name) {
|
||||
result = Module::lookupMethod(m, name)
|
||||
or
|
||||
result = ViewComponentRenderModeling::lookupMethod(m, name)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a method available in module `m`, or in one of `m`'s transitive
|
||||
* sub classes when `exact = false`.
|
||||
@@ -377,7 +479,7 @@ private CfgScope lookupMethod(Module m, string name, boolean exact) {
|
||||
result = lookupMethod(m, name) and
|
||||
exact in [false, true]
|
||||
or
|
||||
result = lookupMethodInSubClasses(m, name) and
|
||||
result = Module::lookupMethodInSubClasses(m, name) and
|
||||
exact = false
|
||||
}
|
||||
|
||||
@@ -490,7 +592,7 @@ private module TrackModuleInput implements CallGraphConstruction::Simple::InputS
|
||||
class State = Module;
|
||||
|
||||
predicate start(DataFlow::Node start, Module m) {
|
||||
m = resolveConstantReadAccess(start.asExpr().getExpr())
|
||||
m = Module::resolveConstantReadAccess(start.asExpr().getExpr())
|
||||
}
|
||||
|
||||
// We exclude steps into `self` parameters, and instead rely on the type of the
|
||||
@@ -547,55 +649,55 @@ private module TrackInstanceInput implements CallGraphConstruction::InputSig {
|
||||
pragma[nomagic]
|
||||
private predicate isInstanceNoCall(DataFlow::Node n, Module tp, boolean exact) {
|
||||
n.asExpr().getExpr() instanceof NilLiteral and
|
||||
tp = TResolved("NilClass") and
|
||||
tp = Module::TResolved("NilClass") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr().(BooleanLiteral).isFalse() and
|
||||
tp = TResolved("FalseClass") and
|
||||
tp = Module::TResolved("FalseClass") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr().(BooleanLiteral).isTrue() and
|
||||
tp = TResolved("TrueClass") and
|
||||
tp = Module::TResolved("TrueClass") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof IntegerLiteral and
|
||||
tp = TResolved("Integer") and
|
||||
tp = Module::TResolved("Integer") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof FloatLiteral and
|
||||
tp = TResolved("Float") and
|
||||
tp = Module::TResolved("Float") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof RationalLiteral and
|
||||
tp = TResolved("Rational") and
|
||||
tp = Module::TResolved("Rational") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof ComplexLiteral and
|
||||
tp = TResolved("Complex") and
|
||||
tp = Module::TResolved("Complex") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof StringlikeLiteral and
|
||||
tp = TResolved("String") and
|
||||
tp = Module::TResolved("String") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr() instanceof CfgNodes::ExprNodes::ArrayLiteralCfgNode and
|
||||
tp = TResolved("Array") and
|
||||
tp = Module::TResolved("Array") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr() instanceof CfgNodes::ExprNodes::HashLiteralCfgNode and
|
||||
tp = TResolved("Hash") and
|
||||
tp = Module::TResolved("Hash") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof MethodBase and
|
||||
tp = TResolved("Symbol") and
|
||||
tp = Module::TResolved("Symbol") and
|
||||
exact = true
|
||||
or
|
||||
n.asParameter() instanceof BlockParameter and
|
||||
tp = TResolved("Proc") and
|
||||
tp = Module::TResolved("Proc") and
|
||||
exact = true
|
||||
or
|
||||
n.asExpr().getExpr() instanceof Lambda and
|
||||
tp = TResolved("Proc") and
|
||||
tp = Module::TResolved("Proc") and
|
||||
exact = true
|
||||
or
|
||||
// `self` reference in method or top-level (but not in module or singleton method,
|
||||
@@ -646,11 +748,11 @@ private module TrackInstanceInput implements CallGraphConstruction::InputSig {
|
||||
isInstance(start, tp, exact)
|
||||
or
|
||||
exists(Module m |
|
||||
(if m.isClass() then tp = TResolved("Class") else tp = TResolved("Module")) and
|
||||
(if m.isClass() then tp = Module::TResolved("Class") else tp = Module::TResolved("Module")) and
|
||||
exact = true
|
||||
|
|
||||
// needed for e.g. `C.new`
|
||||
m = resolveConstantReadAccess(start.asExpr().getExpr())
|
||||
m = Module::resolveConstantReadAccess(start.asExpr().getExpr())
|
||||
or
|
||||
// needed for e.g. `self.include`
|
||||
selfInModule(start.(SelfLocalSourceNode).getVariable(), m)
|
||||
@@ -805,7 +907,7 @@ private predicate singletonMethodOnModule(MethodBase method, string name, Module
|
||||
)
|
||||
or
|
||||
exists(DataFlow::LocalSourceNode sourceNode |
|
||||
m = resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
|
||||
m = Module::resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
|
||||
flowsToSingletonMethodObject(sourceNode, method, name)
|
||||
)
|
||||
or
|
||||
@@ -821,7 +923,7 @@ private MethodBase lookupSingletonMethodDirect(Module m, string name) {
|
||||
or
|
||||
exists(DataFlow::LocalSourceNode sourceNode |
|
||||
sourceNode = trackModuleAccess(m) and
|
||||
not m = resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
|
||||
not m = Module::resolveConstantReadAccess(sourceNode.asExpr().getExpr()) and
|
||||
flowsToSingletonMethodObject(sourceNode, result, name)
|
||||
)
|
||||
}
|
||||
@@ -847,7 +949,7 @@ private MethodBase lookupSingletonMethodInSubClasses(Module m, string name) {
|
||||
// The 'self' inside such a singleton method could then be any class, leading to self-calls
|
||||
// being resolved to arbitrary singleton methods.
|
||||
// To remedy this, we do not allow following super-classes all the way to Object.
|
||||
not m = TResolved("Object") and
|
||||
not m = Module::TResolved("Object") and
|
||||
exists(Module sub |
|
||||
sub.getSuperClass() = m // not `getAnImmediateAncestor` because singleton methods cannot be included
|
||||
|
|
||||
@@ -901,7 +1003,7 @@ predicate singletonMethodOnInstance(MethodBase method, string name, Expr object)
|
||||
singletonMethod(method, name, object) and
|
||||
not selfInModule(object.(SelfVariableReadAccess).getVariable(), _) and
|
||||
// cannot use `trackModuleAccess` because of negative recursion
|
||||
not exists(resolveConstantReadAccess(object))
|
||||
not exists(Module::resolveConstantReadAccess(object))
|
||||
or
|
||||
exists(DataFlow::ExprNode receiver, Module other |
|
||||
extendCall(receiver, other) and
|
||||
@@ -948,7 +1050,7 @@ private module TrackSingletonMethodOnInstanceInput implements CallGraphConstruct
|
||||
RelevantCall call, DataFlow::Node arg, DataFlow::ParameterNode p,
|
||||
CfgNodes::ExprCfgNode nodeFromPreExpr
|
||||
|
|
||||
callStep(call, arg, p) and
|
||||
sourceCallStep(call, arg, p) and
|
||||
nodeTo.getPreUpdateNode() = arg and
|
||||
summary.toString() = "return" and
|
||||
(
|
||||
|
||||
@@ -236,6 +236,14 @@ module LocalFlow {
|
||||
nodeTo.(BlockArgumentNode).getParameterNode(true) = nodeFrom
|
||||
}
|
||||
|
||||
predicate flowSummaryLocalStep(
|
||||
FlowSummaryNode nodeFrom, FlowSummaryNode nodeTo, FlowSummaryImpl::Public::SummarizedCallable c
|
||||
) {
|
||||
FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.getSummaryNode(),
|
||||
nodeTo.getSummaryNode(), true) and
|
||||
c = nodeFrom.getSummarizedCallable()
|
||||
}
|
||||
|
||||
predicate localMustFlowStep(Node node1, Node node2) {
|
||||
LocalFlow::localFlowSsaParamInput(node1, node2)
|
||||
or
|
||||
@@ -522,7 +530,8 @@ private module Cached {
|
||||
p instanceof HashSplatParameter or
|
||||
p instanceof SplatParameter
|
||||
} or
|
||||
TSelfParameterNode(MethodBase m) or
|
||||
TSelfMethodParameterNode(MethodBase m) or
|
||||
TSelfToplevelParameterNode(Toplevel t) or
|
||||
TLambdaSelfReferenceNode(Callable c) { lambdaCreationExpr(_, _, c) } or
|
||||
TBlockParameterNode(MethodBase m) or
|
||||
TBlockArgumentNode(CfgNodes::ExprNodes::CallCfgNode yield) {
|
||||
@@ -562,6 +571,8 @@ private module Cached {
|
||||
} or
|
||||
TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn)
|
||||
|
||||
class TSelfParameterNode = TSelfMethodParameterNode or TSelfToplevelParameterNode;
|
||||
|
||||
class TSourceParameterNode =
|
||||
TNormalParameterNode or TBlockParameterNode or TSelfParameterNode or
|
||||
TSynthHashSplatParameterNode or TSynthSplatParameterNode;
|
||||
@@ -593,8 +604,7 @@ private module Cached {
|
||||
not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _)
|
||||
)
|
||||
or
|
||||
FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom.(FlowSummaryNode).getSummaryNode(),
|
||||
nodeTo.(FlowSummaryNode).getSummaryNode(), true)
|
||||
LocalFlow::flowSummaryLocalStep(nodeFrom, nodeTo, _)
|
||||
or
|
||||
VariableCapture::valueStep(nodeFrom, nodeTo)
|
||||
}
|
||||
@@ -627,6 +637,8 @@ private module Cached {
|
||||
LocalFlow::localFlowSsaInputFromRead(_, nodeFrom, nodeTo)
|
||||
or
|
||||
VariableCapture::flowInsensitiveStep(nodeFrom, nodeTo)
|
||||
or
|
||||
LocalFlow::flowSummaryLocalStep(nodeFrom, nodeTo, any(LibraryCallableToIncludeInTypeTracking c))
|
||||
}
|
||||
|
||||
/** Holds if `n` wraps an SSA definition without ingoing flow. */
|
||||
@@ -961,32 +973,64 @@ private module ParameterNodes {
|
||||
* The value of the `self` parameter at function entry, viewed as a node in a data
|
||||
* flow graph.
|
||||
*/
|
||||
class SelfParameterNodeImpl extends ParameterNodeImpl, TSelfParameterNode {
|
||||
abstract class SelfParameterNodeImpl extends ParameterNodeImpl, TSelfParameterNode {
|
||||
/** Gets the corresponding SSA `self` definition, if any. */
|
||||
abstract Ssa::SelfDefinition getSelfDefinition();
|
||||
|
||||
/** Gets the underlying `self` variable. */
|
||||
abstract SelfVariable getSelfVariable();
|
||||
|
||||
final override Parameter getParameter() { none() }
|
||||
|
||||
final override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
|
||||
c = TCfgScope(this.getCfgScope()) and pos.isSelf()
|
||||
}
|
||||
|
||||
final override string toStringImpl() { result = "self in " + this.getCfgScope() }
|
||||
}
|
||||
|
||||
/**
|
||||
* The value of the `self` parameter at method entry, viewed as a node in a data
|
||||
* flow graph.
|
||||
*/
|
||||
class SelfMethodParameterNodeImpl extends SelfParameterNodeImpl, TSelfMethodParameterNode {
|
||||
private MethodBase method;
|
||||
|
||||
SelfParameterNodeImpl() { this = TSelfParameterNode(method) }
|
||||
SelfMethodParameterNodeImpl() { this = TSelfMethodParameterNode(method) }
|
||||
|
||||
final MethodBase getMethod() { result = method }
|
||||
|
||||
/** Gets the corresponding SSA `self` definition, if any. */
|
||||
Ssa::SelfDefinition getSelfDefinition() {
|
||||
override Ssa::SelfDefinition getSelfDefinition() {
|
||||
result.getSourceVariable().getDeclaringScope() = method
|
||||
}
|
||||
|
||||
/** Gets the underlying `self` variable. */
|
||||
final SelfVariable getSelfVariable() { result.getDeclaringScope() = method }
|
||||
|
||||
override Parameter getParameter() { none() }
|
||||
|
||||
override predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
|
||||
method = c.asCfgScope() and pos.isSelf()
|
||||
}
|
||||
final override SelfVariable getSelfVariable() { result.getDeclaringScope() = method }
|
||||
|
||||
override CfgScope getCfgScope() { result = method }
|
||||
|
||||
override Location getLocationImpl() { result = method.getLocation() }
|
||||
}
|
||||
|
||||
override string toStringImpl() { result = "self in " + method }
|
||||
/**
|
||||
* The value of the `self` parameter at top-level entry, viewed as a node in a data
|
||||
* flow graph.
|
||||
*/
|
||||
class SelfToplevelParameterNodeImpl extends SelfParameterNodeImpl, TSelfToplevelParameterNode {
|
||||
private Toplevel t;
|
||||
|
||||
SelfToplevelParameterNodeImpl() { this = TSelfToplevelParameterNode(t) }
|
||||
|
||||
final Toplevel getToplevel() { result = t }
|
||||
|
||||
override Ssa::SelfDefinition getSelfDefinition() {
|
||||
result.getSourceVariable().getDeclaringScope() = t
|
||||
}
|
||||
|
||||
final override SelfVariable getSelfVariable() { result.getDeclaringScope() = t }
|
||||
|
||||
override CfgScope getCfgScope() { result = t }
|
||||
|
||||
override Location getLocationImpl() { result = t.getLocation() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1067,7 +1067,7 @@ class ModuleNode instanceof Module {
|
||||
* Does not take inheritance into account.
|
||||
*/
|
||||
ParameterNode getAnOwnInstanceSelf() {
|
||||
result = TSelfParameterNode(this.getAnOwnInstanceMethod().asCallableAstNode())
|
||||
result = TSelfMethodParameterNode(this.getAnOwnInstanceMethod().asCallableAstNode())
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
29
ruby/ql/lib/codeql/ruby/frameworks/ViewComponent.qll
Normal file
29
ruby/ql/lib/codeql/ruby/frameworks/ViewComponent.qll
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Provides modeling for the `view_component` gem.
|
||||
*/
|
||||
|
||||
private import codeql.ruby.AST
|
||||
|
||||
/**
|
||||
* Provides modeling for the `view_component` gem.
|
||||
*/
|
||||
module ViewComponent {
|
||||
/**
|
||||
* A subclass of `ViewComponent::Base`.
|
||||
*/
|
||||
class ComponentClass extends Module {
|
||||
ComponentClass() { this.getAnAncestor().getQualifiedName() = "ViewComponent::Base" }
|
||||
|
||||
/**
|
||||
* Returns the template file for this component.
|
||||
*/
|
||||
ErbFile getTemplate() {
|
||||
result.getAbsolutePath() =
|
||||
this.getADeclaration()
|
||||
.getLocation()
|
||||
.getFile()
|
||||
.getAbsolutePath()
|
||||
.replaceAll(".rb", ".html.erb")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,10 @@ private module Config implements DataFlow::StateConfigSig {
|
||||
}
|
||||
|
||||
predicate isBarrier(DataFlow::Node node, FlowState state) { node.(Sanitizer).getAState() = state }
|
||||
|
||||
predicate isBarrierIn(DataFlow::Node node) { node instanceof Source }
|
||||
|
||||
int fieldFlowBranchLimit() { result = 10 }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -28,11 +28,11 @@ private predicate flowThrough(DataFlowPublic::ParameterNode param) {
|
||||
/** Holds if there is flow from `arg` to `p` via the call `call`, not counting `new -> initialize` call steps. */
|
||||
pragma[nomagic]
|
||||
private predicate callStepNoInitialize(
|
||||
ExprNodes::CallCfgNode call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
|
||||
DataFlowDispatch::DataFlowCall call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
|
||||
) {
|
||||
exists(DataFlowDispatch::ParameterPosition pos |
|
||||
argumentPositionMatch(call, arg, pos) and
|
||||
p.isSourceParameterOf(DataFlowDispatch::getTarget(DataFlowDispatch::TNormalCall(call)), pos)
|
||||
p.isSourceParameterOf(DataFlowDispatch::getTarget(call), pos)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ private predicate localFieldStep(DataFlow::Node pred, DataFlow::Node succ) {
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
private predicate argumentPositionMatch(
|
||||
private predicate sourceArgumentPositionMatch(
|
||||
ExprNodes::CallCfgNode call, DataFlowPrivate::ArgumentNode arg,
|
||||
DataFlowDispatch::ParameterPosition ppos
|
||||
) {
|
||||
@@ -105,22 +105,53 @@ private predicate argumentPositionMatch(
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
private predicate viableParam(
|
||||
ExprNodes::CallCfgNode call, DataFlowPrivate::ParameterNodeImpl p,
|
||||
private predicate argumentPositionMatch(
|
||||
DataFlowDispatch::DataFlowCall call, DataFlowPrivate::ArgumentNode arg,
|
||||
DataFlowDispatch::ParameterPosition ppos
|
||||
) {
|
||||
exists(Cfg::CfgScope callable |
|
||||
DataFlowDispatch::getTarget(DataFlowDispatch::TNormalCall(call)) = callable or
|
||||
DataFlowDispatch::getInitializeTarget(call) = callable
|
||||
sourceArgumentPositionMatch(call.asCall(), arg, ppos)
|
||||
or
|
||||
exists(DataFlowDispatch::ArgumentPosition apos |
|
||||
DataFlowDispatch::parameterMatch(ppos, apos) and
|
||||
arg.argumentOf(call, apos) and
|
||||
call.getEnclosingCallable().asLibraryCallable() instanceof
|
||||
DataFlowDispatch::LibraryCallableToIncludeInTypeTracking
|
||||
)
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
private predicate viableParam(
|
||||
DataFlowDispatch::DataFlowCall call, DataFlowPrivate::ParameterNodeImpl p,
|
||||
DataFlowDispatch::ParameterPosition ppos
|
||||
) {
|
||||
exists(DataFlowDispatch::DataFlowCallable callable |
|
||||
DataFlowDispatch::getTarget(call) = callable.asCfgScope() or
|
||||
DataFlowDispatch::getInitializeTarget(call.asCall()) = callable.asCfgScope() or
|
||||
call.asCall().getAstNode() =
|
||||
callable
|
||||
.asLibraryCallable()
|
||||
.(DataFlowDispatch::LibraryCallableToIncludeInTypeTracking)
|
||||
.getACallSimple()
|
||||
|
|
||||
p.isSourceParameterOf(callable, ppos)
|
||||
p.isParameterOf(callable, ppos)
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if there is flow from `arg` to `p` via the source-code call `call`. */
|
||||
pragma[nomagic]
|
||||
predicate sourceCallStep(
|
||||
ExprNodes::CallCfgNode call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
|
||||
) {
|
||||
exists(DataFlowDispatch::ParameterPosition pos |
|
||||
sourceArgumentPositionMatch(call, arg, pos) and
|
||||
viableParam(DataFlowDispatch::TNormalCall(call), p, pos)
|
||||
)
|
||||
}
|
||||
|
||||
/** Holds if there is flow from `arg` to `p` via the call `call`. */
|
||||
pragma[nomagic]
|
||||
predicate callStep(
|
||||
ExprNodes::CallCfgNode call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
|
||||
DataFlowDispatch::DataFlowCall call, DataFlow::Node arg, DataFlowPrivate::ParameterNodeImpl p
|
||||
) {
|
||||
exists(DataFlowDispatch::ParameterPosition pos |
|
||||
argumentPositionMatch(call, arg, pos) and
|
||||
@@ -192,7 +223,7 @@ private module SummaryTypeTrackerInput implements SummaryTypeTracker::Input {
|
||||
Node argumentOf(Node call, SummaryComponent arg, boolean isPostUpdate) {
|
||||
exists(DataFlowDispatch::ParameterPosition pos, DataFlowPrivate::ArgumentNode n |
|
||||
arg = FlowSummaryImpl::Private::SummaryComponent::argument(pos) and
|
||||
argumentPositionMatch(call.asExpr(), n, pos)
|
||||
sourceArgumentPositionMatch(call.asExpr(), n, pos)
|
||||
|
|
||||
isPostUpdate = false and result = n
|
||||
or
|
||||
@@ -272,7 +303,7 @@ module TypeTrackingInput implements Shared::TypeTrackingInput {
|
||||
predicate levelStepCall(Node nodeFrom, LocalSourceNode nodeTo) {
|
||||
exists(DataFlowPublic::ParameterNode param |
|
||||
flowThrough(param) and
|
||||
callStepNoInitialize(nodeTo.asExpr(), nodeFrom, param)
|
||||
callStepNoInitialize(DataFlowDispatch::TNormalCall(nodeTo.asExpr()), nodeFrom, param)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
104
ruby/ql/test/library-tests/dataflow/erb/erb.expected
Normal file
104
ruby/ql/test/library-tests/dataflow/erb/erb.expected
Normal file
@@ -0,0 +1,104 @@
|
||||
testFailures
|
||||
edges
|
||||
| main.rb:3:9:3:9 | x | main.rb:4:26:4:26 | x |
|
||||
| main.rb:3:13:3:21 | call to source | main.rb:3:9:3:9 | x |
|
||||
| main.rb:4:9:4:12 | view [@x] | main.rb:5:16:5:19 | view [@x] |
|
||||
| main.rb:4:16:4:27 | call to new [@x] | main.rb:4:9:4:12 | view [@x] |
|
||||
| main.rb:4:26:4:26 | x | main.rb:4:16:4:27 | call to new [@x] |
|
||||
| main.rb:4:26:4:26 | x | view1.rb:5:20:5:20 | x |
|
||||
| main.rb:5:16:5:19 | view [@x] | view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] |
|
||||
| main.rb:10:16:10:19 | [post] view [@x] | main.rb:11:9:11:12 | view [@x] |
|
||||
| main.rb:11:9:11:12 | view [@x] | view2.rb:2:5:4:7 | self in foo [@x] |
|
||||
| main.rb:15:9:15:9 | x | main.rb:16:26:16:26 | x |
|
||||
| main.rb:15:13:15:21 | call to source | main.rb:15:9:15:9 | x |
|
||||
| main.rb:16:9:16:12 | view [@x] | main.rb:17:16:17:19 | view [@x] |
|
||||
| main.rb:16:16:16:27 | call to new [@x] | main.rb:16:9:16:12 | view [@x] |
|
||||
| main.rb:16:26:16:26 | x | main.rb:16:16:16:27 | call to new [@x] |
|
||||
| main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x |
|
||||
| main.rb:17:16:17:19 | view [@x] | view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] |
|
||||
| view1.html.erb:2:5:2:9 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] |
|
||||
| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | view1.html.erb:2:5:2:9 | self [@x] |
|
||||
| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | view1.html.erb:7:1:7:5 | self [@x] |
|
||||
| view1.html.erb:6:1:6:14 | [post] self [@x] | view1.html.erb:7:1:7:5 | self [@x] |
|
||||
| view1.html.erb:6:5:6:13 | call to source | view1.html.erb:6:1:6:14 | [post] self [@x] |
|
||||
| view1.html.erb:6:5:6:13 | call to source | view1.rb:13:13:13:13 | x |
|
||||
| view1.html.erb:7:1:7:5 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] |
|
||||
| view1.html.erb:7:1:7:5 | self [@x] | view1.rb:9:5:11:7 | self in foo [@x] |
|
||||
| view1.rb:5:20:5:20 | x | view1.rb:6:14:6:14 | x |
|
||||
| view1.rb:6:14:6:14 | x | view1.rb:6:9:6:10 | [post] self [@x] |
|
||||
| view1.rb:9:5:11:7 | self in foo [@x] | view1.rb:10:14:10:15 | self [@x] |
|
||||
| view1.rb:10:14:10:15 | self [@x] | view1.rb:10:14:10:15 | @x |
|
||||
| view1.rb:13:13:13:13 | x | view1.rb:14:14:14:14 | x |
|
||||
| view1.rb:14:14:14:14 | x | view1.rb:14:9:14:10 | [post] self [@x] |
|
||||
| view2.html.erb:3:1:3:14 | [post] self [@x] | main.rb:10:16:10:19 | [post] view [@x] |
|
||||
| view2.html.erb:3:5:3:13 | call to source | view2.html.erb:3:1:3:14 | [post] self [@x] |
|
||||
| view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x |
|
||||
| view2.rb:2:5:4:7 | self in foo [@x] | view2.rb:3:14:3:15 | self [@x] |
|
||||
| view2.rb:3:14:3:15 | self [@x] | view2.rb:3:14:3:15 | @x |
|
||||
| view2.rb:6:13:6:13 | x | view2.rb:7:14:7:14 | x |
|
||||
| view2.rb:7:14:7:14 | x | view2.rb:7:9:7:10 | [post] self [@x] |
|
||||
| view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | view3.html.erb:3:6:3:8 | self [@x] |
|
||||
| view3.html.erb:3:6:3:8 | self [@x] | view3.html.erb:3:6:3:8 | call to get |
|
||||
| view3.html.erb:3:6:3:8 | self [@x] | view3.rb:6:5:8:7 | self in get [@x] |
|
||||
| view3.rb:2:20:2:20 | x | view3.rb:3:14:3:14 | x |
|
||||
| view3.rb:3:14:3:14 | x | view3.rb:3:9:3:10 | [post] self [@x] |
|
||||
| view3.rb:6:5:8:7 | self in get [@x] | view3.rb:7:9:7:10 | self [@x] |
|
||||
| view3.rb:7:9:7:10 | self [@x] | view3.rb:7:9:7:10 | @x |
|
||||
nodes
|
||||
| main.rb:3:9:3:9 | x | semmle.label | x |
|
||||
| main.rb:3:13:3:21 | call to source | semmle.label | call to source |
|
||||
| main.rb:4:9:4:12 | view [@x] | semmle.label | view [@x] |
|
||||
| main.rb:4:16:4:27 | call to new [@x] | semmle.label | call to new [@x] |
|
||||
| main.rb:4:26:4:26 | x | semmle.label | x |
|
||||
| main.rb:5:16:5:19 | view [@x] | semmle.label | view [@x] |
|
||||
| main.rb:10:16:10:19 | [post] view [@x] | semmle.label | [post] view [@x] |
|
||||
| main.rb:11:9:11:12 | view [@x] | semmle.label | view [@x] |
|
||||
| main.rb:15:9:15:9 | x | semmle.label | x |
|
||||
| main.rb:15:13:15:21 | call to source | semmle.label | call to source |
|
||||
| main.rb:16:9:16:12 | view [@x] | semmle.label | view [@x] |
|
||||
| main.rb:16:16:16:27 | call to new [@x] | semmle.label | call to new [@x] |
|
||||
| main.rb:16:26:16:26 | x | semmle.label | x |
|
||||
| main.rb:17:16:17:19 | view [@x] | semmle.label | view [@x] |
|
||||
| view1.html.erb:2:5:2:9 | self [@x] | semmle.label | self [@x] |
|
||||
| view1.html.erb:2:5:8:1 | self in view1.html.erb [@x] | semmle.label | self in view1.html.erb [@x] |
|
||||
| view1.html.erb:6:1:6:14 | [post] self [@x] | semmle.label | [post] self [@x] |
|
||||
| view1.html.erb:6:5:6:13 | call to source | semmle.label | call to source |
|
||||
| view1.html.erb:7:1:7:5 | self [@x] | semmle.label | self [@x] |
|
||||
| view1.html.erb:7:1:7:5 | self [@x] | semmle.label | self [@x] |
|
||||
| view1.rb:5:20:5:20 | x | semmle.label | x |
|
||||
| view1.rb:6:9:6:10 | [post] self [@x] | semmle.label | [post] self [@x] |
|
||||
| view1.rb:6:14:6:14 | x | semmle.label | x |
|
||||
| view1.rb:9:5:11:7 | self in foo [@x] | semmle.label | self in foo [@x] |
|
||||
| view1.rb:10:14:10:15 | @x | semmle.label | @x |
|
||||
| view1.rb:10:14:10:15 | self [@x] | semmle.label | self [@x] |
|
||||
| view1.rb:13:13:13:13 | x | semmle.label | x |
|
||||
| view1.rb:14:9:14:10 | [post] self [@x] | semmle.label | [post] self [@x] |
|
||||
| view1.rb:14:14:14:14 | x | semmle.label | x |
|
||||
| view2.html.erb:3:1:3:14 | [post] self [@x] | semmle.label | [post] self [@x] |
|
||||
| view2.html.erb:3:5:3:13 | call to source | semmle.label | call to source |
|
||||
| view2.rb:2:5:4:7 | self in foo [@x] | semmle.label | self in foo [@x] |
|
||||
| view2.rb:3:14:3:15 | @x | semmle.label | @x |
|
||||
| view2.rb:3:14:3:15 | self [@x] | semmle.label | self [@x] |
|
||||
| view2.rb:6:13:6:13 | x | semmle.label | x |
|
||||
| view2.rb:7:9:7:10 | [post] self [@x] | semmle.label | [post] self [@x] |
|
||||
| view2.rb:7:14:7:14 | x | semmle.label | x |
|
||||
| view3.html.erb:3:1:4:1 | self in view3.html.erb [@x] | semmle.label | self in view3.html.erb [@x] |
|
||||
| view3.html.erb:3:6:3:8 | call to get | semmle.label | call to get |
|
||||
| view3.html.erb:3:6:3:8 | self [@x] | semmle.label | self [@x] |
|
||||
| view3.rb:2:20:2:20 | x | semmle.label | x |
|
||||
| view3.rb:3:9:3:10 | [post] self [@x] | semmle.label | [post] self [@x] |
|
||||
| view3.rb:3:14:3:14 | x | semmle.label | x |
|
||||
| view3.rb:6:5:8:7 | self in get [@x] | semmle.label | self in get [@x] |
|
||||
| view3.rb:7:9:7:10 | @x | semmle.label | @x |
|
||||
| view3.rb:7:9:7:10 | self [@x] | semmle.label | self [@x] |
|
||||
subpaths
|
||||
| main.rb:4:26:4:26 | x | view1.rb:5:20:5:20 | x | view1.rb:6:9:6:10 | [post] self [@x] | main.rb:4:16:4:27 | call to new [@x] |
|
||||
| main.rb:16:26:16:26 | x | view3.rb:2:20:2:20 | x | view3.rb:3:9:3:10 | [post] self [@x] | main.rb:16:16:16:27 | call to new [@x] |
|
||||
| view1.html.erb:6:5:6:13 | call to source | view1.rb:13:13:13:13 | x | view1.rb:14:9:14:10 | [post] self [@x] | view1.html.erb:6:1:6:14 | [post] self [@x] |
|
||||
| view2.html.erb:3:5:3:13 | call to source | view2.rb:6:13:6:13 | x | view2.rb:7:9:7:10 | [post] self [@x] | view2.html.erb:3:1:3:14 | [post] self [@x] |
|
||||
| view3.html.erb:3:6:3:8 | self [@x] | view3.rb:6:5:8:7 | self in get [@x] | view3.rb:7:9:7:10 | @x | view3.html.erb:3:6:3:8 | call to get |
|
||||
#select
|
||||
| view1.rb:10:14:10:15 | @x | main.rb:3:13:3:21 | call to source | view1.rb:10:14:10:15 | @x | $@ | main.rb:3:13:3:21 | call to source | call to source |
|
||||
| view1.rb:10:14:10:15 | @x | view1.html.erb:6:5:6:13 | call to source | view1.rb:10:14:10:15 | @x | $@ | view1.html.erb:6:5:6:13 | call to source | call to source |
|
||||
| view2.rb:3:14:3:15 | @x | view2.html.erb:3:5:3:13 | call to source | view2.rb:3:14:3:15 | @x | $@ | view2.html.erb:3:5:3:13 | call to source | call to source |
|
||||
| view3.html.erb:3:6:3:8 | call to get | main.rb:15:13:15:21 | call to source | view3.html.erb:3:6:3:8 | call to get | $@ | main.rb:15:13:15:21 | call to source | call to source |
|
||||
13
ruby/ql/test/library-tests/dataflow/erb/erb.ql
Normal file
13
ruby/ql/test/library-tests/dataflow/erb/erb.ql
Normal file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* @kind path-problem
|
||||
*/
|
||||
|
||||
import codeql.ruby.AST
|
||||
import codeql.ruby.CFG
|
||||
import TestUtilities.InlineFlowTest
|
||||
import ValueFlowTest<DefaultFlowConfig>
|
||||
import ValueFlow::PathGraph
|
||||
|
||||
from ValueFlow::PathNode source, ValueFlow::PathNode sink
|
||||
where ValueFlow::flowPath(source, sink)
|
||||
select sink, source, sink, "$@", source, source.toString()
|
||||
25
ruby/ql/test/library-tests/dataflow/erb/main.rb
Normal file
25
ruby/ql/test/library-tests/dataflow/erb/main.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
class App
|
||||
def run1
|
||||
x = source(1)
|
||||
view = View1.new(x)
|
||||
render(view)
|
||||
end
|
||||
|
||||
def run2
|
||||
view = View2.new
|
||||
render(view)
|
||||
view.foo
|
||||
end
|
||||
|
||||
def run3
|
||||
x = source(4)
|
||||
view = View3.new(x)
|
||||
render(view)
|
||||
end
|
||||
|
||||
def run4
|
||||
x = source(5)
|
||||
view = View4.new(x)
|
||||
render(view)
|
||||
end
|
||||
end
|
||||
8
ruby/ql/test/library-tests/dataflow/erb/view1.html.erb
Normal file
8
ruby/ql/test/library-tests/dataflow/erb/view1.html.erb
Normal file
@@ -0,0 +1,8 @@
|
||||
<%# Flow through an ERB template %>
|
||||
<%= foo() %>
|
||||
|
||||
<%# Flow out of an ERB template %>
|
||||
<%
|
||||
set(source(2))
|
||||
foo()
|
||||
%>
|
||||
16
ruby/ql/test/library-tests/dataflow/erb/view1.rb
Normal file
16
ruby/ql/test/library-tests/dataflow/erb/view1.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
class ViewComponent::Base
|
||||
end
|
||||
|
||||
class View1 < ViewComponent::Base
|
||||
def initialize(x)
|
||||
@x = x
|
||||
end
|
||||
|
||||
def foo
|
||||
sink(@x) # $ hasValueFlow=1 $ hasValueFlow=2
|
||||
end
|
||||
|
||||
def set(x)
|
||||
@x = x
|
||||
end
|
||||
end
|
||||
4
ruby/ql/test/library-tests/dataflow/erb/view2.html.erb
Normal file
4
ruby/ql/test/library-tests/dataflow/erb/view2.html.erb
Normal file
@@ -0,0 +1,4 @@
|
||||
<%# Flow out of an ERB template (side-effect) %>
|
||||
<%
|
||||
set(source(3))
|
||||
%>
|
||||
9
ruby/ql/test/library-tests/dataflow/erb/view2.rb
Normal file
9
ruby/ql/test/library-tests/dataflow/erb/view2.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class View2 < ViewComponent::Base
|
||||
def foo
|
||||
sink(@x) # $ hasValueFlow=3
|
||||
end
|
||||
|
||||
def set(x)
|
||||
@x = x
|
||||
end
|
||||
end
|
||||
4
ruby/ql/test/library-tests/dataflow/erb/view3.html.erb
Normal file
4
ruby/ql/test/library-tests/dataflow/erb/view3.html.erb
Normal file
@@ -0,0 +1,4 @@
|
||||
<%# Flow into an ERB template %>
|
||||
<%
|
||||
sink(get) # $ hasValueFlow=4
|
||||
%>
|
||||
9
ruby/ql/test/library-tests/dataflow/erb/view3.rb
Normal file
9
ruby/ql/test/library-tests/dataflow/erb/view3.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class View3 < ViewComponent::Base
|
||||
def initialize(x)
|
||||
@x = x
|
||||
end
|
||||
|
||||
def get
|
||||
@x
|
||||
end
|
||||
end
|
||||
15
ruby/ql/test/library-tests/dataflow/erb/view4.rb
Normal file
15
ruby/ql/test/library-tests/dataflow/erb/view4.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
# This component has no corresponding template file, because it defines a `call` method instead.
|
||||
|
||||
class View4 < ViewComponent::Base
|
||||
def initialize(x)
|
||||
@x = x
|
||||
end
|
||||
|
||||
def get
|
||||
@x
|
||||
end
|
||||
|
||||
def call
|
||||
"hi"
|
||||
end
|
||||
end
|
||||
@@ -2401,6 +2401,7 @@
|
||||
| local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) |
|
||||
| local_dataflow.rb:1:1:150:3 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
|
||||
| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
|
||||
| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) |
|
||||
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a |
|
||||
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a |
|
||||
| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b |
|
||||
|
||||
@@ -2844,6 +2844,7 @@
|
||||
| local_dataflow.rb:1:1:7:3 | synthetic splat parameter | local_dataflow.rb:1:9:1:9 | a |
|
||||
| local_dataflow.rb:1:1:150:3 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
|
||||
| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
|
||||
| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) |
|
||||
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a |
|
||||
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a |
|
||||
| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b |
|
||||
|
||||
@@ -3,25 +3,25 @@ track
|
||||
| params_flow.rb:1:1:3:3 | self in taint | type tracker without call steps | params_flow.rb:1:1:3:3 | self in taint |
|
||||
| params_flow.rb:1:1:3:3 | synthetic splat parameter | type tracker without call steps | params_flow.rb:1:1:3:3 | synthetic splat parameter |
|
||||
| params_flow.rb:1:1:3:3 | taint | type tracker without call steps | params_flow.rb:1:1:3:3 | taint |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:1:1:3:3 | self in taint |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:5:1:7:3 | self in sink |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:9:1:12:3 | self in positional |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:16:1:19:3 | self in keyword |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:25:1:31:3 | self in kwargs |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:49:1:53:3 | self in posargs |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:64:1:66:3 | self in splatstuff |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:69:1:76:3 | self in splatmid |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:83:1:91:3 | self in pos_many |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:98:1:103:3 | self in splatmidsmall |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:120:1:126:3 | self in destruct |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:133:1:135:3 | self in splatall |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:167:1:169:3 | self in splatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:181:1:183:3 | self in positionSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker with call steps | params_flow.rb:200:1:205:3 | self in foo |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | type tracker without call steps | params_flow.rb:1:1:207:15 | self (params_flow.rb) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:1:1:3:3 | self in taint |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:5:1:7:3 | self in sink |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:9:1:12:3 | self in positional |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:16:1:19:3 | self in keyword |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:25:1:31:3 | self in kwargs |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:49:1:53:3 | self in posargs |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:64:1:66:3 | self in splatstuff |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:69:1:76:3 | self in splatmid |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:83:1:91:3 | self in pos_many |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:98:1:103:3 | self in splatmidsmall |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:120:1:126:3 | self in destruct |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:133:1:135:3 | self in splatall |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:167:1:169:3 | self in splatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:181:1:183:3 | self in positionSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker with call steps | params_flow.rb:200:1:205:3 | self in foo |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | type tracker without call steps | params_flow.rb:1:1:207:15 | self in params_flow.rb |
|
||||
| params_flow.rb:1:11:1:11 | x | type tracker with call steps | params_flow.rb:5:10:5:10 | x |
|
||||
| params_flow.rb:1:11:1:11 | x | type tracker with call steps | params_flow.rb:9:16:9:17 | p1 |
|
||||
| params_flow.rb:1:11:1:11 | x | type tracker with call steps | params_flow.rb:9:20:9:21 | p2 |
|
||||
@@ -3692,215 +3692,216 @@ trackEnd
|
||||
| params_flow.rb:1:1:3:3 | self in taint | params_flow.rb:1:1:3:3 | self in taint |
|
||||
| params_flow.rb:1:1:3:3 | synthetic splat parameter | params_flow.rb:1:1:3:3 | synthetic splat parameter |
|
||||
| params_flow.rb:1:1:3:3 | taint | params_flow.rb:1:1:3:3 | taint |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:1:1:3:3 | self in taint |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:1:1:207:15 | self (params_flow.rb) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:5:1:7:3 | self (sink) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:5:1:7:3 | self in sink |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:6:5:6:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:9:1:12:3 | self (positional) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:9:1:12:3 | self in positional |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:10:5:10:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:11:5:11:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:14:1:14:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:14:12:14:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:14:22:14:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:16:1:19:3 | self (keyword) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:16:1:19:3 | self in keyword |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:17:5:17:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:18:5:18:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:21:1:21:35 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:21:13:21:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:21:27:21:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:22:1:22:35 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:22:13:22:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:22:27:22:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:23:1:23:41 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:23:16:23:23 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:23:33:23:40 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:25:1:31:3 | self (kwargs) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:25:1:31:3 | self in kwargs |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:26:5:26:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:27:5:27:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:28:5:28:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:29:5:29:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:30:5:30:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:1:33:58 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:12:33:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:26:33:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:33:41:33:49 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:34:14:34:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:35:1:35:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:35:12:35:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:37:16:37:24 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:37:34:37:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:38:1:38:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:40:16:40:24 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:41:1:41:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:41:13:41:21 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:43:9:43:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:44:1:44:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:44:12:44:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:46:9:46:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:46:20:46:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:47:1:47:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:49:1:53:3 | self (posargs) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:49:1:53:3 | self in posargs |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:50:5:50:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:51:5:51:21 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:52:5:52:21 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:55:1:55:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:55:9:55:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:55:20:55:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:57:9:57:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:58:1:58:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:58:9:58:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:60:9:60:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:60:20:60:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:61:1:61:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:63:8:63:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:64:1:66:3 | self (splatstuff) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:64:1:66:3 | self in splatstuff |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:65:5:65:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:67:1:67:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:69:1:76:3 | self (splatmid) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:69:1:76:3 | self in splatmid |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:70:5:70:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:71:5:71:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:72:5:72:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:73:5:73:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:74:5:74:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:75:5:75:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:1:78:63 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:10:78:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:21:78:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:32:78:40 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:43:78:51 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:78:54:78:62 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:9:80:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:20:80:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:31:80:39 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:80:42:80:50 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:81:1:81:37 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:81:10:81:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:81:28:81:36 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:83:1:91:3 | self (pos_many) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:83:1:91:3 | self in pos_many |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:84:5:84:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:85:5:85:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:86:5:86:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:87:5:87:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:88:5:88:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:89:5:89:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:90:5:90:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:9:93:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:20:93:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:31:93:39 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:93:42:93:50 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:1:94:48 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:10:94:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:21:94:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:94:39:94:47 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:1:96:88 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:10:96:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:21:96:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:34:96:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:45:96:53 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:56:96:64 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:68:96:76 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:96:79:96:87 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:98:1:103:3 | self (splatmidsmall) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:98:1:103:3 | self in splatmidsmall |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:99:5:99:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:100:5:100:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:101:5:101:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:102:5:102:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:1:105:49 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:15:105:23 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:28:105:36 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:105:39:105:47 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:1:106:46 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:15:106:23 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:26:106:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:106:37:106:45 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:108:1:112:3 | self (splat_followed_by_keyword_param) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:109:5:109:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:110:5:110:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:111:5:111:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:1:114:67 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:33:114:41 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:44:114:52 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:114:58:114:66 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:117:3:117:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:117:19:117:27 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:118:1:118:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:120:1:126:3 | self (destruct) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:120:1:126:3 | self in destruct |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:121:5:121:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:122:5:122:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:123:5:123:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:124:5:124:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:125:5:125:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:1:128:61 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:11:128:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:22:128:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:35:128:43 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:128:50:128:58 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:130:9:130:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:130:20:130:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:131:1:131:46 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:131:17:131:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:133:1:135:3 | self (splatall) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:133:1:135:3 | self in splatall |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:134:5:134:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:1:137:44 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:12:137:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:23:137:31 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:137:34:137:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:143:24:143:32 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:144:1:144:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:145:1:145:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:146:1:146:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:149:1:149:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:150:1:150:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:150:33:150:41 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:151:1:151:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:157:24:157:32 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:158:1:158:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:159:1:159:27 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:160:1:160:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:163:1:163:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:164:1:164:40 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:164:31:164:39 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:165:1:165:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:167:1:169:3 | self in splatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:171:17:171:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:172:1:172:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:173:1:173:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:174:1:174:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:177:1:177:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:178:1:178:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:178:21:178:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:179:1:179:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:181:1:183:3 | self in positionSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:185:14:185:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:186:1:186:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:187:1:187:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:188:1:188:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:191:1:191:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:192:1:192:33 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:192:24:192:32 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:193:1:193:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:196:10:196:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:200:1:205:3 | self (foo) |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:200:1:205:3 | self in foo |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:201:5:201:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:202:5:202:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:203:5:203:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:204:5:204:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self (params_flow.rb) | params_flow.rb:207:1:207:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:1:1:3:3 | self in taint |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:1:1:207:15 | self (params_flow.rb) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:1:1:207:15 | self in params_flow.rb |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:5:1:7:3 | self (sink) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:5:1:7:3 | self in sink |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:6:5:6:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:9:1:12:3 | self (positional) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:9:1:12:3 | self in positional |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:10:5:10:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:11:5:11:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:14:1:14:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:14:12:14:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:14:22:14:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:16:1:19:3 | self (keyword) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:16:1:19:3 | self in keyword |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:17:5:17:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:18:5:18:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:21:1:21:35 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:21:13:21:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:21:27:21:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:22:1:22:35 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:22:13:22:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:22:27:22:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:23:1:23:41 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:23:16:23:23 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:23:33:23:40 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:25:1:31:3 | self (kwargs) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:25:1:31:3 | self in kwargs |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:26:5:26:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:27:5:27:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:28:5:28:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:29:5:29:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:30:5:30:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:1:33:58 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:12:33:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:26:33:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:33:41:33:49 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:34:14:34:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:35:1:35:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:35:12:35:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:37:16:37:24 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:37:34:37:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:38:1:38:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:40:16:40:24 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:41:1:41:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:41:13:41:21 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:43:9:43:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:44:1:44:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:44:12:44:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:46:9:46:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:46:20:46:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:47:1:47:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:49:1:53:3 | self (posargs) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:49:1:53:3 | self in posargs |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:50:5:50:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:51:5:51:21 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:52:5:52:21 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:55:1:55:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:55:9:55:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:55:20:55:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:57:9:57:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:58:1:58:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:58:9:58:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:60:9:60:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:60:20:60:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:61:1:61:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:63:8:63:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:64:1:66:3 | self (splatstuff) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:64:1:66:3 | self in splatstuff |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:65:5:65:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:67:1:67:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:69:1:76:3 | self (splatmid) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:69:1:76:3 | self in splatmid |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:70:5:70:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:71:5:71:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:72:5:72:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:73:5:73:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:74:5:74:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:75:5:75:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:1:78:63 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:10:78:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:21:78:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:32:78:40 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:43:78:51 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:78:54:78:62 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:9:80:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:20:80:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:31:80:39 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:80:42:80:50 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:81:1:81:37 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:81:10:81:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:81:28:81:36 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:83:1:91:3 | self (pos_many) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:83:1:91:3 | self in pos_many |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:84:5:84:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:85:5:85:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:86:5:86:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:87:5:87:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:88:5:88:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:89:5:89:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:90:5:90:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:9:93:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:20:93:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:31:93:39 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:93:42:93:50 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:1:94:48 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:10:94:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:21:94:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:94:39:94:47 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:1:96:88 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:10:96:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:21:96:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:34:96:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:45:96:53 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:56:96:64 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:68:96:76 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:96:79:96:87 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:98:1:103:3 | self (splatmidsmall) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:98:1:103:3 | self in splatmidsmall |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:99:5:99:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:100:5:100:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:101:5:101:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:102:5:102:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:1:105:49 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:15:105:23 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:28:105:36 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:105:39:105:47 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:1:106:46 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:15:106:23 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:26:106:34 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:106:37:106:45 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:108:1:112:3 | self (splat_followed_by_keyword_param) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:108:1:112:3 | self in splat_followed_by_keyword_param |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:109:5:109:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:110:5:110:13 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:111:5:111:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:1:114:67 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:33:114:41 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:44:114:52 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:114:58:114:66 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:117:3:117:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:117:19:117:27 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:118:1:118:14 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:120:1:126:3 | self (destruct) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:120:1:126:3 | self in destruct |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:121:5:121:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:122:5:122:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:123:5:123:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:124:5:124:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:125:5:125:10 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:1:128:61 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:11:128:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:22:128:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:35:128:43 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:128:50:128:58 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:130:9:130:17 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:130:20:130:28 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:131:1:131:46 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:131:17:131:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:133:1:135:3 | self (splatall) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:133:1:135:3 | self in splatall |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:134:5:134:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:1:137:44 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:12:137:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:23:137:31 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:137:34:137:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:139:1:141:3 | self in hashSplatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:143:24:143:32 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:144:1:144:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:145:1:145:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:146:1:146:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:149:1:149:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:150:1:150:42 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:150:33:150:41 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:151:1:151:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:153:1:155:3 | self in keywordSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:157:24:157:32 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:158:1:158:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:159:1:159:27 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:160:1:160:20 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:163:1:163:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:164:1:164:40 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:164:31:164:39 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:165:1:165:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:167:1:169:3 | self in splatSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:171:17:171:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:172:1:172:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:173:1:173:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:174:1:174:19 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:177:1:177:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:178:1:178:30 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:178:21:178:29 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:179:1:179:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:181:1:183:3 | self in positionSideEffect |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:185:14:185:22 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:186:1:186:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:187:1:187:25 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:188:1:188:16 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:191:1:191:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:192:1:192:33 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:192:24:192:32 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:193:1:193:11 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:196:10:196:18 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:200:1:205:3 | self (foo) |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:200:1:205:3 | self in foo |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:201:5:201:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:202:5:202:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:203:5:203:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:204:5:204:15 | self |
|
||||
| params_flow.rb:1:1:207:15 | self in params_flow.rb | params_flow.rb:207:1:207:14 | self |
|
||||
| params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x |
|
||||
| params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x |
|
||||
| params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x |
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
track
|
||||
| type_tracker.rb:1:1:10:3 | self (Container) | type tracker without call steps | type_tracker.rb:1:1:10:3 | self (Container) |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type tracker with call steps | type_tracker.rb:18:1:21:3 | self in positional |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type tracker with call steps | type_tracker.rb:25:1:28:3 | self in keyword |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type tracker without call steps | type_tracker.rb:1:1:53:4 | self (type_tracker.rb) |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type tracker with call steps | type_tracker.rb:18:1:21:3 | self in positional |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type tracker with call steps | type_tracker.rb:25:1:28:3 | self in keyword |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type tracker without call steps | type_tracker.rb:1:1:53:4 | self in type_tracker.rb |
|
||||
| type_tracker.rb:2:5:5:7 | &block | type tracker without call steps | type_tracker.rb:2:5:5:7 | &block |
|
||||
| type_tracker.rb:2:5:5:7 | field= | type tracker without call steps | type_tracker.rb:2:5:5:7 | field= |
|
||||
| type_tracker.rb:2:5:5:7 | self in field= | type tracker with call steps | type_tracker.rb:7:5:9:7 | self in field |
|
||||
@@ -346,19 +346,20 @@ track
|
||||
| type_tracker.rb:52:5:52:13 | synthetic splat argument | type tracker without call steps | type_tracker.rb:52:5:52:13 | synthetic splat argument |
|
||||
trackEnd
|
||||
| type_tracker.rb:1:1:10:3 | self (Container) | type_tracker.rb:1:1:10:3 | self (Container) |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:1:1:53:4 | self (type_tracker.rb) |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:18:1:21:3 | self (positional) |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:18:1:21:3 | self in positional |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:19:5:19:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:20:5:20:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:23:1:23:16 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:25:1:28:3 | self (keyword) |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:25:1:28:3 | self in keyword |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:26:5:26:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:27:5:27:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:30:1:30:21 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:31:1:31:21 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self (type_tracker.rb) | type_tracker.rb:32:1:32:27 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:1:1:53:4 | self (type_tracker.rb) |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:1:1:53:4 | self in type_tracker.rb |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:18:1:21:3 | self (positional) |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:18:1:21:3 | self in positional |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:19:5:19:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:20:5:20:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:23:1:23:16 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:25:1:28:3 | self (keyword) |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:25:1:28:3 | self in keyword |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:26:5:26:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:27:5:27:11 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:30:1:30:21 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:31:1:31:21 | self |
|
||||
| type_tracker.rb:1:1:53:4 | self in type_tracker.rb | type_tracker.rb:32:1:32:27 | self |
|
||||
| type_tracker.rb:2:5:5:7 | &block | type_tracker.rb:2:5:5:7 | &block |
|
||||
| type_tracker.rb:2:5:5:7 | field= | type_tracker.rb:2:5:5:7 | field= |
|
||||
| type_tracker.rb:2:5:5:7 | self in field= | type_tracker.rb:2:5:5:7 | self (field=) |
|
||||
|
||||
Reference in New Issue
Block a user