mirror of
https://github.com/github/codeql.git
synced 2026-04-29 18:55:14 +02:00
Merge branch 'main' into jcogs33/mad-metrics-query
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
## 0.4.5
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 0.4.4
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
4
ruby/ql/lib/change-notes/2022-11-28-subclass-calls.md
Normal file
4
ruby/ql/lib/change-notes/2022-11-28-subclass-calls.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* When resolving a method call, the analysis now also searches in sub-classes of the receiver's type.
|
||||
4
ruby/ql/lib/change-notes/2022-11-30-actionmailbox.md
Normal file
4
ruby/ql/lib/change-notes/2022-11-30-actionmailbox.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Calls to `mail` and `inbound_mail` in `ActionMailbox` controllers are now considered sources of remote input.
|
||||
3
ruby/ql/lib/change-notes/released/0.4.5.md
Normal file
3
ruby/ql/lib/change-notes/released/0.4.5.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 0.4.5
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.4.4
|
||||
lastReleaseVersion: 0.4.5
|
||||
|
||||
@@ -7,6 +7,7 @@ private import codeql.ruby.frameworks.ActionCable
|
||||
private import codeql.ruby.frameworks.ActionController
|
||||
private import codeql.ruby.frameworks.ActiveJob
|
||||
private import codeql.ruby.frameworks.ActionMailer
|
||||
private import codeql.ruby.frameworks.ActionMailbox
|
||||
private import codeql.ruby.frameworks.ActiveRecord
|
||||
private import codeql.ruby.frameworks.ActiveResource
|
||||
private import codeql.ruby.frameworks.ActiveStorage
|
||||
|
||||
@@ -165,7 +165,7 @@ private module Cached {
|
||||
*/
|
||||
cached
|
||||
Method lookupMethodInSubClasses(Module m, string name) {
|
||||
exists(Module sub | sub.getSuperClass() = m |
|
||||
exists(Module sub | sub.getAnImmediateAncestor() = m |
|
||||
TMethod(result) = lookupMethodOrConst0(sub, name) or
|
||||
result = lookupMethodInSubClasses(sub, name)
|
||||
)
|
||||
|
||||
@@ -4,7 +4,9 @@ import codeql.ruby.AST
|
||||
import codeql.ruby.DataFlow
|
||||
private import internal.FlowSummaryImpl as Impl
|
||||
private import internal.DataFlowDispatch
|
||||
private import internal.DataFlowImplCommon as DataFlowImplCommon
|
||||
private import internal.DataFlowPrivate
|
||||
private import internal.FlowSummaryImplSpecific
|
||||
|
||||
// import all instances below
|
||||
private module Summaries {
|
||||
@@ -127,6 +129,17 @@ abstract class SummarizedCallable extends LibraryCallable, Impl::Public::Summari
|
||||
*/
|
||||
pragma[nomagic]
|
||||
predicate propagatesFlowExt(string input, string output, boolean preservesValue) { none() }
|
||||
|
||||
/**
|
||||
* Gets the synthesized parameter that results from an input specification
|
||||
* that starts with `Argument[s]` for this library callable.
|
||||
*/
|
||||
DataFlow::ParameterNode getParameter(string s) {
|
||||
exists(ParameterPosition pos |
|
||||
DataFlowImplCommon::parameterNode(result, TLibraryCallable(this), pos) and
|
||||
s = getParameterPositionCsv(pos)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -190,13 +190,10 @@ private Block yieldCall(RelevantCall call) {
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate superCall(RelevantCall call, Module superClass, string method) {
|
||||
private predicate superCall(RelevantCall call, Module cls, string method) {
|
||||
call.getExpr() instanceof SuperCall and
|
||||
exists(Module tp |
|
||||
tp = call.getExpr().getEnclosingModule().getModule() and
|
||||
superClass = tp.getSuperClass() and
|
||||
method = call.getExpr().getEnclosingMethod().getName()
|
||||
)
|
||||
cls = call.getExpr().getEnclosingModule().getModule() and
|
||||
method = call.getExpr().getEnclosingMethod().getName()
|
||||
}
|
||||
|
||||
/** Holds if `self` belongs to module `m`. */
|
||||
@@ -240,10 +237,10 @@ private predicate selfInToplevel(SelfVariable self, Module m) {
|
||||
*
|
||||
* the SSA definition for `c` is introduced by matching on `C`.
|
||||
*/
|
||||
private predicate asModulePattern(SsaDefinitionNode def, Module m) {
|
||||
private predicate asModulePattern(SsaDefinitionExtNode def, Module m) {
|
||||
exists(AsPattern ap |
|
||||
m = resolveConstantReadAccess(ap.getPattern()) and
|
||||
def.getDefinition().(Ssa::WriteDefinition).getWriteAccess() = ap.getVariableAccess()
|
||||
def.getDefinitionExt().(Ssa::WriteDefinition).getWriteAccess() = ap.getVariableAccess()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -464,9 +461,9 @@ private module Cached {
|
||||
)
|
||||
)
|
||||
or
|
||||
exists(Module superClass, string method |
|
||||
superCall(call, superClass, method) and
|
||||
result = lookupMethod(superClass, method)
|
||||
exists(Module cls, string method |
|
||||
superCall(call, cls, method) and
|
||||
result = lookupMethod(cls.getAnImmediateAncestor(), method)
|
||||
)
|
||||
or
|
||||
result = yieldCall(call)
|
||||
@@ -985,15 +982,15 @@ private DataFlow::Node trackSingletonMethodOnInstance(MethodBase method, string
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private predicate argMustFlowToReceiver(
|
||||
RelevantCall ctx, DataFlow::LocalSourceNode source, ArgumentNode arg, SsaDefinitionNode paramDef,
|
||||
RelevantCall call, Callable encl, string name
|
||||
RelevantCall ctx, DataFlow::LocalSourceNode source, ArgumentNode arg,
|
||||
SsaDefinitionExtNode paramDef, RelevantCall call, Callable encl, string name
|
||||
) {
|
||||
exists(ParameterNodeImpl p, ParameterPosition ppos, ArgumentPosition apos |
|
||||
// the receiver of `call` references `p`
|
||||
exists(DataFlow::Node receiver |
|
||||
LocalFlow::localFlowSsaParamInput(p, paramDef) and
|
||||
methodCall(pragma[only_bind_into](call), receiver, pragma[only_bind_into](name)) and
|
||||
receiver.asExpr() = paramDef.getDefinition().getARead()
|
||||
receiver.asExpr() = paramDef.getDefinitionExt().(Ssa::Definition).getARead()
|
||||
) and
|
||||
// `p` is a parameter of `encl`,
|
||||
encl = call.getScope() and
|
||||
|
||||
@@ -75,16 +75,26 @@ CfgNodes::ExprCfgNode getAPostUpdateNodeForArg(Argument arg) {
|
||||
module LocalFlow {
|
||||
private import codeql.ruby.dataflow.internal.SsaImpl
|
||||
|
||||
/** An SSA definition into which another SSA definition may flow. */
|
||||
private class SsaInputDefinitionExtNode extends SsaDefinitionExtNode {
|
||||
SsaInputDefinitionExtNode() {
|
||||
def instanceof Ssa::PhiNode
|
||||
or
|
||||
def instanceof SsaImpl::PhiReadNode
|
||||
//TODO: or def instanceof LocalFlow::UncertainExplicitSsaDefinition
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `nodeFrom` is a node for SSA definition `def`, which can reach `next`.
|
||||
*/
|
||||
private predicate localFlowSsaInputFromDef(
|
||||
SsaDefinitionNode nodeFrom, Ssa::Definition def, Ssa::Definition next
|
||||
SsaDefinitionExtNode nodeFrom, SsaImpl::DefinitionExt def, SsaInputDefinitionExtNode next
|
||||
) {
|
||||
exists(BasicBlock bb, int i |
|
||||
lastRefBeforeRedef(def, bb, i, next) and
|
||||
def = nodeFrom.getDefinition() and
|
||||
def.definesAt(_, bb, i)
|
||||
lastRefBeforeRedefExt(def, bb, i, next.getDefinitionExt()) and
|
||||
def = nodeFrom.getDefinitionExt() and
|
||||
def.definesAt(_, bb, i, _)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -92,27 +102,27 @@ module LocalFlow {
|
||||
* Holds if `exprFrom` is a last read of SSA definition `def`, which
|
||||
* can reach `next`.
|
||||
*/
|
||||
predicate localFlowSsaInputFromExpr(
|
||||
CfgNodes::ExprCfgNode exprFrom, Ssa::Definition def, Ssa::Definition next
|
||||
predicate localFlowSsaInputFromRead(
|
||||
CfgNodes::ExprCfgNode exprFrom, SsaImpl::DefinitionExt def, SsaInputDefinitionExtNode next
|
||||
) {
|
||||
exists(BasicBlock bb, int i |
|
||||
lastRefBeforeRedef(def, bb, i, next) and
|
||||
SsaImpl::lastRefBeforeRedefExt(def, bb, i, next.getDefinitionExt()) and
|
||||
exprFrom = bb.getNode(i) and
|
||||
exprFrom.getExpr() instanceof VariableReadAccess
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the SSA definition node corresponding to parameter `p`. */
|
||||
SsaDefinitionNode getParameterDefNode(NamedParameter p) {
|
||||
SsaDefinitionExtNode getParameterDefNode(NamedParameter p) {
|
||||
exists(BasicBlock bb, int i |
|
||||
bb.getNode(i).getNode() = p.getDefiningAccess() and
|
||||
result.getDefinition().definesAt(_, bb, i)
|
||||
result.getDefinitionExt().definesAt(_, bb, i, _)
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the SSA definition node corresponding to the implicit `self` parameter for `m`. */
|
||||
private SsaDefinitionNode getSelfParameterDefNode(MethodBase m) {
|
||||
result.getDefinition().(Ssa::SelfDefinition).getSourceVariable().getDeclaringScope() = m
|
||||
private SsaDefinitionExtNode getSelfParameterDefNode(MethodBase m) {
|
||||
result.getDefinitionExt().(Ssa::SelfDefinition).getSourceVariable().getDeclaringScope() = m
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,7 +146,7 @@ module LocalFlow {
|
||||
or
|
||||
nodeFrom.(SelfParameterNode).getSelfVariable() = def.getSourceVariable()
|
||||
|
|
||||
nodeTo.(SsaDefinitionNode).getDefinition() = def
|
||||
nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = def
|
||||
)
|
||||
}
|
||||
|
||||
@@ -144,8 +154,8 @@ module LocalFlow {
|
||||
* Holds if there is a local use-use flow step from `nodeFrom` to `nodeTo`
|
||||
* involving SSA definition `def`.
|
||||
*/
|
||||
predicate localSsaFlowStepUseUse(Ssa::Definition def, Node nodeFrom, Node nodeTo) {
|
||||
def.hasAdjacentReads(nodeFrom.asExpr(), nodeTo.asExpr())
|
||||
predicate localSsaFlowStepUseUse(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
|
||||
SsaImpl::adjacentReadPairExt(def, nodeFrom.asExpr(), nodeTo.asExpr())
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -153,24 +163,20 @@ module LocalFlow {
|
||||
* SSA definition `def`.
|
||||
*/
|
||||
private predicate localSsaFlowStep(Node nodeFrom, Node nodeTo) {
|
||||
exists(Ssa::Definition def |
|
||||
exists(SsaImpl::DefinitionExt def |
|
||||
// Flow from assignment into SSA definition
|
||||
def.(Ssa::WriteDefinition).assigns(nodeFrom.asExpr()) and
|
||||
nodeTo.(SsaDefinitionNode).getDefinition() = def
|
||||
nodeTo.(SsaDefinitionExtNode).getDefinitionExt() = def
|
||||
or
|
||||
// Flow from SSA definition to first read
|
||||
def = nodeFrom.(SsaDefinitionNode).getDefinition() and
|
||||
nodeTo.asExpr() = def.getAFirstRead()
|
||||
def = nodeFrom.(SsaDefinitionExtNode).getDefinitionExt() and
|
||||
firstReadExt(def, nodeTo.asExpr())
|
||||
or
|
||||
// Flow from read to next read
|
||||
localSsaFlowStepUseUse(def, nodeFrom.(PostUpdateNode).getPreUpdateNode(), nodeTo)
|
||||
or
|
||||
// Flow into phi node from definition
|
||||
exists(Ssa::PhiNode phi |
|
||||
localFlowSsaInputFromDef(nodeFrom, def, phi) and
|
||||
phi = nodeTo.(SsaDefinitionNode).getDefinition() and
|
||||
def = phi.getAnInput()
|
||||
)
|
||||
// Flow into phi (read) SSA definition node from def
|
||||
localFlowSsaInputFromDef(nodeFrom, def, nodeTo)
|
||||
)
|
||||
// TODO
|
||||
// or
|
||||
@@ -287,7 +293,7 @@ private module Cached {
|
||||
ret.getKind() = kind
|
||||
)
|
||||
} or
|
||||
TSsaDefinitionNode(Ssa::Definition def) or
|
||||
TSsaDefinitionExtNode(SsaImpl::DefinitionExt def) or
|
||||
TNormalParameterNode(Parameter p) {
|
||||
p instanceof SimpleParameter or
|
||||
p instanceof OptionalParameter or
|
||||
@@ -334,6 +340,12 @@ private module Cached {
|
||||
p.(KeywordParameter).getDefaultValue() = e.getExprNode().getExpr()
|
||||
}
|
||||
|
||||
cached
|
||||
Location getLocation(NodeImpl n) { result = n.getLocationImpl() }
|
||||
|
||||
cached
|
||||
string toString(NodeImpl n) { result = n.toStringImpl() }
|
||||
|
||||
/**
|
||||
* This is the local flow predicate that is used as a building block in global
|
||||
* data flow.
|
||||
@@ -352,10 +364,8 @@ private module Cached {
|
||||
not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _)
|
||||
or
|
||||
// Flow into phi node from read
|
||||
exists(Ssa::Definition def, Ssa::PhiNode phi, CfgNodes::ExprCfgNode exprFrom |
|
||||
LocalFlow::localFlowSsaInputFromExpr(exprFrom, def, phi) and
|
||||
phi = nodeTo.(SsaDefinitionNode).getDefinition() and
|
||||
def = phi.getAnInput()
|
||||
exists(SsaImpl::DefinitionExt def, CfgNodes::ExprCfgNode exprFrom |
|
||||
LocalFlow::localFlowSsaInputFromRead(exprFrom, def, nodeTo)
|
||||
|
|
||||
exprFrom = nodeFrom.asExpr() and
|
||||
not FlowSummaryImpl::Private::Steps::prohibitsUseUseFlow(nodeFrom, _)
|
||||
@@ -400,18 +410,16 @@ private module Cached {
|
||||
LocalFlow::localSsaFlowStepUseUse(_, nodeFrom, nodeTo)
|
||||
or
|
||||
// Flow into phi node from read
|
||||
exists(Ssa::Definition def, Ssa::PhiNode phi, CfgNodes::ExprCfgNode exprFrom |
|
||||
LocalFlow::localFlowSsaInputFromExpr(exprFrom, def, phi) and
|
||||
phi = nodeTo.(SsaDefinitionNode).getDefinition() and
|
||||
def = phi.getAnInput() and
|
||||
exists(SsaImpl::DefinitionExt def, CfgNodes::ExprCfgNode exprFrom |
|
||||
LocalFlow::localFlowSsaInputFromRead(exprFrom, def, nodeTo) and
|
||||
exprFrom = [nodeFrom.asExpr(), nodeFrom.(PostUpdateNode).getPreUpdateNode().asExpr()]
|
||||
)
|
||||
}
|
||||
|
||||
private predicate entrySsaDefinition(SsaDefinitionNode n) {
|
||||
private predicate entrySsaDefinition(SsaDefinitionExtNode n) {
|
||||
n = LocalFlow::getParameterDefNode(_)
|
||||
or
|
||||
exists(Ssa::Definition def | def = n.getDefinition() |
|
||||
exists(SsaImpl::DefinitionExt def | def = n.getDefinitionExt() |
|
||||
def instanceof Ssa::SelfDefinition
|
||||
or
|
||||
def instanceof Ssa::CapturedEntryDefinition
|
||||
@@ -520,8 +528,9 @@ import Cached
|
||||
|
||||
/** Holds if `n` should be hidden from path explanations. */
|
||||
predicate nodeIsHidden(Node n) {
|
||||
exists(Ssa::Definition def | def = n.(SsaDefinitionNode).getDefinition() |
|
||||
exists(SsaImpl::DefinitionExt def | def = n.(SsaDefinitionExtNode).getDefinitionExt() |
|
||||
def instanceof Ssa::PhiNode or
|
||||
def instanceof SsaImpl::PhiReadNode or
|
||||
def instanceof Ssa::CapturedEntryDefinition or
|
||||
def instanceof Ssa::CapturedCallDefinition
|
||||
)
|
||||
@@ -542,13 +551,13 @@ predicate nodeIsHidden(Node n) {
|
||||
}
|
||||
|
||||
/** An SSA definition, viewed as a node in a data flow graph. */
|
||||
class SsaDefinitionNode extends NodeImpl, TSsaDefinitionNode {
|
||||
Ssa::Definition def;
|
||||
class SsaDefinitionExtNode extends NodeImpl, TSsaDefinitionExtNode {
|
||||
SsaImpl::DefinitionExt def;
|
||||
|
||||
SsaDefinitionNode() { this = TSsaDefinitionNode(def) }
|
||||
SsaDefinitionExtNode() { this = TSsaDefinitionExtNode(def) }
|
||||
|
||||
/** Gets the underlying SSA definition. */
|
||||
Ssa::Definition getDefinition() { result = def }
|
||||
SsaImpl::DefinitionExt getDefinitionExt() { result = def }
|
||||
|
||||
/** Gets the underlying variable. */
|
||||
Variable getVariable() { result = def.getSourceVariable() }
|
||||
@@ -561,7 +570,7 @@ class SsaDefinitionNode extends NodeImpl, TSsaDefinitionNode {
|
||||
}
|
||||
|
||||
/** An SSA definition for a `self` variable. */
|
||||
class SsaSelfDefinitionNode extends LocalSourceNode, SsaDefinitionNode {
|
||||
class SsaSelfDefinitionNode extends LocalSourceNode, SsaDefinitionExtNode {
|
||||
private SelfVariable self;
|
||||
|
||||
SsaSelfDefinitionNode() { self = def.getSourceVariable() }
|
||||
@@ -1078,11 +1087,11 @@ private module OutNodes {
|
||||
import OutNodes
|
||||
|
||||
predicate jumpStep(Node pred, Node succ) {
|
||||
SsaImpl::captureFlowIn(_, pred.(SsaDefinitionNode).getDefinition(),
|
||||
succ.(SsaDefinitionNode).getDefinition())
|
||||
SsaImpl::captureFlowIn(_, pred.(SsaDefinitionExtNode).getDefinitionExt(),
|
||||
succ.(SsaDefinitionExtNode).getDefinitionExt())
|
||||
or
|
||||
SsaImpl::captureFlowOut(_, pred.(SsaDefinitionNode).getDefinition(),
|
||||
succ.(SsaDefinitionNode).getDefinition())
|
||||
SsaImpl::captureFlowOut(_, pred.(SsaDefinitionExtNode).getDefinitionExt(),
|
||||
succ.(SsaDefinitionExtNode).getDefinitionExt())
|
||||
or
|
||||
succ.asExpr().getExpr().(ConstantReadAccess).getValue() = pred.asExpr().getExpr()
|
||||
or
|
||||
|
||||
@@ -19,12 +19,10 @@ class Node extends TNode {
|
||||
Parameter asParameter() { result = this.(ParameterNode).getParameter() }
|
||||
|
||||
/** Gets a textual representation of this node. */
|
||||
cached
|
||||
final string toString() { result = this.(NodeImpl).toStringImpl() }
|
||||
final string toString() { result = toString(this) }
|
||||
|
||||
/** Gets the location of this node. */
|
||||
cached
|
||||
final Location getLocation() { result = this.(NodeImpl).getLocationImpl() }
|
||||
final Location getLocation() { result = getLocation(this) }
|
||||
|
||||
/**
|
||||
* Holds if this element is at the specified location.
|
||||
@@ -373,7 +371,7 @@ private module Cached {
|
||||
LocalSourceNode getConstantAccessNode(ConstantAccess access) {
|
||||
// Namespaces don't evaluate to the constant being accessed, they return the value of their last statement.
|
||||
// Use the definition of 'self' in the namespace as the representative in this case.
|
||||
result.(SsaDefinitionNode).getDefinition().(Ssa::SelfDefinition).getSourceVariable() =
|
||||
result.(SsaDefinitionExtNode).getDefinitionExt().(Ssa::SelfDefinition).getSourceVariable() =
|
||||
access.(Namespace).getModuleSelfVariable()
|
||||
or
|
||||
not access instanceof Namespace and
|
||||
@@ -819,7 +817,7 @@ class ModuleNode instanceof Module {
|
||||
* This only gets `self` at the module level, not inside any (singleton) method.
|
||||
*/
|
||||
LocalSourceNode getModuleLevelSelf() {
|
||||
result.(SsaDefinitionNode).getVariable() = super.getADeclaration().getModuleSelfVariable()
|
||||
result.(SsaDefinitionExtNode).getVariable() = super.getADeclaration().getModuleSelfVariable()
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -252,14 +252,14 @@ module Public {
|
||||
predicate hasProvenance(boolean generated) { summaryElement(this, _, _, _, generated) }
|
||||
}
|
||||
|
||||
/** A callable with a flow summary stating there is no flow via the callable. */
|
||||
class NegativeSummarizedCallable extends SummarizedCallableBase {
|
||||
NegativeSummarizedCallable() { negativeSummaryElement(this, _) }
|
||||
/** A callable where there is no flow via the callable. */
|
||||
class NeutralCallable extends SummarizedCallableBase {
|
||||
NeutralCallable() { neutralElement(this, _) }
|
||||
|
||||
/**
|
||||
* Holds if the negative summary is auto generated.
|
||||
* Holds if the neutral is auto generated.
|
||||
*/
|
||||
predicate isAutoGenerated() { negativeSummaryElement(this, true) }
|
||||
predicate isAutoGenerated() { neutralElement(this, true) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1167,9 +1167,9 @@ module Private {
|
||||
string toString() { result = super.toString() }
|
||||
}
|
||||
|
||||
/** A flow summary to include in the `negativeSummary/1` query predicate. */
|
||||
abstract class RelevantNegativeSummarizedCallable instanceof NegativeSummarizedCallable {
|
||||
/** Gets the string representation of this callable used by `summary/1`. */
|
||||
/** A model to include in the `neutral/1` query predicate. */
|
||||
abstract class RelevantNeutralCallable instanceof NeutralCallable {
|
||||
/** Gets the string representation of this callable used by `neutral/1`. */
|
||||
abstract string getCallableCsv();
|
||||
|
||||
string toString() { result = super.toString() }
|
||||
@@ -1186,13 +1186,13 @@ module Private {
|
||||
if c.isAutoGenerated() then result = "generated" else result = "manual"
|
||||
}
|
||||
|
||||
private string renderProvenanceNegative(NegativeSummarizedCallable c) {
|
||||
private string renderProvenanceNeutral(NeutralCallable c) {
|
||||
if c.isAutoGenerated() then result = "generated" else result = "manual"
|
||||
}
|
||||
|
||||
/**
|
||||
* A query predicate for outputting flow summaries in semi-colon separated format in QL tests.
|
||||
* The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind;provenance"",
|
||||
* The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind;provenance",
|
||||
* ext is hardcoded to empty.
|
||||
*/
|
||||
query predicate summary(string csv) {
|
||||
@@ -1211,14 +1211,14 @@ module Private {
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if a negative flow summary `csv` exists (semi-colon separated format). Used for testing purposes.
|
||||
* Holds if a neutral model `csv` exists (semi-colon separated format). Used for testing purposes.
|
||||
* The syntax is: "namespace;type;name;signature;provenance"",
|
||||
*/
|
||||
query predicate negativeSummary(string csv) {
|
||||
exists(RelevantNegativeSummarizedCallable c |
|
||||
query predicate neutral(string csv) {
|
||||
exists(RelevantNeutralCallable c |
|
||||
csv =
|
||||
c.getCallableCsv() // Callable information
|
||||
+ renderProvenanceNegative(c) // provenance
|
||||
+ renderProvenanceNeutral(c) // provenance
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,11 +63,11 @@ predicate summaryElement(
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if a negative flow summary exists for `c`, which means that there is no
|
||||
* flow through `c`. The flag `generated` states whether the summary is autogenerated.
|
||||
* Note. Negative flow summaries has not been implemented for ruby.
|
||||
* Holds if a neutral model exists for `c`, which means that there is no
|
||||
* flow through `c`. The flag `generated` states whether the neutral model is autogenerated.
|
||||
* Note. Neutral models have not been implemented for ruby.
|
||||
*/
|
||||
predicate negativeSummaryElement(FlowSummary::SummarizedCallable c, boolean generated) { none() }
|
||||
predicate neutralElement(FlowSummary::SummarizedCallable c, boolean generated) { none() }
|
||||
|
||||
bindingset[arg]
|
||||
private SummaryComponent interpretElementArg(string arg) {
|
||||
@@ -145,19 +145,32 @@ string getComponentSpecificCsv(SummaryComponent sc) { none() }
|
||||
|
||||
/** Gets the textual representation of a parameter position in the format used for flow summaries. */
|
||||
string getParameterPositionCsv(ParameterPosition pos) {
|
||||
pos.isSelf() and result = "self"
|
||||
or
|
||||
pos.isBlock() and result = "block"
|
||||
or
|
||||
exists(int i |
|
||||
pos.isPositional(i) and
|
||||
result = i.toString()
|
||||
)
|
||||
or
|
||||
exists(int i |
|
||||
pos.isPositionalLowerBound(i) and
|
||||
result = i + ".."
|
||||
)
|
||||
or
|
||||
exists(string name |
|
||||
pos.isKeyword(name) and
|
||||
result = name + ":"
|
||||
)
|
||||
or
|
||||
pos.isSelf() and
|
||||
result = "self"
|
||||
or
|
||||
pos.isBlock() and
|
||||
result = "block"
|
||||
or
|
||||
pos.isAny() and
|
||||
result = "any"
|
||||
or
|
||||
pos.isAnyNamed() and
|
||||
result = "any-named"
|
||||
}
|
||||
|
||||
/** Gets the textual representation of an argument position in the format used for flow summaries. */
|
||||
|
||||
@@ -225,6 +225,15 @@ private predicate adjacentDefRead(
|
||||
v = def.getSourceVariable()
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
private predicate adjacentDefReadExt(
|
||||
DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2,
|
||||
SsaInput::SourceVariable v
|
||||
) {
|
||||
Impl::adjacentDefReadExt(def, _, bb1, i1, bb2, i2) and
|
||||
v = def.getSourceVariable()
|
||||
}
|
||||
|
||||
private predicate adjacentDefReachesRead(
|
||||
Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2
|
||||
) {
|
||||
@@ -241,6 +250,22 @@ private predicate adjacentDefReachesRead(
|
||||
)
|
||||
}
|
||||
|
||||
private predicate adjacentDefReachesReadExt(
|
||||
DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2
|
||||
) {
|
||||
exists(SsaInput::SourceVariable v | adjacentDefReadExt(def, bb1, i1, bb2, i2, v) |
|
||||
def.definesAt(v, bb1, i1, _)
|
||||
or
|
||||
SsaInput::variableRead(bb1, i1, v, true)
|
||||
)
|
||||
or
|
||||
exists(SsaInput::BasicBlock bb3, int i3 |
|
||||
adjacentDefReachesReadExt(def, bb1, i1, bb3, i3) and
|
||||
SsaInput::variableRead(bb3, i3, _, false) and
|
||||
Impl::adjacentDefReadExt(def, _, bb3, i3, bb2, i2)
|
||||
)
|
||||
}
|
||||
|
||||
/** Same as `adjacentDefRead`, but skips uncertain reads. */
|
||||
pragma[nomagic]
|
||||
private predicate adjacentDefSkipUncertainReads(
|
||||
@@ -250,22 +275,31 @@ private predicate adjacentDefSkipUncertainReads(
|
||||
SsaInput::variableRead(bb2, i2, _, true)
|
||||
}
|
||||
|
||||
private predicate adjacentDefReachesUncertainRead(
|
||||
Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2
|
||||
/** Same as `adjacentDefReadExt`, but skips uncertain reads. */
|
||||
pragma[nomagic]
|
||||
private predicate adjacentDefSkipUncertainReadsExt(
|
||||
DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2
|
||||
) {
|
||||
adjacentDefReachesRead(def, bb1, i1, bb2, i2) and
|
||||
adjacentDefReachesReadExt(def, bb1, i1, bb2, i2) and
|
||||
SsaInput::variableRead(bb2, i2, _, true)
|
||||
}
|
||||
|
||||
private predicate adjacentDefReachesUncertainReadExt(
|
||||
DefinitionExt def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2
|
||||
) {
|
||||
adjacentDefReachesReadExt(def, bb1, i1, bb2, i2) and
|
||||
SsaInput::variableRead(bb2, i2, _, false)
|
||||
}
|
||||
|
||||
/** Same as `lastRefRedef`, but skips uncertain reads. */
|
||||
pragma[nomagic]
|
||||
private predicate lastRefSkipUncertainReads(Definition def, SsaInput::BasicBlock bb, int i) {
|
||||
private predicate lastRefSkipUncertainReadsExt(DefinitionExt def, SsaInput::BasicBlock bb, int i) {
|
||||
Impl::lastRef(def, bb, i) and
|
||||
not SsaInput::variableRead(bb, i, def.getSourceVariable(), false)
|
||||
or
|
||||
exists(SsaInput::BasicBlock bb0, int i0 |
|
||||
Impl::lastRef(def, bb0, i0) and
|
||||
adjacentDefReachesUncertainRead(def, bb, i, bb0, i0)
|
||||
adjacentDefReachesUncertainReadExt(def, bb, i, bb0, i0)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -436,6 +470,19 @@ private module Cached {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the value defined at SSA definition `def` can reach a read at `read`,
|
||||
* without passing through any other non-pseudo read.
|
||||
*/
|
||||
cached
|
||||
predicate firstReadExt(DefinitionExt def, VariableReadAccessCfgNode read) {
|
||||
exists(Cfg::BasicBlock bb1, int i1, Cfg::BasicBlock bb2, int i2 |
|
||||
def.definesAt(_, bb1, i1, _) and
|
||||
adjacentDefSkipUncertainReadsExt(def, bb1, i1, bb2, i2) and
|
||||
read = bb2.getNode(i2)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the read at `read2` is a read of the same SSA definition `def`
|
||||
* as the read at `read1`, and `read2` can be reached from `read1` without
|
||||
@@ -453,6 +500,23 @@ private module Cached {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the read at `read2` is a read of the same SSA definition `def`
|
||||
* as the read at `read1`, and `read2` can be reached from `read1` without
|
||||
* passing through another non-pseudo read.
|
||||
*/
|
||||
cached
|
||||
predicate adjacentReadPairExt(
|
||||
DefinitionExt def, VariableReadAccessCfgNode read1, VariableReadAccessCfgNode read2
|
||||
) {
|
||||
exists(Cfg::BasicBlock bb1, int i1, Cfg::BasicBlock bb2, int i2 |
|
||||
read1 = bb1.getNode(i1) and
|
||||
variableReadActual(bb1, i1, _) and
|
||||
adjacentDefSkipUncertainReadsExt(def, bb1, i1, bb2, i2) and
|
||||
read2 = bb2.getNode(i2)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the read of `def` at `read` may be a last read. That is, `read`
|
||||
* can either reach another definition of the underlying source variable or
|
||||
@@ -461,7 +525,7 @@ private module Cached {
|
||||
cached
|
||||
predicate lastRead(Definition def, VariableReadAccessCfgNode read) {
|
||||
exists(Cfg::BasicBlock bb, int i |
|
||||
lastRefSkipUncertainReads(def, bb, i) and
|
||||
lastRefSkipUncertainReadsExt(def, bb, i) and
|
||||
variableReadActual(bb, i, _) and
|
||||
read = bb.getNode(i)
|
||||
)
|
||||
@@ -475,13 +539,15 @@ private module Cached {
|
||||
* The reference is either a read of `def` or `def` itself.
|
||||
*/
|
||||
cached
|
||||
predicate lastRefBeforeRedef(Definition def, Cfg::BasicBlock bb, int i, Definition next) {
|
||||
Impl::lastRefRedef(def, bb, i, next) and
|
||||
not SsaInput::variableRead(bb, i, def.getSourceVariable(), false)
|
||||
predicate lastRefBeforeRedefExt(DefinitionExt def, Cfg::BasicBlock bb, int i, DefinitionExt next) {
|
||||
exists(LocalVariable v |
|
||||
Impl::lastRefRedefExt(def, v, bb, i, next) and
|
||||
not SsaInput::variableRead(bb, i, v, false)
|
||||
)
|
||||
or
|
||||
exists(SsaInput::BasicBlock bb0, int i0 |
|
||||
Impl::lastRefRedef(def, bb0, i0, next) and
|
||||
adjacentDefReachesUncertainRead(def, bb, i, bb0, i0)
|
||||
Impl::lastRefRedefExt(def, _, bb0, i0, next) and
|
||||
adjacentDefReachesUncertainReadExt(def, bb, i, bb0, i0)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ private import TaintTrackingPublic
|
||||
private import codeql.ruby.CFG
|
||||
private import codeql.ruby.DataFlow
|
||||
private import FlowSummaryImpl as FlowSummaryImpl
|
||||
private import codeql.ruby.dataflow.SSA
|
||||
|
||||
/**
|
||||
* Holds if `node` should be a sanitizer in all global taint flow configurations
|
||||
@@ -77,7 +78,7 @@ private module Cached {
|
||||
exists(CfgNodes::ExprNodes::CaseExprCfgNode case, CfgNodes::ExprNodes::InClauseCfgNode clause |
|
||||
nodeFrom.asExpr() = case.getValue() and
|
||||
clause = case.getBranch(_) and
|
||||
nodeTo.(SsaDefinitionNode).getDefinition().getControlFlowNode() =
|
||||
nodeTo.(SsaDefinitionExtNode).getDefinitionExt().(Ssa::Definition).getControlFlowNode() =
|
||||
variablesInPattern(clause.getPattern())
|
||||
)
|
||||
or
|
||||
|
||||
54
ruby/ql/lib/codeql/ruby/frameworks/ActionMailbox.qll
Normal file
54
ruby/ql/lib/codeql/ruby/frameworks/ActionMailbox.qll
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Models the `ActionMailbox` library, which is part of Rails.
|
||||
* Version: 7.0.4.
|
||||
*/
|
||||
|
||||
private import codeql.ruby.AST
|
||||
private import codeql.ruby.Concepts
|
||||
private import codeql.ruby.DataFlow
|
||||
private import codeql.ruby.dataflow.RemoteFlowSources
|
||||
|
||||
/**
|
||||
* Models the `ActionMailbox` library, which is part of Rails.
|
||||
* Version: 7.0.4.
|
||||
*/
|
||||
module ActionMailbox {
|
||||
private DataFlow::ClassNode controller() {
|
||||
result = DataFlow::getConstant("ActionMailbox").getConstant("Base").getADescendentModule()
|
||||
}
|
||||
|
||||
/**
|
||||
* A call to `mail` on the return value of
|
||||
* `ActionMailbox::Base#inbound_email`, or a direct call to
|
||||
* `ActionMailbox::Base#mail`, which is equivalent. The returned object
|
||||
* contains data from the incoming email.
|
||||
*/
|
||||
class Mail extends DataFlow::CallNode {
|
||||
Mail() {
|
||||
this =
|
||||
[
|
||||
controller().getAnInstanceSelf().getAMethodCall("inbound_email").getAMethodCall("mail"),
|
||||
controller().getAnInstanceSelf().getAMethodCall("mail")
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A method call on a `Mail::Message` object which may return data from a remote source.
|
||||
*/
|
||||
private class RemoteContent extends DataFlow::CallNode, RemoteFlowSource::Range {
|
||||
RemoteContent() {
|
||||
this =
|
||||
any(Mail m)
|
||||
.(DataFlow::LocalSourceNode)
|
||||
.getAMethodCall([
|
||||
"body", "to", "from", "raw_source", "subject", "from_address",
|
||||
"recipients_addresses", "cc_addresses", "bcc_addresses", "in_reply_to",
|
||||
"references", "reply_to", "raw_envelope", "to_s", "encoded", "header", "bcc", "cc",
|
||||
"text_part", "html_part"
|
||||
])
|
||||
}
|
||||
|
||||
override string getSourceType() { result = "ActionMailbox" }
|
||||
}
|
||||
}
|
||||
@@ -133,7 +133,7 @@ module File {
|
||||
}
|
||||
|
||||
override predicate propagatesFlowExt(string input, string output, boolean preservesValue) {
|
||||
input = "Argument[0..]" and
|
||||
input = "Argument[0,1..]" and
|
||||
output = "ReturnValue" and
|
||||
preservesValue = false
|
||||
}
|
||||
|
||||
@@ -140,10 +140,9 @@ module Array {
|
||||
}
|
||||
}
|
||||
|
||||
private class SetDifferenceSummary extends SummarizedCallable {
|
||||
SetDifferenceSummary() { this = "-" }
|
||||
|
||||
override SubExpr getACallSimple() { any() }
|
||||
abstract private class DifferenceSummaryShared extends SummarizedCallable {
|
||||
bindingset[this]
|
||||
DifferenceSummaryShared() { any() }
|
||||
|
||||
override predicate propagatesFlowExt(string input, string output, boolean preservesValue) {
|
||||
input = "Argument[self].Element[any]" and
|
||||
@@ -152,6 +151,12 @@ module Array {
|
||||
}
|
||||
}
|
||||
|
||||
private class SetDifferenceSummary extends DifferenceSummaryShared {
|
||||
SetDifferenceSummary() { this = "-" }
|
||||
|
||||
override SubExpr getACallSimple() { any() }
|
||||
}
|
||||
|
||||
/** Flow summary for `Array#<<`. For `Array#append`, see `PushSummary`. */
|
||||
private class AppendOperatorSummary extends SummarizedCallable {
|
||||
AppendOperatorSummary() { this = "<<" }
|
||||
@@ -687,14 +692,8 @@ module Array {
|
||||
}
|
||||
}
|
||||
|
||||
private class DifferenceSummary extends SimpleSummarizedCallable {
|
||||
private class DifferenceSummary extends DifferenceSummaryShared, SimpleSummarizedCallable {
|
||||
DifferenceSummary() { this = "difference" }
|
||||
|
||||
override predicate propagatesFlowExt(string input, string output, boolean preservesValue) {
|
||||
// `Array#difference` and `Array#-` do not behave exactly the same way,
|
||||
// but we model their flow the same way.
|
||||
any(SetDifferenceSummary s).propagatesFlowExt(input, output, preservesValue)
|
||||
}
|
||||
}
|
||||
|
||||
private string getDigArg(MethodCall dig, int i) {
|
||||
|
||||
@@ -72,6 +72,7 @@ private module API = Specific::API;
|
||||
private module DataFlow = Specific::DataFlow;
|
||||
|
||||
private import Specific::AccessPathSyntax
|
||||
private import ApiGraphModelsExtensions as Extensions
|
||||
|
||||
/** Module containing hooks for providing input data to be interpreted as a model. */
|
||||
module ModelInput {
|
||||
@@ -236,6 +237,8 @@ predicate sourceModel(string type, string path, string kind) {
|
||||
row.splitAt(";", 1) = path and
|
||||
row.splitAt(";", 2) = kind
|
||||
)
|
||||
or
|
||||
Extensions::sourceModel(type, path, kind)
|
||||
}
|
||||
|
||||
/** Holds if a sink model exists for the given parameters. */
|
||||
@@ -246,6 +249,8 @@ private predicate sinkModel(string type, string path, string kind) {
|
||||
row.splitAt(";", 1) = path and
|
||||
row.splitAt(";", 2) = kind
|
||||
)
|
||||
or
|
||||
Extensions::sinkModel(type, path, kind)
|
||||
}
|
||||
|
||||
/** Holds if a summary model `row` exists for the given parameters. */
|
||||
@@ -258,6 +263,8 @@ private predicate summaryModel(string type, string path, string input, string ou
|
||||
row.splitAt(";", 3) = output and
|
||||
row.splitAt(";", 4) = kind
|
||||
)
|
||||
or
|
||||
Extensions::summaryModel(type, path, input, output, kind)
|
||||
}
|
||||
|
||||
/** Holds if a type model exists for the given parameters. */
|
||||
@@ -268,6 +275,8 @@ private predicate typeModel(string type1, string type2, string path) {
|
||||
row.splitAt(";", 1) = type2 and
|
||||
row.splitAt(";", 2) = path
|
||||
)
|
||||
or
|
||||
Extensions::typeModel(type1, type2, path)
|
||||
}
|
||||
|
||||
/** Holds if a type variable model exists for the given parameters. */
|
||||
@@ -277,6 +286,8 @@ private predicate typeVariableModel(string name, string path) {
|
||||
row.splitAt(";", 0) = name and
|
||||
row.splitAt(";", 1) = path
|
||||
)
|
||||
or
|
||||
Extensions::typeVariableModel(name, path)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Defines extensible predicates for contributing library models from data extensions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Holds if the value at `(type, path)` should be seen as a flow
|
||||
* source of the given `kind`.
|
||||
*
|
||||
* The kind `remote` represents a general remote flow source.
|
||||
*/
|
||||
extensible predicate sourceModel(string type, string path, string kind);
|
||||
|
||||
/**
|
||||
* Holds if the value at `(type, path)` should be seen as a sink
|
||||
* of the given `kind`.
|
||||
*/
|
||||
extensible predicate sinkModel(string type, string path, string kind);
|
||||
|
||||
/**
|
||||
* Holds if calls to `(type, path)`, the value referred to by `input`
|
||||
* can flow to the value referred to by `output`.
|
||||
*
|
||||
* `kind` should be either `value` or `taint`, for value-preserving or taint-preserving steps,
|
||||
* respectively.
|
||||
*/
|
||||
extensible predicate summaryModel(string type, string path, string input, string output, string kind);
|
||||
|
||||
/**
|
||||
* Holds if `(type2, path)` should be seen as an instance of `type1`.
|
||||
*/
|
||||
extensible predicate typeModel(string type1, string type2, string path);
|
||||
|
||||
/**
|
||||
* Holds if `path` can be substituted for a token `TypeVar[name]`.
|
||||
*/
|
||||
extensible predicate typeVariableModel(string name, string path);
|
||||
26
ruby/ql/lib/codeql/ruby/frameworks/data/internal/model.yml
Normal file
26
ruby/ql/lib/codeql/ruby/frameworks/data/internal/model.yml
Normal file
@@ -0,0 +1,26 @@
|
||||
extensions:
|
||||
# Contribute empty data sets to avoid errors about an undefined extensionals
|
||||
- addsTo:
|
||||
pack: codeql/ruby-all
|
||||
extensible: sourceModel
|
||||
data: []
|
||||
|
||||
- addsTo:
|
||||
pack: codeql/ruby-all
|
||||
extensible: sinkModel
|
||||
data: []
|
||||
|
||||
- addsTo:
|
||||
pack: codeql/ruby-all
|
||||
extensible: summaryModel
|
||||
data: []
|
||||
|
||||
- addsTo:
|
||||
pack: codeql/ruby-all
|
||||
extensible: typeModel
|
||||
data: []
|
||||
|
||||
- addsTo:
|
||||
pack: codeql/ruby-all
|
||||
extensible: typeVariableModel
|
||||
data: []
|
||||
@@ -7,6 +7,7 @@ private import codeql.ruby.DataFlow
|
||||
private import codeql.ruby.AST
|
||||
private import codeql.ruby.ApiGraphs
|
||||
private import codeql.ruby.frameworks.core.Kernel::Kernel
|
||||
private import codeql.ruby.frameworks.Files
|
||||
|
||||
/** A call to a method that might access a file or start a process. */
|
||||
class AmbiguousPathCall extends DataFlow::CallNode {
|
||||
@@ -16,9 +17,15 @@ class AmbiguousPathCall extends DataFlow::CallNode {
|
||||
this.(KernelMethodCall).getMethodName() = "open" and
|
||||
name = "Kernel.open"
|
||||
or
|
||||
this = API::getTopLevelMember("IO").getAMethodCall("read") and
|
||||
not this = API::getTopLevelMember("File").getAMethodCall("read") and // needed in e.g. opal/opal, where some calls have both paths, but I'm not sure why
|
||||
name = "IO.read"
|
||||
exists(string methodName |
|
||||
methodName = ["read", "write", "binread", "binwrite", "foreach", "readlines"]
|
||||
|
|
||||
methodCallOnlyOnIO(this, methodName) and
|
||||
name = "IO." + methodName
|
||||
)
|
||||
or
|
||||
this = API::getTopLevelMember("URI").getAMethodCall("open") and
|
||||
name = "URI.open"
|
||||
}
|
||||
|
||||
/** Gets the name for the method being called. */
|
||||
@@ -26,11 +33,41 @@ class AmbiguousPathCall extends DataFlow::CallNode {
|
||||
|
||||
/** Gets the name for a safer method that can be used instead. */
|
||||
string getReplacement() {
|
||||
result = "File.open" and name = "Kernel.open"
|
||||
or
|
||||
result = "File.read" and name = "IO.read"
|
||||
or
|
||||
result = "File.open" and name = "Kernel.open"
|
||||
result = "File.write" and name = "IO.write"
|
||||
or
|
||||
result = "File.binread" and name = "IO.binread"
|
||||
or
|
||||
result = "File.binwrite" and name = "IO.binwrite"
|
||||
or
|
||||
result = "File.foreach" and name = "IO.foreach"
|
||||
or
|
||||
result = "File.readlines" and name = "IO.readlines"
|
||||
or
|
||||
result = "URI(<uri>).open" and name = "URI.open"
|
||||
}
|
||||
|
||||
/** Gets the argument that specifies the path to be accessed. */
|
||||
DataFlow::Node getPathArgument() { result = this.getArgument(0) }
|
||||
}
|
||||
|
||||
private predicate methodCallOnlyOnIO(DataFlow::CallNode node, string methodName) {
|
||||
node = API::getTopLevelMember("IO").getAMethodCall(methodName) and
|
||||
not node = API::getTopLevelMember("File").getAMethodCall(methodName) // needed in e.g. opal/opal, where some calls have both paths (opal implements an own corelib)
|
||||
}
|
||||
|
||||
/**
|
||||
* A sanitizer for kernel open vulnerabilities.
|
||||
*/
|
||||
abstract class Sanitizer extends DataFlow::Node { }
|
||||
|
||||
/**
|
||||
* If a `File.join` is performed the resulting string will not start with a pipe `|`.
|
||||
* This is true as long the tainted data doesn't flow into the first argument.
|
||||
*/
|
||||
private class FileJoinSanitizer extends Sanitizer {
|
||||
FileJoinSanitizer() { this = any(File::FileJoinSummary s).getParameter("1..") }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/ruby-all
|
||||
version: 0.4.5-dev
|
||||
version: 0.4.6-dev
|
||||
groups: ruby
|
||||
extractor: ruby
|
||||
dbscheme: ruby.dbscheme
|
||||
@@ -8,3 +8,6 @@ library: true
|
||||
dependencies:
|
||||
codeql/ssa: ${workspace}
|
||||
codeql/regex: ${workspace}
|
||||
codeql/ssa: 0.0.1
|
||||
dataExtensions:
|
||||
- codeql/ruby/frameworks/**/model.yml
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 0.4.5
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 0.4.4
|
||||
|
||||
### New Queries
|
||||
|
||||
4
ruby/ql/src/change-notes/2022-11-22-kernel-open-sinks.md
Normal file
4
ruby/ql/src/change-notes/2022-11-22-kernel-open-sinks.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Extended the `rb/kernel-open` query with following sinks: `IO.write`, `IO.binread`, `IO.binwrite`, `IO.foreach`, `IO.readlines`, and `URI.open`.
|
||||
3
ruby/ql/src/change-notes/released/0.4.5.md
Normal file
3
ruby/ql/src/change-notes/released/0.4.5.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 0.4.5
|
||||
|
||||
No user-facing changes.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.4.4
|
||||
lastReleaseVersion: 0.4.5
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/ruby-queries
|
||||
version: 0.4.5-dev
|
||||
version: 0.4.6-dev
|
||||
groups:
|
||||
- ruby
|
||||
- queries
|
||||
|
||||
@@ -6,15 +6,19 @@
|
||||
<p>If <code>Kernel.open</code> is given a file name that starts with a <code>|</code>
|
||||
character, it will execute the remaining string as a shell command. If a
|
||||
malicious user can control the file name, they can execute arbitrary code.
|
||||
The same vulnerability applies to <code>IO.read</code>.
|
||||
The same vulnerability applies to <code>IO.read</code>, <code>IO.write</code>,
|
||||
<code>IO.binread</code>, <code>IO.binwrite</code>, <code>IO.foreach</code>,
|
||||
<code>IO.readlines</code> and <code>URI.open</code>.
|
||||
</p>
|
||||
|
||||
</overview>
|
||||
<recommendation>
|
||||
|
||||
<p>Use <code>File.open</code> instead of <code>Kernel.open</code>, as the former
|
||||
does not have this vulnerability. Similarly, use <code>File.read</code> instead
|
||||
does not have this vulnerability. Similarly, use the methods from the <code>File</code>
|
||||
class instead of the <code>IO</code> class e.g. <code>File.read</code> instead
|
||||
of <code>IO.read</code>.</p>
|
||||
<p>Instead of <code>URI.open</code> use <code>URI(..).open</code> or an HTTP Client.</p>
|
||||
|
||||
</recommendation>
|
||||
<example>
|
||||
@@ -36,6 +40,7 @@ user-supplied file path.
|
||||
<li>
|
||||
OWASP:
|
||||
<a href="https://www.owasp.org/index.php/Command_Injection">Command Injection</a>.
|
||||
<a href="https://cheatsheetseries.owasp.org/cheatsheets/Ruby_on_Rails_Cheat_Sheet.html#command-injection">Ruby on Rails Cheat Sheet: Command Injection</a>.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/**
|
||||
* @name Use of `Kernel.open` or `IO.read` with user-controlled input
|
||||
* @description Using `Kernel.open` or `IO.read` may allow a malicious
|
||||
* @name Use of `Kernel.open`, `IO.read` or similar sinks with user-controlled input
|
||||
* @description Using `Kernel.open`, `IO.read`, `IO.write`, `IO.binread`, `IO.binwrite`,
|
||||
* `IO.foreach`, `IO.readlines`, or `URI.open` may allow a malicious
|
||||
* user to execute arbitrary system commands.
|
||||
* @kind path-problem
|
||||
* @problem.severity error
|
||||
@@ -32,7 +33,8 @@ class Configuration extends TaintTracking::Configuration {
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) {
|
||||
node instanceof StringConstCompareBarrier or
|
||||
node instanceof StringConstArrayInclusionCallBarrier
|
||||
node instanceof StringConstArrayInclusionCallBarrier or
|
||||
node instanceof Sanitizer
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/**
|
||||
* @name Use of `Kernel.open` or `IO.read` with a non-constant value
|
||||
* @description Using `Kernel.open` or `IO.read` may allow a malicious
|
||||
* @name Use of `Kernel.open` or `IO.read` or similar sinks with a non-constant value
|
||||
* @description Using `Kernel.open`, `IO.read`, `IO.write`, `IO.binread`, `IO.binwrite`,
|
||||
* `IO.foreach`, `IO.readlines`, or `URI.open` may allow a malicious
|
||||
* user to execute arbitrary system commands.
|
||||
* @kind problem
|
||||
* @problem.severity warning
|
||||
@@ -15,15 +16,25 @@
|
||||
*/
|
||||
|
||||
import codeql.ruby.security.KernelOpenQuery
|
||||
import codeql.ruby.ast.Literal
|
||||
import codeql.ruby.AST
|
||||
import codeql.ruby.ApiGraphs
|
||||
|
||||
from AmbiguousPathCall call
|
||||
where
|
||||
// there is not a constant string argument
|
||||
not exists(call.getPathArgument().getConstantValue()) and
|
||||
// if it's a format string, then the first argument is not a constant string
|
||||
not call.getPathArgument().getALocalSource().asExpr().getExpr().(StringLiteral).getComponent(0)
|
||||
instanceof StringTextComponent
|
||||
not hasConstantPrefix(call.getPathArgument().getALocalSource().asExpr().getExpr()) and
|
||||
not call.getPathArgument().getALocalSource() =
|
||||
API::getTopLevelMember("File").getAMethodCall("join")
|
||||
select call,
|
||||
"Call to " + call.getName() + " with a non-constant value. Consider replacing it with " +
|
||||
call.getReplacement() + "."
|
||||
|
||||
predicate hasConstantPrefix(Expr e) {
|
||||
// if it's a format string, then the first argument is not a constant string
|
||||
e.(StringlikeLiteral).getComponent(0) instanceof StringTextComponent
|
||||
or
|
||||
// it is not a constant string argument
|
||||
exists(e.getConstantValue())
|
||||
or
|
||||
// not a concatenation that starts with a constant string
|
||||
hasConstantPrefix(e.(AddExpr).getLeftOperand())
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
||||
ret
|
||||
| UseUseExplosion.rb:21:9:21:3700 | if ... |
|
||||
| local_dataflow.rb:6:3:6:14 | ... = ... |
|
||||
| local_dataflow.rb:12:3:12:5 | call to p |
|
||||
| local_dataflow.rb:16:3:16:10 | break |
|
||||
@@ -22,6 +23,806 @@ ret
|
||||
| local_dataflow.rb:127:3:127:8 | call to rand |
|
||||
| local_dataflow.rb:132:3:149:5 | if ... |
|
||||
arg
|
||||
| UseUseExplosion.rb:20:13:20:17 | @prop | UseUseExplosion.rb:20:13:20:23 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:21:20:23 | 100 | UseUseExplosion.rb:20:13:20:23 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:35:20:39 | @prop | UseUseExplosion.rb:20:35:20:44 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:43:20:44 | 99 | UseUseExplosion.rb:20:35:20:44 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:56:20:60 | @prop | UseUseExplosion.rb:20:56:20:65 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:64:20:65 | 98 | UseUseExplosion.rb:20:56:20:65 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:77:20:81 | @prop | UseUseExplosion.rb:20:77:20:86 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:85:20:86 | 97 | UseUseExplosion.rb:20:77:20:86 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:98:20:102 | @prop | UseUseExplosion.rb:20:98:20:107 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:106:20:107 | 96 | UseUseExplosion.rb:20:98:20:107 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:119:20:123 | @prop | UseUseExplosion.rb:20:119:20:128 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:127:20:128 | 95 | UseUseExplosion.rb:20:119:20:128 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:140:20:144 | @prop | UseUseExplosion.rb:20:140:20:149 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:148:20:149 | 94 | UseUseExplosion.rb:20:140:20:149 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:161:20:165 | @prop | UseUseExplosion.rb:20:161:20:170 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:169:20:170 | 93 | UseUseExplosion.rb:20:161:20:170 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:182:20:186 | @prop | UseUseExplosion.rb:20:182:20:191 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:190:20:191 | 92 | UseUseExplosion.rb:20:182:20:191 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:203:20:207 | @prop | UseUseExplosion.rb:20:203:20:212 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:211:20:212 | 91 | UseUseExplosion.rb:20:203:20:212 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:224:20:228 | @prop | UseUseExplosion.rb:20:224:20:233 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:232:20:233 | 90 | UseUseExplosion.rb:20:224:20:233 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:245:20:249 | @prop | UseUseExplosion.rb:20:245:20:254 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:253:20:254 | 89 | UseUseExplosion.rb:20:245:20:254 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:266:20:270 | @prop | UseUseExplosion.rb:20:266:20:275 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:274:20:275 | 88 | UseUseExplosion.rb:20:266:20:275 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:287:20:291 | @prop | UseUseExplosion.rb:20:287:20:296 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:295:20:296 | 87 | UseUseExplosion.rb:20:287:20:296 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:308:20:312 | @prop | UseUseExplosion.rb:20:308:20:317 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:316:20:317 | 86 | UseUseExplosion.rb:20:308:20:317 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:329:20:333 | @prop | UseUseExplosion.rb:20:329:20:338 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:337:20:338 | 85 | UseUseExplosion.rb:20:329:20:338 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:350:20:354 | @prop | UseUseExplosion.rb:20:350:20:359 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:358:20:359 | 84 | UseUseExplosion.rb:20:350:20:359 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:371:20:375 | @prop | UseUseExplosion.rb:20:371:20:380 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:379:20:380 | 83 | UseUseExplosion.rb:20:371:20:380 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:392:20:396 | @prop | UseUseExplosion.rb:20:392:20:401 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:400:20:401 | 82 | UseUseExplosion.rb:20:392:20:401 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:413:20:417 | @prop | UseUseExplosion.rb:20:413:20:422 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:421:20:422 | 81 | UseUseExplosion.rb:20:413:20:422 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:434:20:438 | @prop | UseUseExplosion.rb:20:434:20:443 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:442:20:443 | 80 | UseUseExplosion.rb:20:434:20:443 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:455:20:459 | @prop | UseUseExplosion.rb:20:455:20:464 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:463:20:464 | 79 | UseUseExplosion.rb:20:455:20:464 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:476:20:480 | @prop | UseUseExplosion.rb:20:476:20:485 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:484:20:485 | 78 | UseUseExplosion.rb:20:476:20:485 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:497:20:501 | @prop | UseUseExplosion.rb:20:497:20:506 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:505:20:506 | 77 | UseUseExplosion.rb:20:497:20:506 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:518:20:522 | @prop | UseUseExplosion.rb:20:518:20:527 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:526:20:527 | 76 | UseUseExplosion.rb:20:518:20:527 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:539:20:543 | @prop | UseUseExplosion.rb:20:539:20:548 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:547:20:548 | 75 | UseUseExplosion.rb:20:539:20:548 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:560:20:564 | @prop | UseUseExplosion.rb:20:560:20:569 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:568:20:569 | 74 | UseUseExplosion.rb:20:560:20:569 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:581:20:585 | @prop | UseUseExplosion.rb:20:581:20:590 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:589:20:590 | 73 | UseUseExplosion.rb:20:581:20:590 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:602:20:606 | @prop | UseUseExplosion.rb:20:602:20:611 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:610:20:611 | 72 | UseUseExplosion.rb:20:602:20:611 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:623:20:627 | @prop | UseUseExplosion.rb:20:623:20:632 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:631:20:632 | 71 | UseUseExplosion.rb:20:623:20:632 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:644:20:648 | @prop | UseUseExplosion.rb:20:644:20:653 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:652:20:653 | 70 | UseUseExplosion.rb:20:644:20:653 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:665:20:669 | @prop | UseUseExplosion.rb:20:665:20:674 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:673:20:674 | 69 | UseUseExplosion.rb:20:665:20:674 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:686:20:690 | @prop | UseUseExplosion.rb:20:686:20:695 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:694:20:695 | 68 | UseUseExplosion.rb:20:686:20:695 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:707:20:711 | @prop | UseUseExplosion.rb:20:707:20:716 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:715:20:716 | 67 | UseUseExplosion.rb:20:707:20:716 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:728:20:732 | @prop | UseUseExplosion.rb:20:728:20:737 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:736:20:737 | 66 | UseUseExplosion.rb:20:728:20:737 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:749:20:753 | @prop | UseUseExplosion.rb:20:749:20:758 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:757:20:758 | 65 | UseUseExplosion.rb:20:749:20:758 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:770:20:774 | @prop | UseUseExplosion.rb:20:770:20:779 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:778:20:779 | 64 | UseUseExplosion.rb:20:770:20:779 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:791:20:795 | @prop | UseUseExplosion.rb:20:791:20:800 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:799:20:800 | 63 | UseUseExplosion.rb:20:791:20:800 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:812:20:816 | @prop | UseUseExplosion.rb:20:812:20:821 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:820:20:821 | 62 | UseUseExplosion.rb:20:812:20:821 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:833:20:837 | @prop | UseUseExplosion.rb:20:833:20:842 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:841:20:842 | 61 | UseUseExplosion.rb:20:833:20:842 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:854:20:858 | @prop | UseUseExplosion.rb:20:854:20:863 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:862:20:863 | 60 | UseUseExplosion.rb:20:854:20:863 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:875:20:879 | @prop | UseUseExplosion.rb:20:875:20:884 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:883:20:884 | 59 | UseUseExplosion.rb:20:875:20:884 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:896:20:900 | @prop | UseUseExplosion.rb:20:896:20:905 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:904:20:905 | 58 | UseUseExplosion.rb:20:896:20:905 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:917:20:921 | @prop | UseUseExplosion.rb:20:917:20:926 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:925:20:926 | 57 | UseUseExplosion.rb:20:917:20:926 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:938:20:942 | @prop | UseUseExplosion.rb:20:938:20:947 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:946:20:947 | 56 | UseUseExplosion.rb:20:938:20:947 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:959:20:963 | @prop | UseUseExplosion.rb:20:959:20:968 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:967:20:968 | 55 | UseUseExplosion.rb:20:959:20:968 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:980:20:984 | @prop | UseUseExplosion.rb:20:980:20:989 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:988:20:989 | 54 | UseUseExplosion.rb:20:980:20:989 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1001:20:1005 | @prop | UseUseExplosion.rb:20:1001:20:1010 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1009:20:1010 | 53 | UseUseExplosion.rb:20:1001:20:1010 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1022:20:1026 | @prop | UseUseExplosion.rb:20:1022:20:1031 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1030:20:1031 | 52 | UseUseExplosion.rb:20:1022:20:1031 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1043:20:1047 | @prop | UseUseExplosion.rb:20:1043:20:1052 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1051:20:1052 | 51 | UseUseExplosion.rb:20:1043:20:1052 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1064:20:1068 | @prop | UseUseExplosion.rb:20:1064:20:1073 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1072:20:1073 | 50 | UseUseExplosion.rb:20:1064:20:1073 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1085:20:1089 | @prop | UseUseExplosion.rb:20:1085:20:1094 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1093:20:1094 | 49 | UseUseExplosion.rb:20:1085:20:1094 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1106:20:1110 | @prop | UseUseExplosion.rb:20:1106:20:1115 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1114:20:1115 | 48 | UseUseExplosion.rb:20:1106:20:1115 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1127:20:1131 | @prop | UseUseExplosion.rb:20:1127:20:1136 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1135:20:1136 | 47 | UseUseExplosion.rb:20:1127:20:1136 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1148:20:1152 | @prop | UseUseExplosion.rb:20:1148:20:1157 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1156:20:1157 | 46 | UseUseExplosion.rb:20:1148:20:1157 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1169:20:1173 | @prop | UseUseExplosion.rb:20:1169:20:1178 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1177:20:1178 | 45 | UseUseExplosion.rb:20:1169:20:1178 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1190:20:1194 | @prop | UseUseExplosion.rb:20:1190:20:1199 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1198:20:1199 | 44 | UseUseExplosion.rb:20:1190:20:1199 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1211:20:1215 | @prop | UseUseExplosion.rb:20:1211:20:1220 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1219:20:1220 | 43 | UseUseExplosion.rb:20:1211:20:1220 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1232:20:1236 | @prop | UseUseExplosion.rb:20:1232:20:1241 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1240:20:1241 | 42 | UseUseExplosion.rb:20:1232:20:1241 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1253:20:1257 | @prop | UseUseExplosion.rb:20:1253:20:1262 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1261:20:1262 | 41 | UseUseExplosion.rb:20:1253:20:1262 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1274:20:1278 | @prop | UseUseExplosion.rb:20:1274:20:1283 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1282:20:1283 | 40 | UseUseExplosion.rb:20:1274:20:1283 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1295:20:1299 | @prop | UseUseExplosion.rb:20:1295:20:1304 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1303:20:1304 | 39 | UseUseExplosion.rb:20:1295:20:1304 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1316:20:1320 | @prop | UseUseExplosion.rb:20:1316:20:1325 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1324:20:1325 | 38 | UseUseExplosion.rb:20:1316:20:1325 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1337:20:1341 | @prop | UseUseExplosion.rb:20:1337:20:1346 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1345:20:1346 | 37 | UseUseExplosion.rb:20:1337:20:1346 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1358:20:1362 | @prop | UseUseExplosion.rb:20:1358:20:1367 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1366:20:1367 | 36 | UseUseExplosion.rb:20:1358:20:1367 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1379:20:1383 | @prop | UseUseExplosion.rb:20:1379:20:1388 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1387:20:1388 | 35 | UseUseExplosion.rb:20:1379:20:1388 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1400:20:1404 | @prop | UseUseExplosion.rb:20:1400:20:1409 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1408:20:1409 | 34 | UseUseExplosion.rb:20:1400:20:1409 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1421:20:1425 | @prop | UseUseExplosion.rb:20:1421:20:1430 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1429:20:1430 | 33 | UseUseExplosion.rb:20:1421:20:1430 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1442:20:1446 | @prop | UseUseExplosion.rb:20:1442:20:1451 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1450:20:1451 | 32 | UseUseExplosion.rb:20:1442:20:1451 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1463:20:1467 | @prop | UseUseExplosion.rb:20:1463:20:1472 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1471:20:1472 | 31 | UseUseExplosion.rb:20:1463:20:1472 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1484:20:1488 | @prop | UseUseExplosion.rb:20:1484:20:1493 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1492:20:1493 | 30 | UseUseExplosion.rb:20:1484:20:1493 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1505:20:1509 | @prop | UseUseExplosion.rb:20:1505:20:1514 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1513:20:1514 | 29 | UseUseExplosion.rb:20:1505:20:1514 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1526:20:1530 | @prop | UseUseExplosion.rb:20:1526:20:1535 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1534:20:1535 | 28 | UseUseExplosion.rb:20:1526:20:1535 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1547:20:1551 | @prop | UseUseExplosion.rb:20:1547:20:1556 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1555:20:1556 | 27 | UseUseExplosion.rb:20:1547:20:1556 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1568:20:1572 | @prop | UseUseExplosion.rb:20:1568:20:1577 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1576:20:1577 | 26 | UseUseExplosion.rb:20:1568:20:1577 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1589:20:1593 | @prop | UseUseExplosion.rb:20:1589:20:1598 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1597:20:1598 | 25 | UseUseExplosion.rb:20:1589:20:1598 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1610:20:1614 | @prop | UseUseExplosion.rb:20:1610:20:1619 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1618:20:1619 | 24 | UseUseExplosion.rb:20:1610:20:1619 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1631:20:1635 | @prop | UseUseExplosion.rb:20:1631:20:1640 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1639:20:1640 | 23 | UseUseExplosion.rb:20:1631:20:1640 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1652:20:1656 | @prop | UseUseExplosion.rb:20:1652:20:1661 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1660:20:1661 | 22 | UseUseExplosion.rb:20:1652:20:1661 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1673:20:1677 | @prop | UseUseExplosion.rb:20:1673:20:1682 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1681:20:1682 | 21 | UseUseExplosion.rb:20:1673:20:1682 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1694:20:1698 | @prop | UseUseExplosion.rb:20:1694:20:1703 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1702:20:1703 | 20 | UseUseExplosion.rb:20:1694:20:1703 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1715:20:1719 | @prop | UseUseExplosion.rb:20:1715:20:1724 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1723:20:1724 | 19 | UseUseExplosion.rb:20:1715:20:1724 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1736:20:1740 | @prop | UseUseExplosion.rb:20:1736:20:1745 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1744:20:1745 | 18 | UseUseExplosion.rb:20:1736:20:1745 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1757:20:1761 | @prop | UseUseExplosion.rb:20:1757:20:1766 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1765:20:1766 | 17 | UseUseExplosion.rb:20:1757:20:1766 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1778:20:1782 | @prop | UseUseExplosion.rb:20:1778:20:1787 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1786:20:1787 | 16 | UseUseExplosion.rb:20:1778:20:1787 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1799:20:1803 | @prop | UseUseExplosion.rb:20:1799:20:1808 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1807:20:1808 | 15 | UseUseExplosion.rb:20:1799:20:1808 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1820:20:1824 | @prop | UseUseExplosion.rb:20:1820:20:1829 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1828:20:1829 | 14 | UseUseExplosion.rb:20:1820:20:1829 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1841:20:1845 | @prop | UseUseExplosion.rb:20:1841:20:1850 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1849:20:1850 | 13 | UseUseExplosion.rb:20:1841:20:1850 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1862:20:1866 | @prop | UseUseExplosion.rb:20:1862:20:1871 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1870:20:1871 | 12 | UseUseExplosion.rb:20:1862:20:1871 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1883:20:1887 | @prop | UseUseExplosion.rb:20:1883:20:1892 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1891:20:1892 | 11 | UseUseExplosion.rb:20:1883:20:1892 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1904:20:1908 | @prop | UseUseExplosion.rb:20:1904:20:1913 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1912:20:1913 | 10 | UseUseExplosion.rb:20:1904:20:1913 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1925:20:1929 | @prop | UseUseExplosion.rb:20:1925:20:1933 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1933:20:1933 | 9 | UseUseExplosion.rb:20:1925:20:1933 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1945:20:1949 | @prop | UseUseExplosion.rb:20:1945:20:1953 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1953:20:1953 | 8 | UseUseExplosion.rb:20:1945:20:1953 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1965:20:1969 | @prop | UseUseExplosion.rb:20:1965:20:1973 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1973:20:1973 | 7 | UseUseExplosion.rb:20:1965:20:1973 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:1985:20:1989 | @prop | UseUseExplosion.rb:20:1985:20:1993 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:1993:20:1993 | 6 | UseUseExplosion.rb:20:1985:20:1993 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:2005:20:2009 | @prop | UseUseExplosion.rb:20:2005:20:2013 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:2013:20:2013 | 5 | UseUseExplosion.rb:20:2005:20:2013 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:2025:20:2029 | @prop | UseUseExplosion.rb:20:2025:20:2033 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:2033:20:2033 | 4 | UseUseExplosion.rb:20:2025:20:2033 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:2045:20:2049 | @prop | UseUseExplosion.rb:20:2045:20:2053 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:2053:20:2053 | 3 | UseUseExplosion.rb:20:2045:20:2053 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:2065:20:2069 | @prop | UseUseExplosion.rb:20:2065:20:2073 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:2073:20:2073 | 2 | UseUseExplosion.rb:20:2065:20:2073 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:2085:20:2089 | @prop | UseUseExplosion.rb:20:2085:20:2093 | ... > ... | self |
|
||||
| UseUseExplosion.rb:20:2093:20:2093 | 1 | UseUseExplosion.rb:20:2085:20:2093 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:20:2107:20:2112 | self | UseUseExplosion.rb:20:2107:20:2112 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2111:20:2111 | x | UseUseExplosion.rb:20:2107:20:2112 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2123:20:2128 | self | UseUseExplosion.rb:20:2123:20:2128 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2127:20:2127 | x | UseUseExplosion.rb:20:2123:20:2128 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2139:20:2144 | self | UseUseExplosion.rb:20:2139:20:2144 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2143:20:2143 | x | UseUseExplosion.rb:20:2139:20:2144 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2155:20:2160 | self | UseUseExplosion.rb:20:2155:20:2160 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2159:20:2159 | x | UseUseExplosion.rb:20:2155:20:2160 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2171:20:2176 | self | UseUseExplosion.rb:20:2171:20:2176 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2175:20:2175 | x | UseUseExplosion.rb:20:2171:20:2176 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2187:20:2192 | self | UseUseExplosion.rb:20:2187:20:2192 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2191:20:2191 | x | UseUseExplosion.rb:20:2187:20:2192 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2203:20:2208 | self | UseUseExplosion.rb:20:2203:20:2208 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2207:20:2207 | x | UseUseExplosion.rb:20:2203:20:2208 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2219:20:2224 | self | UseUseExplosion.rb:20:2219:20:2224 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2223:20:2223 | x | UseUseExplosion.rb:20:2219:20:2224 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2235:20:2240 | self | UseUseExplosion.rb:20:2235:20:2240 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2239:20:2239 | x | UseUseExplosion.rb:20:2235:20:2240 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2251:20:2256 | self | UseUseExplosion.rb:20:2251:20:2256 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2255:20:2255 | x | UseUseExplosion.rb:20:2251:20:2256 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2267:20:2272 | self | UseUseExplosion.rb:20:2267:20:2272 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2271:20:2271 | x | UseUseExplosion.rb:20:2267:20:2272 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2283:20:2288 | self | UseUseExplosion.rb:20:2283:20:2288 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2287:20:2287 | x | UseUseExplosion.rb:20:2283:20:2288 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2299:20:2304 | self | UseUseExplosion.rb:20:2299:20:2304 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2303:20:2303 | x | UseUseExplosion.rb:20:2299:20:2304 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2315:20:2320 | self | UseUseExplosion.rb:20:2315:20:2320 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2319:20:2319 | x | UseUseExplosion.rb:20:2315:20:2320 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2331:20:2336 | self | UseUseExplosion.rb:20:2331:20:2336 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2335:20:2335 | x | UseUseExplosion.rb:20:2331:20:2336 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2347:20:2352 | self | UseUseExplosion.rb:20:2347:20:2352 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2351:20:2351 | x | UseUseExplosion.rb:20:2347:20:2352 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2363:20:2368 | self | UseUseExplosion.rb:20:2363:20:2368 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2367:20:2367 | x | UseUseExplosion.rb:20:2363:20:2368 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2379:20:2384 | self | UseUseExplosion.rb:20:2379:20:2384 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2383:20:2383 | x | UseUseExplosion.rb:20:2379:20:2384 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2395:20:2400 | self | UseUseExplosion.rb:20:2395:20:2400 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2399:20:2399 | x | UseUseExplosion.rb:20:2395:20:2400 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2411:20:2416 | self | UseUseExplosion.rb:20:2411:20:2416 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2415:20:2415 | x | UseUseExplosion.rb:20:2411:20:2416 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2427:20:2432 | self | UseUseExplosion.rb:20:2427:20:2432 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2431:20:2431 | x | UseUseExplosion.rb:20:2427:20:2432 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2443:20:2448 | self | UseUseExplosion.rb:20:2443:20:2448 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2447:20:2447 | x | UseUseExplosion.rb:20:2443:20:2448 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2459:20:2464 | self | UseUseExplosion.rb:20:2459:20:2464 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2463:20:2463 | x | UseUseExplosion.rb:20:2459:20:2464 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2475:20:2480 | self | UseUseExplosion.rb:20:2475:20:2480 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2479:20:2479 | x | UseUseExplosion.rb:20:2475:20:2480 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2491:20:2496 | self | UseUseExplosion.rb:20:2491:20:2496 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2495:20:2495 | x | UseUseExplosion.rb:20:2491:20:2496 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2507:20:2512 | self | UseUseExplosion.rb:20:2507:20:2512 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2511:20:2511 | x | UseUseExplosion.rb:20:2507:20:2512 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2523:20:2528 | self | UseUseExplosion.rb:20:2523:20:2528 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2527:20:2527 | x | UseUseExplosion.rb:20:2523:20:2528 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2539:20:2544 | self | UseUseExplosion.rb:20:2539:20:2544 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2543:20:2543 | x | UseUseExplosion.rb:20:2539:20:2544 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2555:20:2560 | self | UseUseExplosion.rb:20:2555:20:2560 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2559:20:2559 | x | UseUseExplosion.rb:20:2555:20:2560 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2571:20:2576 | self | UseUseExplosion.rb:20:2571:20:2576 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2575:20:2575 | x | UseUseExplosion.rb:20:2571:20:2576 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2587:20:2592 | self | UseUseExplosion.rb:20:2587:20:2592 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2591:20:2591 | x | UseUseExplosion.rb:20:2587:20:2592 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2603:20:2608 | self | UseUseExplosion.rb:20:2603:20:2608 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2607:20:2607 | x | UseUseExplosion.rb:20:2603:20:2608 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2619:20:2624 | self | UseUseExplosion.rb:20:2619:20:2624 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2623:20:2623 | x | UseUseExplosion.rb:20:2619:20:2624 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2635:20:2640 | self | UseUseExplosion.rb:20:2635:20:2640 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2639:20:2639 | x | UseUseExplosion.rb:20:2635:20:2640 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2651:20:2656 | self | UseUseExplosion.rb:20:2651:20:2656 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2655:20:2655 | x | UseUseExplosion.rb:20:2651:20:2656 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2667:20:2672 | self | UseUseExplosion.rb:20:2667:20:2672 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2671:20:2671 | x | UseUseExplosion.rb:20:2667:20:2672 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2683:20:2688 | self | UseUseExplosion.rb:20:2683:20:2688 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2687:20:2687 | x | UseUseExplosion.rb:20:2683:20:2688 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2699:20:2704 | self | UseUseExplosion.rb:20:2699:20:2704 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2703:20:2703 | x | UseUseExplosion.rb:20:2699:20:2704 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2715:20:2720 | self | UseUseExplosion.rb:20:2715:20:2720 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2719:20:2719 | x | UseUseExplosion.rb:20:2715:20:2720 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2731:20:2736 | self | UseUseExplosion.rb:20:2731:20:2736 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2735:20:2735 | x | UseUseExplosion.rb:20:2731:20:2736 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2747:20:2752 | self | UseUseExplosion.rb:20:2747:20:2752 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2751:20:2751 | x | UseUseExplosion.rb:20:2747:20:2752 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2763:20:2768 | self | UseUseExplosion.rb:20:2763:20:2768 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2767:20:2767 | x | UseUseExplosion.rb:20:2763:20:2768 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2779:20:2784 | self | UseUseExplosion.rb:20:2779:20:2784 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2783:20:2783 | x | UseUseExplosion.rb:20:2779:20:2784 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2795:20:2800 | self | UseUseExplosion.rb:20:2795:20:2800 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2799:20:2799 | x | UseUseExplosion.rb:20:2795:20:2800 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2811:20:2816 | self | UseUseExplosion.rb:20:2811:20:2816 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2815:20:2815 | x | UseUseExplosion.rb:20:2811:20:2816 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2827:20:2832 | self | UseUseExplosion.rb:20:2827:20:2832 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2831:20:2831 | x | UseUseExplosion.rb:20:2827:20:2832 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2843:20:2848 | self | UseUseExplosion.rb:20:2843:20:2848 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2847:20:2847 | x | UseUseExplosion.rb:20:2843:20:2848 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2859:20:2864 | self | UseUseExplosion.rb:20:2859:20:2864 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2863:20:2863 | x | UseUseExplosion.rb:20:2859:20:2864 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2875:20:2880 | self | UseUseExplosion.rb:20:2875:20:2880 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2879:20:2879 | x | UseUseExplosion.rb:20:2875:20:2880 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2891:20:2896 | self | UseUseExplosion.rb:20:2891:20:2896 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2895:20:2895 | x | UseUseExplosion.rb:20:2891:20:2896 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2907:20:2912 | self | UseUseExplosion.rb:20:2907:20:2912 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2911:20:2911 | x | UseUseExplosion.rb:20:2907:20:2912 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2923:20:2928 | self | UseUseExplosion.rb:20:2923:20:2928 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2927:20:2927 | x | UseUseExplosion.rb:20:2923:20:2928 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2939:20:2944 | self | UseUseExplosion.rb:20:2939:20:2944 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2943:20:2943 | x | UseUseExplosion.rb:20:2939:20:2944 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2955:20:2960 | self | UseUseExplosion.rb:20:2955:20:2960 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2959:20:2959 | x | UseUseExplosion.rb:20:2955:20:2960 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2971:20:2976 | self | UseUseExplosion.rb:20:2971:20:2976 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2975:20:2975 | x | UseUseExplosion.rb:20:2971:20:2976 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:2987:20:2992 | self | UseUseExplosion.rb:20:2987:20:2992 | call to use | self |
|
||||
| UseUseExplosion.rb:20:2991:20:2991 | x | UseUseExplosion.rb:20:2987:20:2992 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3003:20:3008 | self | UseUseExplosion.rb:20:3003:20:3008 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3007:20:3007 | x | UseUseExplosion.rb:20:3003:20:3008 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3019:20:3024 | self | UseUseExplosion.rb:20:3019:20:3024 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3023:20:3023 | x | UseUseExplosion.rb:20:3019:20:3024 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3035:20:3040 | self | UseUseExplosion.rb:20:3035:20:3040 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3039:20:3039 | x | UseUseExplosion.rb:20:3035:20:3040 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3051:20:3056 | self | UseUseExplosion.rb:20:3051:20:3056 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3055:20:3055 | x | UseUseExplosion.rb:20:3051:20:3056 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3067:20:3072 | self | UseUseExplosion.rb:20:3067:20:3072 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3071:20:3071 | x | UseUseExplosion.rb:20:3067:20:3072 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3083:20:3088 | self | UseUseExplosion.rb:20:3083:20:3088 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3087:20:3087 | x | UseUseExplosion.rb:20:3083:20:3088 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3099:20:3104 | self | UseUseExplosion.rb:20:3099:20:3104 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3103:20:3103 | x | UseUseExplosion.rb:20:3099:20:3104 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3115:20:3120 | self | UseUseExplosion.rb:20:3115:20:3120 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3119:20:3119 | x | UseUseExplosion.rb:20:3115:20:3120 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3131:20:3136 | self | UseUseExplosion.rb:20:3131:20:3136 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3135:20:3135 | x | UseUseExplosion.rb:20:3131:20:3136 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3147:20:3152 | self | UseUseExplosion.rb:20:3147:20:3152 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3151:20:3151 | x | UseUseExplosion.rb:20:3147:20:3152 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3163:20:3168 | self | UseUseExplosion.rb:20:3163:20:3168 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3167:20:3167 | x | UseUseExplosion.rb:20:3163:20:3168 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3179:20:3184 | self | UseUseExplosion.rb:20:3179:20:3184 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3183:20:3183 | x | UseUseExplosion.rb:20:3179:20:3184 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3195:20:3200 | self | UseUseExplosion.rb:20:3195:20:3200 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3199:20:3199 | x | UseUseExplosion.rb:20:3195:20:3200 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3211:20:3216 | self | UseUseExplosion.rb:20:3211:20:3216 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3215:20:3215 | x | UseUseExplosion.rb:20:3211:20:3216 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3227:20:3232 | self | UseUseExplosion.rb:20:3227:20:3232 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3231:20:3231 | x | UseUseExplosion.rb:20:3227:20:3232 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3243:20:3248 | self | UseUseExplosion.rb:20:3243:20:3248 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3247:20:3247 | x | UseUseExplosion.rb:20:3243:20:3248 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3259:20:3264 | self | UseUseExplosion.rb:20:3259:20:3264 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3263:20:3263 | x | UseUseExplosion.rb:20:3259:20:3264 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3275:20:3280 | self | UseUseExplosion.rb:20:3275:20:3280 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3279:20:3279 | x | UseUseExplosion.rb:20:3275:20:3280 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3291:20:3296 | self | UseUseExplosion.rb:20:3291:20:3296 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3295:20:3295 | x | UseUseExplosion.rb:20:3291:20:3296 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3307:20:3312 | self | UseUseExplosion.rb:20:3307:20:3312 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3311:20:3311 | x | UseUseExplosion.rb:20:3307:20:3312 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3323:20:3328 | self | UseUseExplosion.rb:20:3323:20:3328 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3327:20:3327 | x | UseUseExplosion.rb:20:3323:20:3328 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3339:20:3344 | self | UseUseExplosion.rb:20:3339:20:3344 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3343:20:3343 | x | UseUseExplosion.rb:20:3339:20:3344 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3355:20:3360 | self | UseUseExplosion.rb:20:3355:20:3360 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3359:20:3359 | x | UseUseExplosion.rb:20:3355:20:3360 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3371:20:3376 | self | UseUseExplosion.rb:20:3371:20:3376 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3375:20:3375 | x | UseUseExplosion.rb:20:3371:20:3376 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3387:20:3392 | self | UseUseExplosion.rb:20:3387:20:3392 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3391:20:3391 | x | UseUseExplosion.rb:20:3387:20:3392 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3403:20:3408 | self | UseUseExplosion.rb:20:3403:20:3408 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3407:20:3407 | x | UseUseExplosion.rb:20:3403:20:3408 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3419:20:3424 | self | UseUseExplosion.rb:20:3419:20:3424 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3423:20:3423 | x | UseUseExplosion.rb:20:3419:20:3424 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3435:20:3440 | self | UseUseExplosion.rb:20:3435:20:3440 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3439:20:3439 | x | UseUseExplosion.rb:20:3435:20:3440 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3451:20:3456 | self | UseUseExplosion.rb:20:3451:20:3456 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3455:20:3455 | x | UseUseExplosion.rb:20:3451:20:3456 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3467:20:3472 | self | UseUseExplosion.rb:20:3467:20:3472 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3471:20:3471 | x | UseUseExplosion.rb:20:3467:20:3472 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3483:20:3488 | self | UseUseExplosion.rb:20:3483:20:3488 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3487:20:3487 | x | UseUseExplosion.rb:20:3483:20:3488 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3499:20:3504 | self | UseUseExplosion.rb:20:3499:20:3504 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3503:20:3503 | x | UseUseExplosion.rb:20:3499:20:3504 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3515:20:3520 | self | UseUseExplosion.rb:20:3515:20:3520 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3519:20:3519 | x | UseUseExplosion.rb:20:3515:20:3520 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3531:20:3536 | self | UseUseExplosion.rb:20:3531:20:3536 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3535:20:3535 | x | UseUseExplosion.rb:20:3531:20:3536 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3547:20:3552 | self | UseUseExplosion.rb:20:3547:20:3552 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3551:20:3551 | x | UseUseExplosion.rb:20:3547:20:3552 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3563:20:3568 | self | UseUseExplosion.rb:20:3563:20:3568 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3567:20:3567 | x | UseUseExplosion.rb:20:3563:20:3568 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3579:20:3584 | self | UseUseExplosion.rb:20:3579:20:3584 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3583:20:3583 | x | UseUseExplosion.rb:20:3579:20:3584 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3595:20:3600 | self | UseUseExplosion.rb:20:3595:20:3600 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3599:20:3599 | x | UseUseExplosion.rb:20:3595:20:3600 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3611:20:3616 | self | UseUseExplosion.rb:20:3611:20:3616 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3615:20:3615 | x | UseUseExplosion.rb:20:3611:20:3616 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3627:20:3632 | self | UseUseExplosion.rb:20:3627:20:3632 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3631:20:3631 | x | UseUseExplosion.rb:20:3627:20:3632 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3643:20:3648 | self | UseUseExplosion.rb:20:3643:20:3648 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3647:20:3647 | x | UseUseExplosion.rb:20:3643:20:3648 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3659:20:3664 | self | UseUseExplosion.rb:20:3659:20:3664 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3663:20:3663 | x | UseUseExplosion.rb:20:3659:20:3664 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3675:20:3680 | self | UseUseExplosion.rb:20:3675:20:3680 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3679:20:3679 | x | UseUseExplosion.rb:20:3675:20:3680 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:20:3691:20:3696 | call to use | self |
|
||||
| UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:3691:20:3696 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:13:21:17 | @prop | UseUseExplosion.rb:21:13:21:23 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:21:21:23 | 100 | UseUseExplosion.rb:21:13:21:23 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:35:21:39 | @prop | UseUseExplosion.rb:21:35:21:44 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:43:21:44 | 99 | UseUseExplosion.rb:21:35:21:44 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:56:21:60 | @prop | UseUseExplosion.rb:21:56:21:65 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:64:21:65 | 98 | UseUseExplosion.rb:21:56:21:65 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:77:21:81 | @prop | UseUseExplosion.rb:21:77:21:86 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:85:21:86 | 97 | UseUseExplosion.rb:21:77:21:86 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:98:21:102 | @prop | UseUseExplosion.rb:21:98:21:107 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:106:21:107 | 96 | UseUseExplosion.rb:21:98:21:107 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:119:21:123 | @prop | UseUseExplosion.rb:21:119:21:128 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:127:21:128 | 95 | UseUseExplosion.rb:21:119:21:128 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:140:21:144 | @prop | UseUseExplosion.rb:21:140:21:149 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:148:21:149 | 94 | UseUseExplosion.rb:21:140:21:149 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:161:21:165 | @prop | UseUseExplosion.rb:21:161:21:170 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:169:21:170 | 93 | UseUseExplosion.rb:21:161:21:170 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:182:21:186 | @prop | UseUseExplosion.rb:21:182:21:191 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:190:21:191 | 92 | UseUseExplosion.rb:21:182:21:191 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:203:21:207 | @prop | UseUseExplosion.rb:21:203:21:212 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:211:21:212 | 91 | UseUseExplosion.rb:21:203:21:212 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:224:21:228 | @prop | UseUseExplosion.rb:21:224:21:233 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:232:21:233 | 90 | UseUseExplosion.rb:21:224:21:233 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:245:21:249 | @prop | UseUseExplosion.rb:21:245:21:254 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:253:21:254 | 89 | UseUseExplosion.rb:21:245:21:254 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:266:21:270 | @prop | UseUseExplosion.rb:21:266:21:275 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:274:21:275 | 88 | UseUseExplosion.rb:21:266:21:275 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:287:21:291 | @prop | UseUseExplosion.rb:21:287:21:296 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:295:21:296 | 87 | UseUseExplosion.rb:21:287:21:296 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:308:21:312 | @prop | UseUseExplosion.rb:21:308:21:317 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:316:21:317 | 86 | UseUseExplosion.rb:21:308:21:317 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:329:21:333 | @prop | UseUseExplosion.rb:21:329:21:338 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:337:21:338 | 85 | UseUseExplosion.rb:21:329:21:338 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:350:21:354 | @prop | UseUseExplosion.rb:21:350:21:359 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:358:21:359 | 84 | UseUseExplosion.rb:21:350:21:359 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:371:21:375 | @prop | UseUseExplosion.rb:21:371:21:380 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:379:21:380 | 83 | UseUseExplosion.rb:21:371:21:380 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:392:21:396 | @prop | UseUseExplosion.rb:21:392:21:401 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:400:21:401 | 82 | UseUseExplosion.rb:21:392:21:401 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:413:21:417 | @prop | UseUseExplosion.rb:21:413:21:422 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:421:21:422 | 81 | UseUseExplosion.rb:21:413:21:422 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:434:21:438 | @prop | UseUseExplosion.rb:21:434:21:443 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:442:21:443 | 80 | UseUseExplosion.rb:21:434:21:443 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:455:21:459 | @prop | UseUseExplosion.rb:21:455:21:464 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:463:21:464 | 79 | UseUseExplosion.rb:21:455:21:464 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:476:21:480 | @prop | UseUseExplosion.rb:21:476:21:485 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:484:21:485 | 78 | UseUseExplosion.rb:21:476:21:485 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:497:21:501 | @prop | UseUseExplosion.rb:21:497:21:506 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:505:21:506 | 77 | UseUseExplosion.rb:21:497:21:506 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:518:21:522 | @prop | UseUseExplosion.rb:21:518:21:527 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:526:21:527 | 76 | UseUseExplosion.rb:21:518:21:527 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:539:21:543 | @prop | UseUseExplosion.rb:21:539:21:548 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:547:21:548 | 75 | UseUseExplosion.rb:21:539:21:548 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:560:21:564 | @prop | UseUseExplosion.rb:21:560:21:569 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:568:21:569 | 74 | UseUseExplosion.rb:21:560:21:569 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:581:21:585 | @prop | UseUseExplosion.rb:21:581:21:590 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:589:21:590 | 73 | UseUseExplosion.rb:21:581:21:590 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:602:21:606 | @prop | UseUseExplosion.rb:21:602:21:611 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:610:21:611 | 72 | UseUseExplosion.rb:21:602:21:611 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:623:21:627 | @prop | UseUseExplosion.rb:21:623:21:632 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:631:21:632 | 71 | UseUseExplosion.rb:21:623:21:632 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:644:21:648 | @prop | UseUseExplosion.rb:21:644:21:653 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:652:21:653 | 70 | UseUseExplosion.rb:21:644:21:653 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:665:21:669 | @prop | UseUseExplosion.rb:21:665:21:674 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:673:21:674 | 69 | UseUseExplosion.rb:21:665:21:674 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:686:21:690 | @prop | UseUseExplosion.rb:21:686:21:695 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:694:21:695 | 68 | UseUseExplosion.rb:21:686:21:695 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:707:21:711 | @prop | UseUseExplosion.rb:21:707:21:716 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:715:21:716 | 67 | UseUseExplosion.rb:21:707:21:716 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:728:21:732 | @prop | UseUseExplosion.rb:21:728:21:737 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:736:21:737 | 66 | UseUseExplosion.rb:21:728:21:737 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:749:21:753 | @prop | UseUseExplosion.rb:21:749:21:758 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:757:21:758 | 65 | UseUseExplosion.rb:21:749:21:758 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:770:21:774 | @prop | UseUseExplosion.rb:21:770:21:779 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:778:21:779 | 64 | UseUseExplosion.rb:21:770:21:779 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:791:21:795 | @prop | UseUseExplosion.rb:21:791:21:800 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:799:21:800 | 63 | UseUseExplosion.rb:21:791:21:800 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:812:21:816 | @prop | UseUseExplosion.rb:21:812:21:821 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:820:21:821 | 62 | UseUseExplosion.rb:21:812:21:821 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:833:21:837 | @prop | UseUseExplosion.rb:21:833:21:842 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:841:21:842 | 61 | UseUseExplosion.rb:21:833:21:842 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:854:21:858 | @prop | UseUseExplosion.rb:21:854:21:863 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:862:21:863 | 60 | UseUseExplosion.rb:21:854:21:863 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:875:21:879 | @prop | UseUseExplosion.rb:21:875:21:884 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:883:21:884 | 59 | UseUseExplosion.rb:21:875:21:884 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:896:21:900 | @prop | UseUseExplosion.rb:21:896:21:905 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:904:21:905 | 58 | UseUseExplosion.rb:21:896:21:905 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:917:21:921 | @prop | UseUseExplosion.rb:21:917:21:926 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:925:21:926 | 57 | UseUseExplosion.rb:21:917:21:926 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:938:21:942 | @prop | UseUseExplosion.rb:21:938:21:947 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:946:21:947 | 56 | UseUseExplosion.rb:21:938:21:947 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:959:21:963 | @prop | UseUseExplosion.rb:21:959:21:968 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:967:21:968 | 55 | UseUseExplosion.rb:21:959:21:968 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:980:21:984 | @prop | UseUseExplosion.rb:21:980:21:989 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:988:21:989 | 54 | UseUseExplosion.rb:21:980:21:989 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1001:21:1005 | @prop | UseUseExplosion.rb:21:1001:21:1010 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1009:21:1010 | 53 | UseUseExplosion.rb:21:1001:21:1010 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1022:21:1026 | @prop | UseUseExplosion.rb:21:1022:21:1031 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1030:21:1031 | 52 | UseUseExplosion.rb:21:1022:21:1031 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1043:21:1047 | @prop | UseUseExplosion.rb:21:1043:21:1052 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1051:21:1052 | 51 | UseUseExplosion.rb:21:1043:21:1052 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1064:21:1068 | @prop | UseUseExplosion.rb:21:1064:21:1073 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1072:21:1073 | 50 | UseUseExplosion.rb:21:1064:21:1073 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1085:21:1089 | @prop | UseUseExplosion.rb:21:1085:21:1094 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1093:21:1094 | 49 | UseUseExplosion.rb:21:1085:21:1094 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1106:21:1110 | @prop | UseUseExplosion.rb:21:1106:21:1115 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1114:21:1115 | 48 | UseUseExplosion.rb:21:1106:21:1115 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1127:21:1131 | @prop | UseUseExplosion.rb:21:1127:21:1136 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1135:21:1136 | 47 | UseUseExplosion.rb:21:1127:21:1136 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1148:21:1152 | @prop | UseUseExplosion.rb:21:1148:21:1157 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1156:21:1157 | 46 | UseUseExplosion.rb:21:1148:21:1157 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1169:21:1173 | @prop | UseUseExplosion.rb:21:1169:21:1178 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1177:21:1178 | 45 | UseUseExplosion.rb:21:1169:21:1178 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1190:21:1194 | @prop | UseUseExplosion.rb:21:1190:21:1199 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1198:21:1199 | 44 | UseUseExplosion.rb:21:1190:21:1199 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1211:21:1215 | @prop | UseUseExplosion.rb:21:1211:21:1220 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1219:21:1220 | 43 | UseUseExplosion.rb:21:1211:21:1220 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1232:21:1236 | @prop | UseUseExplosion.rb:21:1232:21:1241 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1240:21:1241 | 42 | UseUseExplosion.rb:21:1232:21:1241 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1253:21:1257 | @prop | UseUseExplosion.rb:21:1253:21:1262 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1261:21:1262 | 41 | UseUseExplosion.rb:21:1253:21:1262 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1274:21:1278 | @prop | UseUseExplosion.rb:21:1274:21:1283 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1282:21:1283 | 40 | UseUseExplosion.rb:21:1274:21:1283 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1295:21:1299 | @prop | UseUseExplosion.rb:21:1295:21:1304 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1303:21:1304 | 39 | UseUseExplosion.rb:21:1295:21:1304 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1316:21:1320 | @prop | UseUseExplosion.rb:21:1316:21:1325 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1324:21:1325 | 38 | UseUseExplosion.rb:21:1316:21:1325 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1337:21:1341 | @prop | UseUseExplosion.rb:21:1337:21:1346 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1345:21:1346 | 37 | UseUseExplosion.rb:21:1337:21:1346 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1358:21:1362 | @prop | UseUseExplosion.rb:21:1358:21:1367 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1366:21:1367 | 36 | UseUseExplosion.rb:21:1358:21:1367 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1379:21:1383 | @prop | UseUseExplosion.rb:21:1379:21:1388 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1387:21:1388 | 35 | UseUseExplosion.rb:21:1379:21:1388 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1400:21:1404 | @prop | UseUseExplosion.rb:21:1400:21:1409 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1408:21:1409 | 34 | UseUseExplosion.rb:21:1400:21:1409 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1421:21:1425 | @prop | UseUseExplosion.rb:21:1421:21:1430 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1429:21:1430 | 33 | UseUseExplosion.rb:21:1421:21:1430 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1442:21:1446 | @prop | UseUseExplosion.rb:21:1442:21:1451 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1450:21:1451 | 32 | UseUseExplosion.rb:21:1442:21:1451 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1463:21:1467 | @prop | UseUseExplosion.rb:21:1463:21:1472 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1471:21:1472 | 31 | UseUseExplosion.rb:21:1463:21:1472 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1484:21:1488 | @prop | UseUseExplosion.rb:21:1484:21:1493 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1492:21:1493 | 30 | UseUseExplosion.rb:21:1484:21:1493 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1505:21:1509 | @prop | UseUseExplosion.rb:21:1505:21:1514 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1513:21:1514 | 29 | UseUseExplosion.rb:21:1505:21:1514 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1526:21:1530 | @prop | UseUseExplosion.rb:21:1526:21:1535 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1534:21:1535 | 28 | UseUseExplosion.rb:21:1526:21:1535 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1547:21:1551 | @prop | UseUseExplosion.rb:21:1547:21:1556 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1555:21:1556 | 27 | UseUseExplosion.rb:21:1547:21:1556 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1568:21:1572 | @prop | UseUseExplosion.rb:21:1568:21:1577 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1576:21:1577 | 26 | UseUseExplosion.rb:21:1568:21:1577 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1589:21:1593 | @prop | UseUseExplosion.rb:21:1589:21:1598 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1597:21:1598 | 25 | UseUseExplosion.rb:21:1589:21:1598 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1610:21:1614 | @prop | UseUseExplosion.rb:21:1610:21:1619 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1618:21:1619 | 24 | UseUseExplosion.rb:21:1610:21:1619 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1631:21:1635 | @prop | UseUseExplosion.rb:21:1631:21:1640 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1639:21:1640 | 23 | UseUseExplosion.rb:21:1631:21:1640 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1652:21:1656 | @prop | UseUseExplosion.rb:21:1652:21:1661 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1660:21:1661 | 22 | UseUseExplosion.rb:21:1652:21:1661 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1673:21:1677 | @prop | UseUseExplosion.rb:21:1673:21:1682 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1681:21:1682 | 21 | UseUseExplosion.rb:21:1673:21:1682 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1694:21:1698 | @prop | UseUseExplosion.rb:21:1694:21:1703 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1702:21:1703 | 20 | UseUseExplosion.rb:21:1694:21:1703 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1715:21:1719 | @prop | UseUseExplosion.rb:21:1715:21:1724 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1723:21:1724 | 19 | UseUseExplosion.rb:21:1715:21:1724 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1736:21:1740 | @prop | UseUseExplosion.rb:21:1736:21:1745 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1744:21:1745 | 18 | UseUseExplosion.rb:21:1736:21:1745 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1757:21:1761 | @prop | UseUseExplosion.rb:21:1757:21:1766 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1765:21:1766 | 17 | UseUseExplosion.rb:21:1757:21:1766 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1778:21:1782 | @prop | UseUseExplosion.rb:21:1778:21:1787 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1786:21:1787 | 16 | UseUseExplosion.rb:21:1778:21:1787 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1799:21:1803 | @prop | UseUseExplosion.rb:21:1799:21:1808 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1807:21:1808 | 15 | UseUseExplosion.rb:21:1799:21:1808 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1820:21:1824 | @prop | UseUseExplosion.rb:21:1820:21:1829 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1828:21:1829 | 14 | UseUseExplosion.rb:21:1820:21:1829 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1841:21:1845 | @prop | UseUseExplosion.rb:21:1841:21:1850 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1849:21:1850 | 13 | UseUseExplosion.rb:21:1841:21:1850 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1862:21:1866 | @prop | UseUseExplosion.rb:21:1862:21:1871 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1870:21:1871 | 12 | UseUseExplosion.rb:21:1862:21:1871 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1883:21:1887 | @prop | UseUseExplosion.rb:21:1883:21:1892 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1891:21:1892 | 11 | UseUseExplosion.rb:21:1883:21:1892 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1904:21:1908 | @prop | UseUseExplosion.rb:21:1904:21:1913 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1912:21:1913 | 10 | UseUseExplosion.rb:21:1904:21:1913 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1925:21:1929 | @prop | UseUseExplosion.rb:21:1925:21:1933 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1933:21:1933 | 9 | UseUseExplosion.rb:21:1925:21:1933 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1945:21:1949 | @prop | UseUseExplosion.rb:21:1945:21:1953 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1953:21:1953 | 8 | UseUseExplosion.rb:21:1945:21:1953 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1965:21:1969 | @prop | UseUseExplosion.rb:21:1965:21:1973 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1973:21:1973 | 7 | UseUseExplosion.rb:21:1965:21:1973 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:1985:21:1989 | @prop | UseUseExplosion.rb:21:1985:21:1993 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:1993:21:1993 | 6 | UseUseExplosion.rb:21:1985:21:1993 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:2005:21:2009 | @prop | UseUseExplosion.rb:21:2005:21:2013 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:2013:21:2013 | 5 | UseUseExplosion.rb:21:2005:21:2013 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:2025:21:2029 | @prop | UseUseExplosion.rb:21:2025:21:2033 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:2033:21:2033 | 4 | UseUseExplosion.rb:21:2025:21:2033 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:2045:21:2049 | @prop | UseUseExplosion.rb:21:2045:21:2053 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:2053:21:2053 | 3 | UseUseExplosion.rb:21:2045:21:2053 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:2065:21:2069 | @prop | UseUseExplosion.rb:21:2065:21:2073 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:2073:21:2073 | 2 | UseUseExplosion.rb:21:2065:21:2073 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:2085:21:2089 | @prop | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | self |
|
||||
| UseUseExplosion.rb:21:2093:21:2093 | 1 | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | position 0 |
|
||||
| UseUseExplosion.rb:21:2107:21:2112 | self | UseUseExplosion.rb:21:2107:21:2112 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2111:21:2111 | x | UseUseExplosion.rb:21:2107:21:2112 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2123:21:2128 | self | UseUseExplosion.rb:21:2123:21:2128 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2127:21:2127 | x | UseUseExplosion.rb:21:2123:21:2128 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2139:21:2144 | self | UseUseExplosion.rb:21:2139:21:2144 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2143:21:2143 | x | UseUseExplosion.rb:21:2139:21:2144 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2155:21:2160 | self | UseUseExplosion.rb:21:2155:21:2160 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2159:21:2159 | x | UseUseExplosion.rb:21:2155:21:2160 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2171:21:2176 | self | UseUseExplosion.rb:21:2171:21:2176 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2175:21:2175 | x | UseUseExplosion.rb:21:2171:21:2176 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2187:21:2192 | self | UseUseExplosion.rb:21:2187:21:2192 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2191:21:2191 | x | UseUseExplosion.rb:21:2187:21:2192 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2203:21:2208 | self | UseUseExplosion.rb:21:2203:21:2208 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2207:21:2207 | x | UseUseExplosion.rb:21:2203:21:2208 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2219:21:2224 | self | UseUseExplosion.rb:21:2219:21:2224 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2223:21:2223 | x | UseUseExplosion.rb:21:2219:21:2224 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2235:21:2240 | self | UseUseExplosion.rb:21:2235:21:2240 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2239:21:2239 | x | UseUseExplosion.rb:21:2235:21:2240 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2251:21:2256 | self | UseUseExplosion.rb:21:2251:21:2256 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2255:21:2255 | x | UseUseExplosion.rb:21:2251:21:2256 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2267:21:2272 | self | UseUseExplosion.rb:21:2267:21:2272 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2271:21:2271 | x | UseUseExplosion.rb:21:2267:21:2272 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2283:21:2288 | self | UseUseExplosion.rb:21:2283:21:2288 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2287:21:2287 | x | UseUseExplosion.rb:21:2283:21:2288 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2299:21:2304 | self | UseUseExplosion.rb:21:2299:21:2304 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2303:21:2303 | x | UseUseExplosion.rb:21:2299:21:2304 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2315:21:2320 | self | UseUseExplosion.rb:21:2315:21:2320 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2319:21:2319 | x | UseUseExplosion.rb:21:2315:21:2320 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2331:21:2336 | self | UseUseExplosion.rb:21:2331:21:2336 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2335:21:2335 | x | UseUseExplosion.rb:21:2331:21:2336 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2347:21:2352 | self | UseUseExplosion.rb:21:2347:21:2352 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2351:21:2351 | x | UseUseExplosion.rb:21:2347:21:2352 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2363:21:2368 | self | UseUseExplosion.rb:21:2363:21:2368 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2367:21:2367 | x | UseUseExplosion.rb:21:2363:21:2368 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2379:21:2384 | self | UseUseExplosion.rb:21:2379:21:2384 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2383:21:2383 | x | UseUseExplosion.rb:21:2379:21:2384 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2395:21:2400 | self | UseUseExplosion.rb:21:2395:21:2400 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2399:21:2399 | x | UseUseExplosion.rb:21:2395:21:2400 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2411:21:2416 | self | UseUseExplosion.rb:21:2411:21:2416 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2415:21:2415 | x | UseUseExplosion.rb:21:2411:21:2416 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2427:21:2432 | self | UseUseExplosion.rb:21:2427:21:2432 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2431:21:2431 | x | UseUseExplosion.rb:21:2427:21:2432 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2443:21:2448 | self | UseUseExplosion.rb:21:2443:21:2448 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2447:21:2447 | x | UseUseExplosion.rb:21:2443:21:2448 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2459:21:2464 | self | UseUseExplosion.rb:21:2459:21:2464 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2463:21:2463 | x | UseUseExplosion.rb:21:2459:21:2464 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2475:21:2480 | self | UseUseExplosion.rb:21:2475:21:2480 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2479:21:2479 | x | UseUseExplosion.rb:21:2475:21:2480 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2491:21:2496 | self | UseUseExplosion.rb:21:2491:21:2496 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2495:21:2495 | x | UseUseExplosion.rb:21:2491:21:2496 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2507:21:2512 | self | UseUseExplosion.rb:21:2507:21:2512 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2511:21:2511 | x | UseUseExplosion.rb:21:2507:21:2512 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2523:21:2528 | self | UseUseExplosion.rb:21:2523:21:2528 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2527:21:2527 | x | UseUseExplosion.rb:21:2523:21:2528 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2539:21:2544 | self | UseUseExplosion.rb:21:2539:21:2544 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2543:21:2543 | x | UseUseExplosion.rb:21:2539:21:2544 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2555:21:2560 | self | UseUseExplosion.rb:21:2555:21:2560 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2559:21:2559 | x | UseUseExplosion.rb:21:2555:21:2560 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2571:21:2576 | self | UseUseExplosion.rb:21:2571:21:2576 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2575:21:2575 | x | UseUseExplosion.rb:21:2571:21:2576 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2587:21:2592 | self | UseUseExplosion.rb:21:2587:21:2592 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2591:21:2591 | x | UseUseExplosion.rb:21:2587:21:2592 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2603:21:2608 | self | UseUseExplosion.rb:21:2603:21:2608 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2607:21:2607 | x | UseUseExplosion.rb:21:2603:21:2608 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2619:21:2624 | self | UseUseExplosion.rb:21:2619:21:2624 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2623:21:2623 | x | UseUseExplosion.rb:21:2619:21:2624 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2635:21:2640 | self | UseUseExplosion.rb:21:2635:21:2640 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2639:21:2639 | x | UseUseExplosion.rb:21:2635:21:2640 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2651:21:2656 | self | UseUseExplosion.rb:21:2651:21:2656 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2655:21:2655 | x | UseUseExplosion.rb:21:2651:21:2656 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2667:21:2672 | self | UseUseExplosion.rb:21:2667:21:2672 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2671:21:2671 | x | UseUseExplosion.rb:21:2667:21:2672 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2683:21:2688 | self | UseUseExplosion.rb:21:2683:21:2688 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2687:21:2687 | x | UseUseExplosion.rb:21:2683:21:2688 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2699:21:2704 | self | UseUseExplosion.rb:21:2699:21:2704 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2703:21:2703 | x | UseUseExplosion.rb:21:2699:21:2704 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2715:21:2720 | self | UseUseExplosion.rb:21:2715:21:2720 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2719:21:2719 | x | UseUseExplosion.rb:21:2715:21:2720 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2731:21:2736 | self | UseUseExplosion.rb:21:2731:21:2736 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2735:21:2735 | x | UseUseExplosion.rb:21:2731:21:2736 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2747:21:2752 | self | UseUseExplosion.rb:21:2747:21:2752 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2751:21:2751 | x | UseUseExplosion.rb:21:2747:21:2752 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2763:21:2768 | self | UseUseExplosion.rb:21:2763:21:2768 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2767:21:2767 | x | UseUseExplosion.rb:21:2763:21:2768 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2779:21:2784 | self | UseUseExplosion.rb:21:2779:21:2784 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2783:21:2783 | x | UseUseExplosion.rb:21:2779:21:2784 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2795:21:2800 | self | UseUseExplosion.rb:21:2795:21:2800 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2799:21:2799 | x | UseUseExplosion.rb:21:2795:21:2800 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2811:21:2816 | self | UseUseExplosion.rb:21:2811:21:2816 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2815:21:2815 | x | UseUseExplosion.rb:21:2811:21:2816 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2827:21:2832 | self | UseUseExplosion.rb:21:2827:21:2832 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2831:21:2831 | x | UseUseExplosion.rb:21:2827:21:2832 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2843:21:2848 | self | UseUseExplosion.rb:21:2843:21:2848 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2847:21:2847 | x | UseUseExplosion.rb:21:2843:21:2848 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2859:21:2864 | self | UseUseExplosion.rb:21:2859:21:2864 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2863:21:2863 | x | UseUseExplosion.rb:21:2859:21:2864 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2875:21:2880 | self | UseUseExplosion.rb:21:2875:21:2880 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2879:21:2879 | x | UseUseExplosion.rb:21:2875:21:2880 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2891:21:2896 | self | UseUseExplosion.rb:21:2891:21:2896 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2895:21:2895 | x | UseUseExplosion.rb:21:2891:21:2896 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2907:21:2912 | self | UseUseExplosion.rb:21:2907:21:2912 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2911:21:2911 | x | UseUseExplosion.rb:21:2907:21:2912 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2923:21:2928 | self | UseUseExplosion.rb:21:2923:21:2928 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2927:21:2927 | x | UseUseExplosion.rb:21:2923:21:2928 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2939:21:2944 | self | UseUseExplosion.rb:21:2939:21:2944 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2943:21:2943 | x | UseUseExplosion.rb:21:2939:21:2944 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2955:21:2960 | self | UseUseExplosion.rb:21:2955:21:2960 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2959:21:2959 | x | UseUseExplosion.rb:21:2955:21:2960 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2971:21:2976 | self | UseUseExplosion.rb:21:2971:21:2976 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2975:21:2975 | x | UseUseExplosion.rb:21:2971:21:2976 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:2987:21:2992 | self | UseUseExplosion.rb:21:2987:21:2992 | call to use | self |
|
||||
| UseUseExplosion.rb:21:2991:21:2991 | x | UseUseExplosion.rb:21:2987:21:2992 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3003:21:3008 | self | UseUseExplosion.rb:21:3003:21:3008 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3007:21:3007 | x | UseUseExplosion.rb:21:3003:21:3008 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3019:21:3024 | self | UseUseExplosion.rb:21:3019:21:3024 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3023:21:3023 | x | UseUseExplosion.rb:21:3019:21:3024 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3035:21:3040 | self | UseUseExplosion.rb:21:3035:21:3040 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3039:21:3039 | x | UseUseExplosion.rb:21:3035:21:3040 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3051:21:3056 | self | UseUseExplosion.rb:21:3051:21:3056 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3055:21:3055 | x | UseUseExplosion.rb:21:3051:21:3056 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3067:21:3072 | self | UseUseExplosion.rb:21:3067:21:3072 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3071:21:3071 | x | UseUseExplosion.rb:21:3067:21:3072 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3083:21:3088 | self | UseUseExplosion.rb:21:3083:21:3088 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3087:21:3087 | x | UseUseExplosion.rb:21:3083:21:3088 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3099:21:3104 | self | UseUseExplosion.rb:21:3099:21:3104 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3103:21:3103 | x | UseUseExplosion.rb:21:3099:21:3104 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3115:21:3120 | self | UseUseExplosion.rb:21:3115:21:3120 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3119:21:3119 | x | UseUseExplosion.rb:21:3115:21:3120 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3131:21:3136 | self | UseUseExplosion.rb:21:3131:21:3136 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3135:21:3135 | x | UseUseExplosion.rb:21:3131:21:3136 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3147:21:3152 | self | UseUseExplosion.rb:21:3147:21:3152 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3151:21:3151 | x | UseUseExplosion.rb:21:3147:21:3152 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3163:21:3168 | self | UseUseExplosion.rb:21:3163:21:3168 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3167:21:3167 | x | UseUseExplosion.rb:21:3163:21:3168 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3179:21:3184 | self | UseUseExplosion.rb:21:3179:21:3184 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3183:21:3183 | x | UseUseExplosion.rb:21:3179:21:3184 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3195:21:3200 | self | UseUseExplosion.rb:21:3195:21:3200 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3199:21:3199 | x | UseUseExplosion.rb:21:3195:21:3200 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3211:21:3216 | self | UseUseExplosion.rb:21:3211:21:3216 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3215:21:3215 | x | UseUseExplosion.rb:21:3211:21:3216 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3227:21:3232 | self | UseUseExplosion.rb:21:3227:21:3232 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3231:21:3231 | x | UseUseExplosion.rb:21:3227:21:3232 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3243:21:3248 | self | UseUseExplosion.rb:21:3243:21:3248 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3247:21:3247 | x | UseUseExplosion.rb:21:3243:21:3248 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3259:21:3264 | self | UseUseExplosion.rb:21:3259:21:3264 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3263:21:3263 | x | UseUseExplosion.rb:21:3259:21:3264 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3275:21:3280 | self | UseUseExplosion.rb:21:3275:21:3280 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3279:21:3279 | x | UseUseExplosion.rb:21:3275:21:3280 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3291:21:3296 | self | UseUseExplosion.rb:21:3291:21:3296 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3295:21:3295 | x | UseUseExplosion.rb:21:3291:21:3296 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3307:21:3312 | self | UseUseExplosion.rb:21:3307:21:3312 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3311:21:3311 | x | UseUseExplosion.rb:21:3307:21:3312 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3323:21:3328 | self | UseUseExplosion.rb:21:3323:21:3328 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3327:21:3327 | x | UseUseExplosion.rb:21:3323:21:3328 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3339:21:3344 | self | UseUseExplosion.rb:21:3339:21:3344 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3343:21:3343 | x | UseUseExplosion.rb:21:3339:21:3344 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3355:21:3360 | self | UseUseExplosion.rb:21:3355:21:3360 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3359:21:3359 | x | UseUseExplosion.rb:21:3355:21:3360 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3371:21:3376 | self | UseUseExplosion.rb:21:3371:21:3376 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3375:21:3375 | x | UseUseExplosion.rb:21:3371:21:3376 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3387:21:3392 | self | UseUseExplosion.rb:21:3387:21:3392 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3391:21:3391 | x | UseUseExplosion.rb:21:3387:21:3392 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3403:21:3408 | self | UseUseExplosion.rb:21:3403:21:3408 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3407:21:3407 | x | UseUseExplosion.rb:21:3403:21:3408 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3419:21:3424 | self | UseUseExplosion.rb:21:3419:21:3424 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3423:21:3423 | x | UseUseExplosion.rb:21:3419:21:3424 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3435:21:3440 | self | UseUseExplosion.rb:21:3435:21:3440 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3439:21:3439 | x | UseUseExplosion.rb:21:3435:21:3440 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3451:21:3456 | self | UseUseExplosion.rb:21:3451:21:3456 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3455:21:3455 | x | UseUseExplosion.rb:21:3451:21:3456 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3467:21:3472 | self | UseUseExplosion.rb:21:3467:21:3472 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3471:21:3471 | x | UseUseExplosion.rb:21:3467:21:3472 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3483:21:3488 | self | UseUseExplosion.rb:21:3483:21:3488 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3487:21:3487 | x | UseUseExplosion.rb:21:3483:21:3488 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3499:21:3504 | self | UseUseExplosion.rb:21:3499:21:3504 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3503:21:3503 | x | UseUseExplosion.rb:21:3499:21:3504 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3515:21:3520 | self | UseUseExplosion.rb:21:3515:21:3520 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3519:21:3519 | x | UseUseExplosion.rb:21:3515:21:3520 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3531:21:3536 | self | UseUseExplosion.rb:21:3531:21:3536 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3535:21:3535 | x | UseUseExplosion.rb:21:3531:21:3536 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3547:21:3552 | self | UseUseExplosion.rb:21:3547:21:3552 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3551:21:3551 | x | UseUseExplosion.rb:21:3547:21:3552 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3563:21:3568 | self | UseUseExplosion.rb:21:3563:21:3568 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3567:21:3567 | x | UseUseExplosion.rb:21:3563:21:3568 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3579:21:3584 | self | UseUseExplosion.rb:21:3579:21:3584 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3583:21:3583 | x | UseUseExplosion.rb:21:3579:21:3584 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3595:21:3600 | self | UseUseExplosion.rb:21:3595:21:3600 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3599:21:3599 | x | UseUseExplosion.rb:21:3595:21:3600 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3611:21:3616 | self | UseUseExplosion.rb:21:3611:21:3616 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3615:21:3615 | x | UseUseExplosion.rb:21:3611:21:3616 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3627:21:3632 | self | UseUseExplosion.rb:21:3627:21:3632 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3631:21:3631 | x | UseUseExplosion.rb:21:3627:21:3632 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3643:21:3648 | self | UseUseExplosion.rb:21:3643:21:3648 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3647:21:3647 | x | UseUseExplosion.rb:21:3643:21:3648 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3659:21:3664 | self | UseUseExplosion.rb:21:3659:21:3664 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3663:21:3663 | x | UseUseExplosion.rb:21:3659:21:3664 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3675:21:3680 | self | UseUseExplosion.rb:21:3675:21:3680 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3679:21:3679 | x | UseUseExplosion.rb:21:3675:21:3680 | call to use | position 0 |
|
||||
| UseUseExplosion.rb:21:3691:21:3696 | self | UseUseExplosion.rb:21:3691:21:3696 | call to use | self |
|
||||
| UseUseExplosion.rb:21:3695:21:3695 | x | UseUseExplosion.rb:21:3691:21:3696 | call to use | position 0 |
|
||||
| local_dataflow.rb:3:8:3:10 | self | local_dataflow.rb:3:8:3:10 | call to p | self |
|
||||
| local_dataflow.rb:3:10:3:10 | a | local_dataflow.rb:3:8:3:10 | call to p | position 0 |
|
||||
| local_dataflow.rb:6:8:6:8 | a | local_dataflow.rb:6:10:6:11 | ... + ... | self |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
26
ruby/ql/test/library-tests/dataflow/local/UseUseExplosion.rb
Normal file
26
ruby/ql/test/library-tests/dataflow/local/UseUseExplosion.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
class C
|
||||
# Should generate 100 + 100 local use-use flow steps for `x`, and not 100 * 100
|
||||
#
|
||||
# Generated by quick-evaling `gen/0` below:
|
||||
#
|
||||
# ```ql
|
||||
# string gen(int depth) {
|
||||
# depth in [0 .. 100] and
|
||||
# (
|
||||
# if depth = 0
|
||||
# then result = ""
|
||||
# else result = "if (@prop > " + depth + ") then " + gen(depth - 1) + " else use(x) end"
|
||||
# )
|
||||
# }
|
||||
#
|
||||
# string gen() { result = "x = 0\n" + gen(100) + "\n" + gen(100) }
|
||||
# ```
|
||||
def m()
|
||||
x = 0
|
||||
if (@prop > 100) then if (@prop > 99) then if (@prop > 98) then if (@prop > 97) then if (@prop > 96) then if (@prop > 95) then if (@prop > 94) then if (@prop > 93) then if (@prop > 92) then if (@prop > 91) then if (@prop > 90) then if (@prop > 89) then if (@prop > 88) then if (@prop > 87) then if (@prop > 86) then if (@prop > 85) then if (@prop > 84) then if (@prop > 83) then if (@prop > 82) then if (@prop > 81) then if (@prop > 80) then if (@prop > 79) then if (@prop > 78) then if (@prop > 77) then if (@prop > 76) then if (@prop > 75) then if (@prop > 74) then if (@prop > 73) then if (@prop > 72) then if (@prop > 71) then if (@prop > 70) then if (@prop > 69) then if (@prop > 68) then if (@prop > 67) then if (@prop > 66) then if (@prop > 65) then if (@prop > 64) then if (@prop > 63) then if (@prop > 62) then if (@prop > 61) then if (@prop > 60) then if (@prop > 59) then if (@prop > 58) then if (@prop > 57) then if (@prop > 56) then if (@prop > 55) then if (@prop > 54) then if (@prop > 53) then if (@prop > 52) then if (@prop > 51) then if (@prop > 50) then if (@prop > 49) then if (@prop > 48) then if (@prop > 47) then if (@prop > 46) then if (@prop > 45) then if (@prop > 44) then if (@prop > 43) then if (@prop > 42) then if (@prop > 41) then if (@prop > 40) then if (@prop > 39) then if (@prop > 38) then if (@prop > 37) then if (@prop > 36) then if (@prop > 35) then if (@prop > 34) then if (@prop > 33) then if (@prop > 32) then if (@prop > 31) then if (@prop > 30) then if (@prop > 29) then if (@prop > 28) then if (@prop > 27) then if (@prop > 26) then if (@prop > 25) then if (@prop > 24) then if (@prop > 23) then if (@prop > 22) then if (@prop > 21) then if (@prop > 20) then if (@prop > 19) then if (@prop > 18) then if (@prop > 17) then if (@prop > 16) then if (@prop > 15) then if (@prop > 14) then if (@prop > 13) then if (@prop > 12) then if (@prop > 11) then if (@prop > 10) then if (@prop > 9) then if (@prop > 8) then if (@prop > 7) then if (@prop > 6) then if (@prop > 5) then if (@prop > 4) then if (@prop > 3) then if (@prop > 2) then if (@prop > 1) then else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end
|
||||
if (@prop > 100) then if (@prop > 99) then if (@prop > 98) then if (@prop > 97) then if (@prop > 96) then if (@prop > 95) then if (@prop > 94) then if (@prop > 93) then if (@prop > 92) then if (@prop > 91) then if (@prop > 90) then if (@prop > 89) then if (@prop > 88) then if (@prop > 87) then if (@prop > 86) then if (@prop > 85) then if (@prop > 84) then if (@prop > 83) then if (@prop > 82) then if (@prop > 81) then if (@prop > 80) then if (@prop > 79) then if (@prop > 78) then if (@prop > 77) then if (@prop > 76) then if (@prop > 75) then if (@prop > 74) then if (@prop > 73) then if (@prop > 72) then if (@prop > 71) then if (@prop > 70) then if (@prop > 69) then if (@prop > 68) then if (@prop > 67) then if (@prop > 66) then if (@prop > 65) then if (@prop > 64) then if (@prop > 63) then if (@prop > 62) then if (@prop > 61) then if (@prop > 60) then if (@prop > 59) then if (@prop > 58) then if (@prop > 57) then if (@prop > 56) then if (@prop > 55) then if (@prop > 54) then if (@prop > 53) then if (@prop > 52) then if (@prop > 51) then if (@prop > 50) then if (@prop > 49) then if (@prop > 48) then if (@prop > 47) then if (@prop > 46) then if (@prop > 45) then if (@prop > 44) then if (@prop > 43) then if (@prop > 42) then if (@prop > 41) then if (@prop > 40) then if (@prop > 39) then if (@prop > 38) then if (@prop > 37) then if (@prop > 36) then if (@prop > 35) then if (@prop > 34) then if (@prop > 33) then if (@prop > 32) then if (@prop > 31) then if (@prop > 30) then if (@prop > 29) then if (@prop > 28) then if (@prop > 27) then if (@prop > 26) then if (@prop > 25) then if (@prop > 24) then if (@prop > 23) then if (@prop > 22) then if (@prop > 21) then if (@prop > 20) then if (@prop > 19) then if (@prop > 18) then if (@prop > 17) then if (@prop > 16) then if (@prop > 15) then if (@prop > 14) then if (@prop > 13) then if (@prop > 12) then if (@prop > 11) then if (@prop > 10) then if (@prop > 9) then if (@prop > 8) then if (@prop > 7) then if (@prop > 6) then if (@prop > 5) then if (@prop > 4) then if (@prop > 3) then if (@prop > 2) then if (@prop > 1) then else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end else use(x) end
|
||||
end
|
||||
|
||||
def use(i)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,12 @@
|
||||
messageInstances
|
||||
| action_mailbox.rb:3:5:3:8 | call to mail |
|
||||
| action_mailbox.rb:4:5:4:8 | call to mail |
|
||||
| action_mailbox.rb:6:5:6:10 | call to mail |
|
||||
| action_mailbox.rb:10:5:10:8 | call to mail |
|
||||
| action_mailbox.rb:16:9:16:12 | call to mail |
|
||||
remoteFlowSources
|
||||
| action_mailbox.rb:3:5:3:13 | call to body |
|
||||
| action_mailbox.rb:4:5:4:11 | call to to |
|
||||
| action_mailbox.rb:6:5:6:13 | call to to |
|
||||
| action_mailbox.rb:10:5:10:18 | call to text_part |
|
||||
| action_mailbox.rb:16:9:16:23 | call to raw_source |
|
||||
@@ -0,0 +1,7 @@
|
||||
private import codeql.ruby.frameworks.ActionMailbox
|
||||
private import codeql.ruby.DataFlow
|
||||
private import codeql.ruby.dataflow.RemoteFlowSources
|
||||
|
||||
query predicate messageInstances(ActionMailbox::Mail c) { any() }
|
||||
|
||||
query predicate remoteFlowSources(RemoteFlowSource r) { any() }
|
||||
@@ -0,0 +1,24 @@
|
||||
class A < ActionMailbox::Base
|
||||
def process
|
||||
mail.body
|
||||
mail.to
|
||||
m = inbound_email
|
||||
m.mail.to
|
||||
end
|
||||
|
||||
def other_method
|
||||
mail.text_part
|
||||
end
|
||||
end
|
||||
|
||||
class B < A
|
||||
def process
|
||||
mail.raw_source
|
||||
end
|
||||
end
|
||||
|
||||
class C # not a mailbox class
|
||||
def process
|
||||
mail.subject
|
||||
end
|
||||
end
|
||||
@@ -136,6 +136,12 @@ calls.rb:
|
||||
# 605| SingletonC
|
||||
#-----| super -> SingletonA
|
||||
|
||||
# 618| Included
|
||||
|
||||
# 626| IncludesIncluded
|
||||
#-----| super -> Object
|
||||
#-----| include -> Included
|
||||
|
||||
hello.rb:
|
||||
# 1| EnglishWords
|
||||
|
||||
|
||||
@@ -233,6 +233,10 @@ getTarget
|
||||
| calls.rb:614:1:614:31 | call to call_call_singleton1 | calls.rb:591:5:593:7 | call_call_singleton1 |
|
||||
| calls.rb:615:1:615:31 | call to call_call_singleton1 | calls.rb:591:5:593:7 | call_call_singleton1 |
|
||||
| calls.rb:616:1:616:31 | call to call_call_singleton1 | calls.rb:591:5:593:7 | call_call_singleton1 |
|
||||
| calls.rb:620:9:620:16 | call to bar | calls.rb:622:5:623:7 | bar |
|
||||
| calls.rb:620:9:620:16 | call to bar | calls.rb:628:5:630:7 | bar |
|
||||
| calls.rb:627:5:627:20 | call to include | calls.rb:108:5:110:7 | include |
|
||||
| calls.rb:629:9:629:13 | call to super | calls.rb:622:5:623:7 | bar |
|
||||
| hello.rb:12:5:12:24 | call to include | calls.rb:108:5:110:7 | include |
|
||||
| hello.rb:14:16:14:20 | call to hello | hello.rb:2:5:4:7 | hello |
|
||||
| hello.rb:20:16:20:20 | call to super | hello.rb:13:5:15:7 | message |
|
||||
@@ -476,6 +480,9 @@ publicMethod
|
||||
| calls.rb:600:5:602:7 | call_singleton1 |
|
||||
| calls.rb:606:5:607:7 | singleton1 |
|
||||
| calls.rb:609:5:611:7 | call_singleton1 |
|
||||
| calls.rb:619:5:621:7 | foo |
|
||||
| calls.rb:622:5:623:7 | bar |
|
||||
| calls.rb:628:5:630:7 | bar |
|
||||
| hello.rb:2:5:4:7 | hello |
|
||||
| hello.rb:5:5:7:7 | world |
|
||||
| hello.rb:13:5:15:7 | message |
|
||||
|
||||
@@ -614,3 +614,19 @@ end
|
||||
SingletonA.call_call_singleton1
|
||||
SingletonB.call_call_singleton1
|
||||
SingletonC.call_call_singleton1
|
||||
|
||||
module Included
|
||||
def foo
|
||||
self.bar
|
||||
end
|
||||
def bar
|
||||
end
|
||||
end
|
||||
|
||||
class IncludesIncluded
|
||||
include Included
|
||||
def bar
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -45,6 +45,9 @@ getMethod
|
||||
| calls.rb:531:1:544:3 | ProtectedMethods | bar | calls.rb:534:15:536:7 | bar |
|
||||
| calls.rb:531:1:544:3 | ProtectedMethods | baz | calls.rb:538:5:543:7 | baz |
|
||||
| calls.rb:550:1:555:3 | ProtectedMethodsSub | baz | calls.rb:551:5:554:7 | baz |
|
||||
| calls.rb:618:1:624:3 | Included | bar | calls.rb:622:5:623:7 | bar |
|
||||
| calls.rb:618:1:624:3 | Included | foo | calls.rb:619:5:621:7 | foo |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | bar | calls.rb:628:5:630:7 | bar |
|
||||
| hello.rb:1:1:8:3 | EnglishWords | hello | hello.rb:2:5:4:7 | hello |
|
||||
| hello.rb:1:1:8:3 | EnglishWords | world | hello.rb:5:5:7:7 | world |
|
||||
| hello.rb:11:1:16:3 | Greeting | message | hello.rb:13:5:15:7 | message |
|
||||
@@ -478,6 +481,22 @@ lookupMethod
|
||||
| calls.rb:605:1:612:3 | SingletonC | private_on_main | calls.rb:185:1:186:3 | private_on_main |
|
||||
| calls.rb:605:1:612:3 | SingletonC | puts | calls.rb:102:5:102:30 | puts |
|
||||
| calls.rb:605:1:612:3 | SingletonC | to_s | calls.rb:172:5:173:7 | to_s |
|
||||
| calls.rb:618:1:624:3 | Included | bar | calls.rb:622:5:623:7 | bar |
|
||||
| calls.rb:618:1:624:3 | Included | foo | calls.rb:619:5:621:7 | foo |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | add_singleton | calls.rb:367:1:371:3 | add_singleton |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | bar | calls.rb:628:5:630:7 | bar |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | call_block | calls.rb:81:1:83:3 | call_block |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | call_instance_m | calls.rb:39:1:41:3 | call_instance_m |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | create | calls.rb:278:1:286:3 | create |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | foo | calls.rb:619:5:621:7 | foo |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | funny | calls.rb:140:1:142:3 | funny |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | indirect | calls.rb:158:1:160:3 | indirect |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | new | calls.rb:117:5:117:16 | new |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | optional_arg | calls.rb:76:1:79:3 | optional_arg |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | pattern_dispatch | calls.rb:343:1:359:3 | pattern_dispatch |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | private_on_main | calls.rb:185:1:186:3 | private_on_main |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | puts | calls.rb:102:5:102:30 | puts |
|
||||
| calls.rb:626:1:631:3 | IncludesIncluded | to_s | calls.rb:172:5:173:7 | to_s |
|
||||
| file://:0:0:0:0 | Class | include | calls.rb:108:5:110:7 | include |
|
||||
| file://:0:0:0:0 | Class | module_eval | calls.rb:107:5:107:24 | module_eval |
|
||||
| file://:0:0:0:0 | Class | new | calls.rb:117:5:117:16 | new |
|
||||
@@ -965,6 +984,9 @@ enclosingMethod
|
||||
| calls.rb:601:9:601:18 | self | calls.rb:600:5:602:7 | call_singleton1 |
|
||||
| calls.rb:610:9:610:18 | call to singleton1 | calls.rb:609:5:611:7 | call_singleton1 |
|
||||
| calls.rb:610:9:610:18 | self | calls.rb:609:5:611:7 | call_singleton1 |
|
||||
| calls.rb:620:9:620:12 | self | calls.rb:619:5:621:7 | foo |
|
||||
| calls.rb:620:9:620:16 | call to bar | calls.rb:619:5:621:7 | foo |
|
||||
| calls.rb:629:9:629:13 | call to super | calls.rb:628:5:630:7 | bar |
|
||||
| hello.rb:3:9:3:22 | return | hello.rb:2:5:4:7 | hello |
|
||||
| hello.rb:3:16:3:22 | "hello" | hello.rb:2:5:4:7 | hello |
|
||||
| hello.rb:3:17:3:21 | hello | hello.rb:2:5:4:7 | hello |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -131,6 +131,11 @@ calls.rb:
|
||||
# 605| SingletonC
|
||||
#-----| -> SingletonA
|
||||
|
||||
# 618| Included
|
||||
|
||||
# 626| IncludesIncluded
|
||||
#-----| -> Object
|
||||
|
||||
hello.rb:
|
||||
# 1| EnglishWords
|
||||
|
||||
|
||||
@@ -2,12 +2,38 @@ edges
|
||||
| KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:3:12:3:24 | ...[...] : |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:4:10:4:13 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:5:13:5:16 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:6:14:6:17 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:7:16:7:19 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:8:17:8:20 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:9:16:9:19 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:10:18:10:21 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:11:14:11:17 | file |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:13:23:13:26 | file : |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:26:10:26:13 | file |
|
||||
| KernelOpen.rb:13:23:13:26 | file : | KernelOpen.rb:13:13:13:31 | call to join |
|
||||
nodes
|
||||
| KernelOpen.rb:3:12:3:17 | call to params : | semmle.label | call to params : |
|
||||
| KernelOpen.rb:3:12:3:24 | ...[...] : | semmle.label | ...[...] : |
|
||||
| KernelOpen.rb:4:10:4:13 | file | semmle.label | file |
|
||||
| KernelOpen.rb:5:13:5:16 | file | semmle.label | file |
|
||||
| KernelOpen.rb:6:14:6:17 | file | semmle.label | file |
|
||||
| KernelOpen.rb:7:16:7:19 | file | semmle.label | file |
|
||||
| KernelOpen.rb:8:17:8:20 | file | semmle.label | file |
|
||||
| KernelOpen.rb:9:16:9:19 | file | semmle.label | file |
|
||||
| KernelOpen.rb:10:18:10:21 | file | semmle.label | file |
|
||||
| KernelOpen.rb:11:14:11:17 | file | semmle.label | file |
|
||||
| KernelOpen.rb:13:13:13:31 | call to join | semmle.label | call to join |
|
||||
| KernelOpen.rb:13:23:13:26 | file : | semmle.label | file : |
|
||||
| KernelOpen.rb:26:10:26:13 | file | semmle.label | file |
|
||||
subpaths
|
||||
#select
|
||||
| KernelOpen.rb:4:10:4:13 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:4:10:4:13 | file | This call to Kernel.open depends on a $@. Consider replacing it with File.open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:5:13:5:16 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:5:13:5:16 | file | This call to IO.read depends on a $@. Consider replacing it with File.read. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:6:14:6:17 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:6:14:6:17 | file | This call to IO.write depends on a $@. Consider replacing it with File.write. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:7:16:7:19 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:7:16:7:19 | file | This call to IO.binread depends on a $@. Consider replacing it with File.binread. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:8:17:8:20 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:8:17:8:20 | file | This call to IO.binwrite depends on a $@. Consider replacing it with File.binwrite. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:9:16:9:19 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:9:16:9:19 | file | This call to IO.foreach depends on a $@. Consider replacing it with File.foreach. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:10:18:10:21 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:10:18:10:21 | file | This call to IO.readlines depends on a $@. Consider replacing it with File.readlines. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:11:14:11:17 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:11:14:11:17 | file | This call to URI.open depends on a $@. Consider replacing it with URI(<uri>).open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:13:13:13:31 | call to join | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:13:13:13:31 | call to join | This call to IO.read depends on a $@. Consider replacing it with File.read. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
| KernelOpen.rb:26:10:26:13 | file | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:26:10:26:13 | file | This call to Kernel.open depends on a $@. Consider replacing it with File.open. | KernelOpen.rb:3:12:3:17 | call to params | user-provided value |
|
||||
|
||||
@@ -3,6 +3,15 @@ class UsersController < ActionController::Base
|
||||
file = params[:file]
|
||||
open(file) # BAD
|
||||
IO.read(file) # BAD
|
||||
IO.write(file) # BAD
|
||||
IO.binread(file) # BAD
|
||||
IO.binwrite(file) # BAD
|
||||
IO.foreach(file) # BAD
|
||||
IO.readlines(file) # BAD
|
||||
URI.open(file) # BAD
|
||||
|
||||
IO.read(File.join(file, "")) # BAD - file as first argument to File.join
|
||||
IO.read(File.join("", file)) # GOOD - file path is sanitised by guard
|
||||
|
||||
File.open(file).read # GOOD
|
||||
|
||||
@@ -13,5 +22,7 @@ class UsersController < ActionController::Base
|
||||
if %w(some/const/1.txt some/const/2.txt).include? file
|
||||
IO.read(file) # GOOD - file path is sanitised by guard
|
||||
end
|
||||
|
||||
open(file) # BAD - sanity check to verify that file was not mistakenly marked as sanitized
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
| NonConstantKernelOpen.rb:4:5:4:14 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. |
|
||||
| NonConstantKernelOpen.rb:5:5:5:17 | call to read | Call to IO.read with a non-constant value. Consider replacing it with File.read. |
|
||||
| NonConstantKernelOpen.rb:9:5:9:21 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. |
|
||||
| NonConstantKernelOpen.rb:19:5:19:33 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. |
|
||||
| NonConstantKernelOpen.rb:6:5:6:18 | call to write | Call to IO.write with a non-constant value. Consider replacing it with File.write. |
|
||||
| NonConstantKernelOpen.rb:7:5:7:20 | call to binread | Call to IO.binread with a non-constant value. Consider replacing it with File.binread. |
|
||||
| NonConstantKernelOpen.rb:8:5:8:21 | call to binwrite | Call to IO.binwrite with a non-constant value. Consider replacing it with File.binwrite. |
|
||||
| NonConstantKernelOpen.rb:9:5:9:20 | call to foreach | Call to IO.foreach with a non-constant value. Consider replacing it with File.foreach. |
|
||||
| NonConstantKernelOpen.rb:10:5:10:22 | call to readlines | Call to IO.readlines with a non-constant value. Consider replacing it with File.readlines. |
|
||||
| NonConstantKernelOpen.rb:11:5:11:18 | call to open | Call to URI.open with a non-constant value. Consider replacing it with URI(<uri>).open. |
|
||||
| NonConstantKernelOpen.rb:15:5:15:21 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. |
|
||||
| NonConstantKernelOpen.rb:25:5:25:33 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. |
|
||||
| NonConstantKernelOpen.rb:33:5:33:14 | call to open | Call to Kernel.open with a non-constant value. Consider replacing it with File.open. |
|
||||
|
||||
@@ -3,6 +3,12 @@ class UsersController < ActionController::Base
|
||||
file = params[:file]
|
||||
open(file) # BAD
|
||||
IO.read(file) # BAD
|
||||
IO.write(file) # BAD
|
||||
IO.binread(file) # BAD
|
||||
IO.binwrite(file) # BAD
|
||||
IO.foreach(file) # BAD
|
||||
IO.readlines(file) # BAD
|
||||
URI.open(file) # BAD
|
||||
|
||||
File.open(file).read # GOOD
|
||||
|
||||
@@ -19,5 +25,11 @@ class UsersController < ActionController::Base
|
||||
Kernel.open("#{this_is} bad") # BAD
|
||||
|
||||
open("| #{this_is_an_explicit_command} foo bar") # GOOD
|
||||
|
||||
IO.foreach("|" + EnvUtil.rubybin + " -e 'puts :foo; puts :bar; puts :baz'") {|x| a << x } # GOOD
|
||||
|
||||
IO.write(File.join("foo", "bar.txt"), "bar") # GOOD
|
||||
|
||||
open(file) # BAD - sanity check to verify that file was not mistakenly marked as sanitized
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user