Merge branch 'main' of https://github.com/github/codeql into oscarsj/merge-back-rc-3.21

This commit is contained in:
Óscar San José
2026-03-06 16:20:36 +01:00
846 changed files with 87321 additions and 58588 deletions

View File

@@ -10,5 +10,5 @@ where
e.isNthChildOf(be, i) and i != 0 and i != 1 and reason = "Unexpected operand " + i.toString()
)
or
be.getOp() = " ?? " and reason = "No operator name"
be.getOp() = "??" and reason = "No operator name"
select be, reason

View File

@@ -0,0 +1,2 @@
import java
import ControlFlow::Consistency

View File

@@ -0,0 +1,16 @@
---
category: breaking
---
* The Java control flow graph (CFG) implementation has been completely
rewritten. The CFG now includes additional nodes to more accurately represent
certain constructs. This also means that any existing code that implicitly
relies on very specific details about the CFG may need to be updated.
The CFG now only includes the nodes that are reachable from the entry point.
Additionally, the following breaking changes have been made:
- `ControlFlowNode.asCall` has been removed - use `Call.getControlFlowNode` instead.
- `ControlFlowNode.getEnclosingStmt` has been removed.
- `ControlFlow::ExprNode` has been removed.
- `ControlFlow::StmtNode` has been removed.
- `ControlFlow::Node` has been removed - this was merely an alias of
`ControlFlowNode`, which is still available.
- Previously deprecated predicates on `BasicBlock` have been removed.

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* The class `Assignment` now extends `BinaryExpr`. Uses of `BinaryExpr` may in some cases need slight adjustment.

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* Inline expectations test comments, which are of the form `// $ tag` or `// $ tag=value`, are now parsed more strictly and will not be recognized if there isn't a space after the `$` symbol.

View File

@@ -815,6 +815,7 @@ when_branch_else(unique int id: @whenbranch ref);
| @geexpr
| @eqexpr
| @neexpr
| @assignment
| @valueeqexpr
| @valueneexpr;

View File

@@ -57,7 +57,7 @@ extensions:
- ["java.net", "InetSocketAddress", True, "getPort", "()", "", "Argument[this].SyntheticField[java.net.InetSocketAddress.port]", "ReturnValue", "taint", "manual"]
- ["java.net", "URI", False, "resolve", "(URI)", "", "Argument[this]", "ReturnValue", "taint", "ai-manual"]
- ["java.net", "URI", False, "URI", "(String,String,String,int,String,String,String)", "", "Argument[5]", "Argument[this].SyntheticField[java.net.URI.query]", "taint", "ai-manual"]
- ["java.net", "URI", False, "URI", "(String,String,String)", "", "Argument[1]", "ReturnValue", "taint", "ai-manual"]
- ["java.net", "URI", False, "URI", "(String,String,String)", "", "Argument[1]", "Argument[this]", "taint", "ai-manual"]
- ["java.net", "URI", False, "URI", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["java.net", "URI", False, "create", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["java.net", "URI", False, "getPath", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]

View File

@@ -4,7 +4,7 @@ extensions:
extensible: summaryModel
data:
- ["java.util.zip", "GZIPInputStream", False, "GZIPInputStream", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["java.util.zip", "ZipEntry", True, "ZipEntry", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-manual"]
- ["java.util.zip", "ZipEntry", True, "ZipEntry", "(String)", "", "Argument[0]", "Argument[this]", "taint", "ai-manual"]
- ["java.util.zip", "ZipFile", True, "ZipFile", "(File)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["java.util.zip", "ZipFile", True, "ZipFile", "(File,Charset)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["java.util.zip", "ZipFile", True, "ZipFile", "(File,int)", "", "Argument[0]", "Argument[this]", "taint", "manual"]

View File

@@ -3,8 +3,8 @@ extensions:
pack: codeql/java-all
extensible: summaryModel
data:
- ["org.apache.hc.core5.http.io.entity", "BasicHttpEntity", True, "BasicHttpEntity", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "BufferedHttpEntity", True, "BufferedHttpEntity", "(HttpEntity)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "BasicHttpEntity", True, "BasicHttpEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "BufferedHttpEntity", True, "BufferedHttpEntity", "(HttpEntity)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "ByteArrayEntity", True, "ByteArrayEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "EntityUtils", True, "parse", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "EntityUtils", True, "toByteArray", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
@@ -14,6 +14,6 @@ extensions:
- ["org.apache.hc.core5.http.io.entity", "HttpEntities", True, "createUrlEncoded", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "HttpEntities", True, "gzip", "(HttpEntity)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "HttpEntities", True, "withTrailers", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "HttpEntityWrapper", True, "HttpEntityWrapper", "(HttpEntity)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "InputStreamEntity", True, "InputStreamEntity", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "HttpEntityWrapper", True, "HttpEntityWrapper", "(HttpEntity)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "InputStreamEntity", True, "InputStreamEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.hc.core5.http.io.entity", "StringEntity", True, "StringEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]

View File

@@ -4,8 +4,8 @@ extensions:
extensible: summaryModel
data:
- ["org.apache.http.entity", "BasicHttpEntity", True, "setContent", "(InputStream)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.http.entity", "BufferedHttpEntity", True, "BufferedHttpEntity", "(HttpEntity)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.http.entity", "BufferedHttpEntity", True, "BufferedHttpEntity", "(HttpEntity)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.http.entity", "ByteArrayEntity", True, "ByteArrayEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.http.entity", "HttpEntityWrapper", True, "HttpEntityWrapper", "(HttpEntity)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.http.entity", "InputStreamEntity", True, "InputStreamEntity", "", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["org.apache.http.entity", "HttpEntityWrapper", True, "HttpEntityWrapper", "(HttpEntity)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.http.entity", "InputStreamEntity", True, "InputStreamEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["org.apache.http.entity", "StringEntity", True, "StringEntity", "", "", "Argument[0]", "Argument[this]", "taint", "manual"]

View File

@@ -21,7 +21,7 @@ external int selectedSourceColumn();
private predicate selectedSourceColumnAlias = selectedSourceColumn/0;
module ViewCfgQueryInput implements ViewCfgQueryInputSig<File> {
module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig<File> {
predicate selectedSourceFile = selectedSourceFileAlias/0;
predicate selectedSourceLine = selectedSourceLineAlias/0;
@@ -42,4 +42,4 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig<File> {
}
}
import ViewCfgQuery<File, ViewCfgQueryInput>
import ControlFlow::ViewCfgQuery<File, ViewCfgQueryInput>

View File

@@ -1,96 +0,0 @@
/**
* Provides classes and predicates for representing completions.
*/
overlay[local?]
module;
/*
* A completion represents how a statement or expression terminates.
*
* There are five kinds of completions: normal completion,
* `return` completion, `break` completion,
* `continue` completion, and `throw` completion.
*
* Normal completions are further subdivided into boolean completions and all
* other normal completions. A boolean completion adds the information that the
* cfg node terminated with the given boolean value due to a subexpression
* terminating with the other given boolean value. This is only
* relevant for conditional contexts in which the value controls the
* control-flow successor.
*/
import java
/**
* A label of a `LabeledStmt`.
*/
newtype Label = MkLabel(string l) { exists(LabeledStmt lbl | l = lbl.getLabel()) }
/**
* Either a `Label` or nothing.
*/
newtype MaybeLabel =
JustLabel(Label l) or
NoLabel()
/**
* A completion of a statement or an expression.
*/
newtype Completion =
/**
* The statement or expression completes normally and continues to the next statement.
*/
NormalCompletion() or
/**
* The statement or expression completes by returning from the function.
*/
ReturnCompletion() or
/**
* The expression completes with value `outerValue` overall and with the last control
* flow node having value `innerValue`.
*/
BooleanCompletion(boolean outerValue, boolean innerValue) {
(outerValue = true or outerValue = false) and
(innerValue = true or innerValue = false)
} or
/**
* The expression or statement completes via a `break` statement.
*/
BreakCompletion(MaybeLabel l) or
/**
* The expression or statement completes via a `yield` statement.
*/
YieldCompletion(NormalOrBooleanCompletion c) or
/**
* The expression or statement completes via a `continue` statement.
*/
ContinueCompletion(MaybeLabel l) or
/**
* The expression or statement completes by throwing a `ThrowableType`.
*/
ThrowCompletion(ThrowableType tt)
/** A completion that is either a `NormalCompletion` or a `BooleanCompletion`. */
class NormalOrBooleanCompletion extends Completion {
NormalOrBooleanCompletion() {
this instanceof NormalCompletion or this instanceof BooleanCompletion
}
/** Gets a textual representation of this completion. */
string toString() { result = "completion" }
}
/** Gets the completion `ContinueCompletion(NoLabel())`. */
ContinueCompletion anonymousContinueCompletion() { result = ContinueCompletion(NoLabel()) }
/** Gets the completion `ContinueCompletion(JustLabel(l))`. */
ContinueCompletion labelledContinueCompletion(Label l) { result = ContinueCompletion(JustLabel(l)) }
/** Gets the completion `BreakCompletion(NoLabel())`. */
BreakCompletion anonymousBreakCompletion() { result = BreakCompletion(NoLabel()) }
/** Gets the completion `BreakCompletion(JustLabel(l))`. */
BreakCompletion labelledBreakCompletion(Label l) { result = BreakCompletion(JustLabel(l)) }
/** Gets the completion `BooleanCompletion(value, value)`. */
Completion basicBooleanCompletion(boolean value) { result = BooleanCompletion(value, value) }

File diff suppressed because it is too large Load Diff

View File

@@ -392,7 +392,7 @@ class ArrayInit extends Expr, @arrayinit {
* element assignments since there the assignment destination is not directly
* the array variable but instead an `ArrayAccess`.
*/
class Assignment extends Expr, @assignment {
class Assignment extends BinaryExpr, @assignment {
/** Gets the destination (left-hand side) of the assignment. */
Expr getDest() { result.isNthChildOf(this, 0) }
@@ -417,6 +417,8 @@ class Assignment extends Expr, @assignment {
* For example, `x = 23`.
*/
class AssignExpr extends Assignment, @assignexpr {
override string getOp() { result = "=" }
override string getAPrimaryQlClass() { result = "AssignExpr" }
}
@@ -445,7 +447,7 @@ class AssignOp extends Assignment, @assignop {
override Expr getSource() { result.getParent() = this }
/** Gets a string representation of the assignment operator of this compound assignment. */
/*abstract*/ string getOp() { result = "??=" }
/*abstract*/ override string getOp() { result = "??=" }
/** Gets a printable representation of this expression. */
override string toString() { result = "..." + this.getOp() + "..." }
@@ -739,155 +741,155 @@ class BinaryExpr extends Expr, @binaryexpr {
}
/** Gets a printable representation of this expression. */
override string toString() { result = "..." + this.getOp() + "..." }
override string toString() { result = "... " + this.getOp() + " ..." }
/** Gets a string representation of the operator of this binary expression. */
/*abstract*/ string getOp() { result = " ?? " }
/*abstract*/ string getOp() { result = "??" }
}
/** A binary expression using the `*` operator. */
class MulExpr extends BinaryExpr, @mulexpr {
override string getOp() { result = " * " }
override string getOp() { result = "*" }
override string getAPrimaryQlClass() { result = "MulExpr" }
}
/** A binary expression using the `/` operator. */
class DivExpr extends BinaryExpr, @divexpr {
override string getOp() { result = " / " }
override string getOp() { result = "/" }
override string getAPrimaryQlClass() { result = "DivExpr" }
}
/** A binary expression using the `%` operator. */
class RemExpr extends BinaryExpr, @remexpr {
override string getOp() { result = " % " }
override string getOp() { result = "%" }
override string getAPrimaryQlClass() { result = "RemExpr" }
}
/** A binary expression using the `+` operator. */
class AddExpr extends BinaryExpr, @addexpr {
override string getOp() { result = " + " }
override string getOp() { result = "+" }
override string getAPrimaryQlClass() { result = "AddExpr" }
}
/** A binary expression using the `-` operator. */
class SubExpr extends BinaryExpr, @subexpr {
override string getOp() { result = " - " }
override string getOp() { result = "-" }
override string getAPrimaryQlClass() { result = "SubExpr" }
}
/** A binary expression using the `<<` operator. */
class LeftShiftExpr extends BinaryExpr, @lshiftexpr {
override string getOp() { result = " << " }
override string getOp() { result = "<<" }
override string getAPrimaryQlClass() { result = "LeftShiftExpr" }
}
/** A binary expression using the `>>` operator. */
class RightShiftExpr extends BinaryExpr, @rshiftexpr {
override string getOp() { result = " >> " }
override string getOp() { result = ">>" }
override string getAPrimaryQlClass() { result = "RightShiftExpr" }
}
/** A binary expression using the `>>>` operator. */
class UnsignedRightShiftExpr extends BinaryExpr, @urshiftexpr {
override string getOp() { result = " >>> " }
override string getOp() { result = ">>>" }
override string getAPrimaryQlClass() { result = "UnsignedRightShiftExpr" }
}
/** A binary expression using the `&` operator. */
class AndBitwiseExpr extends BinaryExpr, @andbitexpr {
override string getOp() { result = " & " }
override string getOp() { result = "&" }
override string getAPrimaryQlClass() { result = "AndBitwiseExpr" }
}
/** A binary expression using the `|` operator. */
class OrBitwiseExpr extends BinaryExpr, @orbitexpr {
override string getOp() { result = " | " }
override string getOp() { result = "|" }
override string getAPrimaryQlClass() { result = "OrBitwiseExpr" }
}
/** A binary expression using the `^` operator. */
class XorBitwiseExpr extends BinaryExpr, @xorbitexpr {
override string getOp() { result = " ^ " }
override string getOp() { result = "^" }
override string getAPrimaryQlClass() { result = "XorBitwiseExpr" }
}
/** A binary expression using the `&&` operator. */
class AndLogicalExpr extends BinaryExpr, @andlogicalexpr {
override string getOp() { result = " && " }
override string getOp() { result = "&&" }
override string getAPrimaryQlClass() { result = "AndLogicalExpr" }
}
/** A binary expression using the `||` operator. */
class OrLogicalExpr extends BinaryExpr, @orlogicalexpr {
override string getOp() { result = " || " }
override string getOp() { result = "||" }
override string getAPrimaryQlClass() { result = "OrLogicalExpr" }
}
/** A binary expression using the `<` operator. */
class LTExpr extends BinaryExpr, @ltexpr {
override string getOp() { result = " < " }
override string getOp() { result = "<" }
override string getAPrimaryQlClass() { result = "LTExpr" }
}
/** A binary expression using the `>` operator. */
class GTExpr extends BinaryExpr, @gtexpr {
override string getOp() { result = " > " }
override string getOp() { result = ">" }
override string getAPrimaryQlClass() { result = "GTExpr" }
}
/** A binary expression using the `<=` operator. */
class LEExpr extends BinaryExpr, @leexpr {
override string getOp() { result = " <= " }
override string getOp() { result = "<=" }
override string getAPrimaryQlClass() { result = "LEExpr" }
}
/** A binary expression using the `>=` operator. */
class GEExpr extends BinaryExpr, @geexpr {
override string getOp() { result = " >= " }
override string getOp() { result = ">=" }
override string getAPrimaryQlClass() { result = "GEExpr" }
}
/** A binary expression using Java's `==` or Kotlin's `===` operator. */
class EQExpr extends BinaryExpr, @eqexpr {
override string getOp() { result = " == " }
override string getOp() { result = "==" }
override string getAPrimaryQlClass() { result = "EQExpr" }
}
/** A binary expression using the Kotlin `==` operator, semantically equivalent to `Objects.equals`. */
class ValueEQExpr extends BinaryExpr, @valueeqexpr {
override string getOp() { result = " (value equals) " }
override string getOp() { result = "(value equals)" }
override string getAPrimaryQlClass() { result = "ValueEQExpr" }
}
/** A binary expression using Java's `!=` or Kotlin's `!==` operator. */
class NEExpr extends BinaryExpr, @neexpr {
override string getOp() { result = " != " }
override string getOp() { result = "!=" }
override string getAPrimaryQlClass() { result = "NEExpr" }
}
/** A binary expression using the Kotlin `!=` operator, semantically equivalent to `Objects.equals`. */
class ValueNEExpr extends BinaryExpr, @valueneexpr {
override string getOp() { result = " (value not-equals) " }
override string getOp() { result = "(value not-equals)" }
override string getAPrimaryQlClass() { result = "ValueNEExpr" }
}
@@ -1245,6 +1247,9 @@ class ClassInstanceExpr extends Expr, ConstructorCall, @classinstancexpr {
/** Gets the immediately enclosing statement of this class instance creation expression. */
override Stmt getEnclosingStmt() { result = Expr.super.getEnclosingStmt() }
/** Gets the `ControlFlowNode` corresponding to this call. */
override ControlFlowNode getControlFlowNode() { result = Expr.super.getControlFlowNode() }
/** Gets a printable representation of this expression. */
override string toString() {
result = "new " + this.getConstructor().getName() + "(...)"
@@ -2113,6 +2118,9 @@ class MethodCall extends Expr, Call, @methodaccess {
/** Gets the immediately enclosing statement that contains this method access. */
override Stmt getEnclosingStmt() { result = Expr.super.getEnclosingStmt() }
/** Gets the `ControlFlowNode` corresponding to this call. */
override ControlFlowNode getControlFlowNode() { result = Expr.super.getControlFlowNode() }
/** Gets a printable representation of this expression. */
override string toString() {
if exists(this.getMethod())
@@ -2305,6 +2313,9 @@ class Call extends ExprParent, @caller {
/** Gets the enclosing statement of this call. */
/*abstract*/ Stmt getEnclosingStmt() { none() }
/** Gets the `ControlFlowNode` corresponding to this call. */
/*abstract*/ ControlFlowNode getControlFlowNode() { none() }
/** Gets the number of arguments provided in this call. */
int getNumArgument() { count(this.getAnArgument()) = result }

View File

@@ -207,29 +207,12 @@ private class PpArrayInit extends PpAst, ArrayInit {
override PpAst getChild(int i) { exists(int j | result = this.getInit(j) and i = 1 + 2 * j) }
}
private class PpAssignment extends PpAst, Assignment {
override string getPart(int i) {
i = 1 and
this instanceof AssignExpr and
result = " = "
or
i = 1 and
result = " " + this.(AssignOp).getOp() + " "
}
override PpAst getChild(int i) {
i = 0 and result = this.getDest()
or
i = 2 and result = this.getRhs()
}
}
private class PpLiteral extends PpAst, Literal {
override string getPart(int i) { i = 0 and result = this.getLiteral() }
}
private class PpBinaryExpr extends PpAst, BinaryExpr {
override string getPart(int i) { i = 1 and result = this.getOp() }
override string getPart(int i) { i = 1 and result = " " + this.getOp() + " " }
override PpAst getChild(int i) {
i = 0 and result = this.getLeftOperand()

View File

@@ -61,7 +61,7 @@ class Stmt extends StmtParent, ExprParent, @stmt {
}
/** A statement parent is any element that can have a statement as its child. */
class StmtParent extends @stmtparent, Top { }
class StmtParent extends @stmtparent, ExprParent { }
/**
* An error statement.
@@ -960,6 +960,9 @@ class ThisConstructorInvocationStmt extends Stmt, ConstructorCall, @constructori
/** Gets the immediately enclosing statement of this constructor invocation. */
override Stmt getEnclosingStmt() { result = this }
/** Gets the `ControlFlowNode` corresponding to this call. */
override ControlFlowNode getControlFlowNode() { result = Stmt.super.getControlFlowNode() }
override string pp() { result = "this(...)" }
override string toString() { result = "this(...)" }
@@ -1001,6 +1004,9 @@ class SuperConstructorInvocationStmt extends Stmt, ConstructorCall, @superconstr
/** Gets the immediately enclosing statement of this constructor invocation. */
override Stmt getEnclosingStmt() { result = this }
/** Gets the `ControlFlowNode` corresponding to this call. */
override ControlFlowNode getControlFlowNode() { result = Stmt.super.getControlFlowNode() }
override string pp() { result = "super(...)" }
override string toString() { result = "super(...)" }

View File

@@ -93,8 +93,7 @@ class ArithExpr extends Expr {
) and
forall(Expr e |
e = this.(BinaryExpr).getAnOperand() or
e = this.(UnaryAssignExpr).getOperand() or
e = this.(AssignOp).getSource()
e = this.(UnaryAssignExpr).getOperand()
|
e.getType() instanceof NumType
)
@@ -114,21 +113,17 @@ class ArithExpr extends Expr {
*/
Expr getLeftOperand() {
result = this.(BinaryExpr).getLeftOperand() or
result = this.(UnaryAssignExpr).getOperand() or
result = this.(AssignOp).getDest()
result = this.(UnaryAssignExpr).getOperand()
}
/**
* Gets the right-hand operand if this is a binary expression.
*/
Expr getRightOperand() {
result = this.(BinaryExpr).getRightOperand() or result = this.(AssignOp).getRhs()
}
Expr getRightOperand() { result = this.(BinaryExpr).getRightOperand() }
/** Gets an operand of this arithmetic expression. */
Expr getAnOperand() {
result = this.(BinaryExpr).getAnOperand() or
result = this.(UnaryAssignExpr).getOperand() or
result = this.(AssignOp).getSource()
result = this.(UnaryAssignExpr).getOperand()
}
}

View File

@@ -6,151 +6,8 @@ module;
import java
import Dominance
private import codeql.controlflow.BasicBlock as BB
private import codeql.controlflow.SuccessorType
private module Input implements BB::InputSig<Location> {
/** Hold if `t` represents a conditional successor type. */
predicate successorTypeIsCondition(SuccessorType t) { none() }
/** A delineated part of the AST with its own CFG. */
class CfgScope = Callable;
/** The class of control flow nodes. */
class Node = ControlFlowNode;
/** Gets the CFG scope in which this node occurs. */
CfgScope nodeGetCfgScope(Node node) { node.getEnclosingCallable() = result }
/** Gets an immediate successor of this node. */
Node nodeGetASuccessor(Node node, SuccessorType t) { result = node.getASuccessor(t) }
/**
* Holds if `node` represents an entry node to be used when calculating
* dominance.
*/
predicate nodeIsDominanceEntry(Node node) {
exists(Stmt entrystmt | entrystmt = node.asStmt() |
exists(Callable c | entrystmt = c.getBody())
or
// This disjunct is technically superfluous, but safeguards against extractor problems.
entrystmt instanceof BlockStmt and
not exists(entrystmt.getEnclosingCallable()) and
not entrystmt.getParent() instanceof Stmt
)
}
/**
* Holds if `node` represents an exit node to be used when calculating
* post dominance.
*/
predicate nodeIsPostDominanceExit(Node node) { node instanceof ControlFlow::NormalExitNode }
}
private module BbImpl = BB::Make<Location, Input>;
import BbImpl
/** Holds if the dominance relation is calculated for `bb`. */
predicate hasDominanceInformation(BasicBlock bb) {
exists(BasicBlock entry |
Input::nodeIsDominanceEntry(entry.getFirstNode()) and entry.getASuccessor*() = bb
)
}
/**
* A basic block, that is, a maximal straight-line sequence of control flow nodes
* without branches or joins.
*/
class BasicBlock extends BbImpl::BasicBlock {
/** Gets the immediately enclosing callable whose body contains this node. */
Callable getEnclosingCallable() { result = this.getScope() }
/**
* Holds if this basic block dominates basic block `bb`.
*
* That is, all paths reaching `bb` from the entry point basic block must
* go through this basic block.
*/
predicate dominates(BasicBlock bb) { super.dominates(bb) }
/**
* Holds if this basic block strictly dominates basic block `bb`.
*
* That is, all paths reaching `bb` from the entry point basic block must
* go through this basic block and this basic block is different from `bb`.
*/
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
/** Gets an immediate successor of this basic block of a given type, if any. */
BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) }
BasicBlock getASuccessor() { result = super.getASuccessor() }
BasicBlock getImmediateDominator() { result = super.getImmediateDominator() }
predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) }
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
/**
* DEPRECATED: Use `getASuccessor` instead.
*
* Gets an immediate successor of this basic block.
*/
deprecated BasicBlock getABBSuccessor() { result = this.getASuccessor() }
/**
* DEPRECATED: Use `getAPredecessor` instead.
*
* Gets an immediate predecessor of this basic block.
*/
deprecated BasicBlock getABBPredecessor() { result.getASuccessor() = this }
/**
* DEPRECATED: Use `strictlyDominates` instead.
*
* Holds if this basic block strictly dominates `node`.
*/
deprecated predicate bbStrictlyDominates(BasicBlock node) { this.strictlyDominates(node) }
/**
* DEPRECATED: Use `dominates` instead.
*
* Holds if this basic block dominates `node`. (This is reflexive.)
*/
deprecated predicate bbDominates(BasicBlock node) { this.dominates(node) }
/**
* DEPRECATED: Use `strictlyPostDominates` instead.
*
* Holds if this basic block strictly post-dominates `node`.
*/
deprecated predicate bbStrictlyPostDominates(BasicBlock node) { this.strictlyPostDominates(node) }
/**
* DEPRECATED: Use `postDominates` instead.
*
* Holds if this basic block post-dominates `node`. (This is reflexive.)
*/
deprecated predicate bbPostDominates(BasicBlock node) { this.postDominates(node) }
}
/** A basic block that ends in an exit node. */
class ExitBlock extends BasicBlock {
ExitBlock() { this.getLastNode() instanceof ControlFlow::ExitNode }
}
private class BasicBlockAlias = BasicBlock;
module Cfg implements BB::CfgSig<Location> {
class ControlFlowNode = BbImpl::ControlFlowNode;
class BasicBlock = BasicBlockAlias;
class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { }
predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) }
}

View File

@@ -10,6 +10,7 @@ private import semmle.code.java.controlflow.Dominance
private import semmle.code.java.controlflow.internal.Preconditions
private import semmle.code.java.controlflow.internal.SwitchCases
private import codeql.controlflow.Guards as SharedGuards
private import codeql.controlflow.SuccessorType
/**
* A basic block that terminates in a condition, splitting the subsequent control flow.
@@ -75,70 +76,6 @@ class ConditionBlock extends BasicBlock {
}
}
// Join order engineering -- first determine the switch block and the case indices required, then retrieve them.
bindingset[switch, i]
pragma[inline_late]
private predicate isNthCaseOf(SwitchBlock switch, SwitchCase c, int i) { c.isNthCaseOf(switch, i) }
/**
* Gets a switch case >= pred, up to but not including `pred`'s successor pattern case,
* where `pred` is declared on `switch`.
*/
private SwitchCase getACaseUpToNextPattern(PatternCase pred, SwitchBlock switch) {
// Note we do include `case null, default` (as well as plain old `default`) here.
not result.(ConstCase).getValue(_) instanceof NullLiteral and
exists(int maxCaseIndex |
switch = pred.getParent() and
if exists(getNextPatternCase(pred))
then maxCaseIndex = getNextPatternCase(pred).getCaseIndex() - 1
else maxCaseIndex = lastCaseIndex(switch)
|
isNthCaseOf(switch, result, [pred.getCaseIndex() .. maxCaseIndex])
)
}
/**
* Gets the closest pattern case preceding `case`, including `case` itself, if any.
*/
private PatternCase getClosestPrecedingPatternCase(SwitchCase case) {
case = getACaseUpToNextPattern(result, _)
}
/**
* Holds if `pred` is a control-flow predecessor of switch case `sc` that is not a
* fall-through from a previous case.
*
* For classic switches that means flow from the selector expression; for switches
* involving pattern cases it can also mean flow from a previous pattern case's type
* test or guard failing and proceeding to then consider subsequent cases.
*/
private predicate isNonFallThroughPredecessor(SwitchCase sc, ControlFlowNode pred) {
pred = sc.getControlFlowNode().getAPredecessor() and
(
pred.asExpr().getParent*() = sc.getSelectorExpr()
or
// Ambiguous: in the case of `case String _ when x: case "SomeConstant":`, the guard `x`
// passing edge will fall through into the constant case, and the guard failing edge
// will test if the selector equals `"SomeConstant"` and if so branch to the same
// case statement. Therefore don't label this a non-fall-through predecessor.
exists(PatternCase previousPatternCase |
previousPatternCase = getClosestPrecedingPatternCase(sc)
|
pred.asExpr().getParent*() = previousPatternCase.getGuard() and
// Check there is any statement in between the previous pattern case and this one,
// or the case is a rule, so there is no chance of a fall-through.
(
previousPatternCase.isRule() or
not previousPatternCase.getIndex() = sc.getIndex() - 1
)
)
or
// Unambigious: on the test-passing edge there must be at least one intervening
// declaration node, including anonymous `_` declarations.
pred.asStmt() = getClosestPrecedingPatternCase(sc)
)
}
private module GuardsInput implements SharedGuards::InputSig<Location, ControlFlowNode, BasicBlock> {
private import java as J
private import semmle.code.java.dataflow.internal.BaseSSA as Base
@@ -231,39 +168,18 @@ private module GuardsInput implements SharedGuards::InputSig<Location, ControlFl
)
}
private predicate hasPatternCaseMatchEdge(BasicBlock bb1, BasicBlock bb2, boolean isMatch) {
exists(ConditionNode patterncase |
this instanceof PatternCase and
patterncase = super.getControlFlowNode() and
bb1.getLastNode() = patterncase and
bb2.getFirstNode() = patterncase.getABranchSuccessor(isMatch)
)
}
predicate matchEdge(BasicBlock bb1, BasicBlock bb2) {
exists(ControlFlowNode pred |
// Pattern cases are handled as ConditionBlocks.
not this instanceof PatternCase and
bb2.getFirstNode() = super.getControlFlowNode() and
isNonFallThroughPredecessor(this, pred) and
bb1 = pred.getBasicBlock()
)
or
this.hasPatternCaseMatchEdge(bb1, bb2, true)
bb1.getASuccessor(any(MatchingSuccessor s | s.getValue() = true)) = bb2 and
bb1.getLastNode() = super.getControlFlowNode()
}
predicate nonMatchEdge(BasicBlock bb1, BasicBlock bb2) {
this.hasPatternCaseMatchEdge(bb1, bb2, false)
bb1.getASuccessor(any(MatchingSuccessor s | s.getValue() = false)) = bb2 and
bb1.getLastNode() = super.getControlFlowNode()
}
}
abstract private class BinExpr extends Expr {
Expr getAnOperand() {
result = this.(BinaryExpr).getAnOperand() or result = this.(AssignOp).getSource()
}
}
class AndExpr extends BinExpr {
class AndExpr extends BinaryExpr {
AndExpr() {
this instanceof AndBitwiseExpr or
this instanceof AndLogicalExpr or
@@ -271,7 +187,7 @@ private module GuardsInput implements SharedGuards::InputSig<Location, ControlFl
}
}
class OrExpr extends BinExpr {
class OrExpr extends BinaryExpr {
OrExpr() {
this instanceof OrBitwiseExpr or
this instanceof OrLogicalExpr or

View File

@@ -34,7 +34,7 @@ abstract class ActionConfiguration extends string {
private BasicBlock actionBlock(ActionConfiguration conf) {
exists(ControlFlowNode node | result = node.getBasicBlock() |
conf.isAction(node) or
callAlwaysPerformsAction(node.asCall(), conf)
callAlwaysPerformsAction(any(Call call | call.getControlFlowNode() = node), conf)
)
}
@@ -66,10 +66,6 @@ private class JoinBlock extends BasicBlock {
JoinBlock() { 2 <= strictcount(this.getAPredecessor()) }
}
private class ReachableBlock extends BasicBlock {
ReachableBlock() { hasDominanceInformation(this) }
}
/**
* Holds if `bb` is a block that is collectively dominated by a set of one or
* more actions that individually does not dominate the exit.
@@ -78,7 +74,7 @@ private predicate postActionBlock(BasicBlock bb, ActionConfiguration conf) {
bb = nonDominatingActionBlock(conf)
or
if bb instanceof JoinBlock
then forall(ReachableBlock pred | pred = bb.getAPredecessor() | postActionBlock(pred, conf))
then forall(BasicBlock pred | pred = bb.getAPredecessor() | postActionBlock(pred, conf))
else postActionBlock(bb.getAPredecessor(), conf)
}

View File

@@ -367,12 +367,24 @@ module ModelValidation {
)
}
string getIncorrectConstructorSummaryOutput() {
exists(string namespace, string type, string name, string output |
summaryModel(namespace, type, _, name, _, _, _, output, _, _, _)
|
type = name and
output.matches("ReturnValue%") and
result =
"Constructor model for " + namespace + "." + type +
" should use `Argument[this]` in the output, not `ReturnValue`."
)
}
/** Holds if some row in a MaD flow model appears to contain typos. */
query predicate invalidModelRow(string msg) {
msg =
[
getInvalidModelSignature(), getInvalidModelInput(), getInvalidModelOutput(),
KindVal::getInvalidModelKind()
getIncorrectConstructorSummaryOutput(), KindVal::getInvalidModelKind()
]
}
}

View File

@@ -229,7 +229,7 @@ class InstanceAccessExt extends TInstanceAccessExt {
/** Gets the control flow node associated with this instance access. */
ControlFlowNode getCfgNode() {
exists(ExprParent e | e = this.getAssociatedExprOrStmt() |
result.asCall() = e
result = e.(Call).getControlFlowNode()
or
e.(InstanceAccess).getControlFlowNode() = result
or

View File

@@ -17,6 +17,7 @@ private import NullGuards
private import semmle.code.java.Collections
private import semmle.code.java.controlflow.internal.Preconditions
private import semmle.code.java.controlflow.ControlFlowReachability
private import codeql.controlflow.SuccessorType
/** Gets an expression that may be `null`. */
Expr nullExpr() { result = nullExpr(_) }
@@ -52,8 +53,6 @@ private predicate unboxed(Expr e) {
assign.getDest().getType() instanceof PrimitiveType and assign.getSource() = e
)
or
exists(AssignOp assign | assign.getSource() = e and assign.getType() instanceof PrimitiveType)
or
exists(EqualityTest eq |
eq.getAnOperand() = e and eq.getAnOperand().getType() instanceof PrimitiveType
)
@@ -61,6 +60,7 @@ private predicate unboxed(Expr e) {
exists(BinaryExpr bin |
bin.getAnOperand() = e and
not bin instanceof EqualityTest and
not bin instanceof AssignExpr and
bin.getType() instanceof PrimitiveType
)
or
@@ -230,14 +230,8 @@ private Expr nonEmptyExpr() {
/** The control flow edge that exits an enhanced for loop if the `Iterable` is empty. */
private predicate enhancedForEarlyExit(EnhancedForStmt for, ControlFlowNode n1, ControlFlowNode n2) {
exists(Expr forExpr |
n1.getANormalSuccessor() = n2 and
for.getExpr() = forExpr and
forExpr.getAChildExpr*() = n1.asExpr() and
not forExpr.getAChildExpr*() = n2.asExpr() and
n1.getANormalSuccessor().asExpr() = for.getVariable() and
not n2.asExpr() = for.getVariable()
)
n1.getASuccessor(any(EmptinessSuccessor t | t.isEmpty())) = n2 and
for.getExpr().getControlFlowNode() = n1
}
/** A control flow edge that cannot be taken. */

View File

@@ -86,23 +86,7 @@ module Sem implements Semantic<Location> {
class ConstantIntegerExpr = RU::ConstantIntegerExpr;
abstract class BinaryExpr extends Expr {
Expr getLeftOperand() {
result = this.(J::BinaryExpr).getLeftOperand() or result = this.(J::AssignOp).getDest()
}
Expr getRightOperand() {
result = this.(J::BinaryExpr).getRightOperand() or result = this.(J::AssignOp).getRhs()
}
final Expr getAnOperand() { result = this.getLeftOperand() or result = this.getRightOperand() }
final predicate hasOperands(Expr e1, Expr e2) {
this.getLeftOperand() = e1 and this.getRightOperand() = e2
or
this.getLeftOperand() = e2 and this.getRightOperand() = e1
}
}
class BinaryExpr = J::BinaryExpr;
class AddExpr extends BinaryExpr {
AddExpr() { this instanceof J::AddExpr or this instanceof J::AssignAddExpr }
@@ -220,6 +204,8 @@ module Sem implements Semantic<Location> {
int getBlockId1(BasicBlock bb) { idOf(bb, result) }
string getBlockId2(BasicBlock bb) { bb.getFirstNode().getIdTag() = result }
class Guard extends G::Guards_v2::Guard {
Expr asExpr() { result = this }
}

View File

@@ -326,20 +326,45 @@ private module Input implements TypeFlowInput<Location> {
)
}
/**
* Holds if `ioe` checks `v`, its true-successor is `bb`, and `bb` has multiple
* predecessors.
*/
private predicate instanceofDisjunct(InstanceOfExpr ioe, BasicBlock bb, Base::SsaDefinition v) {
/** Holds if `ioe` checks `v` and its true-successor is `bb`. */
private predicate instanceofTrueSuccessor(InstanceOfExpr ioe, BasicBlock bb, Base::SsaDefinition v) {
ioe.getExpr() = v.getARead() and
strictcount(bb.getAPredecessor()) > 1 and
exists(ConditionBlock cb | cb.getCondition() = ioe and cb.getTestSuccessor(true) = bb)
}
/** Holds if `bb` is disjunctively guarded by multiple `instanceof` tests on `v`. */
private predicate instanceofDisjunction(BasicBlock bb, Base::SsaDefinition v) {
strictcount(InstanceOfExpr ioe | instanceofDisjunct(ioe, bb, v)) =
strictcount(bb.getAPredecessor())
/**
* Holds if `bb` is disjunctively guarded by one (`trivial = true`) or more
* (`trivial = false`) `instanceof` tests on `v`.
*/
private predicate instanceofDisjunction(BasicBlock bb, Base::SsaDefinition v, boolean trivial) {
exists(int preds |
strictcount(bb.getAPredecessor()) = preds and
strictcount(InstanceOfExpr ioe | instanceofTrueSuccessor(ioe, bb, v)) = preds and
if preds > 1 then trivial = false else trivial = true
)
or
strictcount(bb.getAPredecessor()) = 2 and
exists(BasicBlock pred1, BasicBlock pred2 |
pred1 != pred2 and
pred1 = bb.getAPredecessor() and
pred2 = bb.getAPredecessor() and
instanceofDisjunction(pred1, v, _) and
instanceofDisjunction(pred2, v, _) and
trivial = false
)
}
/**
* Holds if `bb` is disjunctively guarded by one or more `instanceof` tests
* on `v`, and `ioe` is one of those tests.
*/
private predicate instanceofDisjunct(InstanceOfExpr ioe, BasicBlock bb, Base::SsaDefinition v) {
instanceofDisjunction(bb, v, _) and
(
instanceofTrueSuccessor(ioe, bb, v)
or
exists(BasicBlock pred | pred = bb.getAPredecessor() and instanceofDisjunct(ioe, pred, v))
)
}
/**
@@ -348,7 +373,7 @@ private module Input implements TypeFlowInput<Location> {
*/
predicate instanceofDisjunctionGuarded(TypeFlowNode n, RefType t) {
exists(BasicBlock bb, InstanceOfExpr ioe, Base::SsaDefinition v, VarAccess va |
instanceofDisjunction(bb, v) and
instanceofDisjunction(bb, v, false) and
bb.dominates(va.getBasicBlock()) and
va = v.getARead() and
instanceofDisjunct(ioe, bb, v) and

View File

@@ -93,8 +93,7 @@ private module BaseSsaImpl {
/** Holds if `n` updates the local variable `v`. */
predicate variableUpdate(BaseSsaSourceVariable v, ControlFlowNode n, BasicBlock b, int i) {
exists(VariableUpdate a | a.getControlFlowNode() = n | getDestVar(a) = v) and
b.getNode(i) = n and
hasDominanceInformation(b)
b.getNode(i) = n
}
/** Gets the definition point of a nested class in the parent scope. */
@@ -132,7 +131,7 @@ private module BaseSsaImpl {
inner != outer and
inner.getDeclaringType() = innerclass and
result = parentDef(desugaredGetEnclosingType*(innerclass)) and
result.getEnclosingStmt().getEnclosingCallable() = outer and
result.getEnclosingCallable() = outer and
capturedvar = TLocalVar(outer, v) and
closurevar = TLocalVar(inner, v)
)
@@ -178,15 +177,12 @@ private module SsaImplInput implements SsaImplCommon::InputSig<Location, BasicBl
* Holds if the `i`th of basic block `bb` reads source variable `v`.
*/
predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
hasDominanceInformation(bb) and
(
exists(VarRead use |
v.getAnAccess() = use and bb.getNode(i) = use.getControlFlowNode() and certain = true
)
or
variableCapture(v, _, bb, i) and
certain = false
exists(VarRead use |
v.getAnAccess() = use and bb.getNode(i) = use.getControlFlowNode() and certain = true
)
or
variableCapture(v, _, bb, i) and
certain = false
}
}

View File

@@ -115,7 +115,7 @@ private ControlFlowNode captureNode(TrackedVar capturedvar, TrackedVar closureva
inner != outer and
inner.getDeclaringType() = innerclass and
result = parentDef(desugaredGetEnclosingType*(innerclass)) and
result.getEnclosingStmt().getEnclosingCallable() = outer and
result.getEnclosingCallable() = outer and
capturedvar = TLocalVar(outer, v) and
closurevar = TLocalVar(inner, v)
)
@@ -130,8 +130,7 @@ private predicate variableCapture(TrackedVar capturedvar, TrackedVar closurevar,
pragma[nomagic]
private predicate certainVariableUpdate(TrackedVar v, ControlFlowNode n, BasicBlock b, int i) {
exists(VariableUpdate a | a.getControlFlowNode() = n | getDestVar(a) = v) and
b.getNode(i) = n and
hasDominanceInformation(b)
b.getNode(i) = n
or
certainVariableUpdate(v.getQualifier(), n, b, i)
}
@@ -153,9 +152,8 @@ private predicate hasEntryDef(TrackedVar v, BasicBlock b) {
overlay[global]
pragma[nomagic]
private predicate uncertainVariableUpdateImpl(TrackedVar v, ControlFlowNode n, BasicBlock b, int i) {
exists(Call c | c = n.asCall() | updatesNamedField(c, v, _)) and
b.getNode(i) = n and
hasDominanceInformation(b)
exists(Call c | c.getControlFlowNode() = n | updatesNamedField(c, v, _)) and
b.getNode(i) = n
or
uncertainVariableUpdateImpl(v.getQualifier(), n, b, i)
}
@@ -191,18 +189,15 @@ private module SsaImplInput implements SsaImplCommon::InputSig<Location, BasicBl
* This includes implicit reads via calls.
*/
predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
hasDominanceInformation(bb) and
(
exists(VarRead use |
v instanceof TrackedVar and
v.getAnAccess() = use and
bb.getNode(i) = use.getControlFlowNode() and
certain = true
)
or
variableCapture(v, _, bb, i) and
certain = false
exists(VarRead use |
v instanceof TrackedVar and
v.getAnAccess() = use and
bb.getNode(i) = use.getControlFlowNode() and
certain = true
)
or
variableCapture(v, _, bb, i) and
certain = false
}
}
@@ -525,8 +520,11 @@ private module Cached {
overlay[global]
cached
predicate defUpdatesNamedField(SsaImplicitWrite calldef, TrackedField f, Callable setter) {
f = calldef.getSourceVariable() and
updatesNamedField0(calldef.getControlFlowNode().asCall(), f, setter)
exists(Call call |
f = calldef.getSourceVariable() and
call.getControlFlowNode() = calldef.getControlFlowNode() and
updatesNamedField0(call, f, setter)
)
}
/** Holds if `init` is a closure variable that captures the value of `capturedvar`. */

View File

@@ -161,13 +161,9 @@ module Private {
this instanceof J::AssignUnsignedRightShiftExpr and result = TUnsignedRightShiftOp()
}
Expr getLeftOperand() {
result = this.(J::BinaryExpr).getLeftOperand() or result = this.(J::AssignOp).getDest()
}
Expr getLeftOperand() { result = this.(J::BinaryExpr).getLeftOperand() }
Expr getRightOperand() {
result = this.(J::BinaryExpr).getRightOperand() or result = this.(J::AssignOp).getRhs()
}
Expr getRightOperand() { result = this.(J::BinaryExpr).getRightOperand() }
}
predicate ssaRead = RU::ssaRead/2;

View File

@@ -23,7 +23,9 @@ private predicate idOfAst(BB::ExprParent x, int y) = equivalenceRelation(id/2)(x
private predicate idOf(BasicBlock x, int y) { idOfAst(x.getFirstNode().getAstNode(), y) }
private int getId(BasicBlock bb) { idOf(bb, result) }
private int getId1(BasicBlock bb) { idOf(bb, result) }
private string getId2(BasicBlock bb) { bb.getFirstNode().getIdTag() = result }
/**
* Declarations to be exposed to users of SsaReadPositionCommon
@@ -39,7 +41,7 @@ module Public {
rank[r](SsaReadPositionPhiInputEdge e |
e.phiInput(phi, _)
|
e order by getId(e.getOrigBlock())
e order by getId1(e.getOrigBlock()), getId2(e.getOrigBlock())
)
}
}

View File

@@ -71,18 +71,28 @@ class MetricCallable extends Callable {
}
}
private predicate fallthroughSwitchCase(SwitchCase sc1, SwitchCase sc2) {
exists(SwitchStmt switch, int n | switch.getStmt(n) = sc1 and switch.getStmt(n + 1) = sc2)
or
exists(SwitchExpr switch, int n | switch.getStmt(n) = sc1 and switch.getStmt(n + 1) = sc2)
}
// Branching points in the sense of cyclomatic complexity are binary,
// so there should be a branching point for each non-default switch
// case (ignoring those that just fall through to the next case).
private predicate branchingSwitchCase(ConstCase sc) {
not sc.getControlFlowNode().getASuccessor().asStmt() instanceof SwitchCase and
not defaultFallThrough(sc)
if sc.isRule()
then any()
else (
not fallthroughSwitchCase(sc, _) and
not defaultFallThrough(sc)
)
}
private predicate defaultFallThrough(ConstCase sc) {
exists(DefaultCase default | default.getControlFlowNode().getASuccessor().asStmt() = sc)
exists(DefaultCase default | fallthroughSwitchCase(default, sc))
or
defaultFallThrough(sc.getControlFlowNode().getAPredecessor().asStmt())
exists(ConstCase mid | defaultFallThrough(mid) and fallthroughSwitchCase(mid, sc))
}
/** Holds if `stmt` is a branching statement used for the computation of cyclomatic complexity. */

View File

@@ -73,7 +73,8 @@ module InsecureRandomnessConfig implements DataFlow::ConfigSig {
predicate isBarrierOut(DataFlow::Node n) { isSink(n) }
predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) {
n1.asExpr() = n2.asExpr().(BinaryExpr).getAnOperand()
n1.asExpr() = n2.asExpr().(BinaryExpr).getAnOperand() and
not n2.asExpr() instanceof AssignExpr
or
n1.asExpr() = n2.asExpr().(UnaryExpr).getOperand()
or

View File

@@ -31,10 +31,7 @@ class RightShiftOp extends Expr {
this instanceof AssignUnsignedRightShiftExpr
}
private Expr getLhs() {
this.(BinaryExpr).getLeftOperand() = result or
this.(Assignment).getDest() = result
}
private Expr getLhs() { this.(BinaryExpr).getLeftOperand() = result }
/**
* Gets the variable that is shifted.

View File

@@ -54,9 +54,8 @@ private module PredictableSeedFlowConfig implements DataFlow::ConfigSig {
private module PredictableSeedFlow = DataFlow::Global<PredictableSeedFlowConfig>;
private predicate predictableCalcStep(Expr e1, Expr e2) {
e2.(BinaryExpr).hasOperands(e1, any(PredictableSeedExpr p))
or
exists(AssignOp a | a = e2 | e1 = a.getDest() and a.getRhs() instanceof PredictableSeedExpr)
e2.(BinaryExpr).hasOperands(e1, any(PredictableSeedExpr p)) and
not e2 instanceof AssignExpr
or
exists(ConstructorCall cc, TypeNumber t | cc = e2 |
cc.getArgument(0) = e1 and

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
description: Expand @binaryexpr union to include @assignment
compatibility: full

View File

@@ -0,0 +1,28 @@
/**
* Provides utilities for getting an AST-based control flow graph in tests.
*/
overlay[local?]
module;
import java
private predicate isAstNode(ControlFlowNode n) {
n.injects(_) or
n instanceof ControlFlow::EntryNode or
n instanceof ControlFlow::AnnotatedExitNode or
n instanceof ControlFlow::ExitNode
}
private predicate succToAst(ControlFlowNode n1, ControlFlowNode n2) {
n2 = n1.getASuccessor() and
isAstNode(n2)
or
exists(ControlFlowNode mid |
mid = n1.getASuccessor() and
not isAstNode(mid) and
succToAst(mid, n2)
)
}
/** Gets a control flow successor of `n` that skips over non-AST nodes. */
ControlFlowNode getAnAstSuccessor(ControlFlowNode n) { isAstNode(n) and succToAst(n, result) }

View File

@@ -0,0 +1,40 @@
/**
* Provides utilities for working with basic blocks in tests.
*/
overlay[local?]
module;
import java
import codeql.util.Boolean
private predicate entryOrExit(ControlFlowNode n) {
n instanceof ControlFlow::EntryNode or
n instanceof ControlFlow::AnnotatedExitNode or
n instanceof ControlFlow::ExitNode
}
/** Gets the first AST node in the basic block `bb`, if any. */
ControlFlowNode getFirstAstNode(BasicBlock bb) { result = getFirstAstNode(bb, false) }
/**
* Gets the first AST node in the basic block `bb`, if any. Otherwise, gets
* the first synthetic node.
*/
ControlFlowNode getFirstAstNodeOrSynth(BasicBlock bb) { result = getFirstAstNode(bb, true) }
private ControlFlowNode getFirstAstNode(BasicBlock bb, Boolean allowSynthetic) {
result =
min(ControlFlowNode n, int i, int astOrder |
bb.getNode(i) = n and
if n.injects(_)
then astOrder = 0
else
if entryOrExit(n)
then astOrder = 1
else (
allowSynthetic = true and astOrder = 2
)
|
n order by astOrder, i
)
}

View File

@@ -19,6 +19,7 @@ where
lit.getLiteral() = val and
val.regexpMatch("0[0-7][0-7]+") and
lit.getParent() instanceof BinaryExpr and
not lit.getParent() instanceof Assignment and
not lit.getParent() instanceof BitwiseExpr and
not lit.getParent() instanceof ComparisonExpr
select lit, "Integer literal starts with 0."

View File

@@ -138,13 +138,14 @@ int operatorWS(BinaryExpr expr) {
endOfBinaryLhs(expr, line, lcol) and
startOfBinaryRhs(expr, line, rcol) and
parens = getParensNextToOp(expr) and
result = rcol - lcol + 1 - expr.getOp().length() - parens
result = rcol - lcol - 1 - expr.getOp().length() - parens
)
}
/** Find nested binary expressions where the programmer may have made a precedence mistake. */
predicate interestingNesting(BinaryExpr inner, BinaryExpr outer) {
inner = outer.getAChildExpr() and
not outer instanceof Assignment and
not inner instanceof AssocNestedExpr and
not inner instanceof HarmlessNestedExpr and
not inner.isParenthesized()

View File

@@ -58,6 +58,7 @@ predicate equal(Expr left, Expr right) {
sameVariable(left, right, _)
or
exists(BinaryExpr bLeft, BinaryExpr bRight | bLeft = left and bRight = right |
not bLeft instanceof Assignment and
bLeft.getKind() = bRight.getKind() and
equal(bLeft.getLeftOperand(), bRight.getLeftOperand()) and
equal(bLeft.getRightOperand(), bRight.getRightOperand())

View File

@@ -101,17 +101,10 @@ Expr overFlowCand() {
|
bin instanceof AddExpr or
bin instanceof MulExpr or
bin instanceof LeftShiftExpr
)
or
exists(AssignOp op |
result = op and
positive(op.getDest()) and
positive(op.getRhs())
|
op instanceof AssignAddExpr or
op instanceof AssignMulExpr or
op instanceof AssignLeftShiftExpr
bin instanceof LeftShiftExpr or
bin instanceof AssignAddExpr or
bin instanceof AssignMulExpr or
bin instanceof AssignLeftShiftExpr
)
or
exists(AddExpr add, CompileTimeConstantExpr c |

View File

@@ -57,13 +57,15 @@ predicate loopExitGuard(LoopStmt loop, Expr cond) {
*/
predicate mainLoopCondition(LoopStmt loop, Expr cond) {
loop.getCondition() = cond and
exists(Expr loopReentry, ControlFlowNode last |
if exists(loop.(ForStmt).getAnUpdate())
then loopReentry = loop.(ForStmt).getUpdate(0)
else loopReentry = cond
|
last.getEnclosingStmt().getEnclosingStmt*() = loop.getBody() and
last.getASuccessor().asExpr().getParent*() = loopReentry
exists(BasicBlock condBlock | condBlock.getANode().isBefore(cond) |
1 < strictcount(condBlock.getAPredecessor()) or loop instanceof DoStmt
)
}
predicate ssaDefinitionInLoop(LoopStmt loop, SsaDefinition ssa) {
exists(ControlFlowNode node | node = ssa.getControlFlowNode() |
node.getAstNode().(Stmt).getEnclosingStmt*() = loop or
node.getAstNode().(Expr).getEnclosingStmt().getEnclosingStmt*() = loop
)
}
@@ -76,7 +78,7 @@ where
) and
// None of the ssa variables in `cond` are updated inside the loop.
forex(SsaDefinition ssa, VarRead use | ssa.getARead() = use and use.getParent*() = cond |
not ssa.getControlFlowNode().getEnclosingStmt().getEnclosingStmt*() = loop or
not ssaDefinitionInLoop(loop, ssa) or
ssa.getControlFlowNode().asExpr().getParent*() = loop.(ForStmt).getAnInit()
) and
// And `cond` does not use method calls, field reads, or array reads.

View File

@@ -1,7 +1,7 @@
class Bad extends WebViewClient {
// BAD: All certificates are trusted.
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult
handler.proceed();
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $ hasResult
handler.proceed();
}
}
@@ -9,7 +9,7 @@ class Good extends WebViewClient {
PublicKey myPubKey = ...;
// GOOD: Only certificates signed by a certain public key are trusted.
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $ hasResult
try {
X509Certificate cert = error.getCertificate().getX509Certificate();
cert.verify(this.myPubKey);
@@ -18,5 +18,5 @@ class Good extends WebViewClient {
catch (CertificateException|NoSuchAlgorithmException|InvalidKeyException|NoSuchProviderException|SignatureException e) {
handler.cancel();
}
}
}
}
}

View File

@@ -1,41 +1,15 @@
import java
private Stmt getASwitchChild(SwitchStmt s) {
result = s.getAChild()
or
exists(Stmt mid |
mid = getASwitchChild(s) and not mid instanceof SwitchStmt and result = mid.getAChild()
)
}
private predicate blockInSwitch(SwitchStmt s, BasicBlock b) {
b.getFirstNode().getEnclosingStmt() = getASwitchChild(s)
}
private predicate switchCaseControlFlow(SwitchStmt switch, BasicBlock b1, BasicBlock b2) {
blockInSwitch(switch, b1) and
b1.getASuccessor() = b2 and
blockInSwitch(switch, b2)
}
predicate switchCaseControlFlowPlus(SwitchStmt switch, BasicBlock b1, BasicBlock b2) {
switchCaseControlFlow(switch, b1, b2)
or
exists(BasicBlock mid |
switchCaseControlFlowPlus(switch, mid, b2) and
switchCaseControlFlow(switch, b1, mid) and
not mid.getFirstNode().asStmt() = switch.getACase()
)
}
predicate mayDropThroughWithoutComment(SwitchStmt switch, Stmt switchCase) {
switchCase = switch.getACase() and
exists(Stmt other, BasicBlock b1, BasicBlock b2 |
b1.getFirstNode().asStmt() = switchCase and
b2.getFirstNode().asStmt() = other and
switchCaseControlFlowPlus(switch, b1, b2) and
other = switch.getACase() and
not fallThroughCommented(other)
exists(int caseIx, SwitchCase next, int nextCaseStmtIx, Stmt lastInCase, ControlFlowNode node |
switch.getCase(caseIx) = switchCase and
switch.getCase(caseIx + 1) = next and
switch.getStmt(nextCaseStmtIx) = next and
switch.getStmt(nextCaseStmtIx - 1) = lastInCase and
lastInCase != switchCase and
node.isAfter(lastInCase) and
node.getANormalSuccessor().asStmt() = switch.getAStmt() and
not fallThroughCommented(next)
)
}

View File

@@ -36,6 +36,7 @@ Variable flowTarget(Expr arg) {
*/
predicate unboxed(BoxedExpr e) {
exists(BinaryExpr bin | e = bin.getAnOperand() |
not bin instanceof Assignment and
if bin instanceof EqualityTest or bin instanceof ComparisonExpr
then bin.getAnOperand() instanceof PrimitiveExpr
else bin instanceof PrimitiveExpr

View File

@@ -42,7 +42,7 @@ private DataFlow::Node getGeneratingWrapperSet(Crypto::NonceArtifactNode a) {
}
private predicate ancestorOfArtifact(
Crypto::ArtifactNode a, Callable enclosingCallable, ControlFlow::Node midOrTarget
Crypto::ArtifactNode a, Callable enclosingCallable, ControlFlowNode midOrTarget
) {
a.asElement().(Expr).getEnclosingCallable() = enclosingCallable and
(
@@ -87,7 +87,7 @@ predicate isArtifactReuse(Crypto::ArtifactNode a, Crypto::ArtifactNode b) {
ancestorOfArtifact(b, commonParent, _)
)
implies
exists(Callable commonParent, ControlFlow::Node aMid, ControlFlow::Node bMid |
exists(Callable commonParent, ControlFlowNode aMid, ControlFlowNode bMid |
ancestorOfArtifact(a, commonParent, aMid) and
ancestorOfArtifact(b, commonParent, bMid) and
a instanceof Crypto::NonceArtifactNode and

View File

@@ -1,205 +1,386 @@
| Test.kt:3:8:80:1 | Exceptional Exit | 0 | Test.kt:3:8:80:1 | Exceptional Exit |
| Test.kt:3:8:80:1 | Exit | 0 | Test.kt:3:8:80:1 | Exit |
| Test.kt:3:8:80:1 | { ... } | 0 | Test.kt:3:8:80:1 | { ... } |
| Test.kt:3:8:80:1 | { ... } | 1 | Test.kt:3:1:80:1 | super(...) |
| Test.kt:3:8:80:1 | { ... } | 2 | Test.kt:3:8:80:1 | { ... } |
| Test.kt:3:8:80:1 | { ... } | 3 | Test.kt:3:8:80:1 | Normal Exit |
| Test.kt:4:2:79:2 | Exceptional Exit | 0 | Test.kt:4:2:79:2 | Exceptional Exit |
| Test.kt:4:2:79:2 | Exit | 0 | Test.kt:4:2:79:2 | Exit |
| Test.kt:3:8:80:1 | Entry | 0 | Test.kt:3:8:80:1 | Entry |
| Test.kt:3:8:80:1 | Entry | 1 | Test.kt:3:8:80:1 | { ... } |
| Test.kt:3:8:80:1 | Entry | 2 | Test.kt:3:1:80:1 | Before super(...) |
| Test.kt:3:8:80:1 | Entry | 3 | Test.kt:3:1:80:1 | super(...) |
| Test.kt:3:8:80:1 | Entry | 4 | Test.kt:3:1:80:1 | After super(...) |
| Test.kt:3:8:80:1 | Entry | 5 | Test.kt:3:8:80:1 | { ... } |
| Test.kt:3:8:80:1 | Entry | 6 | Test.kt:3:8:80:1 | After { ... } |
| Test.kt:3:8:80:1 | Entry | 7 | Test.kt:3:8:80:1 | Normal Exit |
| Test.kt:3:8:80:1 | Entry | 8 | Test.kt:3:8:80:1 | Exit |
| Test.kt:4:2:79:2 | Entry | 0 | Test.kt:4:2:79:2 | Entry |
| Test.kt:4:2:79:2 | Entry | 1 | Test.kt:4:13:79:2 | { ... } |
| Test.kt:4:2:79:2 | Entry | 2 | Test.kt:5:7:5:7 | var ...; |
| Test.kt:4:2:79:2 | Entry | 3 | Test.kt:5:7:5:7 | Before x |
| Test.kt:4:2:79:2 | Entry | 4 | Test.kt:5:16:5:16 | 0 |
| Test.kt:4:2:79:2 | Entry | 5 | Test.kt:5:7:5:7 | x |
| Test.kt:4:2:79:2 | Entry | 6 | Test.kt:5:7:5:7 | After x |
| Test.kt:4:2:79:2 | Entry | 7 | Test.kt:5:7:5:7 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 8 | Test.kt:6:7:6:7 | var ...; |
| Test.kt:4:2:79:2 | Entry | 9 | Test.kt:6:7:6:7 | Before y |
| Test.kt:4:2:79:2 | Entry | 10 | Test.kt:6:17:6:18 | 50 |
| Test.kt:4:2:79:2 | Entry | 11 | Test.kt:6:7:6:7 | y |
| Test.kt:4:2:79:2 | Entry | 12 | Test.kt:6:7:6:7 | After y |
| Test.kt:4:2:79:2 | Entry | 13 | Test.kt:6:7:6:7 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 14 | Test.kt:7:7:7:7 | var ...; |
| Test.kt:4:2:79:2 | Entry | 15 | Test.kt:7:7:7:7 | Before z |
| Test.kt:4:2:79:2 | Entry | 16 | Test.kt:7:16:7:16 | 0 |
| Test.kt:4:2:79:2 | Entry | 17 | Test.kt:7:7:7:7 | z |
| Test.kt:4:2:79:2 | Entry | 18 | Test.kt:7:7:7:7 | After z |
| Test.kt:4:2:79:2 | Entry | 19 | Test.kt:7:7:7:7 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 20 | Test.kt:8:7:8:7 | var ...; |
| Test.kt:4:2:79:2 | Entry | 21 | Test.kt:8:7:8:7 | Before w |
| Test.kt:4:2:79:2 | Entry | 22 | Test.kt:8:16:8:16 | 0 |
| Test.kt:4:2:79:2 | Entry | 23 | Test.kt:8:7:8:7 | w |
| Test.kt:4:2:79:2 | Entry | 24 | Test.kt:8:7:8:7 | After w |
| Test.kt:4:2:79:2 | Entry | 25 | Test.kt:8:7:8:7 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 26 | Test.kt:11:3:16:3 | <Expr>; |
| Test.kt:4:2:79:2 | Entry | 27 | Test.kt:11:3:16:3 | when ... |
| Test.kt:4:2:79:2 | Entry | 28 | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:4:2:79:2 | Entry | 29 | Test.kt:11:7:11:11 | Before ... > ... |
| Test.kt:4:2:79:2 | Entry | 30 | Test.kt:11:7:11:7 | x |
| Test.kt:4:2:79:2 | Entry | 31 | Test.kt:11:11:11:11 | 0 |
| Test.kt:4:2:79:2 | Entry | 32 | Test.kt:11:7:11:11 | ... > ... |
| Test.kt:4:2:79:2 | Normal Exit | 0 | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:4:13:79:2 | { ... } | 0 | Test.kt:4:13:79:2 | { ... } |
| Test.kt:4:13:79:2 | { ... } | 1 | Test.kt:5:7:5:7 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 2 | Test.kt:5:16:5:16 | 0 |
| Test.kt:4:13:79:2 | { ... } | 3 | Test.kt:5:7:5:7 | x |
| Test.kt:4:13:79:2 | { ... } | 4 | Test.kt:6:7:6:7 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 5 | Test.kt:6:17:6:18 | 50 |
| Test.kt:4:13:79:2 | { ... } | 6 | Test.kt:6:7:6:7 | y |
| Test.kt:4:13:79:2 | { ... } | 7 | Test.kt:7:7:7:7 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 8 | Test.kt:7:16:7:16 | 0 |
| Test.kt:4:13:79:2 | { ... } | 9 | Test.kt:7:7:7:7 | z |
| Test.kt:4:13:79:2 | { ... } | 10 | Test.kt:8:7:8:7 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 11 | Test.kt:8:16:8:16 | 0 |
| Test.kt:4:13:79:2 | { ... } | 12 | Test.kt:8:7:8:7 | w |
| Test.kt:4:13:79:2 | { ... } | 13 | Test.kt:11:3:16:3 | <Expr>; |
| Test.kt:4:13:79:2 | { ... } | 14 | Test.kt:11:3:16:3 | when ... |
| Test.kt:4:13:79:2 | { ... } | 15 | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:4:13:79:2 | { ... } | 16 | Test.kt:11:7:11:7 | x |
| Test.kt:4:13:79:2 | { ... } | 17 | Test.kt:11:11:11:11 | 0 |
| Test.kt:4:13:79:2 | { ... } | 18 | Test.kt:11:7:11:11 | ... > ... |
| Test.kt:11:3:16:3 | ... -> ... | 0 | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:11:3:16:3 | ... -> ... | 1 | Test.kt:11:3:16:3 | true |
| Test.kt:11:3:16:3 | ... -> ... | 2 | Test.kt:14:10:16:3 | { ... } |
| Test.kt:11:3:16:3 | ... -> ... | 3 | Test.kt:15:4:15:4 | <Expr>; |
| Test.kt:11:3:16:3 | ... -> ... | 4 | Test.kt:15:8:15:9 | 30 |
| Test.kt:11:3:16:3 | ... -> ... | 5 | Test.kt:15:4:15:9 | ...=... |
| Test.kt:11:14:14:3 | { ... } | 0 | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:14:14:3 | { ... } | 1 | Test.kt:12:4:12:4 | <Expr>; |
| Test.kt:11:14:14:3 | { ... } | 2 | Test.kt:12:8:12:9 | 20 |
| Test.kt:11:14:14:3 | { ... } | 3 | Test.kt:12:4:12:9 | ...=... |
| Test.kt:11:14:14:3 | { ... } | 4 | Test.kt:13:4:13:4 | <Expr>; |
| Test.kt:11:14:14:3 | { ... } | 5 | Test.kt:13:8:13:9 | 10 |
| Test.kt:11:14:14:3 | { ... } | 6 | Test.kt:13:4:13:9 | ...=... |
| Test.kt:18:3:18:3 | <Expr>; | 0 | Test.kt:18:3:18:3 | <Expr>; |
| Test.kt:18:3:18:3 | <Expr>; | 1 | Test.kt:18:7:18:7 | 0 |
| Test.kt:18:3:18:3 | <Expr>; | 2 | Test.kt:18:3:18:7 | ...=... |
| Test.kt:18:3:18:3 | <Expr>; | 3 | Test.kt:21:3:24:9 | <Expr>; |
| Test.kt:18:3:18:3 | <Expr>; | 4 | Test.kt:21:3:24:9 | when ... |
| Test.kt:18:3:18:3 | <Expr>; | 5 | Test.kt:21:3:24:9 | ... -> ... |
| Test.kt:18:3:18:3 | <Expr>; | 6 | Test.kt:21:6:21:6 | x |
| Test.kt:18:3:18:3 | <Expr>; | 7 | Test.kt:21:10:21:10 | 0 |
| Test.kt:18:3:18:3 | <Expr>; | 8 | Test.kt:21:6:21:10 | ... < ... |
| Test.kt:21:3:24:9 | ... -> ... | 0 | Test.kt:21:3:24:9 | ... -> ... |
| Test.kt:21:3:24:9 | ... -> ... | 1 | Test.kt:21:3:24:9 | true |
| Test.kt:21:3:24:9 | ... -> ... | 2 | Test.kt:24:4:24:9 | INSTANCE |
| Test.kt:21:3:24:9 | ... -> ... | 3 | Test.kt:24:4:24:9 | return ... |
| Test.kt:22:4:22:4 | <Expr>; | 0 | Test.kt:22:4:22:4 | <Expr>; |
| Test.kt:22:4:22:4 | <Expr>; | 1 | Test.kt:22:8:22:9 | 40 |
| Test.kt:22:4:22:4 | <Expr>; | 2 | Test.kt:22:4:22:9 | ...=... |
| Test.kt:22:4:22:4 | <Expr>; | 3 | Test.kt:27:3:27:3 | <Expr>; |
| Test.kt:22:4:22:4 | <Expr>; | 4 | Test.kt:27:7:27:8 | 10 |
| Test.kt:22:4:22:4 | <Expr>; | 5 | Test.kt:27:3:27:8 | ...=... |
| Test.kt:22:4:22:4 | <Expr>; | 6 | Test.kt:30:3:33:3 | <Expr>; |
| Test.kt:22:4:22:4 | <Expr>; | 7 | Test.kt:30:3:33:3 | when ... |
| Test.kt:22:4:22:4 | <Expr>; | 8 | Test.kt:30:3:33:3 | ... -> ... |
| Test.kt:22:4:22:4 | <Expr>; | 9 | Test.kt:30:7:30:7 | x |
| Test.kt:22:4:22:4 | <Expr>; | 10 | Test.kt:30:12:30:12 | 0 |
| Test.kt:22:4:22:4 | <Expr>; | 11 | Test.kt:30:7:30:12 | ... (value equals) ... |
| Test.kt:30:15:33:3 | { ... } | 0 | Test.kt:30:15:33:3 | { ... } |
| Test.kt:30:15:33:3 | { ... } | 1 | Test.kt:31:4:31:4 | <Expr>; |
| Test.kt:30:15:33:3 | { ... } | 2 | Test.kt:31:8:31:9 | 60 |
| Test.kt:30:15:33:3 | { ... } | 3 | Test.kt:31:4:31:9 | ...=... |
| Test.kt:30:15:33:3 | { ... } | 4 | Test.kt:32:4:32:4 | <Expr>; |
| Test.kt:30:15:33:3 | { ... } | 5 | Test.kt:32:8:32:9 | 10 |
| Test.kt:30:15:33:3 | { ... } | 6 | Test.kt:32:4:32:9 | ...=... |
| Test.kt:35:3:35:3 | <Expr>; | 0 | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:35:3:35:3 | <Expr>; | 1 | Test.kt:35:7:35:8 | 20 |
| Test.kt:35:3:35:3 | <Expr>; | 2 | Test.kt:35:3:35:8 | ...=... |
| Test.kt:35:3:35:3 | <Expr>; | 3 | Test.kt:38:3:41:3 | while (...) |
| Test.kt:38:9:38:9 | x | 0 | Test.kt:38:9:38:9 | x |
| Test.kt:38:9:38:9 | x | 1 | Test.kt:38:13:38:13 | 0 |
| Test.kt:38:9:38:9 | x | 2 | Test.kt:38:9:38:13 | ... > ... |
| Test.kt:38:16:41:3 | { ... } | 0 | Test.kt:38:16:41:3 | { ... } |
| Test.kt:38:16:41:3 | { ... } | 1 | Test.kt:39:4:39:4 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 2 | Test.kt:39:8:39:9 | 10 |
| Test.kt:38:16:41:3 | { ... } | 3 | Test.kt:39:4:39:9 | ...=... |
| Test.kt:38:16:41:3 | { ... } | 4 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 5 | Test.kt:40:4:40:6 | <Stmt> |
| Test.kt:38:16:41:3 | { ... } | 6 | Test.kt:40:4:40:6 | { ... } |
| Test.kt:38:16:41:3 | { ... } | 7 | Test.kt:40:4:40:6 | var ...; |
| Test.kt:38:16:41:3 | { ... } | 8 | Test.kt:40:4:40:4 | x |
| Test.kt:38:16:41:3 | { ... } | 9 | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:38:16:41:3 | { ... } | 10 | Test.kt:40:4:40:4 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 11 | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:38:16:41:3 | { ... } | 12 | Test.kt:40:4:40:6 | dec(...) |
| Test.kt:38:16:41:3 | { ... } | 13 | Test.kt:40:4:40:6 | ...=... |
| Test.kt:38:16:41:3 | { ... } | 14 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 15 | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:38:16:41:3 | { ... } | 16 | Test.kt:40:4:40:6 | <implicit coercion to unit> |
| Test.kt:43:3:43:3 | <Expr>; | 0 | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:43:3:43:3 | <Expr>; | 1 | Test.kt:43:7:43:8 | 30 |
| Test.kt:43:3:43:3 | <Expr>; | 2 | Test.kt:43:3:43:8 | ...=... |
| Test.kt:43:3:43:3 | <Expr>; | 3 | Test.kt:73:3:73:3 | <Expr>; |
| Test.kt:43:3:43:3 | <Expr>; | 4 | Test.kt:73:7:73:8 | 50 |
| Test.kt:43:3:43:3 | <Expr>; | 5 | Test.kt:73:3:73:8 | ...=... |
| Test.kt:43:3:43:3 | <Expr>; | 6 | Test.kt:77:3:77:3 | <Expr>; |
| Test.kt:43:3:43:3 | <Expr>; | 7 | Test.kt:77:7:77:8 | 40 |
| Test.kt:43:3:43:3 | <Expr>; | 8 | Test.kt:77:3:77:8 | ...=... |
| Test.kt:43:3:43:3 | <Expr>; | 9 | Test.kt:78:3:78:8 | INSTANCE |
| Test.kt:43:3:43:3 | <Expr>; | 10 | Test.kt:78:3:78:8 | return ... |
| Test.kt:82:1:89:1 | Exceptional Exit | 0 | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:4:2:79:2 | Normal Exit | 1 | Test.kt:4:2:79:2 | Exit |
| Test.kt:11:3:16:3 | After when ... | 0 | Test.kt:11:3:16:3 | After when ... |
| Test.kt:11:3:16:3 | After when ... | 1 | Test.kt:11:3:16:3 | After <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 2 | Test.kt:18:3:18:3 | <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 3 | Test.kt:18:3:18:7 | Before ...=... |
| Test.kt:11:3:16:3 | After when ... | 4 | Test.kt:18:3:18:3 | z |
| Test.kt:11:3:16:3 | After when ... | 5 | Test.kt:18:7:18:7 | 0 |
| Test.kt:11:3:16:3 | After when ... | 6 | Test.kt:18:3:18:7 | ...=... |
| Test.kt:11:3:16:3 | After when ... | 7 | Test.kt:18:3:18:7 | After ...=... |
| Test.kt:11:3:16:3 | After when ... | 8 | Test.kt:18:3:18:3 | After <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 9 | Test.kt:21:3:24:9 | <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 10 | Test.kt:21:3:24:9 | when ... |
| Test.kt:11:3:16:3 | After when ... | 11 | Test.kt:21:3:24:9 | ... -> ... |
| Test.kt:11:3:16:3 | After when ... | 12 | Test.kt:21:6:21:10 | Before ... < ... |
| Test.kt:11:3:16:3 | After when ... | 13 | Test.kt:21:6:21:6 | x |
| Test.kt:11:3:16:3 | After when ... | 14 | Test.kt:21:10:21:10 | 0 |
| Test.kt:11:3:16:3 | After when ... | 15 | Test.kt:21:6:21:10 | ... < ... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 0 | Test.kt:11:7:11:11 | After ... > ... [false] |
| Test.kt:11:7:11:11 | After ... > ... [false] | 1 | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 2 | Test.kt:11:3:16:3 | true |
| Test.kt:11:7:11:11 | After ... > ... [false] | 3 | Test.kt:11:3:16:3 | After true [true] |
| Test.kt:11:7:11:11 | After ... > ... [false] | 4 | Test.kt:14:10:16:3 | { ... } |
| Test.kt:11:7:11:11 | After ... > ... [false] | 5 | Test.kt:15:4:15:4 | <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [false] | 6 | Test.kt:15:4:15:9 | Before ...=... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 7 | Test.kt:15:4:15:4 | y |
| Test.kt:11:7:11:11 | After ... > ... [false] | 8 | Test.kt:15:8:15:9 | 30 |
| Test.kt:11:7:11:11 | After ... > ... [false] | 9 | Test.kt:15:4:15:9 | ...=... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 10 | Test.kt:15:4:15:9 | After ...=... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 11 | Test.kt:15:4:15:4 | After <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [false] | 12 | Test.kt:14:10:16:3 | After { ... } |
| Test.kt:11:7:11:11 | After ... > ... [true] | 0 | Test.kt:11:7:11:11 | After ... > ... [true] |
| Test.kt:11:7:11:11 | After ... > ... [true] | 1 | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:7:11:11 | After ... > ... [true] | 2 | Test.kt:12:4:12:4 | <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 3 | Test.kt:12:4:12:9 | Before ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 4 | Test.kt:12:4:12:4 | y |
| Test.kt:11:7:11:11 | After ... > ... [true] | 5 | Test.kt:12:8:12:9 | 20 |
| Test.kt:11:7:11:11 | After ... > ... [true] | 6 | Test.kt:12:4:12:9 | ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 7 | Test.kt:12:4:12:9 | After ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 8 | Test.kt:12:4:12:4 | After <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 9 | Test.kt:13:4:13:4 | <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 10 | Test.kt:13:4:13:9 | Before ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 11 | Test.kt:13:4:13:4 | z |
| Test.kt:11:7:11:11 | After ... > ... [true] | 12 | Test.kt:13:8:13:9 | 10 |
| Test.kt:11:7:11:11 | After ... > ... [true] | 13 | Test.kt:13:4:13:9 | ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 14 | Test.kt:13:4:13:9 | After ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 15 | Test.kt:13:4:13:4 | After <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 16 | Test.kt:11:14:14:3 | After { ... } |
| Test.kt:21:6:21:10 | After ... < ... [false] | 0 | Test.kt:21:6:21:10 | After ... < ... [false] |
| Test.kt:21:6:21:10 | After ... < ... [false] | 1 | Test.kt:21:3:24:9 | ... -> ... |
| Test.kt:21:6:21:10 | After ... < ... [false] | 2 | Test.kt:21:3:24:9 | true |
| Test.kt:21:6:21:10 | After ... < ... [false] | 3 | Test.kt:21:3:24:9 | After true [true] |
| Test.kt:21:6:21:10 | After ... < ... [false] | 4 | Test.kt:24:4:24:9 | Before return ... |
| Test.kt:21:6:21:10 | After ... < ... [false] | 5 | Test.kt:24:4:24:9 | INSTANCE |
| Test.kt:21:6:21:10 | After ... < ... [false] | 6 | Test.kt:24:4:24:9 | return ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 0 | Test.kt:21:6:21:10 | After ... < ... [true] |
| Test.kt:21:6:21:10 | After ... < ... [true] | 1 | Test.kt:22:4:22:4 | <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 2 | Test.kt:22:4:22:9 | Before ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 3 | Test.kt:22:4:22:4 | y |
| Test.kt:21:6:21:10 | After ... < ... [true] | 4 | Test.kt:22:8:22:9 | 40 |
| Test.kt:21:6:21:10 | After ... < ... [true] | 5 | Test.kt:22:4:22:9 | ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 6 | Test.kt:22:4:22:9 | After ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 7 | Test.kt:22:4:22:4 | After <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 8 | Test.kt:21:3:24:9 | After when ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 9 | Test.kt:21:3:24:9 | After <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 10 | Test.kt:27:3:27:3 | <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 11 | Test.kt:27:3:27:8 | Before ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 12 | Test.kt:27:3:27:3 | z |
| Test.kt:21:6:21:10 | After ... < ... [true] | 13 | Test.kt:27:7:27:8 | 10 |
| Test.kt:21:6:21:10 | After ... < ... [true] | 14 | Test.kt:27:3:27:8 | ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 15 | Test.kt:27:3:27:8 | After ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 16 | Test.kt:27:3:27:3 | After <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 17 | Test.kt:30:3:33:3 | <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 18 | Test.kt:30:3:33:3 | when ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 19 | Test.kt:30:3:33:3 | ... -> ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 20 | Test.kt:30:7:30:12 | Before ... (value equals) ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 21 | Test.kt:30:7:30:7 | x |
| Test.kt:21:6:21:10 | After ... < ... [true] | 22 | Test.kt:30:12:30:12 | 0 |
| Test.kt:21:6:21:10 | After ... < ... [true] | 23 | Test.kt:30:7:30:12 | ... (value equals) ... |
| Test.kt:30:3:33:3 | After when ... | 0 | Test.kt:30:3:33:3 | After when ... |
| Test.kt:30:3:33:3 | After when ... | 1 | Test.kt:30:3:33:3 | After <Expr>; |
| Test.kt:30:3:33:3 | After when ... | 2 | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:30:3:33:3 | After when ... | 3 | Test.kt:35:3:35:8 | Before ...=... |
| Test.kt:30:3:33:3 | After when ... | 4 | Test.kt:35:3:35:3 | z |
| Test.kt:30:3:33:3 | After when ... | 5 | Test.kt:35:7:35:8 | 20 |
| Test.kt:30:3:33:3 | After when ... | 6 | Test.kt:35:3:35:8 | ...=... |
| Test.kt:30:3:33:3 | After when ... | 7 | Test.kt:35:3:35:8 | After ...=... |
| Test.kt:30:3:33:3 | After when ... | 8 | Test.kt:35:3:35:3 | After <Expr>; |
| Test.kt:30:3:33:3 | After when ... | 9 | Test.kt:38:3:41:3 | while (...) |
| Test.kt:30:7:30:12 | After ... (value equals) ... [false] | 0 | Test.kt:30:7:30:12 | After ... (value equals) ... [false] |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 0 | Test.kt:30:7:30:12 | After ... (value equals) ... [true] |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 1 | Test.kt:30:15:33:3 | { ... } |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 2 | Test.kt:31:4:31:4 | <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 3 | Test.kt:31:4:31:9 | Before ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 4 | Test.kt:31:4:31:4 | y |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 5 | Test.kt:31:8:31:9 | 60 |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 6 | Test.kt:31:4:31:9 | ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 7 | Test.kt:31:4:31:9 | After ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 8 | Test.kt:31:4:31:4 | After <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 9 | Test.kt:32:4:32:4 | <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 10 | Test.kt:32:4:32:9 | Before ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 11 | Test.kt:32:4:32:4 | z |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 12 | Test.kt:32:8:32:9 | 10 |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 13 | Test.kt:32:4:32:9 | ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 14 | Test.kt:32:4:32:9 | After ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 15 | Test.kt:32:4:32:4 | After <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 16 | Test.kt:30:15:33:3 | After { ... } |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 0 | Test.kt:38:3:41:3 | [LoopHeader] while (...) |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 1 | Test.kt:38:9:38:13 | Before ... > ... |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 2 | Test.kt:38:9:38:9 | x |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 3 | Test.kt:38:13:38:13 | 0 |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 4 | Test.kt:38:9:38:13 | ... > ... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 0 | Test.kt:38:9:38:13 | After ... > ... [false] |
| Test.kt:38:9:38:13 | After ... > ... [false] | 1 | Test.kt:38:3:41:3 | After while (...) |
| Test.kt:38:9:38:13 | After ... > ... [false] | 2 | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 3 | Test.kt:43:3:43:8 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 4 | Test.kt:43:3:43:3 | z |
| Test.kt:38:9:38:13 | After ... > ... [false] | 5 | Test.kt:43:7:43:8 | 30 |
| Test.kt:38:9:38:13 | After ... > ... [false] | 6 | Test.kt:43:3:43:8 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 7 | Test.kt:43:3:43:8 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 8 | Test.kt:43:3:43:3 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 9 | Test.kt:73:3:73:3 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 10 | Test.kt:73:3:73:8 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 11 | Test.kt:73:3:73:3 | z |
| Test.kt:38:9:38:13 | After ... > ... [false] | 12 | Test.kt:73:7:73:8 | 50 |
| Test.kt:38:9:38:13 | After ... > ... [false] | 13 | Test.kt:73:3:73:8 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 14 | Test.kt:73:3:73:8 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 15 | Test.kt:73:3:73:3 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 16 | Test.kt:77:3:77:3 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 17 | Test.kt:77:3:77:8 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 18 | Test.kt:77:3:77:3 | w |
| Test.kt:38:9:38:13 | After ... > ... [false] | 19 | Test.kt:77:7:77:8 | 40 |
| Test.kt:38:9:38:13 | After ... > ... [false] | 20 | Test.kt:77:3:77:8 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 21 | Test.kt:77:3:77:8 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 22 | Test.kt:77:3:77:3 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 23 | Test.kt:78:3:78:8 | Before return ... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 24 | Test.kt:78:3:78:8 | INSTANCE |
| Test.kt:38:9:38:13 | After ... > ... [false] | 25 | Test.kt:78:3:78:8 | return ... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 0 | Test.kt:38:9:38:13 | After ... > ... [true] |
| Test.kt:38:9:38:13 | After ... > ... [true] | 1 | Test.kt:38:16:41:3 | { ... } |
| Test.kt:38:9:38:13 | After ... > ... [true] | 2 | Test.kt:39:4:39:4 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 3 | Test.kt:39:4:39:9 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 4 | Test.kt:39:4:39:4 | y |
| Test.kt:38:9:38:13 | After ... > ... [true] | 5 | Test.kt:39:8:39:9 | 10 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 6 | Test.kt:39:4:39:9 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 7 | Test.kt:39:4:39:9 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 8 | Test.kt:39:4:39:4 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 9 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 10 | Test.kt:40:4:40:6 | Before <implicit coercion to unit> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 11 | Test.kt:40:4:40:6 | Before <Stmt> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 12 | Test.kt:40:4:40:6 | { ... } |
| Test.kt:38:9:38:13 | After ... > ... [true] | 13 | Test.kt:40:4:40:6 | var ...; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 14 | Test.kt:40:4:40:6 | Before tmp0 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 15 | Test.kt:40:4:40:4 | x |
| Test.kt:38:9:38:13 | After ... > ... [true] | 16 | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 17 | Test.kt:40:4:40:6 | After tmp0 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 18 | Test.kt:40:4:40:6 | After var ...; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 19 | Test.kt:40:4:40:4 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 20 | Test.kt:40:4:40:6 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 21 | Test.kt:40:4:40:4 | x |
| Test.kt:38:9:38:13 | After ... > ... [true] | 22 | Test.kt:40:4:40:6 | Before dec(...) |
| Test.kt:38:9:38:13 | After ... > ... [true] | 23 | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 24 | Test.kt:40:4:40:6 | dec(...) |
| Test.kt:38:9:38:13 | After ... > ... [true] | 25 | Test.kt:40:4:40:6 | After dec(...) |
| Test.kt:38:9:38:13 | After ... > ... [true] | 26 | Test.kt:40:4:40:6 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 27 | Test.kt:40:4:40:6 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 28 | Test.kt:40:4:40:4 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 29 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 30 | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 31 | Test.kt:40:4:40:6 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 32 | Test.kt:40:4:40:6 | After { ... } |
| Test.kt:38:9:38:13 | After ... > ... [true] | 33 | Test.kt:40:4:40:6 | <Stmt> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 34 | Test.kt:40:4:40:6 | After <Stmt> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 35 | Test.kt:40:4:40:6 | <implicit coercion to unit> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 36 | Test.kt:40:4:40:6 | After <implicit coercion to unit> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 37 | Test.kt:40:4:40:6 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 38 | Test.kt:38:16:41:3 | After { ... } |
| Test.kt:82:1:89:1 | Entry | 0 | Test.kt:82:1:89:1 | Entry |
| Test.kt:82:1:89:1 | Entry | 1 | Test.kt:82:21:89:1 | { ... } |
| Test.kt:82:1:89:1 | Entry | 2 | Test.kt:83:2:88:2 | try ... |
| Test.kt:82:1:89:1 | Entry | 3 | Test.kt:83:6:86:2 | { ... } |
| Test.kt:82:1:89:1 | Entry | 4 | Test.kt:84:7:84:7 | var ...; |
| Test.kt:82:1:89:1 | Entry | 5 | Test.kt:84:7:84:7 | Before x |
| Test.kt:82:1:89:1 | Entry | 6 | Test.kt:84:11:84:18 | Before (...)... |
| Test.kt:82:1:89:1 | Entry | 7 | Test.kt:84:11:84:11 | o |
| Test.kt:82:1:89:1 | Entry | 8 | Test.kt:84:11:84:18 | (...)... |
| Test.kt:82:1:89:1 | Exit | 0 | Test.kt:82:1:89:1 | Exit |
| Test.kt:82:1:89:1 | Normal Exit | 0 | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:82:21:89:1 | { ... } | 0 | Test.kt:82:21:89:1 | { ... } |
| Test.kt:82:21:89:1 | { ... } | 1 | Test.kt:83:2:88:2 | try ... |
| Test.kt:82:21:89:1 | { ... } | 2 | Test.kt:83:6:86:2 | { ... } |
| Test.kt:82:21:89:1 | { ... } | 3 | Test.kt:84:7:84:7 | var ...; |
| Test.kt:82:21:89:1 | { ... } | 4 | Test.kt:84:11:84:11 | o |
| Test.kt:82:21:89:1 | { ... } | 5 | Test.kt:84:11:84:18 | (...)... |
| Test.kt:84:7:84:7 | x | 0 | Test.kt:84:7:84:7 | x |
| Test.kt:84:7:84:7 | x | 1 | Test.kt:85:10:85:10 | 1 |
| Test.kt:84:7:84:7 | x | 2 | Test.kt:85:3:85:10 | return ... |
| Test.kt:84:11:84:18 | After (...)... | 0 | Test.kt:84:11:84:18 | After (...)... |
| Test.kt:84:11:84:18 | After (...)... | 1 | Test.kt:84:7:84:7 | x |
| Test.kt:84:11:84:18 | After (...)... | 2 | Test.kt:84:7:84:7 | After x |
| Test.kt:84:11:84:18 | After (...)... | 3 | Test.kt:84:7:84:7 | After var ...; |
| Test.kt:84:11:84:18 | After (...)... | 4 | Test.kt:85:3:85:10 | Before return ... |
| Test.kt:84:11:84:18 | After (...)... | 5 | Test.kt:85:10:85:10 | 1 |
| Test.kt:84:11:84:18 | After (...)... | 6 | Test.kt:85:3:85:10 | return ... |
| Test.kt:86:4:88:2 | After catch (...) [match] | 0 | Test.kt:86:4:88:2 | After catch (...) [match] |
| Test.kt:86:4:88:2 | After catch (...) [match] | 1 | Test.kt:86:11:86:31 | e |
| Test.kt:86:4:88:2 | After catch (...) [match] | 2 | Test.kt:86:34:88:2 | { ... } |
| Test.kt:86:4:88:2 | After catch (...) [match] | 3 | Test.kt:87:3:87:10 | Before return ... |
| Test.kt:86:4:88:2 | After catch (...) [match] | 4 | Test.kt:87:10:87:10 | 2 |
| Test.kt:86:4:88:2 | After catch (...) [match] | 5 | Test.kt:87:3:87:10 | return ... |
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 0 | Test.kt:86:4:88:2 | After catch (...) [no-match] |
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 1 | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) |
| Test.kt:86:4:88:2 | catch (...) | 1 | Test.kt:86:11:86:31 | e |
| Test.kt:86:4:88:2 | catch (...) | 2 | Test.kt:86:34:88:2 | { ... } |
| Test.kt:86:4:88:2 | catch (...) | 3 | Test.kt:87:10:87:10 | 2 |
| Test.kt:86:4:88:2 | catch (...) | 4 | Test.kt:87:3:87:10 | return ... |
| Test.kt:91:1:98:1 | Exceptional Exit | 0 | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:91:1:98:1 | Entry | 0 | Test.kt:91:1:98:1 | Entry |
| Test.kt:91:1:98:1 | Entry | 1 | Test.kt:91:22:98:1 | { ... } |
| Test.kt:91:1:98:1 | Entry | 2 | Test.kt:92:2:97:2 | try ... |
| Test.kt:91:1:98:1 | Entry | 3 | Test.kt:92:6:95:2 | { ... } |
| Test.kt:91:1:98:1 | Entry | 4 | Test.kt:93:7:93:7 | var ...; |
| Test.kt:91:1:98:1 | Entry | 5 | Test.kt:93:7:93:7 | Before x |
| Test.kt:91:1:98:1 | Entry | 6 | Test.kt:93:12:93:13 | Before ...!! |
| Test.kt:91:1:98:1 | Entry | 7 | Test.kt:93:11:93:11 | o |
| Test.kt:91:1:98:1 | Entry | 8 | Test.kt:93:12:93:13 | ...!! |
| Test.kt:91:1:98:1 | Exit | 0 | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:1:98:1 | Normal Exit | 0 | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:91:22:98:1 | { ... } | 0 | Test.kt:91:22:98:1 | { ... } |
| Test.kt:91:22:98:1 | { ... } | 1 | Test.kt:92:2:97:2 | try ... |
| Test.kt:91:22:98:1 | { ... } | 2 | Test.kt:92:6:95:2 | { ... } |
| Test.kt:91:22:98:1 | { ... } | 3 | Test.kt:93:7:93:7 | var ...; |
| Test.kt:91:22:98:1 | { ... } | 4 | Test.kt:93:11:93:11 | o |
| Test.kt:91:22:98:1 | { ... } | 5 | Test.kt:93:12:93:13 | ...!! |
| Test.kt:93:7:93:7 | x | 0 | Test.kt:93:7:93:7 | x |
| Test.kt:93:7:93:7 | x | 1 | Test.kt:94:10:94:10 | 1 |
| Test.kt:93:7:93:7 | x | 2 | Test.kt:94:3:94:10 | return ... |
| Test.kt:93:12:93:13 | After ...!! | 0 | Test.kt:93:12:93:13 | After ...!! |
| Test.kt:93:12:93:13 | After ...!! | 1 | Test.kt:93:7:93:7 | x |
| Test.kt:93:12:93:13 | After ...!! | 2 | Test.kt:93:7:93:7 | After x |
| Test.kt:93:12:93:13 | After ...!! | 3 | Test.kt:93:7:93:7 | After var ...; |
| Test.kt:93:12:93:13 | After ...!! | 4 | Test.kt:94:3:94:10 | Before return ... |
| Test.kt:93:12:93:13 | After ...!! | 5 | Test.kt:94:10:94:10 | 1 |
| Test.kt:93:12:93:13 | After ...!! | 6 | Test.kt:94:3:94:10 | return ... |
| Test.kt:95:4:97:2 | After catch (...) [match] | 0 | Test.kt:95:4:97:2 | After catch (...) [match] |
| Test.kt:95:4:97:2 | After catch (...) [match] | 1 | Test.kt:95:11:95:33 | e |
| Test.kt:95:4:97:2 | After catch (...) [match] | 2 | Test.kt:95:36:97:2 | { ... } |
| Test.kt:95:4:97:2 | After catch (...) [match] | 3 | Test.kt:96:3:96:10 | Before return ... |
| Test.kt:95:4:97:2 | After catch (...) [match] | 4 | Test.kt:96:10:96:10 | 2 |
| Test.kt:95:4:97:2 | After catch (...) [match] | 5 | Test.kt:96:3:96:10 | return ... |
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 0 | Test.kt:95:4:97:2 | After catch (...) [no-match] |
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 1 | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) |
| Test.kt:95:4:97:2 | catch (...) | 1 | Test.kt:95:11:95:33 | e |
| Test.kt:95:4:97:2 | catch (...) | 2 | Test.kt:95:36:97:2 | { ... } |
| Test.kt:95:4:97:2 | catch (...) | 3 | Test.kt:96:10:96:10 | 2 |
| Test.kt:95:4:97:2 | catch (...) | 4 | Test.kt:96:3:96:10 | return ... |
| Test.kt:100:1:110:1 | Entry | 0 | Test.kt:100:1:110:1 | Entry |
| Test.kt:100:1:110:1 | Entry | 1 | Test.kt:100:25:110:1 | { ... } |
| Test.kt:100:1:110:1 | Entry | 2 | Test.kt:101:5:103:5 | <Expr>; |
| Test.kt:100:1:110:1 | Entry | 3 | Test.kt:101:5:103:5 | when ... |
| Test.kt:100:1:110:1 | Entry | 4 | Test.kt:101:5:103:5 | ... -> ... |
| Test.kt:100:1:110:1 | Entry | 5 | Test.kt:101:9:101:30 | ... && ... |
| Test.kt:100:1:110:1 | Entry | 6 | Test.kt:101:9:101:17 | Before ... (value equals) ... |
| Test.kt:100:1:110:1 | Entry | 7 | Test.kt:101:9:101:9 | x |
| Test.kt:100:1:110:1 | Entry | 8 | Test.kt:101:14:101:17 | null |
| Test.kt:100:1:110:1 | Entry | 9 | Test.kt:101:9:101:17 | ... (value equals) ... |
| Test.kt:100:1:110:1 | Exit | 0 | Test.kt:100:1:110:1 | Exit |
| Test.kt:100:1:110:1 | Normal Exit | 0 | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:100:25:110:1 | { ... } | 0 | Test.kt:100:25:110:1 | { ... } |
| Test.kt:100:25:110:1 | { ... } | 1 | Test.kt:101:5:103:5 | <Expr>; |
| Test.kt:100:25:110:1 | { ... } | 2 | Test.kt:101:5:103:5 | when ... |
| Test.kt:100:25:110:1 | { ... } | 3 | Test.kt:101:5:103:5 | ... -> ... |
| Test.kt:100:25:110:1 | { ... } | 4 | Test.kt:101:9:101:30 | ... && ... |
| Test.kt:100:25:110:1 | { ... } | 5 | Test.kt:101:9:101:9 | x |
| Test.kt:100:25:110:1 | { ... } | 6 | Test.kt:101:14:101:17 | null |
| Test.kt:100:25:110:1 | { ... } | 7 | Test.kt:101:9:101:17 | ... (value equals) ... |
| Test.kt:101:22:101:22 | y | 0 | Test.kt:101:22:101:22 | y |
| Test.kt:101:22:101:22 | y | 1 | Test.kt:101:27:101:30 | null |
| Test.kt:101:22:101:22 | y | 2 | Test.kt:101:22:101:30 | ... (value equals) ... |
| Test.kt:101:33:103:5 | { ... } | 0 | Test.kt:101:33:103:5 | { ... } |
| Test.kt:101:33:103:5 | { ... } | 1 | Test.kt:102:15:102:25 | new Exception(...) |
| Test.kt:101:33:103:5 | { ... } | 2 | Test.kt:102:9:102:25 | throw ... |
| Test.kt:101:33:103:5 | { ... } | 3 | Test.kt:100:1:110:1 | Exceptional Exit |
| Test.kt:105:5:109:5 | <Expr>; | 0 | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:105:5:109:5 | <Expr>; | 1 | Test.kt:105:5:109:5 | when ... |
| Test.kt:105:5:109:5 | <Expr>; | 2 | Test.kt:105:9:107:5 | ... -> ... |
| Test.kt:105:5:109:5 | <Expr>; | 3 | Test.kt:105:9:105:9 | x |
| Test.kt:105:5:109:5 | <Expr>; | 4 | Test.kt:105:14:105:17 | null |
| Test.kt:105:5:109:5 | <Expr>; | 5 | Test.kt:105:9:105:17 | ... (value not-equals) ... |
| Test.kt:105:20:107:5 | { ... } | 0 | Test.kt:105:20:107:5 | { ... } |
| Test.kt:105:20:107:5 | { ... } | 1 | Test.kt:106:9:106:29 | <Expr>; |
| Test.kt:105:20:107:5 | { ... } | 2 | Test.kt:106:17:106:28 | "x not null" |
| Test.kt:105:20:107:5 | { ... } | 3 | Test.kt:106:9:106:29 | println(...) |
| Test.kt:107:16:109:5 | ... -> ... | 0 | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:107:16:109:5 | ... -> ... | 1 | Test.kt:107:16:107:16 | y |
| Test.kt:107:16:109:5 | ... -> ... | 2 | Test.kt:107:21:107:24 | null |
| Test.kt:107:16:109:5 | ... -> ... | 3 | Test.kt:107:16:107:24 | ... (value not-equals) ... |
| Test.kt:107:27:109:5 | { ... } | 0 | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:27:109:5 | { ... } | 1 | Test.kt:108:9:108:29 | <Expr>; |
| Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:17:108:28 | "y not null" |
| Test.kt:107:27:109:5 | { ... } | 3 | Test.kt:108:9:108:29 | println(...) |
| Test.kt:112:1:116:1 | Exceptional Exit | 0 | Test.kt:112:1:116:1 | Exceptional Exit |
| Test.kt:112:1:116:1 | Exit | 0 | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:1:116:1 | Normal Exit | 0 | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:112:32:116:1 | { ... } | 0 | Test.kt:112:32:116:1 | { ... } |
| Test.kt:112:32:116:1 | { ... } | 1 | Test.kt:113:5:115:5 | <Expr>; |
| Test.kt:112:32:116:1 | { ... } | 2 | Test.kt:113:5:115:5 | when ... |
| Test.kt:112:32:116:1 | { ... } | 3 | Test.kt:113:5:115:5 | ... -> ... |
| Test.kt:112:32:116:1 | { ... } | 4 | Test.kt:113:9:113:14 | ... && ... |
| Test.kt:112:32:116:1 | { ... } | 5 | Test.kt:113:9:113:9 | x |
| Test.kt:113:14:113:14 | y | 0 | Test.kt:113:14:113:14 | y |
| Test.kt:113:17:115:5 | { ... } | 0 | Test.kt:113:17:115:5 | { ... } |
| Test.kt:118:1:124:1 | Exceptional Exit | 0 | Test.kt:118:1:124:1 | Exceptional Exit |
| Test.kt:118:1:124:1 | Exit | 0 | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:1:124:1 | Normal Exit | 0 | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:118:37:124:1 | { ... } | 0 | Test.kt:118:37:124:1 | { ... } |
| Test.kt:118:37:124:1 | { ... } | 1 | Test.kt:119:2:123:12 | <Expr>; |
| Test.kt:118:37:124:1 | { ... } | 2 | Test.kt:119:2:123:12 | when ... |
| Test.kt:118:37:124:1 | { ... } | 3 | Test.kt:120:3:123:10 | ... -> ... |
| Test.kt:118:37:124:1 | { ... } | 4 | Test.kt:120:3:123:3 | when ... |
| Test.kt:118:37:124:1 | { ... } | 5 | Test.kt:121:4:121:9 | ... -> ... |
| Test.kt:118:37:124:1 | { ... } | 6 | Test.kt:121:4:121:4 | x |
| Test.kt:121:9:121:9 | <Expr>; | 0 | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:121:9:121:9 | <Expr>; | 1 | Test.kt:121:9:121:9 | y |
| Test.kt:122:12:122:16 | ... -> ... | 0 | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:122:12:122:16 | ... -> ... | 1 | Test.kt:122:12:122:16 | true |
| Test.kt:122:12:122:16 | ... -> ... | 2 | Test.kt:122:12:122:16 | <Expr>; |
| Test.kt:122:12:122:16 | ... -> ... | 3 | Test.kt:122:12:122:16 | false |
| Test.kt:123:8:123:10 | { ... } | 0 | Test.kt:123:8:123:10 | { ... } |
| Test.kt:101:9:101:17 | After ... (value equals) ... [false] | 0 | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 0 | Test.kt:101:9:101:17 | After ... (value equals) ... [true] |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 1 | Test.kt:101:22:101:30 | Before ... (value equals) ... |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 2 | Test.kt:101:22:101:22 | y |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 3 | Test.kt:101:27:101:30 | null |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 4 | Test.kt:101:22:101:30 | ... (value equals) ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 0 | Test.kt:101:9:101:30 | After ... && ... [false] |
| Test.kt:101:9:101:30 | After ... && ... [false] | 1 | Test.kt:101:5:103:5 | After when ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 2 | Test.kt:101:5:103:5 | After <Expr>; |
| Test.kt:101:9:101:30 | After ... && ... [false] | 3 | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:9:101:30 | After ... && ... [false] | 4 | Test.kt:105:5:109:5 | when ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 5 | Test.kt:105:9:107:5 | ... -> ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 6 | Test.kt:105:9:105:17 | Before ... (value not-equals) ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 7 | Test.kt:105:9:105:9 | x |
| Test.kt:101:9:101:30 | After ... && ... [false] | 8 | Test.kt:105:14:105:17 | null |
| Test.kt:101:9:101:30 | After ... && ... [false] | 9 | Test.kt:105:9:105:17 | ... (value not-equals) ... |
| Test.kt:101:22:101:30 | After ... (value equals) ... [false] | 0 | Test.kt:101:22:101:30 | After ... (value equals) ... [false] |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 0 | Test.kt:101:22:101:30 | After ... (value equals) ... [true] |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 1 | Test.kt:101:9:101:30 | After ... && ... [true] |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 2 | Test.kt:101:33:103:5 | { ... } |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 3 | Test.kt:102:9:102:25 | Before throw ... |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 4 | Test.kt:102:15:102:25 | Before new Exception(...) |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 5 | Test.kt:102:15:102:25 | new Exception(...) |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 6 | Test.kt:102:15:102:25 | After new Exception(...) |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 7 | Test.kt:102:9:102:25 | throw ... |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 8 | Test.kt:100:1:110:1 | Exceptional Exit |
| Test.kt:105:5:109:5 | After when ... | 0 | Test.kt:105:5:109:5 | After when ... |
| Test.kt:105:5:109:5 | After when ... | 1 | Test.kt:105:5:109:5 | After <Expr>; |
| Test.kt:105:5:109:5 | After when ... | 2 | Test.kt:100:25:110:1 | After { ... } |
| Test.kt:105:5:109:5 | After when ... | 3 | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 0 | Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 1 | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 2 | Test.kt:107:16:107:24 | Before ... (value not-equals) ... |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 3 | Test.kt:107:16:107:16 | y |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 4 | Test.kt:107:21:107:24 | null |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 5 | Test.kt:107:16:107:24 | ... (value not-equals) ... |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 0 | Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 1 | Test.kt:105:20:107:5 | { ... } |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 2 | Test.kt:106:9:106:29 | <Expr>; |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 3 | Test.kt:106:9:106:29 | Before println(...) |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 4 | Test.kt:106:17:106:28 | "x not null" |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 5 | Test.kt:106:9:106:29 | println(...) |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 6 | Test.kt:106:9:106:29 | After println(...) |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 7 | Test.kt:106:9:106:29 | After <Expr>; |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 8 | Test.kt:105:20:107:5 | After { ... } |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] | 0 | Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 0 | Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 1 | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 2 | Test.kt:108:9:108:29 | <Expr>; |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 3 | Test.kt:108:9:108:29 | Before println(...) |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 4 | Test.kt:108:17:108:28 | "y not null" |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 5 | Test.kt:108:9:108:29 | println(...) |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 6 | Test.kt:108:9:108:29 | After println(...) |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 7 | Test.kt:108:9:108:29 | After <Expr>; |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 8 | Test.kt:107:27:109:5 | After { ... } |
| Test.kt:112:1:116:1 | Entry | 0 | Test.kt:112:1:116:1 | Entry |
| Test.kt:112:1:116:1 | Entry | 1 | Test.kt:112:32:116:1 | { ... } |
| Test.kt:112:1:116:1 | Entry | 2 | Test.kt:113:5:115:5 | <Expr>; |
| Test.kt:112:1:116:1 | Entry | 3 | Test.kt:113:5:115:5 | when ... |
| Test.kt:112:1:116:1 | Entry | 4 | Test.kt:113:5:115:5 | ... -> ... |
| Test.kt:112:1:116:1 | Entry | 5 | Test.kt:113:9:113:14 | ... && ... |
| Test.kt:112:1:116:1 | Entry | 6 | Test.kt:113:9:113:9 | x |
| Test.kt:113:5:115:5 | After when ... | 0 | Test.kt:113:5:115:5 | After when ... |
| Test.kt:113:5:115:5 | After when ... | 1 | Test.kt:113:5:115:5 | After <Expr>; |
| Test.kt:113:5:115:5 | After when ... | 2 | Test.kt:112:32:116:1 | After { ... } |
| Test.kt:113:5:115:5 | After when ... | 3 | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:113:5:115:5 | After when ... | 4 | Test.kt:112:1:116:1 | Exit |
| Test.kt:113:9:113:9 | After x [false] | 0 | Test.kt:113:9:113:9 | After x [false] |
| Test.kt:113:9:113:9 | After x [true] | 0 | Test.kt:113:9:113:9 | After x [true] |
| Test.kt:113:9:113:9 | After x [true] | 1 | Test.kt:113:14:113:14 | y |
| Test.kt:113:9:113:14 | After ... && ... [false] | 0 | Test.kt:113:9:113:14 | After ... && ... [false] |
| Test.kt:113:14:113:14 | After y [false] | 0 | Test.kt:113:14:113:14 | After y [false] |
| Test.kt:113:14:113:14 | After y [true] | 0 | Test.kt:113:14:113:14 | After y [true] |
| Test.kt:113:14:113:14 | After y [true] | 1 | Test.kt:113:9:113:14 | After ... && ... [true] |
| Test.kt:113:14:113:14 | After y [true] | 2 | Test.kt:113:17:115:5 | { ... } |
| Test.kt:118:1:124:1 | Entry | 0 | Test.kt:118:1:124:1 | Entry |
| Test.kt:118:1:124:1 | Entry | 1 | Test.kt:118:37:124:1 | { ... } |
| Test.kt:118:1:124:1 | Entry | 2 | Test.kt:119:2:123:12 | <Expr>; |
| Test.kt:118:1:124:1 | Entry | 3 | Test.kt:119:2:123:12 | when ... |
| Test.kt:118:1:124:1 | Entry | 4 | Test.kt:120:3:123:10 | ... -> ... |
| Test.kt:118:1:124:1 | Entry | 5 | Test.kt:120:3:123:3 | when ... |
| Test.kt:118:1:124:1 | Entry | 6 | Test.kt:121:4:121:9 | ... -> ... |
| Test.kt:118:1:124:1 | Entry | 7 | Test.kt:121:4:121:4 | x |
| Test.kt:119:2:123:12 | After when ... | 0 | Test.kt:119:2:123:12 | After when ... |
| Test.kt:119:2:123:12 | After when ... | 1 | Test.kt:119:2:123:12 | After <Expr>; |
| Test.kt:119:2:123:12 | After when ... | 2 | Test.kt:118:37:124:1 | After { ... } |
| Test.kt:119:2:123:12 | After when ... | 3 | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:119:2:123:12 | After when ... | 4 | Test.kt:118:1:124:1 | Exit |
| Test.kt:120:3:123:3 | After when ... [false] | 0 | Test.kt:120:3:123:3 | After when ... [false] |
| Test.kt:120:3:123:3 | After when ... [true] | 0 | Test.kt:120:3:123:3 | After when ... [true] |
| Test.kt:120:3:123:3 | After when ... [true] | 1 | Test.kt:123:8:123:10 | { ... } |
| Test.kt:121:4:121:4 | After x [false] | 0 | Test.kt:121:4:121:4 | After x [false] |
| Test.kt:121:4:121:4 | After x [false] | 1 | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:121:4:121:4 | After x [false] | 2 | Test.kt:122:12:122:16 | true |
| Test.kt:121:4:121:4 | After x [false] | 3 | Test.kt:122:12:122:16 | After true [true] |
| Test.kt:121:4:121:4 | After x [false] | 4 | Test.kt:122:12:122:16 | <Expr>; |
| Test.kt:121:4:121:4 | After x [false] | 5 | Test.kt:122:12:122:16 | false |
| Test.kt:121:4:121:4 | After x [false] | 6 | Test.kt:122:12:122:16 | After <Expr>; |
| Test.kt:121:4:121:4 | After x [true] | 0 | Test.kt:121:4:121:4 | After x [true] |
| Test.kt:121:4:121:4 | After x [true] | 1 | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:121:4:121:4 | After x [true] | 2 | Test.kt:121:9:121:9 | y |
| Test.kt:121:4:121:4 | After x [true] | 3 | Test.kt:121:9:121:9 | After <Expr>; |

View File

@@ -1,6 +1,3 @@
| Test.kt:3:8:80:1 | { ... } | Test.kt:3:8:80:1 | Exit |
| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } |
@@ -12,7 +9,6 @@
| Test.kt:4:13:79:2 | { ... } | Test.kt:38:9:38:9 | x |
| Test.kt:4:13:79:2 | { ... } | Test.kt:38:16:41:3 | { ... } |
| Test.kt:4:13:79:2 | { ... } | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:4:2:79:2 | Exit |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:21:3:24:9 | ... -> ... |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:22:4:22:4 | <Expr>; |
@@ -31,16 +27,22 @@
| Test.kt:35:3:35:3 | <Expr>; | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } |
| Test.kt:38:9:38:9 | x | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:82:1:89:1 | Normal Exit | Test.kt:82:1:89:1 | Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x |
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:11:86:31 | e |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x |
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:11:95:33 | e |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit |
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
@@ -55,16 +57,11 @@
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } |
| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } |
| Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } |
| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:118:37:124:1 | { ... } | Test.kt:123:8:123:10 | { ... } |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:123:8:123:10 | { ... } |

View File

@@ -1,6 +1,7 @@
import java
import semmle.code.java.controlflow.Dominance
import utils.test.BasicBlock
from BasicBlock b, BasicBlock b2
where b.strictlyDominates(b2)
select b, b2
select getFirstAstNode(b), getFirstAstNode(b2)

View File

@@ -1,7 +1,3 @@
| Test.kt:3:8:80:1 | Exceptional Exit | Test.kt:3:8:80:1 | Exit |
| Test.kt:3:8:80:1 | { ... } | Test.kt:3:8:80:1 | Exit |
| Test.kt:4:2:79:2 | Exceptional Exit | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:3:16:3 | ... -> ... | Test.kt:18:3:18:3 | <Expr>; |
@@ -9,8 +5,9 @@
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:21:3:24:9 | ... -> ... |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:22:4:22:4 | <Expr>; |
| Test.kt:21:3:24:9 | ... -> ... | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:30:7:30:12 | After ... (value equals) ... [false] |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:30:15:33:3 | { ... } |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [false] | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:30:15:33:3 | { ... } | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:35:3:35:3 | <Expr>; | Test.kt:38:9:38:9 | x |
| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } |
@@ -22,37 +19,45 @@
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x |
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
| Test.kt:84:7:84:7 | x | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
| Test.kt:86:11:86:31 | e | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x |
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
| Test.kt:93:7:93:7 | x | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
| Test.kt:95:11:95:33 | e | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit |
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
| Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:9:101:17 | After ... (value equals) ... [false] | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:22:101:22 | y | Test.kt:101:22:101:30 | After ... (value equals) ... [false] |
| Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } |
| Test.kt:101:22:101:22 | y | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:22:101:30 | After ... (value equals) ... [false] | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:33:103:5 | { ... } | Test.kt:100:1:110:1 | Exit |
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:105:20:107:5 | { ... } |
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:112:1:116:1 | Exceptional Exit | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:9:113:9 | After x [false] |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y |
| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:113:9:113:9 | After x [false] | Test.kt:113:9:113:14 | After ... && ... [false] |
| Test.kt:113:9:113:14 | After ... && ... [false] | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:113:14:113:14 | After y [false] | Test.kt:113:9:113:14 | After ... && ... [false] |
| Test.kt:113:14:113:14 | y | Test.kt:113:14:113:14 | After y [false] |
| Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } |
| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:118:1:124:1 | Exceptional Exit | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:120:3:123:3 | After when ... [false] | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:120:3:123:3 | After when ... [false] |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:123:8:123:10 | { ... } |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:120:3:123:3 | After when ... [false] |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:123:8:123:10 | { ... } |
| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | Normal Exit |

View File

@@ -1,5 +1,6 @@
import java
import utils.test.BasicBlock
from BasicBlock b, BasicBlock b2
where b.getASuccessor() = b2
select b, b2
select getFirstAstNodeOrSynth(b), getFirstAstNodeOrSynth(b2)

View File

@@ -1,12 +1,10 @@
#select
| Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | Test.kt:3:8:80:1 | { ... } | BlockStmt |
| Test.kt:3:8:80:1 | Exceptional Exit | Constructor | Test.kt:3:8:80:1 | Exit | Constructor |
| Test.kt:3:8:80:1 | Exit | Constructor | file://:0:0:0:0 | <none> | <none> |
| Test.kt:3:8:80:1 | Entry | Constructor | Test.kt:3:8:80:1 | { ... } | BlockStmt |
| Test.kt:3:8:80:1 | Normal Exit | Constructor | Test.kt:3:8:80:1 | Exit | Constructor |
| Test.kt:3:8:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt |
| Test.kt:3:8:80:1 | { ... } | BlockStmt | Test.kt:3:8:80:1 | Normal Exit | Constructor |
| Test.kt:4:2:79:2 | Exceptional Exit | Method | Test.kt:4:2:79:2 | Exit | Method |
| Test.kt:4:2:79:2 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:4:2:79:2 | Entry | Method | Test.kt:4:13:79:2 | { ... } | BlockStmt |
| Test.kt:4:2:79:2 | Normal Exit | Method | Test.kt:4:2:79:2 | Exit | Method |
| Test.kt:4:13:79:2 | { ... } | BlockStmt | Test.kt:5:7:5:7 | var ...; | LocalVariableDeclStmt |
| Test.kt:5:7:5:7 | var ...; | LocalVariableDeclStmt | Test.kt:5:16:5:16 | 0 | IntegerLiteral |
@@ -31,17 +29,21 @@
| Test.kt:11:7:11:11 | ... > ... | GTExpr | Test.kt:11:14:14:3 | { ... } | BlockStmt |
| Test.kt:11:11:11:11 | 0 | IntegerLiteral | Test.kt:11:7:11:11 | ... > ... | GTExpr |
| Test.kt:11:14:14:3 | { ... } | BlockStmt | Test.kt:12:4:12:4 | <Expr>; | ExprStmt |
| Test.kt:12:4:12:4 | <Expr>; | ExprStmt | Test.kt:12:8:12:9 | 20 | LongLiteral |
| Test.kt:12:4:12:4 | <Expr>; | ExprStmt | Test.kt:12:4:12:4 | y | VarAccess |
| Test.kt:12:4:12:4 | y | VarAccess | Test.kt:12:8:12:9 | 20 | LongLiteral |
| Test.kt:12:4:12:9 | ...=... | AssignExpr | Test.kt:13:4:13:4 | <Expr>; | ExprStmt |
| Test.kt:12:8:12:9 | 20 | LongLiteral | Test.kt:12:4:12:9 | ...=... | AssignExpr |
| Test.kt:13:4:13:4 | <Expr>; | ExprStmt | Test.kt:13:8:13:9 | 10 | IntegerLiteral |
| Test.kt:13:4:13:4 | <Expr>; | ExprStmt | Test.kt:13:4:13:4 | z | VarAccess |
| Test.kt:13:4:13:4 | z | VarAccess | Test.kt:13:8:13:9 | 10 | IntegerLiteral |
| Test.kt:13:4:13:9 | ...=... | AssignExpr | Test.kt:18:3:18:3 | <Expr>; | ExprStmt |
| Test.kt:13:8:13:9 | 10 | IntegerLiteral | Test.kt:13:4:13:9 | ...=... | AssignExpr |
| Test.kt:14:10:16:3 | { ... } | BlockStmt | Test.kt:15:4:15:4 | <Expr>; | ExprStmt |
| Test.kt:15:4:15:4 | <Expr>; | ExprStmt | Test.kt:15:8:15:9 | 30 | LongLiteral |
| Test.kt:15:4:15:4 | <Expr>; | ExprStmt | Test.kt:15:4:15:4 | y | VarAccess |
| Test.kt:15:4:15:4 | y | VarAccess | Test.kt:15:8:15:9 | 30 | LongLiteral |
| Test.kt:15:4:15:9 | ...=... | AssignExpr | Test.kt:18:3:18:3 | <Expr>; | ExprStmt |
| Test.kt:15:8:15:9 | 30 | LongLiteral | Test.kt:15:4:15:9 | ...=... | AssignExpr |
| Test.kt:18:3:18:3 | <Expr>; | ExprStmt | Test.kt:18:7:18:7 | 0 | IntegerLiteral |
| Test.kt:18:3:18:3 | <Expr>; | ExprStmt | Test.kt:18:3:18:3 | z | VarAccess |
| Test.kt:18:3:18:3 | z | VarAccess | Test.kt:18:7:18:7 | 0 | IntegerLiteral |
| Test.kt:18:3:18:7 | ...=... | AssignExpr | Test.kt:21:3:24:9 | <Expr>; | ExprStmt |
| Test.kt:18:7:18:7 | 0 | IntegerLiteral | Test.kt:18:3:18:7 | ...=... | AssignExpr |
| Test.kt:21:3:24:9 | ... -> ... | WhenBranch | Test.kt:21:3:24:9 | true | BooleanLiteral |
@@ -53,12 +55,14 @@
| Test.kt:21:6:21:10 | ... < ... | LTExpr | Test.kt:21:3:24:9 | ... -> ... | WhenBranch |
| Test.kt:21:6:21:10 | ... < ... | LTExpr | Test.kt:22:4:22:4 | <Expr>; | ExprStmt |
| Test.kt:21:10:21:10 | 0 | IntegerLiteral | Test.kt:21:6:21:10 | ... < ... | LTExpr |
| Test.kt:22:4:22:4 | <Expr>; | ExprStmt | Test.kt:22:8:22:9 | 40 | LongLiteral |
| Test.kt:22:4:22:4 | <Expr>; | ExprStmt | Test.kt:22:4:22:4 | y | VarAccess |
| Test.kt:22:4:22:4 | y | VarAccess | Test.kt:22:8:22:9 | 40 | LongLiteral |
| Test.kt:22:4:22:9 | ...=... | AssignExpr | Test.kt:27:3:27:3 | <Expr>; | ExprStmt |
| Test.kt:22:8:22:9 | 40 | LongLiteral | Test.kt:22:4:22:9 | ...=... | AssignExpr |
| Test.kt:24:4:24:9 | INSTANCE | VarAccess | Test.kt:24:4:24:9 | return ... | ReturnStmt |
| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method |
| Test.kt:27:3:27:3 | <Expr>; | ExprStmt | Test.kt:27:7:27:8 | 10 | IntegerLiteral |
| Test.kt:27:3:27:3 | <Expr>; | ExprStmt | Test.kt:27:3:27:3 | z | VarAccess |
| Test.kt:27:3:27:3 | z | VarAccess | Test.kt:27:7:27:8 | 10 | IntegerLiteral |
| Test.kt:27:3:27:8 | ...=... | AssignExpr | Test.kt:30:3:33:3 | <Expr>; | ExprStmt |
| Test.kt:27:7:27:8 | 10 | IntegerLiteral | Test.kt:27:3:27:8 | ...=... | AssignExpr |
| Test.kt:30:3:33:3 | ... -> ... | WhenBranch | Test.kt:30:7:30:7 | x | VarAccess |
@@ -69,13 +73,16 @@
| Test.kt:30:7:30:12 | ... (value equals) ... | ValueEQExpr | Test.kt:35:3:35:3 | <Expr>; | ExprStmt |
| Test.kt:30:12:30:12 | 0 | IntegerLiteral | Test.kt:30:7:30:12 | ... (value equals) ... | ValueEQExpr |
| Test.kt:30:15:33:3 | { ... } | BlockStmt | Test.kt:31:4:31:4 | <Expr>; | ExprStmt |
| Test.kt:31:4:31:4 | <Expr>; | ExprStmt | Test.kt:31:8:31:9 | 60 | LongLiteral |
| Test.kt:31:4:31:4 | <Expr>; | ExprStmt | Test.kt:31:4:31:4 | y | VarAccess |
| Test.kt:31:4:31:4 | y | VarAccess | Test.kt:31:8:31:9 | 60 | LongLiteral |
| Test.kt:31:4:31:9 | ...=... | AssignExpr | Test.kt:32:4:32:4 | <Expr>; | ExprStmt |
| Test.kt:31:8:31:9 | 60 | LongLiteral | Test.kt:31:4:31:9 | ...=... | AssignExpr |
| Test.kt:32:4:32:4 | <Expr>; | ExprStmt | Test.kt:32:8:32:9 | 10 | IntegerLiteral |
| Test.kt:32:4:32:4 | <Expr>; | ExprStmt | Test.kt:32:4:32:4 | z | VarAccess |
| Test.kt:32:4:32:4 | z | VarAccess | Test.kt:32:8:32:9 | 10 | IntegerLiteral |
| Test.kt:32:4:32:9 | ...=... | AssignExpr | Test.kt:35:3:35:3 | <Expr>; | ExprStmt |
| Test.kt:32:8:32:9 | 10 | IntegerLiteral | Test.kt:32:4:32:9 | ...=... | AssignExpr |
| Test.kt:35:3:35:3 | <Expr>; | ExprStmt | Test.kt:35:7:35:8 | 20 | IntegerLiteral |
| Test.kt:35:3:35:3 | <Expr>; | ExprStmt | Test.kt:35:3:35:3 | z | VarAccess |
| Test.kt:35:3:35:3 | z | VarAccess | Test.kt:35:7:35:8 | 20 | IntegerLiteral |
| Test.kt:35:3:35:8 | ...=... | AssignExpr | Test.kt:38:3:41:3 | while (...) | WhileStmt |
| Test.kt:35:7:35:8 | 20 | IntegerLiteral | Test.kt:35:3:35:8 | ...=... | AssignExpr |
| Test.kt:38:3:41:3 | while (...) | WhileStmt | Test.kt:38:9:38:9 | x | VarAccess |
@@ -84,35 +91,40 @@
| Test.kt:38:9:38:13 | ... > ... | GTExpr | Test.kt:43:3:43:3 | <Expr>; | ExprStmt |
| Test.kt:38:13:38:13 | 0 | IntegerLiteral | Test.kt:38:9:38:13 | ... > ... | GTExpr |
| Test.kt:38:16:41:3 | { ... } | BlockStmt | Test.kt:39:4:39:4 | <Expr>; | ExprStmt |
| Test.kt:39:4:39:4 | <Expr>; | ExprStmt | Test.kt:39:8:39:9 | 10 | LongLiteral |
| Test.kt:39:4:39:4 | <Expr>; | ExprStmt | Test.kt:39:4:39:4 | y | VarAccess |
| Test.kt:39:4:39:4 | y | VarAccess | Test.kt:39:8:39:9 | 10 | LongLiteral |
| Test.kt:39:4:39:9 | ...=... | AssignExpr | Test.kt:40:4:40:6 | <Expr>; | ExprStmt |
| Test.kt:39:8:39:9 | 10 | LongLiteral | Test.kt:39:4:39:9 | ...=... | AssignExpr |
| Test.kt:40:4:40:4 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | tmp0 | VarAccess |
| Test.kt:40:4:40:4 | <Expr>; | ExprStmt | Test.kt:40:4:40:4 | x | VarAccess |
| Test.kt:40:4:40:4 | x | VarAccess | Test.kt:40:4:40:6 | tmp0 | LocalVariableDeclExpr |
| Test.kt:40:4:40:4 | x | VarAccess | Test.kt:40:4:40:6 | tmp0 | VarAccess |
| Test.kt:40:4:40:6 | ...=... | AssignExpr | Test.kt:40:4:40:6 | <Expr>; | ExprStmt |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | <Stmt> | StmtExpr |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | tmp0 | VarAccess |
| Test.kt:40:4:40:6 | <Stmt> | StmtExpr | Test.kt:40:4:40:6 | { ... } | BlockStmt |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | { ... } | BlockStmt |
| Test.kt:40:4:40:6 | <Stmt> | StmtExpr | Test.kt:40:4:40:6 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
| Test.kt:40:4:40:6 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr | Test.kt:38:9:38:9 | x | VarAccess |
| Test.kt:40:4:40:6 | dec(...) | MethodCall | Test.kt:40:4:40:6 | ...=... | AssignExpr |
| Test.kt:40:4:40:6 | tmp0 | LocalVariableDeclExpr | Test.kt:40:4:40:4 | <Expr>; | ExprStmt |
| Test.kt:40:4:40:6 | tmp0 | VarAccess | Test.kt:40:4:40:6 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
| Test.kt:40:4:40:6 | tmp0 | VarAccess | Test.kt:40:4:40:6 | <Stmt> | StmtExpr |
| Test.kt:40:4:40:6 | tmp0 | VarAccess | Test.kt:40:4:40:6 | dec(...) | MethodCall |
| Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt | Test.kt:40:4:40:4 | x | VarAccess |
| Test.kt:40:4:40:6 | { ... } | BlockStmt | Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt |
| Test.kt:43:3:43:3 | <Expr>; | ExprStmt | Test.kt:43:7:43:8 | 30 | IntegerLiteral |
| Test.kt:43:3:43:3 | <Expr>; | ExprStmt | Test.kt:43:3:43:3 | z | VarAccess |
| Test.kt:43:3:43:3 | z | VarAccess | Test.kt:43:7:43:8 | 30 | IntegerLiteral |
| Test.kt:43:3:43:8 | ...=... | AssignExpr | Test.kt:73:3:73:3 | <Expr>; | ExprStmt |
| Test.kt:43:7:43:8 | 30 | IntegerLiteral | Test.kt:43:3:43:8 | ...=... | AssignExpr |
| Test.kt:73:3:73:3 | <Expr>; | ExprStmt | Test.kt:73:7:73:8 | 50 | IntegerLiteral |
| Test.kt:73:3:73:3 | <Expr>; | ExprStmt | Test.kt:73:3:73:3 | z | VarAccess |
| Test.kt:73:3:73:3 | z | VarAccess | Test.kt:73:7:73:8 | 50 | IntegerLiteral |
| Test.kt:73:3:73:8 | ...=... | AssignExpr | Test.kt:77:3:77:3 | <Expr>; | ExprStmt |
| Test.kt:73:7:73:8 | 50 | IntegerLiteral | Test.kt:73:3:73:8 | ...=... | AssignExpr |
| Test.kt:77:3:77:3 | <Expr>; | ExprStmt | Test.kt:77:7:77:8 | 40 | IntegerLiteral |
| Test.kt:77:3:77:3 | <Expr>; | ExprStmt | Test.kt:77:3:77:3 | w | VarAccess |
| Test.kt:77:3:77:3 | w | VarAccess | Test.kt:77:7:77:8 | 40 | IntegerLiteral |
| Test.kt:77:3:77:8 | ...=... | AssignExpr | Test.kt:78:3:78:8 | INSTANCE | VarAccess |
| Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:8 | ...=... | AssignExpr |
| Test.kt:78:3:78:8 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt |
| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method |
| Test.kt:82:1:89:1 | Entry | Method | Test.kt:82:21:89:1 | { ... } | BlockStmt |
| Test.kt:82:1:89:1 | Exceptional Exit | Method | Test.kt:82:1:89:1 | Exit | Method |
| Test.kt:82:1:89:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:82:1:89:1 | Normal Exit | Method | Test.kt:82:1:89:1 | Exit | Method |
| Test.kt:82:21:89:1 | { ... } | BlockStmt | Test.kt:83:2:88:2 | try ... | TryStmt |
| Test.kt:83:2:88:2 | try ... | TryStmt | Test.kt:83:6:86:2 | { ... } | BlockStmt |
@@ -124,13 +136,14 @@
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause |
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:82:1:89:1 | Exceptional Exit | Method |
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr |
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
| Test.kt:87:10:87:10 | 2 | IntegerLiteral | Test.kt:87:3:87:10 | return ... | ReturnStmt |
| Test.kt:91:1:98:1 | Entry | Method | Test.kt:91:22:98:1 | { ... } | BlockStmt |
| Test.kt:91:1:98:1 | Exceptional Exit | Method | Test.kt:91:1:98:1 | Exit | Method |
| Test.kt:91:1:98:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:91:1:98:1 | Normal Exit | Method | Test.kt:91:1:98:1 | Exit | Method |
| Test.kt:91:22:98:1 | { ... } | BlockStmt | Test.kt:92:2:97:2 | try ... | TryStmt |
| Test.kt:92:2:97:2 | try ... | TryStmt | Test.kt:92:6:95:2 | { ... } | BlockStmt |
@@ -142,13 +155,14 @@
| Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause |
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:91:1:98:1 | Exceptional Exit | Method |
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr |
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
| Test.kt:96:10:96:10 | 2 | IntegerLiteral | Test.kt:96:3:96:10 | return ... | ReturnStmt |
| Test.kt:100:1:110:1 | Entry | Method | Test.kt:100:25:110:1 | { ... } | BlockStmt |
| Test.kt:100:1:110:1 | Exceptional Exit | Method | Test.kt:100:1:110:1 | Exit | Method |
| Test.kt:100:1:110:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:100:1:110:1 | Normal Exit | Method | Test.kt:100:1:110:1 | Exit | Method |
| Test.kt:100:25:110:1 | { ... } | BlockStmt | Test.kt:101:5:103:5 | <Expr>; | ExprStmt |
| Test.kt:101:5:103:5 | ... -> ... | WhenBranch | Test.kt:101:9:101:30 | ... && ... | AndLogicalExpr |
@@ -186,8 +200,7 @@
| Test.kt:108:9:108:29 | <Expr>; | ExprStmt | Test.kt:108:17:108:28 | "y not null" | StringLiteral |
| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Normal Exit | Method |
| Test.kt:108:17:108:28 | "y not null" | StringLiteral | Test.kt:108:9:108:29 | println(...) | MethodCall |
| Test.kt:112:1:116:1 | Exceptional Exit | Method | Test.kt:112:1:116:1 | Exit | Method |
| Test.kt:112:1:116:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:112:1:116:1 | Entry | Method | Test.kt:112:32:116:1 | { ... } | BlockStmt |
| Test.kt:112:1:116:1 | Normal Exit | Method | Test.kt:112:1:116:1 | Exit | Method |
| Test.kt:112:32:116:1 | { ... } | BlockStmt | Test.kt:113:5:115:5 | <Expr>; | ExprStmt |
| Test.kt:113:5:115:5 | ... -> ... | WhenBranch | Test.kt:113:9:113:14 | ... && ... | AndLogicalExpr |
@@ -199,8 +212,7 @@
| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | Normal Exit | Method |
| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:113:17:115:5 | { ... } | BlockStmt |
| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | Normal Exit | Method |
| Test.kt:118:1:124:1 | Exceptional Exit | Method | Test.kt:118:1:124:1 | Exit | Method |
| Test.kt:118:1:124:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:118:1:124:1 | Entry | Method | Test.kt:118:37:124:1 | { ... } | BlockStmt |
| Test.kt:118:1:124:1 | Normal Exit | Method | Test.kt:118:1:124:1 | Exit | Method |
| Test.kt:118:37:124:1 | { ... } | BlockStmt | Test.kt:119:2:123:12 | <Expr>; | ExprStmt |
| Test.kt:119:2:123:12 | <Expr>; | ExprStmt | Test.kt:119:2:123:12 | when ... | WhenExpr |
@@ -216,6 +228,7 @@
| Test.kt:122:12:122:16 | ... -> ... | WhenBranch | Test.kt:122:12:122:16 | true | BooleanLiteral |
| Test.kt:122:12:122:16 | <Expr>; | ExprStmt | Test.kt:122:12:122:16 | false | BooleanLiteral |
| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | Normal Exit | Method |
| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:123:8:123:10 | { ... } | BlockStmt |
| Test.kt:122:12:122:16 | true | BooleanLiteral | Test.kt:122:12:122:16 | <Expr>; | ExprStmt |
| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | Normal Exit | Method |
missingSuccessor

View File

@@ -1,53 +1,14 @@
import java
import utils.test.AstCfg
newtype TMaybeControlFlowNode =
TControlFlowNode(ControlFlowNode c) or
TNoControlFlowNode()
class MaybeControlFlowNode extends TMaybeControlFlowNode {
abstract string toString();
abstract Location getLocation();
abstract string getPrimaryQlClasses();
}
class YesMaybeControlFlowNode extends MaybeControlFlowNode {
ControlFlowNode c;
YesMaybeControlFlowNode() { this = TControlFlowNode(c) }
override string toString() { result = c.toString() }
override Location getLocation() { result = c.getLocation() }
override string getPrimaryQlClasses() { result = c.getAstNode().getPrimaryQlClasses() }
}
class NoMaybeControlFlowNode extends MaybeControlFlowNode {
NoMaybeControlFlowNode() { this = TNoControlFlowNode() }
override string toString() { result = "<none>" }
override Location getLocation() { result.toString() = "file://:0:0:0:0" }
override string getPrimaryQlClasses() { result = "<none>" }
}
MaybeControlFlowNode maybeSuccessor(ControlFlowNode n) {
if exists(n.getASuccessor())
then result = TControlFlowNode(n.getASuccessor())
else result = TNoControlFlowNode()
}
from ControlFlowNode n, MaybeControlFlowNode m
from ControlFlowNode n, ControlFlowNode m
where
m = maybeSuccessor(n) and
m = getAnAstSuccessor(n) and
n.getLocation().getFile().(CompilationUnit).fromSource()
select n, n.getAstNode().getPrimaryQlClasses(), m, m.getPrimaryQlClasses()
select n, n.getAstNode().getPrimaryQlClasses(), m, m.getAstNode().getPrimaryQlClasses()
query predicate missingSuccessor(Expr e) {
maybeSuccessor(e.getControlFlowNode()) instanceof NoMaybeControlFlowNode and
exists(ControlFlowNode n | n = e.getControlFlowNode() and not exists(n.getASuccessor())) and
e.getFile().(CompilationUnit).fromSource() and
not e instanceof TypeAccess and
not e instanceof VarWrite

View File

@@ -562,5 +562,4 @@
| Test.kt:121:4:121:9 | ... -> ... | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:121:4:121:9 | ... -> ... | Test.kt:122:12:122:16 | <Expr>; |
| Test.kt:121:4:121:9 | ... -> ... | Test.kt:123:8:123:10 | { ... } |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:123:8:123:10 | { ... } |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:122:12:122:16 | <Expr>; |

View File

@@ -17,5 +17,6 @@ predicate dominanceCounterExample(ControlFlowNode entry, ControlFlowNode dom, Co
from Callable c, ControlFlowNode dom, ControlFlowNode node
where
strictlyDominates(dom, node) and
dominanceCounterExample(c.getBody().getControlFlowNode(), dom, node)
dominanceCounterExample(any(ControlFlow::EntryNode entry | entry.getEnclosingCallable() = c), dom,
node)
select c, dom, node

View File

@@ -1,157 +1,21 @@
| Test.kt:2:43:79:2 | { ... } | Test.kt:3:13:3:13 | var ...; |
| Test.kt:3:13:3:13 | var ...; | Test.kt:3:17:3:18 | px |
| Test.kt:3:13:3:13 | x | Test.kt:4:13:4:13 | var ...; |
| Test.kt:3:17:3:18 | px | Test.kt:3:13:3:13 | x |
| Test.kt:4:13:4:13 | var ...; | Test.kt:4:17:4:18 | pw |
| Test.kt:4:13:4:13 | w | Test.kt:5:13:5:13 | var ...; |
| Test.kt:4:17:4:18 | pw | Test.kt:4:13:4:13 | w |
| Test.kt:5:13:5:13 | var ...; | Test.kt:5:17:5:18 | pz |
| Test.kt:5:13:5:13 | z | Test.kt:7:7:7:7 | var ...; |
| Test.kt:5:17:5:18 | pz | Test.kt:5:13:5:13 | z |
| Test.kt:7:7:7:7 | j | Test.kt:8:7:8:7 | var ...; |
| Test.kt:7:7:7:7 | var ...; | Test.kt:7:7:7:7 | j |
| Test.kt:8:7:8:7 | var ...; | Test.kt:8:17:8:18 | 50 |
| Test.kt:8:7:8:7 | y | Test.kt:11:3:16:3 | <Expr>; |
| Test.kt:8:17:8:18 | 50 | Test.kt:8:7:8:7 | y |
| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:3:16:3 | true |
| Test.kt:11:3:16:3 | ... -> ... | Test.kt:11:7:11:7 | x |
| Test.kt:11:3:16:3 | <Expr>; | Test.kt:11:3:16:3 | when ... |
| Test.kt:11:3:16:3 | true | Test.kt:14:10:16:3 | { ... } |
| Test.kt:11:3:16:3 | when ... | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:11:7:11:7 | x | Test.kt:11:11:11:11 | 0 |
| Test.kt:11:7:11:11 | ... > ... | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:11:7:11:11 | ... > ... | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:7:11:11 | ... > ... | Test.kt:18:3:18:3 | <Expr>; |
| Test.kt:11:11:11:11 | 0 | Test.kt:11:7:11:11 | ... > ... |
| Test.kt:11:14:14:3 | { ... } | Test.kt:12:4:12:4 | <Expr>; |
| Test.kt:12:4:12:4 | <Expr>; | Test.kt:12:8:12:9 | 20 |
| Test.kt:12:4:12:9 | ...=... | Test.kt:13:4:13:4 | <Expr>; |
| Test.kt:12:8:12:9 | 20 | Test.kt:12:4:12:9 | ...=... |
| Test.kt:13:4:13:4 | <Expr>; | Test.kt:13:8:13:9 | 10 |
| Test.kt:13:8:13:9 | 10 | Test.kt:13:4:13:9 | ...=... |
| Test.kt:14:10:16:3 | { ... } | Test.kt:15:4:15:4 | <Expr>; |
| Test.kt:15:4:15:4 | <Expr>; | Test.kt:15:8:15:9 | 30 |
| Test.kt:15:8:15:9 | 30 | Test.kt:15:4:15:9 | ...=... |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:18:8:18:8 | x |
| Test.kt:18:3:18:20 | ...=... | Test.kt:21:3:24:11 | <Expr>; |
| Test.kt:18:7:18:20 | (...)... | Test.kt:18:3:18:20 | ...=... |
| Test.kt:18:8:18:8 | x | Test.kt:18:12:18:12 | y |
| Test.kt:18:8:18:12 | ... + ... | Test.kt:18:7:18:20 | (...)... |
| Test.kt:18:12:18:12 | y | Test.kt:18:8:18:12 | ... + ... |
| Test.kt:21:3:24:11 | ... -> ... | Test.kt:21:3:24:11 | true |
| Test.kt:21:3:24:11 | ... -> ... | Test.kt:21:7:21:7 | x |
| Test.kt:21:3:24:11 | <Expr>; | Test.kt:21:3:24:11 | when ... |
| Test.kt:21:3:24:11 | true | Test.kt:24:11:24:11 | z |
| Test.kt:21:3:24:11 | when ... | Test.kt:21:3:24:11 | ... -> ... |
| Test.kt:21:7:21:7 | x | Test.kt:21:11:21:11 | 0 |
| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | Normal Exit |
| Test.kt:21:7:21:11 | ... < ... | Test.kt:21:3:24:11 | ... -> ... |
| Test.kt:21:7:21:11 | ... < ... | Test.kt:22:4:22:4 | <Expr>; |
| Test.kt:21:11:21:11 | 0 | Test.kt:21:7:21:11 | ... < ... |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:22:8:22:9 | 40 |
| Test.kt:22:4:22:9 | ...=... | Test.kt:27:3:27:3 | <Expr>; |
| Test.kt:22:8:22:9 | 40 | Test.kt:22:4:22:9 | ...=... |
| Test.kt:24:11:24:11 | z | Test.kt:24:4:24:11 | return ... |
| Test.kt:27:3:27:3 | <Expr>; | Test.kt:27:7:27:8 | 10 |
| Test.kt:27:3:27:8 | ...=... | Test.kt:30:3:33:3 | <Expr>; |
| Test.kt:27:7:27:8 | 10 | Test.kt:27:3:27:8 | ...=... |
| Test.kt:30:3:33:3 | ... -> ... | Test.kt:30:7:30:7 | x |
| Test.kt:30:3:33:3 | <Expr>; | Test.kt:30:3:33:3 | when ... |
| Test.kt:30:3:33:3 | when ... | Test.kt:30:3:33:3 | ... -> ... |
| Test.kt:30:7:30:7 | x | Test.kt:30:12:30:12 | 0 |
| Test.kt:30:7:30:12 | ... (value equals) ... | Test.kt:30:15:33:3 | { ... } |
| Test.kt:30:7:30:12 | ... (value equals) ... | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:30:12:30:12 | 0 | Test.kt:30:7:30:12 | ... (value equals) ... |
| Test.kt:30:15:33:3 | { ... } | Test.kt:31:4:31:4 | <Expr>; |
| Test.kt:31:4:31:4 | <Expr>; | Test.kt:31:8:31:9 | 60 |
| Test.kt:31:4:31:9 | ...=... | Test.kt:32:4:32:4 | <Expr>; |
| Test.kt:31:8:31:9 | 60 | Test.kt:31:4:31:9 | ...=... |
| Test.kt:32:4:32:4 | <Expr>; | Test.kt:32:8:32:9 | 10 |
| Test.kt:32:8:32:9 | 10 | Test.kt:32:4:32:9 | ...=... |
| Test.kt:35:3:35:3 | <Expr>; | Test.kt:35:3:35:3 | z |
| Test.kt:35:3:35:3 | z | Test.kt:35:8:35:8 | x |
| Test.kt:35:3:35:8 | ...+=... | Test.kt:38:3:41:3 | while (...) |
| Test.kt:35:8:35:8 | x | Test.kt:35:3:35:8 | ...+=... |
| Test.kt:38:3:41:3 | while (...) | Test.kt:38:10:38:10 | x |
| Test.kt:38:10:38:10 | x | Test.kt:38:14:38:14 | 0 |
| Test.kt:38:10:38:14 | ... > ... | Test.kt:38:17:41:3 | { ... } |
| Test.kt:38:10:38:14 | ... > ... | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:38:14:38:14 | 0 | Test.kt:38:10:38:14 | ... > ... |
| Test.kt:38:17:41:3 | { ... } | Test.kt:39:4:39:4 | <Expr>; |
| Test.kt:39:4:39:4 | <Expr>; | Test.kt:39:8:39:9 | 10 |
| Test.kt:39:4:39:9 | ...=... | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:39:8:39:9 | 10 | Test.kt:39:4:39:9 | ...=... |
| Test.kt:40:4:40:4 | <Expr>; | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:40:4:40:4 | x | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:40:4:40:6 | ...=... | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:40:4:40:6 | <Expr>; | Test.kt:40:4:40:6 | <Stmt> |
| Test.kt:40:4:40:6 | <Expr>; | Test.kt:40:4:40:6 | tmp0 |
| Test.kt:40:4:40:6 | <Stmt> | Test.kt:40:4:40:6 | { ... } |
| Test.kt:40:4:40:6 | dec(...) | Test.kt:40:4:40:6 | ...=... |
| Test.kt:40:4:40:6 | tmp0 | Test.kt:40:4:40:4 | <Expr>; |
| Test.kt:40:4:40:6 | tmp0 | Test.kt:40:4:40:6 | <implicit coercion to unit> |
| Test.kt:40:4:40:6 | tmp0 | Test.kt:40:4:40:6 | dec(...) |
| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:4 | x |
| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | var ...; |
| Test.kt:43:3:43:3 | <Expr>; | Test.kt:43:3:43:3 | z |
| Test.kt:43:3:43:3 | z | Test.kt:43:8:43:8 | y |
| Test.kt:43:3:43:15 | ...+=... | Test.kt:73:3:73:3 | <Expr>; |
| Test.kt:43:8:43:8 | y | Test.kt:43:8:43:15 | (...)... |
| Test.kt:43:8:43:15 | (...)... | Test.kt:43:3:43:15 | ...+=... |
| Test.kt:73:3:73:3 | <Expr>; | Test.kt:73:3:73:3 | z |
| Test.kt:73:3:73:3 | z | Test.kt:73:8:73:8 | x |
| Test.kt:73:3:73:16 | ...+=... | Test.kt:77:3:77:3 | <Expr>; |
| Test.kt:73:8:73:8 | x | Test.kt:73:12:73:12 | y |
| Test.kt:73:8:73:12 | ... + ... | Test.kt:73:16:73:16 | w |
| Test.kt:73:8:73:16 | ... + ... | Test.kt:73:3:73:16 | ...+=... |
| Test.kt:73:12:73:12 | <implicit cast> | Test.kt:73:8:73:12 | ... + ... |
| Test.kt:73:12:73:12 | y | Test.kt:73:12:73:12 | <implicit cast> |
| Test.kt:73:16:73:16 | w | Test.kt:73:8:73:16 | ... + ... |
| Test.kt:77:3:77:3 | <Expr>; | Test.kt:77:7:77:8 | 40 |
| Test.kt:77:3:77:8 | ...=... | Test.kt:78:10:78:10 | w |
| Test.kt:77:7:77:8 | 40 | Test.kt:77:3:77:8 | ...=... |
| Test.kt:78:10:78:10 | w | Test.kt:78:3:78:10 | return ... |
| Test.kt:81:25:98:2 | { ... } | Test.kt:83:7:83:7 | var ...; |
| Test.kt:83:7:83:7 | b | Test.kt:84:7:84:7 | var ...; |
| Test.kt:83:7:83:7 | var ...; | Test.kt:83:7:83:7 | b |
| Test.kt:84:7:84:7 | c | Test.kt:85:3:85:3 | <Expr>; |
| Test.kt:84:7:84:7 | var ...; | Test.kt:84:7:84:7 | c |
| Test.kt:85:3:85:3 | <Expr>; | Test.kt:85:7:85:7 | 0 |
| Test.kt:85:3:85:7 | ...=... | Test.kt:86:3:96:3 | while (...) |
| Test.kt:85:7:85:7 | 0 | Test.kt:85:3:85:7 | ...=... |
| Test.kt:86:3:96:3 | while (...) | Test.kt:86:9:86:12 | true |
| Test.kt:86:9:86:12 | true | Test.kt:86:15:96:3 | { ... } |
| Test.kt:86:15:96:3 | { ... } | Test.kt:87:4:87:4 | <Expr>; |
| Test.kt:87:4:87:4 | <Expr>; | Test.kt:87:8:87:9 | 10 |
| Test.kt:87:4:87:9 | ...=... | Test.kt:88:4:91:4 | <Expr>; |
| Test.kt:87:8:87:9 | 10 | Test.kt:87:4:87:9 | ...=... |
| Test.kt:88:4:91:4 | ... -> ... | Test.kt:88:8:88:8 | a |
| Test.kt:88:4:91:4 | <Expr>; | Test.kt:88:4:91:4 | when ... |
| Test.kt:88:4:91:4 | when ... | Test.kt:88:4:91:4 | ... -> ... |
| Test.kt:88:8:88:8 | a | Test.kt:88:12:88:14 | 100 |
| Test.kt:88:8:88:14 | ... > ... | Test.kt:88:17:91:4 | { ... } |
| Test.kt:88:8:88:14 | ... > ... | Test.kt:92:4:93:9 | <Expr>; |
| Test.kt:88:12:88:14 | 100 | Test.kt:88:8:88:14 | ... > ... |
| Test.kt:88:17:91:4 | { ... } | Test.kt:89:5:89:5 | <Expr>; |
| Test.kt:89:5:89:5 | <Expr>; | Test.kt:89:9:89:10 | 10 |
| Test.kt:89:5:89:10 | ...=... | Test.kt:90:5:90:5 | <Expr>; |
| Test.kt:89:9:89:10 | 10 | Test.kt:89:5:89:10 | ...=... |
| Test.kt:90:5:90:5 | <Expr>; | Test.kt:90:9:90:9 | c |
| Test.kt:90:9:90:9 | c | Test.kt:90:5:90:9 | ...=... |
| Test.kt:92:4:93:9 | ... -> ... | Test.kt:92:8:92:8 | a |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:92:4:93:9 | when ... |
| Test.kt:92:4:93:9 | when ... | Test.kt:92:4:93:9 | ... -> ... |
| Test.kt:92:8:92:8 | a | Test.kt:92:13:92:14 | 10 |
| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | Normal Exit |
| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:93:5:93:9 | break |
| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:94:4:95:12 | <Expr>; |
| Test.kt:92:13:92:14 | 10 | Test.kt:92:8:92:14 | ... (value equals) ... |
| Test.kt:93:5:93:9 | break | Test.kt:97:10:97:10 | b |
| Test.kt:94:4:95:12 | ... -> ... | Test.kt:94:8:94:8 | a |
| Test.kt:94:4:95:12 | <Expr>; | Test.kt:94:4:95:12 | when ... |
| Test.kt:94:4:95:12 | when ... | Test.kt:94:4:95:12 | ... -> ... |
| Test.kt:94:8:94:8 | a | Test.kt:94:13:94:14 | 20 |
| Test.kt:94:8:94:14 | ... (value equals) ... | Test.kt:95:12:95:12 | c |
| Test.kt:94:13:94:14 | 20 | Test.kt:94:8:94:14 | ... (value equals) ... |
| Test.kt:95:12:95:12 | c | Test.kt:95:5:95:12 | return ... |
| Test.kt:97:10:97:10 | b | Test.kt:97:3:97:10 | return ... |
| Test.kt:2:43:79:2 | { ... } | Test.kt:11:3:16:3 | ... -> ... |
| Test.kt:2:43:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } |
| Test.kt:2:43:79:2 | { ... } | Test.kt:18:3:18:3 | <Expr>; |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:2:2:79:2 | Normal Exit |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:21:3:24:11 | ... -> ... |
| Test.kt:18:3:18:3 | <Expr>; | Test.kt:22:4:22:4 | <Expr>; |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:30:7:30:12 | After ... (value equals) ... [false] |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:30:15:33:3 | { ... } |
| Test.kt:22:4:22:4 | <Expr>; | Test.kt:35:3:35:3 | <Expr>; |
| Test.kt:35:3:35:3 | <Expr>; | Test.kt:38:10:38:10 | x |
| Test.kt:38:10:38:10 | x | Test.kt:38:17:41:3 | { ... } |
| Test.kt:38:10:38:10 | x | Test.kt:43:3:43:3 | <Expr>; |
| Test.kt:81:25:98:2 | { ... } | Test.kt:86:9:86:12 | true |
| Test.kt:86:9:86:12 | true | Test.kt:88:8:88:14 | After ... > ... [false] |
| Test.kt:86:9:86:12 | true | Test.kt:88:17:91:4 | { ... } |
| Test.kt:86:9:86:12 | true | Test.kt:92:4:93:9 | <Expr>; |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:81:2:98:2 | Normal Exit |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:93:5:93:9 | break |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:94:4:95:12 | <Expr>; |
| Test.kt:94:4:95:12 | <Expr>; | Test.kt:94:8:94:14 | After ... (value equals) ... [false] |
| Test.kt:94:4:95:12 | <Expr>; | Test.kt:95:12:95:12 | c |

View File

@@ -1,9 +1,9 @@
import default
import semmle.code.java.controlflow.Dominance
import java
import utils.test.BasicBlock
from Method func, ControlFlowNode dominator, ControlFlowNode node
from Method func, BasicBlock dominator, BasicBlock bb
where
iDominates(dominator, node) and
dominator.getEnclosingStmt().getEnclosingCallable() = func and
dominator.immediatelyDominates(bb) and
dominator.getEnclosingCallable() = func and
func.getDeclaringType().hasName("Test")
select dominator, node
select getFirstAstNodeOrSynth(dominator), getFirstAstNodeOrSynth(bb)

View File

@@ -7,5 +7,5 @@ where
iDominates(dom1, node) and
iDominates(dom2, node) and
dom1 != dom2 and
func = node.getEnclosingStmt().getEnclosingCallable()
func = node.getEnclosingCallable()
select func, node, dom1, dom2

View File

@@ -41,4 +41,5 @@ MaybeElement rhs(BinaryExpr e) {
}
from Expr e
where not e instanceof Assignment
select e, lhs(e), rhs(e)

View File

@@ -1,205 +1,386 @@
| Test.kt:3:1:80:1 | Exceptional Exit | 0 | Test.kt:3:1:80:1 | Exceptional Exit |
| Test.kt:3:1:80:1 | Exit | 0 | Test.kt:3:1:80:1 | Exit |
| Test.kt:3:1:80:1 | { ... } | 0 | Test.kt:3:1:80:1 | { ... } |
| Test.kt:3:1:80:1 | { ... } | 1 | Test.kt:3:1:80:1 | super(...) |
| Test.kt:3:1:80:1 | { ... } | 2 | Test.kt:3:1:80:1 | { ... } |
| Test.kt:3:1:80:1 | { ... } | 3 | Test.kt:3:1:80:1 | Normal Exit |
| Test.kt:4:2:79:2 | Exceptional Exit | 0 | Test.kt:4:2:79:2 | Exceptional Exit |
| Test.kt:4:2:79:2 | Exit | 0 | Test.kt:4:2:79:2 | Exit |
| Test.kt:3:1:80:1 | Entry | 0 | Test.kt:3:1:80:1 | Entry |
| Test.kt:3:1:80:1 | Entry | 1 | Test.kt:3:1:80:1 | { ... } |
| Test.kt:3:1:80:1 | Entry | 2 | Test.kt:3:1:80:1 | Before super(...) |
| Test.kt:3:1:80:1 | Entry | 3 | Test.kt:3:1:80:1 | super(...) |
| Test.kt:3:1:80:1 | Entry | 4 | Test.kt:3:1:80:1 | After super(...) |
| Test.kt:3:1:80:1 | Entry | 5 | Test.kt:3:1:80:1 | { ... } |
| Test.kt:3:1:80:1 | Entry | 6 | Test.kt:3:1:80:1 | After { ... } |
| Test.kt:3:1:80:1 | Entry | 7 | Test.kt:3:1:80:1 | Normal Exit |
| Test.kt:3:1:80:1 | Entry | 8 | Test.kt:3:1:80:1 | Exit |
| Test.kt:4:2:79:2 | Entry | 0 | Test.kt:4:2:79:2 | Entry |
| Test.kt:4:2:79:2 | Entry | 1 | Test.kt:4:13:79:2 | { ... } |
| Test.kt:4:2:79:2 | Entry | 2 | Test.kt:5:3:5:16 | var ...; |
| Test.kt:4:2:79:2 | Entry | 3 | Test.kt:5:3:5:16 | Before x |
| Test.kt:4:2:79:2 | Entry | 4 | Test.kt:5:16:5:16 | 0 |
| Test.kt:4:2:79:2 | Entry | 5 | Test.kt:5:3:5:16 | x |
| Test.kt:4:2:79:2 | Entry | 6 | Test.kt:5:3:5:16 | After x |
| Test.kt:4:2:79:2 | Entry | 7 | Test.kt:5:3:5:16 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 8 | Test.kt:6:3:6:18 | var ...; |
| Test.kt:4:2:79:2 | Entry | 9 | Test.kt:6:3:6:18 | Before y |
| Test.kt:4:2:79:2 | Entry | 10 | Test.kt:6:17:6:18 | 50 |
| Test.kt:4:2:79:2 | Entry | 11 | Test.kt:6:3:6:18 | y |
| Test.kt:4:2:79:2 | Entry | 12 | Test.kt:6:3:6:18 | After y |
| Test.kt:4:2:79:2 | Entry | 13 | Test.kt:6:3:6:18 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 14 | Test.kt:7:3:7:16 | var ...; |
| Test.kt:4:2:79:2 | Entry | 15 | Test.kt:7:3:7:16 | Before z |
| Test.kt:4:2:79:2 | Entry | 16 | Test.kt:7:16:7:16 | 0 |
| Test.kt:4:2:79:2 | Entry | 17 | Test.kt:7:3:7:16 | z |
| Test.kt:4:2:79:2 | Entry | 18 | Test.kt:7:3:7:16 | After z |
| Test.kt:4:2:79:2 | Entry | 19 | Test.kt:7:3:7:16 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 20 | Test.kt:8:3:8:16 | var ...; |
| Test.kt:4:2:79:2 | Entry | 21 | Test.kt:8:3:8:16 | Before w |
| Test.kt:4:2:79:2 | Entry | 22 | Test.kt:8:16:8:16 | 0 |
| Test.kt:4:2:79:2 | Entry | 23 | Test.kt:8:3:8:16 | w |
| Test.kt:4:2:79:2 | Entry | 24 | Test.kt:8:3:8:16 | After w |
| Test.kt:4:2:79:2 | Entry | 25 | Test.kt:8:3:8:16 | After var ...; |
| Test.kt:4:2:79:2 | Entry | 26 | Test.kt:11:3:16:3 | <Expr>; |
| Test.kt:4:2:79:2 | Entry | 27 | Test.kt:11:3:16:3 | when ... |
| Test.kt:4:2:79:2 | Entry | 28 | Test.kt:11:7:14:3 | ... -> ... |
| Test.kt:4:2:79:2 | Entry | 29 | Test.kt:11:7:11:11 | Before ... > ... |
| Test.kt:4:2:79:2 | Entry | 30 | Test.kt:11:7:11:7 | x |
| Test.kt:4:2:79:2 | Entry | 31 | Test.kt:11:11:11:11 | 0 |
| Test.kt:4:2:79:2 | Entry | 32 | Test.kt:11:7:11:11 | ... > ... |
| Test.kt:4:2:79:2 | Normal Exit | 0 | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:4:13:79:2 | { ... } | 0 | Test.kt:4:13:79:2 | { ... } |
| Test.kt:4:13:79:2 | { ... } | 1 | Test.kt:5:3:5:16 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 2 | Test.kt:5:16:5:16 | 0 |
| Test.kt:4:13:79:2 | { ... } | 3 | Test.kt:5:3:5:16 | x |
| Test.kt:4:13:79:2 | { ... } | 4 | Test.kt:6:3:6:18 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 5 | Test.kt:6:17:6:18 | 50 |
| Test.kt:4:13:79:2 | { ... } | 6 | Test.kt:6:3:6:18 | y |
| Test.kt:4:13:79:2 | { ... } | 7 | Test.kt:7:3:7:16 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 8 | Test.kt:7:16:7:16 | 0 |
| Test.kt:4:13:79:2 | { ... } | 9 | Test.kt:7:3:7:16 | z |
| Test.kt:4:13:79:2 | { ... } | 10 | Test.kt:8:3:8:16 | var ...; |
| Test.kt:4:13:79:2 | { ... } | 11 | Test.kt:8:16:8:16 | 0 |
| Test.kt:4:13:79:2 | { ... } | 12 | Test.kt:8:3:8:16 | w |
| Test.kt:4:13:79:2 | { ... } | 13 | Test.kt:11:3:16:3 | <Expr>; |
| Test.kt:4:13:79:2 | { ... } | 14 | Test.kt:11:3:16:3 | when ... |
| Test.kt:4:13:79:2 | { ... } | 15 | Test.kt:11:7:14:3 | ... -> ... |
| Test.kt:4:13:79:2 | { ... } | 16 | Test.kt:11:7:11:7 | x |
| Test.kt:4:13:79:2 | { ... } | 17 | Test.kt:11:11:11:11 | 0 |
| Test.kt:4:13:79:2 | { ... } | 18 | Test.kt:11:7:11:11 | ... > ... |
| Test.kt:11:14:14:3 | { ... } | 0 | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:14:14:3 | { ... } | 1 | Test.kt:12:4:12:9 | <Expr>; |
| Test.kt:11:14:14:3 | { ... } | 2 | Test.kt:12:8:12:9 | 20 |
| Test.kt:11:14:14:3 | { ... } | 3 | Test.kt:12:4:12:9 | ...=... |
| Test.kt:11:14:14:3 | { ... } | 4 | Test.kt:13:4:13:9 | <Expr>; |
| Test.kt:11:14:14:3 | { ... } | 5 | Test.kt:13:8:13:9 | 10 |
| Test.kt:11:14:14:3 | { ... } | 6 | Test.kt:13:4:13:9 | ...=... |
| Test.kt:14:10:16:3 | ... -> ... | 0 | Test.kt:14:10:16:3 | ... -> ... |
| Test.kt:14:10:16:3 | ... -> ... | 1 | Test.kt:14:10:16:3 | true |
| Test.kt:14:10:16:3 | ... -> ... | 2 | Test.kt:14:10:16:3 | { ... } |
| Test.kt:14:10:16:3 | ... -> ... | 3 | Test.kt:15:4:15:9 | <Expr>; |
| Test.kt:14:10:16:3 | ... -> ... | 4 | Test.kt:15:8:15:9 | 30 |
| Test.kt:14:10:16:3 | ... -> ... | 5 | Test.kt:15:4:15:9 | ...=... |
| Test.kt:18:3:18:7 | <Expr>; | 0 | Test.kt:18:3:18:7 | <Expr>; |
| Test.kt:18:3:18:7 | <Expr>; | 1 | Test.kt:18:7:18:7 | 0 |
| Test.kt:18:3:18:7 | <Expr>; | 2 | Test.kt:18:3:18:7 | ...=... |
| Test.kt:18:3:18:7 | <Expr>; | 3 | Test.kt:21:3:24:9 | <Expr>; |
| Test.kt:18:3:18:7 | <Expr>; | 4 | Test.kt:21:3:24:9 | when ... |
| Test.kt:18:3:18:7 | <Expr>; | 5 | Test.kt:21:6:22:9 | ... -> ... |
| Test.kt:18:3:18:7 | <Expr>; | 6 | Test.kt:21:6:21:6 | x |
| Test.kt:18:3:18:7 | <Expr>; | 7 | Test.kt:21:10:21:10 | 0 |
| Test.kt:18:3:18:7 | <Expr>; | 8 | Test.kt:21:6:21:10 | ... < ... |
| Test.kt:22:4:22:9 | <Expr>; | 0 | Test.kt:22:4:22:9 | <Expr>; |
| Test.kt:22:4:22:9 | <Expr>; | 1 | Test.kt:22:8:22:9 | 40 |
| Test.kt:22:4:22:9 | <Expr>; | 2 | Test.kt:22:4:22:9 | ...=... |
| Test.kt:22:4:22:9 | <Expr>; | 3 | Test.kt:27:3:27:8 | <Expr>; |
| Test.kt:22:4:22:9 | <Expr>; | 4 | Test.kt:27:7:27:8 | 10 |
| Test.kt:22:4:22:9 | <Expr>; | 5 | Test.kt:27:3:27:8 | ...=... |
| Test.kt:22:4:22:9 | <Expr>; | 6 | Test.kt:30:3:33:3 | <Expr>; |
| Test.kt:22:4:22:9 | <Expr>; | 7 | Test.kt:30:3:33:3 | when ... |
| Test.kt:22:4:22:9 | <Expr>; | 8 | Test.kt:30:7:33:3 | ... -> ... |
| Test.kt:22:4:22:9 | <Expr>; | 9 | Test.kt:30:7:30:7 | x |
| Test.kt:22:4:22:9 | <Expr>; | 10 | Test.kt:30:12:30:12 | 0 |
| Test.kt:22:4:22:9 | <Expr>; | 11 | Test.kt:30:7:30:12 | ... (value equals) ... |
| Test.kt:24:4:24:9 | ... -> ... | 0 | Test.kt:24:4:24:9 | ... -> ... |
| Test.kt:24:4:24:9 | ... -> ... | 1 | Test.kt:24:4:24:9 | true |
| Test.kt:24:4:24:9 | ... -> ... | 2 | Test.kt:24:10:24:10 | INSTANCE |
| Test.kt:24:4:24:9 | ... -> ... | 3 | Test.kt:24:4:24:9 | return ... |
| Test.kt:30:15:33:3 | { ... } | 0 | Test.kt:30:15:33:3 | { ... } |
| Test.kt:30:15:33:3 | { ... } | 1 | Test.kt:31:4:31:9 | <Expr>; |
| Test.kt:30:15:33:3 | { ... } | 2 | Test.kt:31:8:31:9 | 60 |
| Test.kt:30:15:33:3 | { ... } | 3 | Test.kt:31:4:31:9 | ...=... |
| Test.kt:30:15:33:3 | { ... } | 4 | Test.kt:32:4:32:9 | <Expr>; |
| Test.kt:30:15:33:3 | { ... } | 5 | Test.kt:32:8:32:9 | 10 |
| Test.kt:30:15:33:3 | { ... } | 6 | Test.kt:32:4:32:9 | ...=... |
| Test.kt:35:3:35:8 | <Expr>; | 0 | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:35:3:35:8 | <Expr>; | 1 | Test.kt:35:7:35:8 | 20 |
| Test.kt:35:3:35:8 | <Expr>; | 2 | Test.kt:35:3:35:8 | ...=... |
| Test.kt:35:3:35:8 | <Expr>; | 3 | Test.kt:38:3:41:3 | while (...) |
| Test.kt:38:9:38:9 | x | 0 | Test.kt:38:9:38:9 | x |
| Test.kt:38:9:38:9 | x | 1 | Test.kt:38:13:38:13 | 0 |
| Test.kt:38:9:38:9 | x | 2 | Test.kt:38:9:38:13 | ... > ... |
| Test.kt:38:16:41:3 | { ... } | 0 | Test.kt:38:16:41:3 | { ... } |
| Test.kt:38:16:41:3 | { ... } | 1 | Test.kt:39:4:39:9 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 2 | Test.kt:39:8:39:9 | 10 |
| Test.kt:38:16:41:3 | { ... } | 3 | Test.kt:39:4:39:9 | ...=... |
| Test.kt:38:16:41:3 | { ... } | 4 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 5 | Test.kt:40:4:40:6 | <Stmt> |
| Test.kt:38:16:41:3 | { ... } | 6 | Test.kt:40:4:40:6 | { ... } |
| Test.kt:38:16:41:3 | { ... } | 7 | Test.kt:40:4:40:6 | var ...; |
| Test.kt:38:16:41:3 | { ... } | 8 | Test.kt:40:4:40:4 | x |
| Test.kt:38:16:41:3 | { ... } | 9 | Test.kt:40:4:40:6 | <unary> |
| Test.kt:38:16:41:3 | { ... } | 10 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 11 | Test.kt:40:4:40:6 | <unary> |
| Test.kt:38:16:41:3 | { ... } | 12 | Test.kt:40:4:40:6 | dec(...) |
| Test.kt:38:16:41:3 | { ... } | 13 | Test.kt:40:4:40:6 | ...=... |
| Test.kt:38:16:41:3 | { ... } | 14 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:16:41:3 | { ... } | 15 | Test.kt:40:4:40:6 | <unary> |
| Test.kt:38:16:41:3 | { ... } | 16 | Test.kt:40:4:40:6 | <implicit coercion to unit> |
| Test.kt:43:3:43:8 | <Expr>; | 0 | Test.kt:43:3:43:8 | <Expr>; |
| Test.kt:43:3:43:8 | <Expr>; | 1 | Test.kt:43:7:43:8 | 30 |
| Test.kt:43:3:43:8 | <Expr>; | 2 | Test.kt:43:3:43:8 | ...=... |
| Test.kt:43:3:43:8 | <Expr>; | 3 | Test.kt:73:3:73:8 | <Expr>; |
| Test.kt:43:3:43:8 | <Expr>; | 4 | Test.kt:73:7:73:8 | 50 |
| Test.kt:43:3:43:8 | <Expr>; | 5 | Test.kt:73:3:73:8 | ...=... |
| Test.kt:43:3:43:8 | <Expr>; | 6 | Test.kt:77:3:77:8 | <Expr>; |
| Test.kt:43:3:43:8 | <Expr>; | 7 | Test.kt:77:7:77:8 | 40 |
| Test.kt:43:3:43:8 | <Expr>; | 8 | Test.kt:77:3:77:8 | ...=... |
| Test.kt:43:3:43:8 | <Expr>; | 9 | Test.kt:78:9:78:9 | INSTANCE |
| Test.kt:43:3:43:8 | <Expr>; | 10 | Test.kt:78:3:78:8 | return ... |
| Test.kt:82:1:89:1 | Exceptional Exit | 0 | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:4:2:79:2 | Normal Exit | 1 | Test.kt:4:2:79:2 | Exit |
| Test.kt:11:3:16:3 | After when ... | 0 | Test.kt:11:3:16:3 | After when ... |
| Test.kt:11:3:16:3 | After when ... | 1 | Test.kt:11:3:16:3 | After <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 2 | Test.kt:18:3:18:7 | <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 3 | Test.kt:18:3:18:7 | Before ...=... |
| Test.kt:11:3:16:3 | After when ... | 4 | Test.kt:18:3:18:7 | z |
| Test.kt:11:3:16:3 | After when ... | 5 | Test.kt:18:7:18:7 | 0 |
| Test.kt:11:3:16:3 | After when ... | 6 | Test.kt:18:3:18:7 | ...=... |
| Test.kt:11:3:16:3 | After when ... | 7 | Test.kt:18:3:18:7 | After ...=... |
| Test.kt:11:3:16:3 | After when ... | 8 | Test.kt:18:3:18:7 | After <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 9 | Test.kt:21:3:24:9 | <Expr>; |
| Test.kt:11:3:16:3 | After when ... | 10 | Test.kt:21:3:24:9 | when ... |
| Test.kt:11:3:16:3 | After when ... | 11 | Test.kt:21:6:22:9 | ... -> ... |
| Test.kt:11:3:16:3 | After when ... | 12 | Test.kt:21:6:21:10 | Before ... < ... |
| Test.kt:11:3:16:3 | After when ... | 13 | Test.kt:21:6:21:6 | x |
| Test.kt:11:3:16:3 | After when ... | 14 | Test.kt:21:10:21:10 | 0 |
| Test.kt:11:3:16:3 | After when ... | 15 | Test.kt:21:6:21:10 | ... < ... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 0 | Test.kt:11:7:11:11 | After ... > ... [false] |
| Test.kt:11:7:11:11 | After ... > ... [false] | 1 | Test.kt:14:10:16:3 | ... -> ... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 2 | Test.kt:14:10:16:3 | true |
| Test.kt:11:7:11:11 | After ... > ... [false] | 3 | Test.kt:14:10:16:3 | After true [true] |
| Test.kt:11:7:11:11 | After ... > ... [false] | 4 | Test.kt:14:10:16:3 | { ... } |
| Test.kt:11:7:11:11 | After ... > ... [false] | 5 | Test.kt:15:4:15:9 | <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [false] | 6 | Test.kt:15:4:15:9 | Before ...=... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 7 | Test.kt:15:4:15:9 | y |
| Test.kt:11:7:11:11 | After ... > ... [false] | 8 | Test.kt:15:8:15:9 | 30 |
| Test.kt:11:7:11:11 | After ... > ... [false] | 9 | Test.kt:15:4:15:9 | ...=... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 10 | Test.kt:15:4:15:9 | After ...=... |
| Test.kt:11:7:11:11 | After ... > ... [false] | 11 | Test.kt:15:4:15:9 | After <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [false] | 12 | Test.kt:14:10:16:3 | After { ... } |
| Test.kt:11:7:11:11 | After ... > ... [true] | 0 | Test.kt:11:7:11:11 | After ... > ... [true] |
| Test.kt:11:7:11:11 | After ... > ... [true] | 1 | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:7:11:11 | After ... > ... [true] | 2 | Test.kt:12:4:12:9 | <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 3 | Test.kt:12:4:12:9 | Before ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 4 | Test.kt:12:4:12:9 | y |
| Test.kt:11:7:11:11 | After ... > ... [true] | 5 | Test.kt:12:8:12:9 | 20 |
| Test.kt:11:7:11:11 | After ... > ... [true] | 6 | Test.kt:12:4:12:9 | ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 7 | Test.kt:12:4:12:9 | After ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 8 | Test.kt:12:4:12:9 | After <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 9 | Test.kt:13:4:13:9 | <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 10 | Test.kt:13:4:13:9 | Before ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 11 | Test.kt:13:4:13:9 | z |
| Test.kt:11:7:11:11 | After ... > ... [true] | 12 | Test.kt:13:8:13:9 | 10 |
| Test.kt:11:7:11:11 | After ... > ... [true] | 13 | Test.kt:13:4:13:9 | ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 14 | Test.kt:13:4:13:9 | After ...=... |
| Test.kt:11:7:11:11 | After ... > ... [true] | 15 | Test.kt:13:4:13:9 | After <Expr>; |
| Test.kt:11:7:11:11 | After ... > ... [true] | 16 | Test.kt:11:14:14:3 | After { ... } |
| Test.kt:21:6:21:10 | After ... < ... [false] | 0 | Test.kt:21:6:21:10 | After ... < ... [false] |
| Test.kt:21:6:21:10 | After ... < ... [false] | 1 | Test.kt:24:4:24:9 | ... -> ... |
| Test.kt:21:6:21:10 | After ... < ... [false] | 2 | Test.kt:24:4:24:9 | true |
| Test.kt:21:6:21:10 | After ... < ... [false] | 3 | Test.kt:24:4:24:9 | After true [true] |
| Test.kt:21:6:21:10 | After ... < ... [false] | 4 | Test.kt:24:4:24:9 | Before return ... |
| Test.kt:21:6:21:10 | After ... < ... [false] | 5 | Test.kt:24:10:24:10 | INSTANCE |
| Test.kt:21:6:21:10 | After ... < ... [false] | 6 | Test.kt:24:4:24:9 | return ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 0 | Test.kt:21:6:21:10 | After ... < ... [true] |
| Test.kt:21:6:21:10 | After ... < ... [true] | 1 | Test.kt:22:4:22:9 | <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 2 | Test.kt:22:4:22:9 | Before ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 3 | Test.kt:22:4:22:9 | y |
| Test.kt:21:6:21:10 | After ... < ... [true] | 4 | Test.kt:22:8:22:9 | 40 |
| Test.kt:21:6:21:10 | After ... < ... [true] | 5 | Test.kt:22:4:22:9 | ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 6 | Test.kt:22:4:22:9 | After ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 7 | Test.kt:22:4:22:9 | After <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 8 | Test.kt:21:3:24:9 | After when ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 9 | Test.kt:21:3:24:9 | After <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 10 | Test.kt:27:3:27:8 | <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 11 | Test.kt:27:3:27:8 | Before ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 12 | Test.kt:27:3:27:8 | z |
| Test.kt:21:6:21:10 | After ... < ... [true] | 13 | Test.kt:27:7:27:8 | 10 |
| Test.kt:21:6:21:10 | After ... < ... [true] | 14 | Test.kt:27:3:27:8 | ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 15 | Test.kt:27:3:27:8 | After ...=... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 16 | Test.kt:27:3:27:8 | After <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 17 | Test.kt:30:3:33:3 | <Expr>; |
| Test.kt:21:6:21:10 | After ... < ... [true] | 18 | Test.kt:30:3:33:3 | when ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 19 | Test.kt:30:7:33:3 | ... -> ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 20 | Test.kt:30:7:30:12 | Before ... (value equals) ... |
| Test.kt:21:6:21:10 | After ... < ... [true] | 21 | Test.kt:30:7:30:7 | x |
| Test.kt:21:6:21:10 | After ... < ... [true] | 22 | Test.kt:30:12:30:12 | 0 |
| Test.kt:21:6:21:10 | After ... < ... [true] | 23 | Test.kt:30:7:30:12 | ... (value equals) ... |
| Test.kt:30:3:33:3 | After when ... | 0 | Test.kt:30:3:33:3 | After when ... |
| Test.kt:30:3:33:3 | After when ... | 1 | Test.kt:30:3:33:3 | After <Expr>; |
| Test.kt:30:3:33:3 | After when ... | 2 | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:30:3:33:3 | After when ... | 3 | Test.kt:35:3:35:8 | Before ...=... |
| Test.kt:30:3:33:3 | After when ... | 4 | Test.kt:35:3:35:8 | z |
| Test.kt:30:3:33:3 | After when ... | 5 | Test.kt:35:7:35:8 | 20 |
| Test.kt:30:3:33:3 | After when ... | 6 | Test.kt:35:3:35:8 | ...=... |
| Test.kt:30:3:33:3 | After when ... | 7 | Test.kt:35:3:35:8 | After ...=... |
| Test.kt:30:3:33:3 | After when ... | 8 | Test.kt:35:3:35:8 | After <Expr>; |
| Test.kt:30:3:33:3 | After when ... | 9 | Test.kt:38:3:41:3 | while (...) |
| Test.kt:30:7:30:12 | After ... (value equals) ... [false] | 0 | Test.kt:30:7:30:12 | After ... (value equals) ... [false] |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 0 | Test.kt:30:7:30:12 | After ... (value equals) ... [true] |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 1 | Test.kt:30:15:33:3 | { ... } |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 2 | Test.kt:31:4:31:9 | <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 3 | Test.kt:31:4:31:9 | Before ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 4 | Test.kt:31:4:31:9 | y |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 5 | Test.kt:31:8:31:9 | 60 |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 6 | Test.kt:31:4:31:9 | ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 7 | Test.kt:31:4:31:9 | After ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 8 | Test.kt:31:4:31:9 | After <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 9 | Test.kt:32:4:32:9 | <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 10 | Test.kt:32:4:32:9 | Before ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 11 | Test.kt:32:4:32:9 | z |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 12 | Test.kt:32:8:32:9 | 10 |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 13 | Test.kt:32:4:32:9 | ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 14 | Test.kt:32:4:32:9 | After ...=... |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 15 | Test.kt:32:4:32:9 | After <Expr>; |
| Test.kt:30:7:30:12 | After ... (value equals) ... [true] | 16 | Test.kt:30:15:33:3 | After { ... } |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 0 | Test.kt:38:3:41:3 | [LoopHeader] while (...) |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 1 | Test.kt:38:9:38:13 | Before ... > ... |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 2 | Test.kt:38:9:38:9 | x |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 3 | Test.kt:38:13:38:13 | 0 |
| Test.kt:38:3:41:3 | [LoopHeader] while (...) | 4 | Test.kt:38:9:38:13 | ... > ... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 0 | Test.kt:38:9:38:13 | After ... > ... [false] |
| Test.kt:38:9:38:13 | After ... > ... [false] | 1 | Test.kt:38:3:41:3 | After while (...) |
| Test.kt:38:9:38:13 | After ... > ... [false] | 2 | Test.kt:43:3:43:8 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 3 | Test.kt:43:3:43:8 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 4 | Test.kt:43:3:43:8 | z |
| Test.kt:38:9:38:13 | After ... > ... [false] | 5 | Test.kt:43:7:43:8 | 30 |
| Test.kt:38:9:38:13 | After ... > ... [false] | 6 | Test.kt:43:3:43:8 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 7 | Test.kt:43:3:43:8 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 8 | Test.kt:43:3:43:8 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 9 | Test.kt:73:3:73:8 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 10 | Test.kt:73:3:73:8 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 11 | Test.kt:73:3:73:8 | z |
| Test.kt:38:9:38:13 | After ... > ... [false] | 12 | Test.kt:73:7:73:8 | 50 |
| Test.kt:38:9:38:13 | After ... > ... [false] | 13 | Test.kt:73:3:73:8 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 14 | Test.kt:73:3:73:8 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 15 | Test.kt:73:3:73:8 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 16 | Test.kt:77:3:77:8 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 17 | Test.kt:77:3:77:8 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 18 | Test.kt:77:3:77:8 | w |
| Test.kt:38:9:38:13 | After ... > ... [false] | 19 | Test.kt:77:7:77:8 | 40 |
| Test.kt:38:9:38:13 | After ... > ... [false] | 20 | Test.kt:77:3:77:8 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 21 | Test.kt:77:3:77:8 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 22 | Test.kt:77:3:77:8 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [false] | 23 | Test.kt:78:3:78:8 | Before return ... |
| Test.kt:38:9:38:13 | After ... > ... [false] | 24 | Test.kt:78:9:78:9 | INSTANCE |
| Test.kt:38:9:38:13 | After ... > ... [false] | 25 | Test.kt:78:3:78:8 | return ... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 0 | Test.kt:38:9:38:13 | After ... > ... [true] |
| Test.kt:38:9:38:13 | After ... > ... [true] | 1 | Test.kt:38:16:41:3 | { ... } |
| Test.kt:38:9:38:13 | After ... > ... [true] | 2 | Test.kt:39:4:39:9 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 3 | Test.kt:39:4:39:9 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 4 | Test.kt:39:4:39:9 | y |
| Test.kt:38:9:38:13 | After ... > ... [true] | 5 | Test.kt:39:8:39:9 | 10 |
| Test.kt:38:9:38:13 | After ... > ... [true] | 6 | Test.kt:39:4:39:9 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 7 | Test.kt:39:4:39:9 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 8 | Test.kt:39:4:39:9 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 9 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 10 | Test.kt:40:4:40:6 | Before <implicit coercion to unit> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 11 | Test.kt:40:4:40:6 | Before <Stmt> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 12 | Test.kt:40:4:40:6 | { ... } |
| Test.kt:38:9:38:13 | After ... > ... [true] | 13 | Test.kt:40:4:40:6 | var ...; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 14 | Test.kt:40:4:40:6 | Before <unary> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 15 | Test.kt:40:4:40:4 | x |
| Test.kt:38:9:38:13 | After ... > ... [true] | 16 | Test.kt:40:4:40:6 | <unary> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 17 | Test.kt:40:4:40:6 | After <unary> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 18 | Test.kt:40:4:40:6 | After var ...; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 19 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 20 | Test.kt:40:4:40:6 | Before ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 21 | Test.kt:40:4:40:6 | x |
| Test.kt:38:9:38:13 | After ... > ... [true] | 22 | Test.kt:40:4:40:6 | Before dec(...) |
| Test.kt:38:9:38:13 | After ... > ... [true] | 23 | Test.kt:40:4:40:6 | <unary> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 24 | Test.kt:40:4:40:6 | dec(...) |
| Test.kt:38:9:38:13 | After ... > ... [true] | 25 | Test.kt:40:4:40:6 | After dec(...) |
| Test.kt:38:9:38:13 | After ... > ... [true] | 26 | Test.kt:40:4:40:6 | ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 27 | Test.kt:40:4:40:6 | After ...=... |
| Test.kt:38:9:38:13 | After ... > ... [true] | 28 | Test.kt:40:4:40:6 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 29 | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 30 | Test.kt:40:4:40:6 | <unary> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 31 | Test.kt:40:4:40:6 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 32 | Test.kt:40:4:40:6 | After { ... } |
| Test.kt:38:9:38:13 | After ... > ... [true] | 33 | Test.kt:40:4:40:6 | <Stmt> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 34 | Test.kt:40:4:40:6 | After <Stmt> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 35 | Test.kt:40:4:40:6 | <implicit coercion to unit> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 36 | Test.kt:40:4:40:6 | After <implicit coercion to unit> |
| Test.kt:38:9:38:13 | After ... > ... [true] | 37 | Test.kt:40:4:40:6 | After <Expr>; |
| Test.kt:38:9:38:13 | After ... > ... [true] | 38 | Test.kt:38:16:41:3 | After { ... } |
| Test.kt:82:1:89:1 | Entry | 0 | Test.kt:82:1:89:1 | Entry |
| Test.kt:82:1:89:1 | Entry | 1 | Test.kt:82:21:89:1 | { ... } |
| Test.kt:82:1:89:1 | Entry | 2 | Test.kt:83:2:88:2 | try ... |
| Test.kt:82:1:89:1 | Entry | 3 | Test.kt:83:6:86:2 | { ... } |
| Test.kt:82:1:89:1 | Entry | 4 | Test.kt:84:3:84:18 | var ...; |
| Test.kt:82:1:89:1 | Entry | 5 | Test.kt:84:3:84:18 | Before x |
| Test.kt:82:1:89:1 | Entry | 6 | Test.kt:84:11:84:18 | Before (...)... |
| Test.kt:82:1:89:1 | Entry | 7 | Test.kt:84:11:84:11 | o |
| Test.kt:82:1:89:1 | Entry | 8 | Test.kt:84:11:84:18 | (...)... |
| Test.kt:82:1:89:1 | Exit | 0 | Test.kt:82:1:89:1 | Exit |
| Test.kt:82:1:89:1 | Normal Exit | 0 | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:82:21:89:1 | { ... } | 0 | Test.kt:82:21:89:1 | { ... } |
| Test.kt:82:21:89:1 | { ... } | 1 | Test.kt:83:2:88:2 | try ... |
| Test.kt:82:21:89:1 | { ... } | 2 | Test.kt:83:6:86:2 | { ... } |
| Test.kt:82:21:89:1 | { ... } | 3 | Test.kt:84:3:84:18 | var ...; |
| Test.kt:82:21:89:1 | { ... } | 4 | Test.kt:84:11:84:11 | o |
| Test.kt:82:21:89:1 | { ... } | 5 | Test.kt:84:11:84:18 | (...)... |
| Test.kt:84:3:84:18 | x | 0 | Test.kt:84:3:84:18 | x |
| Test.kt:84:3:84:18 | x | 1 | Test.kt:85:10:85:10 | 1 |
| Test.kt:84:3:84:18 | x | 2 | Test.kt:85:3:85:10 | return ... |
| Test.kt:84:11:84:18 | After (...)... | 0 | Test.kt:84:11:84:18 | After (...)... |
| Test.kt:84:11:84:18 | After (...)... | 1 | Test.kt:84:3:84:18 | x |
| Test.kt:84:11:84:18 | After (...)... | 2 | Test.kt:84:3:84:18 | After x |
| Test.kt:84:11:84:18 | After (...)... | 3 | Test.kt:84:3:84:18 | After var ...; |
| Test.kt:84:11:84:18 | After (...)... | 4 | Test.kt:85:3:85:10 | Before return ... |
| Test.kt:84:11:84:18 | After (...)... | 5 | Test.kt:85:10:85:10 | 1 |
| Test.kt:84:11:84:18 | After (...)... | 6 | Test.kt:85:3:85:10 | return ... |
| Test.kt:86:4:88:2 | After catch (...) [match] | 0 | Test.kt:86:4:88:2 | After catch (...) [match] |
| Test.kt:86:4:88:2 | After catch (...) [match] | 1 | Test.kt:86:11:86:31 | e |
| Test.kt:86:4:88:2 | After catch (...) [match] | 2 | Test.kt:86:34:88:2 | { ... } |
| Test.kt:86:4:88:2 | After catch (...) [match] | 3 | Test.kt:87:3:87:10 | Before return ... |
| Test.kt:86:4:88:2 | After catch (...) [match] | 4 | Test.kt:87:10:87:10 | 2 |
| Test.kt:86:4:88:2 | After catch (...) [match] | 5 | Test.kt:87:3:87:10 | return ... |
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 0 | Test.kt:86:4:88:2 | After catch (...) [no-match] |
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 1 | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) |
| Test.kt:86:4:88:2 | catch (...) | 1 | Test.kt:86:11:86:31 | e |
| Test.kt:86:4:88:2 | catch (...) | 2 | Test.kt:86:34:88:2 | { ... } |
| Test.kt:86:4:88:2 | catch (...) | 3 | Test.kt:87:10:87:10 | 2 |
| Test.kt:86:4:88:2 | catch (...) | 4 | Test.kt:87:3:87:10 | return ... |
| Test.kt:91:1:98:1 | Exceptional Exit | 0 | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:91:1:98:1 | Entry | 0 | Test.kt:91:1:98:1 | Entry |
| Test.kt:91:1:98:1 | Entry | 1 | Test.kt:91:22:98:1 | { ... } |
| Test.kt:91:1:98:1 | Entry | 2 | Test.kt:92:2:97:2 | try ... |
| Test.kt:91:1:98:1 | Entry | 3 | Test.kt:92:6:95:2 | { ... } |
| Test.kt:91:1:98:1 | Entry | 4 | Test.kt:93:3:93:13 | var ...; |
| Test.kt:91:1:98:1 | Entry | 5 | Test.kt:93:3:93:13 | Before x |
| Test.kt:91:1:98:1 | Entry | 6 | Test.kt:93:11:93:13 | Before ...!! |
| Test.kt:91:1:98:1 | Entry | 7 | Test.kt:93:11:93:11 | o |
| Test.kt:91:1:98:1 | Entry | 8 | Test.kt:93:11:93:13 | ...!! |
| Test.kt:91:1:98:1 | Exit | 0 | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:1:98:1 | Normal Exit | 0 | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:91:22:98:1 | { ... } | 0 | Test.kt:91:22:98:1 | { ... } |
| Test.kt:91:22:98:1 | { ... } | 1 | Test.kt:92:2:97:2 | try ... |
| Test.kt:91:22:98:1 | { ... } | 2 | Test.kt:92:6:95:2 | { ... } |
| Test.kt:91:22:98:1 | { ... } | 3 | Test.kt:93:3:93:13 | var ...; |
| Test.kt:91:22:98:1 | { ... } | 4 | Test.kt:93:11:93:11 | o |
| Test.kt:91:22:98:1 | { ... } | 5 | Test.kt:93:11:93:13 | ...!! |
| Test.kt:93:3:93:13 | x | 0 | Test.kt:93:3:93:13 | x |
| Test.kt:93:3:93:13 | x | 1 | Test.kt:94:10:94:10 | 1 |
| Test.kt:93:3:93:13 | x | 2 | Test.kt:94:3:94:10 | return ... |
| Test.kt:93:11:93:13 | After ...!! | 0 | Test.kt:93:11:93:13 | After ...!! |
| Test.kt:93:11:93:13 | After ...!! | 1 | Test.kt:93:3:93:13 | x |
| Test.kt:93:11:93:13 | After ...!! | 2 | Test.kt:93:3:93:13 | After x |
| Test.kt:93:11:93:13 | After ...!! | 3 | Test.kt:93:3:93:13 | After var ...; |
| Test.kt:93:11:93:13 | After ...!! | 4 | Test.kt:94:3:94:10 | Before return ... |
| Test.kt:93:11:93:13 | After ...!! | 5 | Test.kt:94:10:94:10 | 1 |
| Test.kt:93:11:93:13 | After ...!! | 6 | Test.kt:94:3:94:10 | return ... |
| Test.kt:95:4:97:2 | After catch (...) [match] | 0 | Test.kt:95:4:97:2 | After catch (...) [match] |
| Test.kt:95:4:97:2 | After catch (...) [match] | 1 | Test.kt:95:11:95:33 | e |
| Test.kt:95:4:97:2 | After catch (...) [match] | 2 | Test.kt:95:36:97:2 | { ... } |
| Test.kt:95:4:97:2 | After catch (...) [match] | 3 | Test.kt:96:3:96:10 | Before return ... |
| Test.kt:95:4:97:2 | After catch (...) [match] | 4 | Test.kt:96:10:96:10 | 2 |
| Test.kt:95:4:97:2 | After catch (...) [match] | 5 | Test.kt:96:3:96:10 | return ... |
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 0 | Test.kt:95:4:97:2 | After catch (...) [no-match] |
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 1 | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) |
| Test.kt:95:4:97:2 | catch (...) | 1 | Test.kt:95:11:95:33 | e |
| Test.kt:95:4:97:2 | catch (...) | 2 | Test.kt:95:36:97:2 | { ... } |
| Test.kt:95:4:97:2 | catch (...) | 3 | Test.kt:96:10:96:10 | 2 |
| Test.kt:95:4:97:2 | catch (...) | 4 | Test.kt:96:3:96:10 | return ... |
| Test.kt:100:1:110:1 | Entry | 0 | Test.kt:100:1:110:1 | Entry |
| Test.kt:100:1:110:1 | Entry | 1 | Test.kt:100:25:110:1 | { ... } |
| Test.kt:100:1:110:1 | Entry | 2 | Test.kt:101:5:103:5 | <Expr>; |
| Test.kt:100:1:110:1 | Entry | 3 | Test.kt:101:5:103:5 | when ... |
| Test.kt:100:1:110:1 | Entry | 4 | Test.kt:101:9:103:5 | ... -> ... |
| Test.kt:100:1:110:1 | Entry | 5 | Test.kt:101:9:101:30 | ... && ... |
| Test.kt:100:1:110:1 | Entry | 6 | Test.kt:101:9:101:17 | Before ... (value equals) ... |
| Test.kt:100:1:110:1 | Entry | 7 | Test.kt:101:9:101:9 | x |
| Test.kt:100:1:110:1 | Entry | 8 | Test.kt:101:14:101:17 | null |
| Test.kt:100:1:110:1 | Entry | 9 | Test.kt:101:9:101:17 | ... (value equals) ... |
| Test.kt:100:1:110:1 | Exit | 0 | Test.kt:100:1:110:1 | Exit |
| Test.kt:100:1:110:1 | Normal Exit | 0 | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:100:25:110:1 | { ... } | 0 | Test.kt:100:25:110:1 | { ... } |
| Test.kt:100:25:110:1 | { ... } | 1 | Test.kt:101:5:103:5 | <Expr>; |
| Test.kt:100:25:110:1 | { ... } | 2 | Test.kt:101:5:103:5 | when ... |
| Test.kt:100:25:110:1 | { ... } | 3 | Test.kt:101:9:103:5 | ... -> ... |
| Test.kt:100:25:110:1 | { ... } | 4 | Test.kt:101:9:101:30 | ... && ... |
| Test.kt:100:25:110:1 | { ... } | 5 | Test.kt:101:9:101:9 | x |
| Test.kt:100:25:110:1 | { ... } | 6 | Test.kt:101:14:101:17 | null |
| Test.kt:100:25:110:1 | { ... } | 7 | Test.kt:101:9:101:17 | ... (value equals) ... |
| Test.kt:101:22:101:22 | y | 0 | Test.kt:101:22:101:22 | y |
| Test.kt:101:22:101:22 | y | 1 | Test.kt:101:27:101:30 | null |
| Test.kt:101:22:101:22 | y | 2 | Test.kt:101:22:101:30 | ... (value equals) ... |
| Test.kt:101:33:103:5 | { ... } | 0 | Test.kt:101:33:103:5 | { ... } |
| Test.kt:101:33:103:5 | { ... } | 1 | Test.kt:102:15:102:25 | new Exception(...) |
| Test.kt:101:33:103:5 | { ... } | 2 | Test.kt:102:9:102:25 | throw ... |
| Test.kt:101:33:103:5 | { ... } | 3 | Test.kt:100:1:110:1 | Exceptional Exit |
| Test.kt:105:5:109:5 | <Expr>; | 0 | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:105:5:109:5 | <Expr>; | 1 | Test.kt:105:5:109:5 | when ... |
| Test.kt:105:5:109:5 | <Expr>; | 2 | Test.kt:105:9:107:5 | ... -> ... |
| Test.kt:105:5:109:5 | <Expr>; | 3 | Test.kt:105:9:105:9 | x |
| Test.kt:105:5:109:5 | <Expr>; | 4 | Test.kt:105:14:105:17 | null |
| Test.kt:105:5:109:5 | <Expr>; | 5 | Test.kt:105:9:105:17 | ... (value not-equals) ... |
| Test.kt:105:20:107:5 | { ... } | 0 | Test.kt:105:20:107:5 | { ... } |
| Test.kt:105:20:107:5 | { ... } | 1 | Test.kt:106:9:106:29 | <Expr>; |
| Test.kt:105:20:107:5 | { ... } | 2 | Test.kt:106:17:106:28 | "x not null" |
| Test.kt:105:20:107:5 | { ... } | 3 | Test.kt:106:9:106:29 | println(...) |
| Test.kt:107:16:109:5 | ... -> ... | 0 | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:107:16:109:5 | ... -> ... | 1 | Test.kt:107:16:107:16 | y |
| Test.kt:107:16:109:5 | ... -> ... | 2 | Test.kt:107:21:107:24 | null |
| Test.kt:107:16:109:5 | ... -> ... | 3 | Test.kt:107:16:107:24 | ... (value not-equals) ... |
| Test.kt:107:27:109:5 | { ... } | 0 | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:27:109:5 | { ... } | 1 | Test.kt:108:9:108:29 | <Expr>; |
| Test.kt:107:27:109:5 | { ... } | 2 | Test.kt:108:17:108:28 | "y not null" |
| Test.kt:107:27:109:5 | { ... } | 3 | Test.kt:108:9:108:29 | println(...) |
| Test.kt:112:1:116:1 | Exceptional Exit | 0 | Test.kt:112:1:116:1 | Exceptional Exit |
| Test.kt:112:1:116:1 | Exit | 0 | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:1:116:1 | Normal Exit | 0 | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:112:32:116:1 | { ... } | 0 | Test.kt:112:32:116:1 | { ... } |
| Test.kt:112:32:116:1 | { ... } | 1 | Test.kt:113:5:115:5 | <Expr>; |
| Test.kt:112:32:116:1 | { ... } | 2 | Test.kt:113:5:115:5 | when ... |
| Test.kt:112:32:116:1 | { ... } | 3 | Test.kt:113:9:115:5 | ... -> ... |
| Test.kt:112:32:116:1 | { ... } | 4 | Test.kt:113:9:113:14 | ... && ... |
| Test.kt:112:32:116:1 | { ... } | 5 | Test.kt:113:9:113:9 | x |
| Test.kt:113:14:113:14 | y | 0 | Test.kt:113:14:113:14 | y |
| Test.kt:113:17:115:5 | { ... } | 0 | Test.kt:113:17:115:5 | { ... } |
| Test.kt:118:1:124:1 | Exceptional Exit | 0 | Test.kt:118:1:124:1 | Exceptional Exit |
| Test.kt:118:1:124:1 | Exit | 0 | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:1:124:1 | Normal Exit | 0 | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:118:37:124:1 | { ... } | 0 | Test.kt:118:37:124:1 | { ... } |
| Test.kt:118:37:124:1 | { ... } | 1 | Test.kt:119:2:123:12 | <Expr>; |
| Test.kt:118:37:124:1 | { ... } | 2 | Test.kt:119:2:123:12 | when ... |
| Test.kt:118:37:124:1 | { ... } | 3 | Test.kt:120:3:123:10 | ... -> ... |
| Test.kt:118:37:124:1 | { ... } | 4 | Test.kt:120:3:123:3 | when ... |
| Test.kt:118:37:124:1 | { ... } | 5 | Test.kt:121:4:121:9 | ... -> ... |
| Test.kt:118:37:124:1 | { ... } | 6 | Test.kt:121:4:121:4 | x |
| Test.kt:121:9:121:9 | <Expr>; | 0 | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:121:9:121:9 | <Expr>; | 1 | Test.kt:121:9:121:9 | y |
| Test.kt:122:12:122:16 | ... -> ... | 0 | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:122:12:122:16 | ... -> ... | 1 | Test.kt:122:12:122:16 | true |
| Test.kt:122:12:122:16 | ... -> ... | 2 | Test.kt:122:12:122:16 | <Expr>; |
| Test.kt:122:12:122:16 | ... -> ... | 3 | Test.kt:122:12:122:16 | false |
| Test.kt:123:8:123:10 | { ... } | 0 | Test.kt:123:8:123:10 | { ... } |
| Test.kt:101:9:101:17 | After ... (value equals) ... [false] | 0 | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 0 | Test.kt:101:9:101:17 | After ... (value equals) ... [true] |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 1 | Test.kt:101:22:101:30 | Before ... (value equals) ... |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 2 | Test.kt:101:22:101:22 | y |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 3 | Test.kt:101:27:101:30 | null |
| Test.kt:101:9:101:17 | After ... (value equals) ... [true] | 4 | Test.kt:101:22:101:30 | ... (value equals) ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 0 | Test.kt:101:9:101:30 | After ... && ... [false] |
| Test.kt:101:9:101:30 | After ... && ... [false] | 1 | Test.kt:101:5:103:5 | After when ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 2 | Test.kt:101:5:103:5 | After <Expr>; |
| Test.kt:101:9:101:30 | After ... && ... [false] | 3 | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:9:101:30 | After ... && ... [false] | 4 | Test.kt:105:5:109:5 | when ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 5 | Test.kt:105:9:107:5 | ... -> ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 6 | Test.kt:105:9:105:17 | Before ... (value not-equals) ... |
| Test.kt:101:9:101:30 | After ... && ... [false] | 7 | Test.kt:105:9:105:9 | x |
| Test.kt:101:9:101:30 | After ... && ... [false] | 8 | Test.kt:105:14:105:17 | null |
| Test.kt:101:9:101:30 | After ... && ... [false] | 9 | Test.kt:105:9:105:17 | ... (value not-equals) ... |
| Test.kt:101:22:101:30 | After ... (value equals) ... [false] | 0 | Test.kt:101:22:101:30 | After ... (value equals) ... [false] |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 0 | Test.kt:101:22:101:30 | After ... (value equals) ... [true] |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 1 | Test.kt:101:9:101:30 | After ... && ... [true] |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 2 | Test.kt:101:33:103:5 | { ... } |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 3 | Test.kt:102:9:102:25 | Before throw ... |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 4 | Test.kt:102:15:102:25 | Before new Exception(...) |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 5 | Test.kt:102:15:102:25 | new Exception(...) |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 6 | Test.kt:102:15:102:25 | After new Exception(...) |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 7 | Test.kt:102:9:102:25 | throw ... |
| Test.kt:101:22:101:30 | After ... (value equals) ... [true] | 8 | Test.kt:100:1:110:1 | Exceptional Exit |
| Test.kt:105:5:109:5 | After when ... | 0 | Test.kt:105:5:109:5 | After when ... |
| Test.kt:105:5:109:5 | After when ... | 1 | Test.kt:105:5:109:5 | After <Expr>; |
| Test.kt:105:5:109:5 | After when ... | 2 | Test.kt:100:25:110:1 | After { ... } |
| Test.kt:105:5:109:5 | After when ... | 3 | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 0 | Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 1 | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 2 | Test.kt:107:16:107:24 | Before ... (value not-equals) ... |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 3 | Test.kt:107:16:107:16 | y |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 4 | Test.kt:107:21:107:24 | null |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [false] | 5 | Test.kt:107:16:107:24 | ... (value not-equals) ... |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 0 | Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 1 | Test.kt:105:20:107:5 | { ... } |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 2 | Test.kt:106:9:106:29 | <Expr>; |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 3 | Test.kt:106:9:106:29 | Before println(...) |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 4 | Test.kt:106:17:106:28 | "x not null" |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 5 | Test.kt:106:9:106:29 | println(...) |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 6 | Test.kt:106:9:106:29 | After println(...) |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 7 | Test.kt:106:9:106:29 | After <Expr>; |
| Test.kt:105:9:105:17 | After ... (value not-equals) ... [true] | 8 | Test.kt:105:20:107:5 | After { ... } |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] | 0 | Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 0 | Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 1 | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 2 | Test.kt:108:9:108:29 | <Expr>; |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 3 | Test.kt:108:9:108:29 | Before println(...) |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 4 | Test.kt:108:17:108:28 | "y not null" |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 5 | Test.kt:108:9:108:29 | println(...) |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 6 | Test.kt:108:9:108:29 | After println(...) |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 7 | Test.kt:108:9:108:29 | After <Expr>; |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [true] | 8 | Test.kt:107:27:109:5 | After { ... } |
| Test.kt:112:1:116:1 | Entry | 0 | Test.kt:112:1:116:1 | Entry |
| Test.kt:112:1:116:1 | Entry | 1 | Test.kt:112:32:116:1 | { ... } |
| Test.kt:112:1:116:1 | Entry | 2 | Test.kt:113:5:115:5 | <Expr>; |
| Test.kt:112:1:116:1 | Entry | 3 | Test.kt:113:5:115:5 | when ... |
| Test.kt:112:1:116:1 | Entry | 4 | Test.kt:113:9:115:5 | ... -> ... |
| Test.kt:112:1:116:1 | Entry | 5 | Test.kt:113:9:113:14 | ... && ... |
| Test.kt:112:1:116:1 | Entry | 6 | Test.kt:113:9:113:9 | x |
| Test.kt:113:5:115:5 | After when ... | 0 | Test.kt:113:5:115:5 | After when ... |
| Test.kt:113:5:115:5 | After when ... | 1 | Test.kt:113:5:115:5 | After <Expr>; |
| Test.kt:113:5:115:5 | After when ... | 2 | Test.kt:112:32:116:1 | After { ... } |
| Test.kt:113:5:115:5 | After when ... | 3 | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:113:5:115:5 | After when ... | 4 | Test.kt:112:1:116:1 | Exit |
| Test.kt:113:9:113:9 | After x [false] | 0 | Test.kt:113:9:113:9 | After x [false] |
| Test.kt:113:9:113:9 | After x [true] | 0 | Test.kt:113:9:113:9 | After x [true] |
| Test.kt:113:9:113:9 | After x [true] | 1 | Test.kt:113:14:113:14 | y |
| Test.kt:113:9:113:14 | After ... && ... [false] | 0 | Test.kt:113:9:113:14 | After ... && ... [false] |
| Test.kt:113:14:113:14 | After y [false] | 0 | Test.kt:113:14:113:14 | After y [false] |
| Test.kt:113:14:113:14 | After y [true] | 0 | Test.kt:113:14:113:14 | After y [true] |
| Test.kt:113:14:113:14 | After y [true] | 1 | Test.kt:113:9:113:14 | After ... && ... [true] |
| Test.kt:113:14:113:14 | After y [true] | 2 | Test.kt:113:17:115:5 | { ... } |
| Test.kt:118:1:124:1 | Entry | 0 | Test.kt:118:1:124:1 | Entry |
| Test.kt:118:1:124:1 | Entry | 1 | Test.kt:118:37:124:1 | { ... } |
| Test.kt:118:1:124:1 | Entry | 2 | Test.kt:119:2:123:12 | <Expr>; |
| Test.kt:118:1:124:1 | Entry | 3 | Test.kt:119:2:123:12 | when ... |
| Test.kt:118:1:124:1 | Entry | 4 | Test.kt:120:3:123:10 | ... -> ... |
| Test.kt:118:1:124:1 | Entry | 5 | Test.kt:120:3:123:3 | when ... |
| Test.kt:118:1:124:1 | Entry | 6 | Test.kt:121:4:121:9 | ... -> ... |
| Test.kt:118:1:124:1 | Entry | 7 | Test.kt:121:4:121:4 | x |
| Test.kt:119:2:123:12 | After when ... | 0 | Test.kt:119:2:123:12 | After when ... |
| Test.kt:119:2:123:12 | After when ... | 1 | Test.kt:119:2:123:12 | After <Expr>; |
| Test.kt:119:2:123:12 | After when ... | 2 | Test.kt:118:37:124:1 | After { ... } |
| Test.kt:119:2:123:12 | After when ... | 3 | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:119:2:123:12 | After when ... | 4 | Test.kt:118:1:124:1 | Exit |
| Test.kt:120:3:123:3 | After when ... [false] | 0 | Test.kt:120:3:123:3 | After when ... [false] |
| Test.kt:120:3:123:3 | After when ... [true] | 0 | Test.kt:120:3:123:3 | After when ... [true] |
| Test.kt:120:3:123:3 | After when ... [true] | 1 | Test.kt:123:8:123:10 | { ... } |
| Test.kt:121:4:121:4 | After x [false] | 0 | Test.kt:121:4:121:4 | After x [false] |
| Test.kt:121:4:121:4 | After x [false] | 1 | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:121:4:121:4 | After x [false] | 2 | Test.kt:122:12:122:16 | true |
| Test.kt:121:4:121:4 | After x [false] | 3 | Test.kt:122:12:122:16 | After true [true] |
| Test.kt:121:4:121:4 | After x [false] | 4 | Test.kt:122:12:122:16 | <Expr>; |
| Test.kt:121:4:121:4 | After x [false] | 5 | Test.kt:122:12:122:16 | false |
| Test.kt:121:4:121:4 | After x [false] | 6 | Test.kt:122:12:122:16 | After <Expr>; |
| Test.kt:121:4:121:4 | After x [true] | 0 | Test.kt:121:4:121:4 | After x [true] |
| Test.kt:121:4:121:4 | After x [true] | 1 | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:121:4:121:4 | After x [true] | 2 | Test.kt:121:9:121:9 | y |
| Test.kt:121:4:121:4 | After x [true] | 3 | Test.kt:121:9:121:9 | After <Expr>; |

View File

@@ -1,6 +1,3 @@
| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | Exit |
| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } |
| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... |
@@ -12,7 +9,6 @@
| Test.kt:4:13:79:2 | { ... } | Test.kt:38:9:38:9 | x |
| Test.kt:4:13:79:2 | { ... } | Test.kt:38:16:41:3 | { ... } |
| Test.kt:4:13:79:2 | { ... } | Test.kt:43:3:43:8 | <Expr>; |
| Test.kt:18:3:18:7 | <Expr>; | Test.kt:4:2:79:2 | Exit |
| Test.kt:18:3:18:7 | <Expr>; | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:18:3:18:7 | <Expr>; | Test.kt:22:4:22:9 | <Expr>; |
| Test.kt:18:3:18:7 | <Expr>; | Test.kt:24:4:24:9 | ... -> ... |
@@ -31,16 +27,22 @@
| Test.kt:35:3:35:8 | <Expr>; | Test.kt:43:3:43:8 | <Expr>; |
| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } |
| Test.kt:38:9:38:9 | x | Test.kt:43:3:43:8 | <Expr>; |
| Test.kt:82:1:89:1 | Normal Exit | Test.kt:82:1:89:1 | Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x |
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:11:86:31 | e |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:11:95:33 | e |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit |
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
@@ -55,16 +57,11 @@
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } |
| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:17:115:5 | { ... } |
| Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } |
| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:118:37:124:1 | { ... } | Test.kt:123:8:123:10 | { ... } |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:123:8:123:10 | { ... } |

View File

@@ -1,6 +1,7 @@
import java
import semmle.code.java.controlflow.Dominance
import utils.test.BasicBlock
from BasicBlock b, BasicBlock b2
where b.strictlyDominates(b2)
select b, b2
select getFirstAstNode(b), getFirstAstNode(b2)

View File

@@ -1,16 +1,13 @@
| Test.kt:3:1:80:1 | Exceptional Exit | Test.kt:3:1:80:1 | Exit |
| Test.kt:3:1:80:1 | { ... } | Test.kt:3:1:80:1 | Exit |
| Test.kt:4:2:79:2 | Exceptional Exit | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:2:79:2 | Normal Exit | Test.kt:4:2:79:2 | Exit |
| Test.kt:4:13:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } |
| Test.kt:4:13:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... |
| Test.kt:11:14:14:3 | { ... } | Test.kt:18:3:18:7 | <Expr>; |
| Test.kt:14:10:16:3 | ... -> ... | Test.kt:18:3:18:7 | <Expr>; |
| Test.kt:18:3:18:7 | <Expr>; | Test.kt:22:4:22:9 | <Expr>; |
| Test.kt:18:3:18:7 | <Expr>; | Test.kt:24:4:24:9 | ... -> ... |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:30:7:30:12 | After ... (value equals) ... [false] |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:30:15:33:3 | { ... } |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:24:4:24:9 | ... -> ... | Test.kt:4:2:79:2 | Normal Exit |
| Test.kt:30:7:30:12 | After ... (value equals) ... [false] | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:30:15:33:3 | { ... } | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:35:3:35:8 | <Expr>; | Test.kt:38:9:38:9 | x |
| Test.kt:38:9:38:9 | x | Test.kt:38:16:41:3 | { ... } |
@@ -22,37 +19,45 @@
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x |
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
| Test.kt:86:11:86:31 | e | Test.kt:82:1:89:1 | Normal Exit |
| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
| Test.kt:95:11:95:33 | e | Test.kt:91:1:98:1 | Normal Exit |
| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit |
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
| Test.kt:100:25:110:1 | { ... } | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:9:101:17 | After ... (value equals) ... [false] | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:22:101:22 | y | Test.kt:101:22:101:30 | After ... (value equals) ... [false] |
| Test.kt:101:22:101:22 | y | Test.kt:101:33:103:5 | { ... } |
| Test.kt:101:22:101:22 | y | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:22:101:30 | After ... (value equals) ... [false] | Test.kt:105:5:109:5 | <Expr>; |
| Test.kt:101:33:103:5 | { ... } | Test.kt:100:1:110:1 | Exit |
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:105:20:107:5 | { ... } |
| Test.kt:105:5:109:5 | <Expr>; | Test.kt:107:16:109:5 | ... -> ... |
| Test.kt:105:20:107:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:16:107:24 | After ... (value not-equals) ... [false] |
| Test.kt:107:16:109:5 | ... -> ... | Test.kt:107:27:109:5 | { ... } |
| Test.kt:107:27:109:5 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
| Test.kt:112:1:116:1 | Exceptional Exit | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:1:116:1 | Normal Exit | Test.kt:112:1:116:1 | Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:9:113:9 | After x [false] |
| Test.kt:112:32:116:1 | { ... } | Test.kt:113:14:113:14 | y |
| Test.kt:113:14:113:14 | y | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:113:9:113:9 | After x [false] | Test.kt:113:9:113:14 | After ... && ... [false] |
| Test.kt:113:9:113:14 | After ... && ... [false] | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:113:14:113:14 | After y [false] | Test.kt:113:9:113:14 | After ... && ... [false] |
| Test.kt:113:14:113:14 | y | Test.kt:113:14:113:14 | After y [false] |
| Test.kt:113:14:113:14 | y | Test.kt:113:17:115:5 | { ... } |
| Test.kt:113:17:115:5 | { ... } | Test.kt:112:1:116:1 | Normal Exit |
| Test.kt:118:1:124:1 | Exceptional Exit | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:1:124:1 | Normal Exit | Test.kt:118:1:124:1 | Exit |
| Test.kt:118:37:124:1 | { ... } | Test.kt:121:9:121:9 | <Expr>; |
| Test.kt:118:37:124:1 | { ... } | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:120:3:123:3 | After when ... [false] | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:120:3:123:3 | After when ... [false] |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:123:8:123:10 | { ... } |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:118:1:124:1 | Normal Exit |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:120:3:123:3 | After when ... [false] |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:123:8:123:10 | { ... } |
| Test.kt:123:8:123:10 | { ... } | Test.kt:118:1:124:1 | Normal Exit |

View File

@@ -1,5 +1,6 @@
import java
import utils.test.BasicBlock
from BasicBlock b, BasicBlock b2
where b.getASuccessor() = b2
select b, b2
select getFirstAstNodeOrSynth(b), getFirstAstNodeOrSynth(b2)

View File

@@ -1,12 +1,10 @@
#select
| Test.kt:3:1:80:1 | Exceptional Exit | Constructor | Test.kt:3:1:80:1 | Exit | Constructor |
| Test.kt:3:1:80:1 | Exit | Constructor | file://:0:0:0:0 | <none> | <none> |
| Test.kt:3:1:80:1 | Entry | Constructor | Test.kt:3:1:80:1 | { ... } | BlockStmt |
| Test.kt:3:1:80:1 | Normal Exit | Constructor | Test.kt:3:1:80:1 | Exit | Constructor |
| Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt | Test.kt:3:1:80:1 | { ... } | BlockStmt |
| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | Normal Exit | Constructor |
| Test.kt:3:1:80:1 | { ... } | BlockStmt | Test.kt:3:1:80:1 | super(...) | SuperConstructorInvocationStmt |
| Test.kt:4:2:79:2 | Exceptional Exit | Method | Test.kt:4:2:79:2 | Exit | Method |
| Test.kt:4:2:79:2 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:4:2:79:2 | Entry | Method | Test.kt:4:13:79:2 | { ... } | BlockStmt |
| Test.kt:4:2:79:2 | Normal Exit | Method | Test.kt:4:2:79:2 | Exit | Method |
| Test.kt:4:13:79:2 | { ... } | BlockStmt | Test.kt:5:3:5:16 | var ...; | LocalVariableDeclStmt |
| Test.kt:5:3:5:16 | var ...; | LocalVariableDeclStmt | Test.kt:5:16:5:16 | 0 | IntegerLiteral |
@@ -30,19 +28,23 @@
| Test.kt:11:11:11:11 | 0 | IntegerLiteral | Test.kt:11:7:11:11 | ... > ... | GTExpr |
| Test.kt:11:14:14:3 | { ... } | BlockStmt | Test.kt:12:4:12:9 | <Expr>; | ExprStmt |
| Test.kt:12:4:12:9 | ...=... | AssignExpr | Test.kt:13:4:13:9 | <Expr>; | ExprStmt |
| Test.kt:12:4:12:9 | <Expr>; | ExprStmt | Test.kt:12:8:12:9 | 20 | LongLiteral |
| Test.kt:12:4:12:9 | <Expr>; | ExprStmt | Test.kt:12:4:12:9 | y | VarAccess |
| Test.kt:12:4:12:9 | y | VarAccess | Test.kt:12:8:12:9 | 20 | LongLiteral |
| Test.kt:12:8:12:9 | 20 | LongLiteral | Test.kt:12:4:12:9 | ...=... | AssignExpr |
| Test.kt:13:4:13:9 | ...=... | AssignExpr | Test.kt:18:3:18:7 | <Expr>; | ExprStmt |
| Test.kt:13:4:13:9 | <Expr>; | ExprStmt | Test.kt:13:8:13:9 | 10 | IntegerLiteral |
| Test.kt:13:4:13:9 | <Expr>; | ExprStmt | Test.kt:13:4:13:9 | z | VarAccess |
| Test.kt:13:4:13:9 | z | VarAccess | Test.kt:13:8:13:9 | 10 | IntegerLiteral |
| Test.kt:13:8:13:9 | 10 | IntegerLiteral | Test.kt:13:4:13:9 | ...=... | AssignExpr |
| Test.kt:14:10:16:3 | ... -> ... | WhenBranch | Test.kt:14:10:16:3 | true | BooleanLiteral |
| Test.kt:14:10:16:3 | true | BooleanLiteral | Test.kt:14:10:16:3 | { ... } | BlockStmt |
| Test.kt:14:10:16:3 | { ... } | BlockStmt | Test.kt:15:4:15:9 | <Expr>; | ExprStmt |
| Test.kt:15:4:15:9 | ...=... | AssignExpr | Test.kt:18:3:18:7 | <Expr>; | ExprStmt |
| Test.kt:15:4:15:9 | <Expr>; | ExprStmt | Test.kt:15:8:15:9 | 30 | LongLiteral |
| Test.kt:15:4:15:9 | <Expr>; | ExprStmt | Test.kt:15:4:15:9 | y | VarAccess |
| Test.kt:15:4:15:9 | y | VarAccess | Test.kt:15:8:15:9 | 30 | LongLiteral |
| Test.kt:15:8:15:9 | 30 | LongLiteral | Test.kt:15:4:15:9 | ...=... | AssignExpr |
| Test.kt:18:3:18:7 | ...=... | AssignExpr | Test.kt:21:3:24:9 | <Expr>; | ExprStmt |
| Test.kt:18:3:18:7 | <Expr>; | ExprStmt | Test.kt:18:7:18:7 | 0 | IntegerLiteral |
| Test.kt:18:3:18:7 | <Expr>; | ExprStmt | Test.kt:18:3:18:7 | z | VarAccess |
| Test.kt:18:3:18:7 | z | VarAccess | Test.kt:18:7:18:7 | 0 | IntegerLiteral |
| Test.kt:18:7:18:7 | 0 | IntegerLiteral | Test.kt:18:3:18:7 | ...=... | AssignExpr |
| Test.kt:21:3:24:9 | <Expr>; | ExprStmt | Test.kt:21:3:24:9 | when ... | WhenExpr |
| Test.kt:21:3:24:9 | when ... | WhenExpr | Test.kt:21:6:22:9 | ... -> ... | WhenBranch |
@@ -52,14 +54,16 @@
| Test.kt:21:6:22:9 | ... -> ... | WhenBranch | Test.kt:21:6:21:6 | x | VarAccess |
| Test.kt:21:10:21:10 | 0 | IntegerLiteral | Test.kt:21:6:21:10 | ... < ... | LTExpr |
| Test.kt:22:4:22:9 | ...=... | AssignExpr | Test.kt:27:3:27:8 | <Expr>; | ExprStmt |
| Test.kt:22:4:22:9 | <Expr>; | ExprStmt | Test.kt:22:8:22:9 | 40 | LongLiteral |
| Test.kt:22:4:22:9 | <Expr>; | ExprStmt | Test.kt:22:4:22:9 | y | VarAccess |
| Test.kt:22:4:22:9 | y | VarAccess | Test.kt:22:8:22:9 | 40 | LongLiteral |
| Test.kt:22:8:22:9 | 40 | LongLiteral | Test.kt:22:4:22:9 | ...=... | AssignExpr |
| Test.kt:24:4:24:9 | ... -> ... | WhenBranch | Test.kt:24:4:24:9 | true | BooleanLiteral |
| Test.kt:24:4:24:9 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method |
| Test.kt:24:4:24:9 | true | BooleanLiteral | Test.kt:24:10:24:10 | INSTANCE | VarAccess |
| Test.kt:24:10:24:10 | INSTANCE | VarAccess | Test.kt:24:4:24:9 | return ... | ReturnStmt |
| Test.kt:27:3:27:8 | ...=... | AssignExpr | Test.kt:30:3:33:3 | <Expr>; | ExprStmt |
| Test.kt:27:3:27:8 | <Expr>; | ExprStmt | Test.kt:27:7:27:8 | 10 | IntegerLiteral |
| Test.kt:27:3:27:8 | <Expr>; | ExprStmt | Test.kt:27:3:27:8 | z | VarAccess |
| Test.kt:27:3:27:8 | z | VarAccess | Test.kt:27:7:27:8 | 10 | IntegerLiteral |
| Test.kt:27:7:27:8 | 10 | IntegerLiteral | Test.kt:27:3:27:8 | ...=... | AssignExpr |
| Test.kt:30:3:33:3 | <Expr>; | ExprStmt | Test.kt:30:3:33:3 | when ... | WhenExpr |
| Test.kt:30:3:33:3 | when ... | WhenExpr | Test.kt:30:7:33:3 | ... -> ... | WhenBranch |
@@ -70,13 +74,16 @@
| Test.kt:30:12:30:12 | 0 | IntegerLiteral | Test.kt:30:7:30:12 | ... (value equals) ... | ValueEQExpr |
| Test.kt:30:15:33:3 | { ... } | BlockStmt | Test.kt:31:4:31:9 | <Expr>; | ExprStmt |
| Test.kt:31:4:31:9 | ...=... | AssignExpr | Test.kt:32:4:32:9 | <Expr>; | ExprStmt |
| Test.kt:31:4:31:9 | <Expr>; | ExprStmt | Test.kt:31:8:31:9 | 60 | LongLiteral |
| Test.kt:31:4:31:9 | <Expr>; | ExprStmt | Test.kt:31:4:31:9 | y | VarAccess |
| Test.kt:31:4:31:9 | y | VarAccess | Test.kt:31:8:31:9 | 60 | LongLiteral |
| Test.kt:31:8:31:9 | 60 | LongLiteral | Test.kt:31:4:31:9 | ...=... | AssignExpr |
| Test.kt:32:4:32:9 | ...=... | AssignExpr | Test.kt:35:3:35:8 | <Expr>; | ExprStmt |
| Test.kt:32:4:32:9 | <Expr>; | ExprStmt | Test.kt:32:8:32:9 | 10 | IntegerLiteral |
| Test.kt:32:4:32:9 | <Expr>; | ExprStmt | Test.kt:32:4:32:9 | z | VarAccess |
| Test.kt:32:4:32:9 | z | VarAccess | Test.kt:32:8:32:9 | 10 | IntegerLiteral |
| Test.kt:32:8:32:9 | 10 | IntegerLiteral | Test.kt:32:4:32:9 | ...=... | AssignExpr |
| Test.kt:35:3:35:8 | ...=... | AssignExpr | Test.kt:38:3:41:3 | while (...) | WhileStmt |
| Test.kt:35:3:35:8 | <Expr>; | ExprStmt | Test.kt:35:7:35:8 | 20 | IntegerLiteral |
| Test.kt:35:3:35:8 | <Expr>; | ExprStmt | Test.kt:35:3:35:8 | z | VarAccess |
| Test.kt:35:3:35:8 | z | VarAccess | Test.kt:35:7:35:8 | 20 | IntegerLiteral |
| Test.kt:35:7:35:8 | 20 | IntegerLiteral | Test.kt:35:3:35:8 | ...=... | AssignExpr |
| Test.kt:38:3:41:3 | while (...) | WhileStmt | Test.kt:38:9:38:9 | x | VarAccess |
| Test.kt:38:9:38:9 | x | VarAccess | Test.kt:38:13:38:13 | 0 | IntegerLiteral |
@@ -85,34 +92,39 @@
| Test.kt:38:13:38:13 | 0 | IntegerLiteral | Test.kt:38:9:38:13 | ... > ... | GTExpr |
| Test.kt:38:16:41:3 | { ... } | BlockStmt | Test.kt:39:4:39:9 | <Expr>; | ExprStmt |
| Test.kt:39:4:39:9 | ...=... | AssignExpr | Test.kt:40:4:40:6 | <Expr>; | ExprStmt |
| Test.kt:39:4:39:9 | <Expr>; | ExprStmt | Test.kt:39:8:39:9 | 10 | LongLiteral |
| Test.kt:39:4:39:9 | <Expr>; | ExprStmt | Test.kt:39:4:39:9 | y | VarAccess |
| Test.kt:39:4:39:9 | y | VarAccess | Test.kt:39:8:39:9 | 10 | LongLiteral |
| Test.kt:39:8:39:9 | 10 | LongLiteral | Test.kt:39:4:39:9 | ...=... | AssignExpr |
| Test.kt:40:4:40:4 | x | VarAccess | Test.kt:40:4:40:6 | <unary> | LocalVariableDeclExpr |
| Test.kt:40:4:40:6 | ...=... | AssignExpr | Test.kt:40:4:40:6 | <Expr>; | ExprStmt |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | <Stmt> | StmtExpr |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | <unary> | VarAccess |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | <unary> | VarAccess |
| Test.kt:40:4:40:6 | <Stmt> | StmtExpr | Test.kt:40:4:40:6 | { ... } | BlockStmt |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | x | VarAccess |
| Test.kt:40:4:40:6 | <Expr>; | ExprStmt | Test.kt:40:4:40:6 | { ... } | BlockStmt |
| Test.kt:40:4:40:6 | <Stmt> | StmtExpr | Test.kt:40:4:40:6 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
| Test.kt:40:4:40:6 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr | Test.kt:38:9:38:9 | x | VarAccess |
| Test.kt:40:4:40:6 | <unary> | LocalVariableDeclExpr | Test.kt:40:4:40:6 | <Expr>; | ExprStmt |
| Test.kt:40:4:40:6 | <unary> | VarAccess | Test.kt:40:4:40:6 | <implicit coercion to unit> | ImplicitCoercionToUnitExpr |
| Test.kt:40:4:40:6 | <unary> | VarAccess | Test.kt:40:4:40:6 | <Stmt> | StmtExpr |
| Test.kt:40:4:40:6 | <unary> | VarAccess | Test.kt:40:4:40:6 | dec(...) | MethodCall |
| Test.kt:40:4:40:6 | dec(...) | MethodCall | Test.kt:40:4:40:6 | ...=... | AssignExpr |
| Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt | Test.kt:40:4:40:4 | x | VarAccess |
| Test.kt:40:4:40:6 | x | VarAccess | Test.kt:40:4:40:6 | <unary> | VarAccess |
| Test.kt:40:4:40:6 | { ... } | BlockStmt | Test.kt:40:4:40:6 | var ...; | LocalVariableDeclStmt |
| Test.kt:43:3:43:8 | ...=... | AssignExpr | Test.kt:73:3:73:8 | <Expr>; | ExprStmt |
| Test.kt:43:3:43:8 | <Expr>; | ExprStmt | Test.kt:43:7:43:8 | 30 | IntegerLiteral |
| Test.kt:43:3:43:8 | <Expr>; | ExprStmt | Test.kt:43:3:43:8 | z | VarAccess |
| Test.kt:43:3:43:8 | z | VarAccess | Test.kt:43:7:43:8 | 30 | IntegerLiteral |
| Test.kt:43:7:43:8 | 30 | IntegerLiteral | Test.kt:43:3:43:8 | ...=... | AssignExpr |
| Test.kt:73:3:73:8 | ...=... | AssignExpr | Test.kt:77:3:77:8 | <Expr>; | ExprStmt |
| Test.kt:73:3:73:8 | <Expr>; | ExprStmt | Test.kt:73:7:73:8 | 50 | IntegerLiteral |
| Test.kt:73:3:73:8 | <Expr>; | ExprStmt | Test.kt:73:3:73:8 | z | VarAccess |
| Test.kt:73:3:73:8 | z | VarAccess | Test.kt:73:7:73:8 | 50 | IntegerLiteral |
| Test.kt:73:7:73:8 | 50 | IntegerLiteral | Test.kt:73:3:73:8 | ...=... | AssignExpr |
| Test.kt:77:3:77:8 | ...=... | AssignExpr | Test.kt:78:9:78:9 | INSTANCE | VarAccess |
| Test.kt:77:3:77:8 | <Expr>; | ExprStmt | Test.kt:77:7:77:8 | 40 | IntegerLiteral |
| Test.kt:77:3:77:8 | <Expr>; | ExprStmt | Test.kt:77:3:77:8 | w | VarAccess |
| Test.kt:77:3:77:8 | w | VarAccess | Test.kt:77:7:77:8 | 40 | IntegerLiteral |
| Test.kt:77:7:77:8 | 40 | IntegerLiteral | Test.kt:77:3:77:8 | ...=... | AssignExpr |
| Test.kt:78:3:78:8 | return ... | ReturnStmt | Test.kt:4:2:79:2 | Normal Exit | Method |
| Test.kt:78:9:78:9 | INSTANCE | VarAccess | Test.kt:78:3:78:8 | return ... | ReturnStmt |
| Test.kt:82:1:89:1 | Entry | Method | Test.kt:82:21:89:1 | { ... } | BlockStmt |
| Test.kt:82:1:89:1 | Exceptional Exit | Method | Test.kt:82:1:89:1 | Exit | Method |
| Test.kt:82:1:89:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:82:1:89:1 | Normal Exit | Method | Test.kt:82:1:89:1 | Exit | Method |
| Test.kt:82:21:89:1 | { ... } | BlockStmt | Test.kt:83:2:88:2 | try ... | TryStmt |
| Test.kt:83:2:88:2 | try ... | TryStmt | Test.kt:83:6:86:2 | { ... } | BlockStmt |
@@ -124,13 +136,14 @@
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause |
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:82:1:89:1 | Exceptional Exit | Method |
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr |
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
| Test.kt:87:10:87:10 | 2 | IntegerLiteral | Test.kt:87:3:87:10 | return ... | ReturnStmt |
| Test.kt:91:1:98:1 | Entry | Method | Test.kt:91:22:98:1 | { ... } | BlockStmt |
| Test.kt:91:1:98:1 | Exceptional Exit | Method | Test.kt:91:1:98:1 | Exit | Method |
| Test.kt:91:1:98:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:91:1:98:1 | Normal Exit | Method | Test.kt:91:1:98:1 | Exit | Method |
| Test.kt:91:22:98:1 | { ... } | BlockStmt | Test.kt:92:2:97:2 | try ... | TryStmt |
| Test.kt:92:2:97:2 | try ... | TryStmt | Test.kt:92:6:95:2 | { ... } | BlockStmt |
@@ -142,13 +155,14 @@
| Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause |
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:91:1:98:1 | Exceptional Exit | Method |
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr |
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
| Test.kt:96:10:96:10 | 2 | IntegerLiteral | Test.kt:96:3:96:10 | return ... | ReturnStmt |
| Test.kt:100:1:110:1 | Entry | Method | Test.kt:100:25:110:1 | { ... } | BlockStmt |
| Test.kt:100:1:110:1 | Exceptional Exit | Method | Test.kt:100:1:110:1 | Exit | Method |
| Test.kt:100:1:110:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:100:1:110:1 | Normal Exit | Method | Test.kt:100:1:110:1 | Exit | Method |
| Test.kt:100:25:110:1 | { ... } | BlockStmt | Test.kt:101:5:103:5 | <Expr>; | ExprStmt |
| Test.kt:101:5:103:5 | <Expr>; | ExprStmt | Test.kt:101:5:103:5 | when ... | WhenExpr |
@@ -186,8 +200,7 @@
| Test.kt:108:9:108:29 | <Expr>; | ExprStmt | Test.kt:108:17:108:28 | "y not null" | StringLiteral |
| Test.kt:108:9:108:29 | println(...) | MethodCall | Test.kt:100:1:110:1 | Normal Exit | Method |
| Test.kt:108:17:108:28 | "y not null" | StringLiteral | Test.kt:108:9:108:29 | println(...) | MethodCall |
| Test.kt:112:1:116:1 | Exceptional Exit | Method | Test.kt:112:1:116:1 | Exit | Method |
| Test.kt:112:1:116:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:112:1:116:1 | Entry | Method | Test.kt:112:32:116:1 | { ... } | BlockStmt |
| Test.kt:112:1:116:1 | Normal Exit | Method | Test.kt:112:1:116:1 | Exit | Method |
| Test.kt:112:32:116:1 | { ... } | BlockStmt | Test.kt:113:5:115:5 | <Expr>; | ExprStmt |
| Test.kt:113:5:115:5 | <Expr>; | ExprStmt | Test.kt:113:5:115:5 | when ... | WhenExpr |
@@ -199,8 +212,7 @@
| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:112:1:116:1 | Normal Exit | Method |
| Test.kt:113:14:113:14 | y | VarAccess | Test.kt:113:17:115:5 | { ... } | BlockStmt |
| Test.kt:113:17:115:5 | { ... } | BlockStmt | Test.kt:112:1:116:1 | Normal Exit | Method |
| Test.kt:118:1:124:1 | Exceptional Exit | Method | Test.kt:118:1:124:1 | Exit | Method |
| Test.kt:118:1:124:1 | Exit | Method | file://:0:0:0:0 | <none> | <none> |
| Test.kt:118:1:124:1 | Entry | Method | Test.kt:118:37:124:1 | { ... } | BlockStmt |
| Test.kt:118:1:124:1 | Normal Exit | Method | Test.kt:118:1:124:1 | Exit | Method |
| Test.kt:118:37:124:1 | { ... } | BlockStmt | Test.kt:119:2:123:12 | <Expr>; | ExprStmt |
| Test.kt:119:2:123:12 | <Expr>; | ExprStmt | Test.kt:119:2:123:12 | when ... | WhenExpr |
@@ -216,6 +228,7 @@
| Test.kt:122:12:122:16 | ... -> ... | WhenBranch | Test.kt:122:12:122:16 | true | BooleanLiteral |
| Test.kt:122:12:122:16 | <Expr>; | ExprStmt | Test.kt:122:12:122:16 | false | BooleanLiteral |
| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:118:1:124:1 | Normal Exit | Method |
| Test.kt:122:12:122:16 | false | BooleanLiteral | Test.kt:123:8:123:10 | { ... } | BlockStmt |
| Test.kt:122:12:122:16 | true | BooleanLiteral | Test.kt:122:12:122:16 | <Expr>; | ExprStmt |
| Test.kt:123:8:123:10 | { ... } | BlockStmt | Test.kt:118:1:124:1 | Normal Exit | Method |
missingSuccessor

View File

@@ -1,54 +1,15 @@
import java
import utils.test.AstCfg
newtype TMaybeControlFlowNode =
TControlFlowNode(ControlFlowNode c) or
TNoControlFlowNode()
class MaybeControlFlowNode extends TMaybeControlFlowNode {
abstract string toString();
abstract Location getLocation();
abstract string getPrimaryQlClasses();
}
class YesMaybeControlFlowNode extends MaybeControlFlowNode {
ControlFlowNode c;
YesMaybeControlFlowNode() { this = TControlFlowNode(c) }
override string toString() { result = c.toString() }
override Location getLocation() { result = c.getLocation() }
override string getPrimaryQlClasses() { result = c.getAstNode().getPrimaryQlClasses() }
}
class NoMaybeControlFlowNode extends MaybeControlFlowNode {
NoMaybeControlFlowNode() { this = TNoControlFlowNode() }
override string toString() { result = "<none>" }
override Location getLocation() { result.toString() = "file://:0:0:0:0" }
override string getPrimaryQlClasses() { result = "<none>" }
}
MaybeControlFlowNode maybeSuccessor(ControlFlowNode n) {
if exists(n.getASuccessor())
then result = TControlFlowNode(n.getASuccessor())
else result = TNoControlFlowNode()
}
from ControlFlowNode n, MaybeControlFlowNode m
from ControlFlowNode n, ControlFlowNode m
where
m = maybeSuccessor(n) and
m = getAnAstSuccessor(n) and
n.getLocation().getFile().(CompilationUnit).fromSource()
select n, n.getAstNode().getPrimaryQlClasses(), m, m.getPrimaryQlClasses()
select n, n.getAstNode().getPrimaryQlClasses(), m, m.getAstNode().getPrimaryQlClasses()
query predicate missingSuccessor(Expr n) {
maybeSuccessor(n.getControlFlowNode()) instanceof NoMaybeControlFlowNode and
n.getFile().(CompilationUnit).fromSource() and
not n instanceof TypeAccess and
not n instanceof VarWrite
query predicate missingSuccessor(Expr e) {
exists(ControlFlowNode n | n = e.getControlFlowNode() and not exists(n.getASuccessor())) and
e.getFile().(CompilationUnit).fromSource() and
not e instanceof TypeAccess and
not e instanceof VarWrite
}

View File

@@ -562,5 +562,4 @@
| Test.kt:121:4:121:9 | ... -> ... | Test.kt:122:12:122:16 | ... -> ... |
| Test.kt:121:4:121:9 | ... -> ... | Test.kt:122:12:122:16 | <Expr>; |
| Test.kt:121:4:121:9 | ... -> ... | Test.kt:123:8:123:10 | { ... } |
| Test.kt:121:9:121:9 | <Expr>; | Test.kt:123:8:123:10 | { ... } |
| Test.kt:122:12:122:16 | ... -> ... | Test.kt:122:12:122:16 | <Expr>; |

View File

@@ -17,5 +17,6 @@ predicate dominanceCounterExample(ControlFlowNode entry, ControlFlowNode dom, Co
from Callable c, ControlFlowNode dom, ControlFlowNode node
where
strictlyDominates(dom, node) and
dominanceCounterExample(c.getBody().getControlFlowNode(), dom, node)
dominanceCounterExample(any(ControlFlow::EntryNode entry | entry.getEnclosingCallable() = c), dom,
node)
select c, dom, node

View File

@@ -1,157 +1,21 @@
| Test.kt:2:43:79:2 | { ... } | Test.kt:3:9:3:18 | var ...; |
| Test.kt:3:9:3:18 | var ...; | Test.kt:3:17:3:18 | px |
| Test.kt:3:9:3:18 | x | Test.kt:4:9:4:18 | var ...; |
| Test.kt:3:17:3:18 | px | Test.kt:3:9:3:18 | x |
| Test.kt:4:9:4:18 | var ...; | Test.kt:4:17:4:18 | pw |
| Test.kt:4:9:4:18 | w | Test.kt:5:9:5:18 | var ...; |
| Test.kt:4:17:4:18 | pw | Test.kt:4:9:4:18 | w |
| Test.kt:5:9:5:18 | var ...; | Test.kt:5:17:5:18 | pz |
| Test.kt:5:9:5:18 | z | Test.kt:7:3:7:12 | var ...; |
| Test.kt:5:17:5:18 | pz | Test.kt:5:9:5:18 | z |
| Test.kt:7:3:7:12 | j | Test.kt:8:3:8:18 | var ...; |
| Test.kt:7:3:7:12 | var ...; | Test.kt:7:3:7:12 | j |
| Test.kt:8:3:8:18 | var ...; | Test.kt:8:17:8:18 | 50 |
| Test.kt:8:3:8:18 | y | Test.kt:11:3:16:3 | <Expr>; |
| Test.kt:8:17:8:18 | 50 | Test.kt:8:3:8:18 | y |
| Test.kt:11:3:16:3 | <Expr>; | Test.kt:11:3:16:3 | when ... |
| Test.kt:11:3:16:3 | when ... | Test.kt:11:7:14:3 | ... -> ... |
| Test.kt:11:7:11:7 | x | Test.kt:11:11:11:11 | 0 |
| Test.kt:11:7:11:11 | ... > ... | Test.kt:11:14:14:3 | { ... } |
| Test.kt:11:7:11:11 | ... > ... | Test.kt:14:10:16:3 | ... -> ... |
| Test.kt:11:7:11:11 | ... > ... | Test.kt:18:3:18:20 | <Expr>; |
| Test.kt:11:7:14:3 | ... -> ... | Test.kt:11:7:11:7 | x |
| Test.kt:11:11:11:11 | 0 | Test.kt:11:7:11:11 | ... > ... |
| Test.kt:11:14:14:3 | { ... } | Test.kt:12:4:12:9 | <Expr>; |
| Test.kt:12:4:12:9 | ...=... | Test.kt:13:4:13:9 | <Expr>; |
| Test.kt:12:4:12:9 | <Expr>; | Test.kt:12:8:12:9 | 20 |
| Test.kt:12:8:12:9 | 20 | Test.kt:12:4:12:9 | ...=... |
| Test.kt:13:4:13:9 | <Expr>; | Test.kt:13:8:13:9 | 10 |
| Test.kt:13:8:13:9 | 10 | Test.kt:13:4:13:9 | ...=... |
| Test.kt:14:10:16:3 | ... -> ... | Test.kt:14:10:16:3 | true |
| Test.kt:14:10:16:3 | true | Test.kt:14:10:16:3 | { ... } |
| Test.kt:14:10:16:3 | { ... } | Test.kt:15:4:15:9 | <Expr>; |
| Test.kt:15:4:15:9 | <Expr>; | Test.kt:15:8:15:9 | 30 |
| Test.kt:15:8:15:9 | 30 | Test.kt:15:4:15:9 | ...=... |
| Test.kt:18:3:18:20 | ...=... | Test.kt:21:3:24:11 | <Expr>; |
| Test.kt:18:3:18:20 | <Expr>; | Test.kt:18:8:18:8 | x |
| Test.kt:18:7:18:20 | (...)... | Test.kt:18:3:18:20 | ...=... |
| Test.kt:18:8:18:8 | x | Test.kt:18:12:18:12 | y |
| Test.kt:18:8:18:12 | ... + ... | Test.kt:18:7:18:20 | (...)... |
| Test.kt:18:12:18:12 | y | Test.kt:18:8:18:12 | ... + ... |
| Test.kt:21:3:24:11 | <Expr>; | Test.kt:21:3:24:11 | when ... |
| Test.kt:21:3:24:11 | when ... | Test.kt:21:7:22:9 | ... -> ... |
| Test.kt:21:7:21:7 | x | Test.kt:21:11:21:11 | 0 |
| Test.kt:21:7:21:11 | ... < ... | Test.kt:2:2:79:2 | Normal Exit |
| Test.kt:21:7:21:11 | ... < ... | Test.kt:22:4:22:9 | <Expr>; |
| Test.kt:21:7:21:11 | ... < ... | Test.kt:24:4:24:11 | ... -> ... |
| Test.kt:21:7:22:9 | ... -> ... | Test.kt:21:7:21:7 | x |
| Test.kt:21:11:21:11 | 0 | Test.kt:21:7:21:11 | ... < ... |
| Test.kt:22:4:22:9 | ...=... | Test.kt:27:3:27:8 | <Expr>; |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:22:8:22:9 | 40 |
| Test.kt:22:8:22:9 | 40 | Test.kt:22:4:22:9 | ...=... |
| Test.kt:24:4:24:11 | ... -> ... | Test.kt:24:4:24:11 | true |
| Test.kt:24:4:24:11 | true | Test.kt:24:11:24:11 | z |
| Test.kt:24:11:24:11 | z | Test.kt:24:4:24:11 | return ... |
| Test.kt:27:3:27:8 | ...=... | Test.kt:30:3:33:3 | <Expr>; |
| Test.kt:27:3:27:8 | <Expr>; | Test.kt:27:7:27:8 | 10 |
| Test.kt:27:7:27:8 | 10 | Test.kt:27:3:27:8 | ...=... |
| Test.kt:30:3:33:3 | <Expr>; | Test.kt:30:3:33:3 | when ... |
| Test.kt:30:3:33:3 | when ... | Test.kt:30:7:33:3 | ... -> ... |
| Test.kt:30:7:30:7 | x | Test.kt:30:12:30:12 | 0 |
| Test.kt:30:7:30:12 | ... (value equals) ... | Test.kt:30:15:33:3 | { ... } |
| Test.kt:30:7:30:12 | ... (value equals) ... | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:30:7:33:3 | ... -> ... | Test.kt:30:7:30:7 | x |
| Test.kt:30:12:30:12 | 0 | Test.kt:30:7:30:12 | ... (value equals) ... |
| Test.kt:30:15:33:3 | { ... } | Test.kt:31:4:31:9 | <Expr>; |
| Test.kt:31:4:31:9 | ...=... | Test.kt:32:4:32:9 | <Expr>; |
| Test.kt:31:4:31:9 | <Expr>; | Test.kt:31:8:31:9 | 60 |
| Test.kt:31:8:31:9 | 60 | Test.kt:31:4:31:9 | ...=... |
| Test.kt:32:4:32:9 | <Expr>; | Test.kt:32:8:32:9 | 10 |
| Test.kt:32:8:32:9 | 10 | Test.kt:32:4:32:9 | ...=... |
| Test.kt:35:3:35:8 | ...+=... | Test.kt:38:3:41:3 | while (...) |
| Test.kt:35:3:35:8 | <Expr>; | Test.kt:35:3:35:8 | z |
| Test.kt:35:3:35:8 | z | Test.kt:35:8:35:8 | x |
| Test.kt:35:8:35:8 | x | Test.kt:35:3:35:8 | ...+=... |
| Test.kt:38:3:41:3 | while (...) | Test.kt:38:10:38:10 | x |
| Test.kt:38:10:38:10 | x | Test.kt:38:14:38:14 | 0 |
| Test.kt:38:10:38:14 | ... > ... | Test.kt:38:17:41:3 | { ... } |
| Test.kt:38:10:38:14 | ... > ... | Test.kt:43:3:43:15 | <Expr>; |
| Test.kt:38:14:38:14 | 0 | Test.kt:38:10:38:14 | ... > ... |
| Test.kt:38:17:41:3 | { ... } | Test.kt:39:4:39:9 | <Expr>; |
| Test.kt:39:4:39:9 | ...=... | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:39:4:39:9 | <Expr>; | Test.kt:39:8:39:9 | 10 |
| Test.kt:39:8:39:9 | 10 | Test.kt:39:4:39:9 | ...=... |
| Test.kt:40:4:40:4 | x | Test.kt:40:4:40:6 | <unary> |
| Test.kt:40:4:40:6 | ...=... | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:40:4:40:6 | <Expr>; | Test.kt:40:4:40:6 | <Stmt> |
| Test.kt:40:4:40:6 | <Expr>; | Test.kt:40:4:40:6 | <unary> |
| Test.kt:40:4:40:6 | <Expr>; | Test.kt:40:4:40:6 | <unary> |
| Test.kt:40:4:40:6 | <Stmt> | Test.kt:40:4:40:6 | { ... } |
| Test.kt:40:4:40:6 | <unary> | Test.kt:40:4:40:6 | <Expr>; |
| Test.kt:40:4:40:6 | <unary> | Test.kt:40:4:40:6 | <implicit coercion to unit> |
| Test.kt:40:4:40:6 | <unary> | Test.kt:40:4:40:6 | dec(...) |
| Test.kt:40:4:40:6 | dec(...) | Test.kt:40:4:40:6 | ...=... |
| Test.kt:40:4:40:6 | var ...; | Test.kt:40:4:40:4 | x |
| Test.kt:40:4:40:6 | { ... } | Test.kt:40:4:40:6 | var ...; |
| Test.kt:43:3:43:15 | ...+=... | Test.kt:73:3:73:16 | <Expr>; |
| Test.kt:43:3:43:15 | <Expr>; | Test.kt:43:3:43:15 | z |
| Test.kt:43:3:43:15 | z | Test.kt:43:8:43:8 | y |
| Test.kt:43:8:43:8 | y | Test.kt:43:8:43:15 | (...)... |
| Test.kt:43:8:43:15 | (...)... | Test.kt:43:3:43:15 | ...+=... |
| Test.kt:73:3:73:16 | ...+=... | Test.kt:77:3:77:8 | <Expr>; |
| Test.kt:73:3:73:16 | <Expr>; | Test.kt:73:3:73:16 | z |
| Test.kt:73:3:73:16 | z | Test.kt:73:8:73:8 | x |
| Test.kt:73:8:73:8 | x | Test.kt:73:12:73:12 | y |
| Test.kt:73:8:73:12 | ... + ... | Test.kt:73:16:73:16 | w |
| Test.kt:73:8:73:16 | ... + ... | Test.kt:73:3:73:16 | ...+=... |
| Test.kt:73:12:73:12 | <implicit cast> | Test.kt:73:8:73:12 | ... + ... |
| Test.kt:73:12:73:12 | y | Test.kt:73:12:73:12 | <implicit cast> |
| Test.kt:73:16:73:16 | w | Test.kt:73:8:73:16 | ... + ... |
| Test.kt:77:3:77:8 | ...=... | Test.kt:78:10:78:10 | w |
| Test.kt:77:3:77:8 | <Expr>; | Test.kt:77:7:77:8 | 40 |
| Test.kt:77:7:77:8 | 40 | Test.kt:77:3:77:8 | ...=... |
| Test.kt:78:10:78:10 | w | Test.kt:78:3:78:10 | return ... |
| Test.kt:81:25:98:2 | { ... } | Test.kt:83:3:83:12 | var ...; |
| Test.kt:83:3:83:12 | b | Test.kt:84:3:84:12 | var ...; |
| Test.kt:83:3:83:12 | var ...; | Test.kt:83:3:83:12 | b |
| Test.kt:84:3:84:12 | c | Test.kt:85:3:85:7 | <Expr>; |
| Test.kt:84:3:84:12 | var ...; | Test.kt:84:3:84:12 | c |
| Test.kt:85:3:85:7 | ...=... | Test.kt:86:3:96:3 | while (...) |
| Test.kt:85:3:85:7 | <Expr>; | Test.kt:85:7:85:7 | 0 |
| Test.kt:85:7:85:7 | 0 | Test.kt:85:3:85:7 | ...=... |
| Test.kt:86:3:96:3 | while (...) | Test.kt:86:9:86:12 | true |
| Test.kt:86:9:86:12 | true | Test.kt:86:15:96:3 | { ... } |
| Test.kt:86:15:96:3 | { ... } | Test.kt:87:4:87:9 | <Expr>; |
| Test.kt:87:4:87:9 | ...=... | Test.kt:88:4:91:4 | <Expr>; |
| Test.kt:87:4:87:9 | <Expr>; | Test.kt:87:8:87:9 | 10 |
| Test.kt:87:8:87:9 | 10 | Test.kt:87:4:87:9 | ...=... |
| Test.kt:88:4:91:4 | <Expr>; | Test.kt:88:4:91:4 | when ... |
| Test.kt:88:4:91:4 | when ... | Test.kt:88:8:91:4 | ... -> ... |
| Test.kt:88:8:88:8 | a | Test.kt:88:12:88:14 | 100 |
| Test.kt:88:8:88:14 | ... > ... | Test.kt:88:17:91:4 | { ... } |
| Test.kt:88:8:88:14 | ... > ... | Test.kt:92:4:93:9 | <Expr>; |
| Test.kt:88:8:91:4 | ... -> ... | Test.kt:88:8:88:8 | a |
| Test.kt:88:12:88:14 | 100 | Test.kt:88:8:88:14 | ... > ... |
| Test.kt:88:17:91:4 | { ... } | Test.kt:89:5:89:10 | <Expr>; |
| Test.kt:89:5:89:10 | ...=... | Test.kt:90:5:90:9 | <Expr>; |
| Test.kt:89:5:89:10 | <Expr>; | Test.kt:89:9:89:10 | 10 |
| Test.kt:89:9:89:10 | 10 | Test.kt:89:5:89:10 | ...=... |
| Test.kt:90:5:90:9 | <Expr>; | Test.kt:90:9:90:9 | c |
| Test.kt:90:9:90:9 | c | Test.kt:90:5:90:9 | ...=... |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:92:4:93:9 | when ... |
| Test.kt:92:4:93:9 | when ... | Test.kt:92:8:93:9 | ... -> ... |
| Test.kt:92:8:92:8 | a | Test.kt:92:13:92:14 | 10 |
| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:81:2:98:2 | Normal Exit |
| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:93:5:93:9 | break |
| Test.kt:92:8:92:14 | ... (value equals) ... | Test.kt:94:4:95:12 | <Expr>; |
| Test.kt:92:8:93:9 | ... -> ... | Test.kt:92:8:92:8 | a |
| Test.kt:92:13:92:14 | 10 | Test.kt:92:8:92:14 | ... (value equals) ... |
| Test.kt:93:5:93:9 | break | Test.kt:97:10:97:10 | b |
| Test.kt:94:4:95:12 | <Expr>; | Test.kt:94:4:95:12 | when ... |
| Test.kt:94:4:95:12 | when ... | Test.kt:94:8:95:12 | ... -> ... |
| Test.kt:94:8:94:8 | a | Test.kt:94:13:94:14 | 20 |
| Test.kt:94:8:94:14 | ... (value equals) ... | Test.kt:95:12:95:12 | c |
| Test.kt:94:8:95:12 | ... -> ... | Test.kt:94:8:94:8 | a |
| Test.kt:94:13:94:14 | 20 | Test.kt:94:8:94:14 | ... (value equals) ... |
| Test.kt:95:12:95:12 | c | Test.kt:95:5:95:12 | return ... |
| Test.kt:97:10:97:10 | b | Test.kt:97:3:97:10 | return ... |
| Test.kt:2:43:79:2 | { ... } | Test.kt:11:14:14:3 | { ... } |
| Test.kt:2:43:79:2 | { ... } | Test.kt:14:10:16:3 | ... -> ... |
| Test.kt:2:43:79:2 | { ... } | Test.kt:18:3:18:20 | <Expr>; |
| Test.kt:18:3:18:20 | <Expr>; | Test.kt:2:2:79:2 | Normal Exit |
| Test.kt:18:3:18:20 | <Expr>; | Test.kt:22:4:22:9 | <Expr>; |
| Test.kt:18:3:18:20 | <Expr>; | Test.kt:24:4:24:11 | ... -> ... |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:30:7:30:12 | After ... (value equals) ... [false] |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:30:15:33:3 | { ... } |
| Test.kt:22:4:22:9 | <Expr>; | Test.kt:35:3:35:8 | <Expr>; |
| Test.kt:35:3:35:8 | <Expr>; | Test.kt:38:10:38:10 | x |
| Test.kt:38:10:38:10 | x | Test.kt:38:17:41:3 | { ... } |
| Test.kt:38:10:38:10 | x | Test.kt:43:3:43:15 | <Expr>; |
| Test.kt:81:25:98:2 | { ... } | Test.kt:86:9:86:12 | true |
| Test.kt:86:9:86:12 | true | Test.kt:88:8:88:14 | After ... > ... [false] |
| Test.kt:86:9:86:12 | true | Test.kt:88:17:91:4 | { ... } |
| Test.kt:86:9:86:12 | true | Test.kt:92:4:93:9 | <Expr>; |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:81:2:98:2 | Normal Exit |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:93:5:93:9 | break |
| Test.kt:92:4:93:9 | <Expr>; | Test.kt:94:4:95:12 | <Expr>; |
| Test.kt:94:4:95:12 | <Expr>; | Test.kt:94:8:94:14 | After ... (value equals) ... [false] |
| Test.kt:94:4:95:12 | <Expr>; | Test.kt:95:12:95:12 | c |

View File

@@ -1,9 +1,9 @@
import default
import semmle.code.java.controlflow.Dominance
import java
import utils.test.BasicBlock
from Method func, ControlFlowNode dominator, ControlFlowNode node
from Method func, BasicBlock dominator, BasicBlock bb
where
iDominates(dominator, node) and
dominator.getEnclosingStmt().getEnclosingCallable() = func and
dominator.immediatelyDominates(bb) and
dominator.getEnclosingCallable() = func and
func.getDeclaringType().hasName("Test")
select dominator, node
select getFirstAstNodeOrSynth(dominator), getFirstAstNodeOrSynth(bb)

View File

@@ -7,5 +7,5 @@ where
iDominates(dom1, node) and
iDominates(dom2, node) and
dom1 != dom2 and
func = node.getEnclosingStmt().getEnclosingCallable()
func = node.getEnclosingCallable()
select func, node, dom1, dom2

View File

@@ -41,4 +41,5 @@ MaybeElement rhs(BinaryExpr e) {
}
from Expr e
where not e instanceof Assignment
select e, lhs(e), rhs(e)

View File

@@ -30,7 +30,7 @@ nodes
| BadMacUse.java:152:42:152:51 | ciphertext | semmle.label | ciphertext |
subpaths
testFailures
| BadMacUse.java:50:56:50:65 | // $Source | Missing result: Source |
| BadMacUse.java:63:118:63:127 | // $Source | Missing result: Source |
| BadMacUse.java:50:56:50:66 | // $ Source | Missing result: Source |
| BadMacUse.java:63:118:63:128 | // $ Source | Missing result: Source |
| BadMacUse.java:92:31:92:35 | bytes : byte[] | Unexpected result: Source |
| BadMacUse.java:146:95:146:104 | // $Source | Missing result: Source |
| BadMacUse.java:146:95:146:105 | // $ Source | Missing result: Source |

View File

@@ -31,7 +31,7 @@ nodes
| BadMacUse.java:124:42:124:51 | ciphertext | semmle.label | ciphertext |
subpaths
testFailures
| BadMacUse.java:63:118:63:127 | // $Source | Missing result: Source |
| BadMacUse.java:63:118:63:128 | // $ Source | Missing result: Source |
| BadMacUse.java:92:16:92:36 | doFinal(...) : byte[] | Unexpected result: Source |
| BadMacUse.java:124:42:124:51 | ciphertext | Unexpected result: Alert |
| BadMacUse.java:146:95:146:104 | // $Source | Missing result: Source |
| BadMacUse.java:146:95:146:105 | // $ Source | Missing result: Source |

View File

@@ -45,7 +45,7 @@ nodes
| BadMacUse.java:152:42:152:51 | ciphertext | semmle.label | ciphertext |
subpaths
testFailures
| BadMacUse.java:50:56:50:65 | // $Source | Missing result: Source |
| BadMacUse.java:50:56:50:66 | // $ Source | Missing result: Source |
| BadMacUse.java:139:79:139:90 | input : byte[] | Unexpected result: Source |
| BadMacUse.java:146:95:146:104 | // $Source | Missing result: Source |
| BadMacUse.java:146:95:146:105 | // $ Source | Missing result: Source |
| BadMacUse.java:152:42:152:51 | ciphertext | Unexpected result: Alert |

View File

@@ -47,20 +47,20 @@ class BadMacUse {
SecretKey encryptionKey = new SecretKeySpec(encryptionKeyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, encryptionKey, new SecureRandom());
byte[] plaintext = cipher.doFinal(ciphertext); // $Source
byte[] plaintext = cipher.doFinal(ciphertext); // $ Source
// Now verify MAC (too late)
SecretKey macKey = new SecretKeySpec(macKeyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(macKey);
byte[] computedMac = mac.doFinal(plaintext); // $Alert[java/quantum/examples/bad-mac-order-decrypt-to-mac]
byte[] computedMac = mac.doFinal(plaintext); // $ Alert[java/quantum/examples/bad-mac-order-decrypt-to-mac]
if (!MessageDigest.isEqual(receivedMac, computedMac)) {
throw new SecurityException("MAC verification failed");
}
}
public void BadMacOnPlaintext(byte[] encryptionKeyBytes, byte[] macKeyBytes, byte[] plaintext) throws Exception {// $Source
public void BadMacOnPlaintext(byte[] encryptionKeyBytes, byte[] macKeyBytes, byte[] plaintext) throws Exception {// $ Source
// Create keys directly from provided byte arrays
SecretKey encryptionKey = new SecretKeySpec(encryptionKeyBytes, "AES");
SecretKey macKey = new SecretKeySpec(macKeyBytes, "HmacSHA256");
@@ -73,7 +73,7 @@ class BadMacUse {
// Encrypt the plaintext
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, new SecureRandom());
byte[] ciphertext = cipher.doFinal(plaintext); // $Alert[java/quantum/examples/bad-mac-order-encrypt-plaintext-also-in-mac]
byte[] ciphertext = cipher.doFinal(plaintext); // $ Alert[java/quantum/examples/bad-mac-order-encrypt-plaintext-also-in-mac]
// Concatenate ciphertext and MAC
byte[] output = new byte[ciphertext.length + computedMac.length];
@@ -132,7 +132,7 @@ class BadMacUse {
/**
* Correct inputs to a decrypt and MAC operation, but the ordering is unsafe.
* Correct inputs to a decrypt and MAC operation, but the ordering is unsafe.
* The function decrypts THEN computes the MAC on the plaintext.
* It should have the MAC computed on the ciphertext first.
*/
@@ -143,13 +143,13 @@ class BadMacUse {
byte[] receivedMac = Arrays.copyOfRange(input, input.length - macLength, input.length);
// Decrypt first (unsafe)
byte[] plaintext = decryptUsingWrapper(ciphertext, encryptionKeyBytes, new byte[16]); // $Source
byte[] plaintext = decryptUsingWrapper(ciphertext, encryptionKeyBytes, new byte[16]); // $ Source
// Now verify MAC (too late)
SecretKey macKey = new SecretKeySpec(macKeyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(macKey);
byte[] computedMac = mac.doFinal(ciphertext); // $Alert[java/quantum/examples/bad-mac-order-decrypt-then-mac], False positive for Plaintext reuse
byte[] computedMac = mac.doFinal(ciphertext); // $ Alert[java/quantum/examples/bad-mac-order-decrypt-then-mac], False positive for Plaintext reuse
if (!MessageDigest.isEqual(receivedMac, computedMac)) {
throw new SecurityException("MAC verification failed");

View File

@@ -11,33 +11,33 @@ public class InsecureIVorNonceSource {
// BAD: AES-GCM with static IV from a byte array
public byte[] encryptWithStaticIvByteArrayWithInitializer(byte[] key, byte[] plaintext) throws Exception {
byte[] iv = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }; // $Source
byte[] iv = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }; // $ Source
GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.update(plaintext);
return cipher.doFinal();
}
// BAD: AES-GCM with static IV from zero-initialized byte array
public byte[] encryptWithZeroStaticIvByteArray(byte[] key, byte[] plaintext) throws Exception {
byte[] iv = new byte[16];
byte[] iv = new byte[16];
GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/unknown-iv-or-nonce-source]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/unknown-iv-or-nonce-source]
cipher.update(plaintext);
return cipher.doFinal();
}
// BAD: AES-CBC with static IV from 1-initialized byte array
public byte[] encryptWithStaticIvByteArray(byte[] key, byte[] plaintext) throws Exception {
byte[] iv = new byte[16];
byte[] iv = new byte[16];
for (byte i = 0; i < iv.length; i++) {
iv[i] = 1;
}
@@ -46,7 +46,7 @@ public class InsecureIVorNonceSource {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.update(plaintext);
return cipher.doFinal();
}
@@ -54,15 +54,15 @@ public class InsecureIVorNonceSource {
// BAD: AES-GCM with static IV from a multidimensional byte array
public byte[] encryptWithOneOfStaticIvs01(byte[] key, byte[] plaintext) throws Exception {
byte[][] staticIvs = new byte[][] {
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }, // $Source
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 42 } // $Source
};
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }, // $ Source
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 42 } // $ Source
};
GCMParameterSpec ivSpec = new GCMParameterSpec(128, staticIvs[1]);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.update(plaintext);
return cipher.doFinal();
}
@@ -70,15 +70,15 @@ public class InsecureIVorNonceSource {
// BAD: AES-GCM with static IV from a multidimensional byte array
public byte[] encryptWithOneOfStaticIvs02(byte[] key, byte[] plaintext) throws Exception {
byte[][] staticIvs = new byte[][] {
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }, // $Source
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 42 } // $Source
};
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5 }, // $ Source
new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 42 } // $ Source
};
GCMParameterSpec ivSpec = new GCMParameterSpec(128, staticIvs[1]);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/insecure-iv-or-nonce]
cipher.update(plaintext);
return cipher.doFinal();
}
@@ -86,15 +86,15 @@ public class InsecureIVorNonceSource {
// BAD: AES-GCM with static IV from a zero-initialized multidimensional byte array
public byte[] encryptWithOneOfStaticZeroIvs(byte[] key, byte[] plaintext) throws Exception {
byte[][] ivs = new byte[][] {
new byte[8],
new byte[16]
new byte[8],
new byte[16]
};
GCMParameterSpec ivSpec = new GCMParameterSpec(128, ivs[1]);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/unknown-iv-or-nonce-source]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/unknown-iv-or-nonce-source]
cipher.update(plaintext);
return cipher.doFinal();
}
@@ -166,8 +166,8 @@ public class InsecureIVorNonceSource {
return cipher.doFinal();
}
public byte[] generate(int size) throws Exception {
if (size == 0) {
public byte[] generate(int size) throws Exception {
if (size == 0) {
return new byte[0];
}
byte[] randomBytes = new byte[size];
@@ -183,7 +183,7 @@ public class InsecureIVorNonceSource {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
cipher.update(plaintext);
return cipher.doFinal();
}
@@ -191,7 +191,7 @@ public class InsecureIVorNonceSource {
public byte[] generateInsecureRandomBytes(int numBytes) {
Random random = new Random();
byte[] bytes = new byte[numBytes];
random.nextBytes(bytes); // $Source
random.nextBytes(bytes); // $ Source
return bytes;
}
@@ -203,7 +203,7 @@ public class InsecureIVorNonceSource {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $Alert[java/quantum/examples/insecure-iv-or-nonce]]
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); // $ Alert[java/quantum/examples/insecure-iv-or-nonce]]
cipher.update(plaintext);
return cipher.doFinal();
}

View File

@@ -2,15 +2,15 @@ import java.security.*;
public class InsufficientAsymmetricKeySize{
public static void test() throws Exception{
KeyPairGenerator keyPairGen1 = KeyPairGenerator.getInstance("RSA");
keyPairGen1.initialize(1024); // $Alert[java/quantum/examples/weak-asymmetric-key-gen-size]
keyPairGen1.initialize(1024); // $ Alert[java/quantum/examples/weak-asymmetric-key-gen-size]
keyPairGen1.generateKeyPair();
KeyPairGenerator keyPairGen2 = KeyPairGenerator.getInstance("DSA");
keyPairGen2.initialize(1024); // $Alert[java/quantum/examples/weak-asymmetric-key-gen-size]
keyPairGen2.initialize(1024); // $ Alert[java/quantum/examples/weak-asymmetric-key-gen-size]
keyPairGen2.generateKeyPair();
KeyPairGenerator keyPairGen3 = KeyPairGenerator.getInstance("DH");
keyPairGen3.initialize(1024); // $Alert[java/quantum/examples/weak-asymmetric-key-gen-size]
keyPairGen3.initialize(1024); // $ Alert[java/quantum/examples/weak-asymmetric-key-gen-size]
keyPairGen3.generateKeyPair();
KeyPairGenerator keyPairGen4 = KeyPairGenerator.getInstance("RSA");
@@ -25,4 +25,4 @@ public class InsufficientAsymmetricKeySize{
keyPairGen6.initialize(2048); // GOOD
keyPairGen6.generateKeyPair();
}
}
}

View File

@@ -10,25 +10,25 @@ public class Test {
byte[] data = "SensitiveData".getBytes();
// Insecure block mode: ECB
Cipher cipherECB = Cipher.getInstance("AES/ECB/PKCS5Padding"); // $Alert
Cipher cipherECB = Cipher.getInstance("AES/ECB/PKCS5Padding"); // $ Alert
cipherECB.init(Cipher.ENCRYPT_MODE, key);
byte[] ecbEncrypted = cipherECB.doFinal(data);
System.out.println("ECB encrypted: " + bytesToHex(ecbEncrypted));
// Insecure block mode: CFB
Cipher cipherCFB = Cipher.getInstance("AES/CFB/PKCS5Padding"); // $Alert
Cipher cipherCFB = Cipher.getInstance("AES/CFB/PKCS5Padding"); // $ Alert
cipherCFB.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] cfbEncrypted = cipherCFB.doFinal(data);
System.out.println("CFB encrypted: " + bytesToHex(cfbEncrypted));
// Insecure block mode: OFB
Cipher cipherOFB = Cipher.getInstance("AES/OFB/PKCS5Padding"); // $Alert
Cipher cipherOFB = Cipher.getInstance("AES/OFB/PKCS5Padding"); // $ Alert
cipherOFB.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] ofbEncrypted = cipherOFB.doFinal(data);
System.out.println("OFB encrypted: " + bytesToHex(ofbEncrypted));
// Insecure block mode: CTR
Cipher cipherCTR = Cipher.getInstance("AES/CTR/NoPadding"); // $Alert
Cipher cipherCTR = Cipher.getInstance("AES/CTR/NoPadding"); // $ Alert
cipherCTR.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] ctrEncrypted = cipherCTR.doFinal(data);
System.out.println("CTR encrypted: " + bytesToHex(ctrEncrypted));
@@ -54,4 +54,4 @@ public class Test {
sb.append(String.format("%02x", b));
return sb.toString();
}
}
}

View File

@@ -12,33 +12,33 @@ public class WeakHashing {
props.load(new FileInputStream("example.properties"));
// BAD: Using a weak hashing algorithm even with a secure default
MessageDigest bad = MessageDigest.getInstance(props.getProperty("hashAlg1")); // $Alert[java/quantum/examples/weak-hash]
MessageDigest bad = MessageDigest.getInstance(props.getProperty("hashAlg1")); // $ Alert[java/quantum/examples/weak-hash]
// BAD: Using a weak hashing algorithm even with a secure default
MessageDigest bad2 = MessageDigest.getInstance(props.getProperty("hashAlg1", "SHA-256")); // $Alert[java/quantum/examples/weak-hash]
MessageDigest bad2 = MessageDigest.getInstance(props.getProperty("hashAlg1", "SHA-256")); // $ Alert[java/quantum/examples/weak-hash]
// BAD: Using a strong hashing algorithm but with a weak default
MessageDigest bad3 = MessageDigest.getInstance(props.getProperty("hashAlg2", "MD5")); // $Alert[java/quantum/examples/weak-hash]
MessageDigest bad3 = MessageDigest.getInstance(props.getProperty("hashAlg2", "MD5")); // $ Alert[java/quantum/examples/weak-hash]
// BAD: Using a weak hash
MessageDigest bad4 = MessageDigest.getInstance("SHA-1"); // $Alert[java/quantum/examples/weak-hash]
MessageDigest bad4 = MessageDigest.getInstance("SHA-1"); // $ Alert[java/quantum/examples/weak-hash]
// BAD: Property does not exist and default (used value) is unknown
MessageDigest bad5 = MessageDigest.getInstance(props.getProperty("non-existent_property", "non-existent_default")); // $Alert[java/quantum/examples/unknown-hash]
MessageDigest bad5 = MessageDigest.getInstance(props.getProperty("non-existent_property", "non-existent_default")); // $ Alert[java/quantum/examples/unknown-hash]
java.util.Properties props2 = new java.util.Properties();
props2.load(new FileInputStream("unobserved-file.properties"));
// BAD: "hashAlg2" is not visible in the file loaded for props2, should be an unknown
// BAD: "hashAlg2" is not visible in the file loaded for props2, should be an unknown
// FALSE NEGATIVE for unknown hash
MessageDigest bad6 = MessageDigest.getInstance(props2.getProperty("hashAlg2", "SHA-256")); // $Alert[java/quantum/examples/unknown-hash]
MessageDigest bad6 = MessageDigest.getInstance(props2.getProperty("hashAlg2", "SHA-256")); // $ Alert[java/quantum/examples/unknown-hash]
// GOOD: Using a strong hashing algorithm
MessageDigest ok = MessageDigest.getInstance(props.getProperty("hashAlg2"));
// BAD?: Property does not exist (considered unknown) and but default is secure
MessageDigest ok2 = MessageDigest.getInstance(props.getProperty("non-existent-property", "SHA-256")); // $Alert[java/quantum/examples/unknown-hash]
MessageDigest ok2 = MessageDigest.getInstance(props.getProperty("non-existent-property", "SHA-256")); // $ Alert[java/quantum/examples/unknown-hash]
// GOOD: Using a strong hashing algorithm
MessageDigest ok3 = MessageDigest.getInstance("SHA3-512");

View File

@@ -28,8 +28,8 @@ public class Test {
*/
public void pbkdf2LowIteration(String password) throws Exception {
byte[] salt = generateSalt(16);
int iterationCount = 10; // $Source
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, 256); // $Alert[java/quantum/examples/weak-kdf-iteration-count]
int iterationCount = 10; // $ Source
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, 256); // $ Alert[java/quantum/examples/weak-kdf-iteration-count]
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] key = factory.generateSecret(spec).getEncoded();
}
@@ -40,9 +40,9 @@ public class Test {
* SAST/CBOM: - Parent: PBKDF2. - Iteration count is only 10, which is far
* below acceptable security standards. - Flagged as insecure.
*/
public void pbkdf2LowIteration(String password, int iterationCount) throws Exception { // $Source
public void pbkdf2LowIteration(String password, int iterationCount) throws Exception { // $ Source
byte[] salt = generateSalt(16);
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, 256); // $Alert[java/quantum/examples/unknown-kdf-iteration-count]
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, 256); // $ Alert[java/quantum/examples/unknown-kdf-iteration-count]
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] key = factory.generateSecret(spec).getEncoded();
}
@@ -55,9 +55,9 @@ public class Test {
*/
public void pbkdf2HighIteration(String password) throws Exception {
byte[] salt = generateSalt(16);
int iterationCount = 1_000_000;
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, 256);
int iterationCount = 1_000_000;
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, 256);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] key = factory.generateSecret(spec).getEncoded();
}
}
}

View File

@@ -1,5 +1,5 @@
#select
| Test.java:47:22:47:49 | KeyDerivation | Key derivation operation with unknown iteration: $@ | Test.java:43:53:43:70 | iterationCount | iterationCount |
testFailures
| Test.java:45:94:45:153 | // $Alert[java/quantum/examples/unknown-kdf-iteration-count] | Missing result: Alert[java/quantum/examples/unknown-kdf-iteration-count] |
| Test.java:45:94:45:154 | // $ Alert[java/quantum/examples/unknown-kdf-iteration-count] | Missing result: Alert[java/quantum/examples/unknown-kdf-iteration-count] |
| Test.java:47:22:47:49 | Key derivation operation with unknown iteration: $@ | Unexpected result: Alert |

View File

@@ -13,4 +13,4 @@ nodes
| Test.java:59:72:59:85 | iterationCount | semmle.label | iterationCount |
subpaths
testFailures
| Test.java:43:92:43:101 | // $Source | Missing result: Source |
| Test.java:43:92:43:102 | // $ Source | Missing result: Source |

View File

@@ -20,8 +20,8 @@ public class Test {
public void pbkdf2WeakKeySize(String password) throws Exception {
byte[] salt = generateSalt(16);
int iterationCount = 100_000;
int keySize = 64; // $Source
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, keySize); // $Alert[java/quantum/examples/weak-kdf-key-size]
int keySize = 64; // $ Source
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterationCount, keySize); // $ Alert[java/quantum/examples/weak-kdf-key-size]
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] key = factory.generateSecret(spec).getEncoded();
}
@@ -39,4 +39,4 @@ public class Test {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] key = factory.generateSecret(spec).getEncoded();
}
}
}

View File

@@ -10,51 +10,51 @@ public class Test {
byte[] data = "Sensitive Data".getBytes();
// BAD: DES (unsafe)
KeyGenerator desKeyGen = KeyGenerator.getInstance("DES"); // $Alert
KeyGenerator desKeyGen = KeyGenerator.getInstance("DES"); // $ Alert
SecretKey desKey = desKeyGen.generateKey();
Cipher desCipher = Cipher.getInstance("DES"); // $Alert
Cipher desCipher = Cipher.getInstance("DES"); // $ Alert
desCipher.init(Cipher.ENCRYPT_MODE, desKey);
byte[] desEncrypted = desCipher.doFinal(data);
// BAD: DESede (Triple DES, considered weak)
KeyGenerator desedeKeyGen = KeyGenerator.getInstance("DESede"); // $Alert
KeyGenerator desedeKeyGen = KeyGenerator.getInstance("DESede"); // $ Alert
SecretKey desedeKey = desedeKeyGen.generateKey();
Cipher desedeCipher = Cipher.getInstance("DESede"); // $Alert
Cipher desedeCipher = Cipher.getInstance("DESede"); // $ Alert
desedeCipher.init(Cipher.ENCRYPT_MODE, desedeKey);
byte[] desedeEncrypted = desedeCipher.doFinal(data);
// BAD: Blowfish (considered weak)
KeyGenerator blowfishKeyGen = KeyGenerator.getInstance("Blowfish"); // $Alert
KeyGenerator blowfishKeyGen = KeyGenerator.getInstance("Blowfish"); // $ Alert
SecretKey blowfishKey = blowfishKeyGen.generateKey();
Cipher blowfishCipher = Cipher.getInstance("Blowfish"); // $Alert
Cipher blowfishCipher = Cipher.getInstance("Blowfish"); // $ Alert
blowfishCipher.init(Cipher.ENCRYPT_MODE, blowfishKey);
byte[] blowfishEncrypted = blowfishCipher.doFinal(data);
// BAD: RC2 (unsafe)
KeyGenerator rc2KeyGen = KeyGenerator.getInstance("RC2"); // $Alert
KeyGenerator rc2KeyGen = KeyGenerator.getInstance("RC2"); // $ Alert
SecretKey rc2Key = rc2KeyGen.generateKey();
Cipher rc2Cipher = Cipher.getInstance("RC2"); // $Alert
Cipher rc2Cipher = Cipher.getInstance("RC2"); // $ Alert
rc2Cipher.init(Cipher.ENCRYPT_MODE, rc2Key);
byte[] rc2Encrypted = rc2Cipher.doFinal(data);
// BAD: RC4 (stream cipher, unsafe)
KeyGenerator rc4KeyGen = KeyGenerator.getInstance("RC4"); // $Alert
KeyGenerator rc4KeyGen = KeyGenerator.getInstance("RC4"); // $ Alert
SecretKey rc4Key = rc4KeyGen.generateKey();
Cipher rc4Cipher = Cipher.getInstance("RC4"); // $Alert
Cipher rc4Cipher = Cipher.getInstance("RC4"); // $ Alert
rc4Cipher.init(Cipher.ENCRYPT_MODE, rc4Key);
byte[] rc4Encrypted = rc4Cipher.doFinal(data);
// BAD: IDEA (considered weak)
KeyGenerator ideaKeyGen = KeyGenerator.getInstance("IDEA"); // $Alert
KeyGenerator ideaKeyGen = KeyGenerator.getInstance("IDEA"); // $ Alert
SecretKey ideaKey = ideaKeyGen.generateKey();
Cipher ideaCipher = Cipher.getInstance("IDEA"); // $Alert
Cipher ideaCipher = Cipher.getInstance("IDEA"); // $ Alert
ideaCipher.init(Cipher.ENCRYPT_MODE, ideaKey);
byte[] ideaEncrypted = ideaCipher.doFinal(data);
// BAD: Skipjack (unsafe)
KeyGenerator skipjackKeyGen = KeyGenerator.getInstance("Skipjack"); // $Alert
KeyGenerator skipjackKeyGen = KeyGenerator.getInstance("Skipjack"); // $ Alert
SecretKey skipjackKey = skipjackKeyGen.generateKey();
Cipher skipjackCipher = Cipher.getInstance("Skipjack"); // $Alert
Cipher skipjackCipher = Cipher.getInstance("Skipjack"); // $ Alert
skipjackCipher.init(Cipher.ENCRYPT_MODE, skipjackKey);
byte[] skipjackEncrypted = skipjackCipher.doFinal(data);
@@ -78,4 +78,4 @@ public class Test {
// GOOD: not a symmetric cipher (Sanity check)
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
}
}
}

View File

@@ -33,50 +33,50 @@ public class Test {
// top 100 JDK APIs tests
{
Exception e1 = new RuntimeException((String)source());
sink((String)e1.getMessage()); // $hasValueFlow
sink((String)e1.getMessage()); // $ hasValueFlow
Exception e2 = new RuntimeException((Throwable)source());
sink((Throwable)e2.getCause()); // $hasValueFlow
sink((Throwable)e2.getCause()); // $ hasValueFlow
Exception e3 = new IllegalArgumentException((String)source());
sink((String)e3.getMessage()); // $hasValueFlow
sink((String)e3.getMessage()); // $ hasValueFlow
Exception e4 = new IllegalStateException((String)source());
sink((String)e4.getMessage()); // $hasValueFlow
sink((String)e4.getMessage()); // $ hasValueFlow
Exception e5 = new UnsupportedOperationException((String)source());
sink((String)e5.getMessage()); // $hasValueFlow
sink((String)e5.getMessage()); // $ hasValueFlow
Throwable t = new Throwable((Throwable)source());
sink((Throwable)t.getCause()); // $hasValueFlow
sink((Throwable)t.getCause()); // $ hasValueFlow
String s2 = (String)source();
int i = 0;
sink(s2.charAt(i)); // $hasTaintFlow
sink(s2.charAt(i)); // $ hasTaintFlow
ResultSet rs = (ResultSet)source();
sink(rs.getString("")); // $hasTaintFlow
sink(rs.getString("")); // $ hasTaintFlow
}
// top 200 JDK APIs tests
{
// java.io
Exception e1 = new IOException((String)source());
sink((String)e1.getMessage()); // $hasValueFlow
sink((String)e1.getMessage()); // $ hasValueFlow
File f = (File)source();
sink(f.getName()); // $hasTaintFlow
sink(f.getName()); // $ hasTaintFlow
// java.lang
Exception e2 = new Exception((String)source());
sink((String)e2.getMessage()); // $hasValueFlow
sink((String)e2.getMessage()); // $ hasValueFlow
Exception e3 = new IndexOutOfBoundsException((String)source());
sink((String)e3.getMessage()); // $hasValueFlow
sink((String)e3.getMessage()); // $ hasValueFlow
Exception e4 = new RuntimeException((String)source(), (Throwable)source());
sink((String)e4.getMessage()); // $hasValueFlow
sink((Throwable)e4.getCause()); // $hasValueFlow
sink((String)e4.getMessage()); // $ hasValueFlow
sink((Throwable)e4.getCause()); // $ hasValueFlow
// java.sql
Connection con = DriverManager.getConnection("");
@@ -86,14 +86,14 @@ public class Test {
// java.util.concurrent.atomic
AtomicReference ar = new AtomicReference(source());
sink(ar.get()); // $hasValueFlow
sink(ar.get()); // $ hasValueFlow
// java.util
StringJoiner sj1 = new StringJoiner(",");
sink(sj1.add((CharSequence)source())); // $hasTaintFlow
sink(sj1.add((CharSequence)source())); // $ hasTaintFlow
StringJoiner sj2 = (StringJoiner)source();
sink(sj2.add("test")); // $hasValueFlow
sink(sj2.add("test")); // $ hasValueFlow
}
// top 300-500 JDK APIs tests
@@ -101,62 +101,62 @@ public class Test {
// java.awt
Container container = new Container();
sink(container.add((Component)source())); // $hasValueFlow
sink(container.add((Component)source())); // $ hasValueFlow
// java.io
File f1 = (File)source();
sink(f1.getParentFile()); // $hasTaintFlow
sink(f1.getParentFile()); // $ hasTaintFlow
File f2 = (File)source();
sink(f2.getPath()); // $hasTaintFlow
sink(f2.getPath()); // $ hasTaintFlow
StringWriter sw = (StringWriter)source();
sink(sw.toString()); // $hasTaintFlow
sink(sw.toString()); // $ hasTaintFlow
Exception e = new UncheckedIOException((IOException)source());
sink((Throwable)e.getCause()); // $hasValueFlow
sink((Throwable)e.getCause()); // $ hasValueFlow
// java.net
URL url = (URL)source();
sink(url.toURI()); // $hasTaintFlow
sink(url.toURI()); // $ hasTaintFlow
// java.nio.file
Path p = (Path)source();
sink(p.getFileName()); // $hasTaintFlow
sink(p.getFileName()); // $ hasTaintFlow
// java.util.concurrent.atomic
AtomicReference ar = new AtomicReference();
ar.set(source());
sink(ar.get()); // $hasValueFlow
sink(ar.get()); // $ hasValueFlow
// java.util.concurrent
// `ThreadPoolExecutor` implements the `java.util.concurrent.ExecutorService` interface
ThreadPoolExecutor tpe = new ThreadPoolExecutor(0, 0, 0, null, null);
sink(tpe.submit((Runnable)source())); // $hasTaintFlow
sink(tpe.submit((Runnable)source())); // $ hasTaintFlow
CompletionStage cs = (CompletionStage)source();
sink(cs.toCompletableFuture()); // $hasTaintFlow
sink(cs.toCompletableFuture()); // $ hasTaintFlow
CompletableFuture cf1 = new CompletableFuture();
cf1.complete(source());
sink(cf1.get()); // $hasValueFlow
sink(cf1.join()); // $hasValueFlow
sink(cf1.get()); // $ hasValueFlow
sink(cf1.join()); // $ hasValueFlow
CompletableFuture cf2 = CompletableFuture.completedFuture(source());
sink(cf2.get()); // $hasValueFlow
sink(cf2.join()); // $hasValueFlow
sink(cf2.get()); // $ hasValueFlow
sink(cf2.join()); // $ hasValueFlow
// java.util.logging
Logger logger = Logger.getLogger((String)source());
sink(logger.getName()); // $hasValueFlow
sink(logger.getName()); // $ hasValueFlow
// java.util.regex
Pattern pattern = Pattern.compile((String)source());
sink(pattern); // $hasTaintFlow
sink(pattern); // $ hasTaintFlow
// java.util
EventObject eventObj = new EventObject(source());
sink(eventObj.getSource()); // $hasValueFlow
sink(eventObj.getSource()); // $ hasValueFlow
// "java.util;ResourceBundle;true;getString;(String);;Argument[-1].MapValue;ReturnValue;value;manual"
String out = null;
@@ -166,33 +166,33 @@ public class Test {
// java.lang
AssertionError assertErr = new AssertionError(source());
sink((String)assertErr.getMessage()); // $hasValueFlow
sink((String)assertErr.getMessage()); // $ hasValueFlow
sink(Test.class.cast(source())); // $hasValueFlow
sink(Test.class.cast(source())); // $ hasValueFlow
Exception excep1 = new Exception((String)source(), (Throwable)source());
sink((String)excep1.getMessage()); // $hasValueFlow
sink((Throwable)excep1.getCause()); // $hasValueFlow
sink((String)excep1.getMessage()); // $ hasValueFlow
sink((Throwable)excep1.getCause()); // $ hasValueFlow
Exception excep2 = new NullPointerException((String)source());
sink((String)excep2.getMessage()); // $hasValueFlow
sink((String)excep2.getMessage()); // $ hasValueFlow
StringBuilder sb = (StringBuilder)source();
sink(sb.delete(0, 1)); // $hasValueFlow
sink(sb.delete(0, 1)); // $ hasValueFlow
Thread thread1 = new Thread((Runnable)source());
sink(thread1); // $hasTaintFlow
sink(thread1); // $ hasTaintFlow
Thread thread2 = new Thread((String)source());
sink(thread2.getName()); // $hasValueFlow
sink(thread2.getName()); // $ hasValueFlow
ThreadLocal threadloc = new ThreadLocal();
threadloc.set(source());
sink(threadloc.get()); // $hasValueFlow
sink(threadloc.get()); // $ hasValueFlow
Throwable th = new Throwable((String)source());
sink((String)th.getLocalizedMessage()); // $hasValueFlow
sink(th.toString()); // $hasTaintFlow
sink((String)th.getLocalizedMessage()); // $ hasValueFlow
sink(th.toString()); // $ hasTaintFlow
}
}
}

View File

@@ -1,140 +1,296 @@
| Test.java:3:14:3:17 | Exceptional Exit | 0 | Test.java:3:14:3:17 | Exceptional Exit |
| Test.java:3:14:3:17 | Exit | 0 | Test.java:3:14:3:17 | Exit |
| Test.java:3:14:3:17 | { ... } | 0 | Test.java:3:14:3:17 | { ... } |
| Test.java:3:14:3:17 | { ... } | 1 | Test.java:3:14:3:17 | super(...) |
| Test.java:3:14:3:17 | { ... } | 2 | Test.java:3:14:3:17 | Normal Exit |
| Test.java:4:14:4:17 | Exceptional Exit | 0 | Test.java:4:14:4:17 | Exceptional Exit |
| Test.java:4:14:4:17 | Exit | 0 | Test.java:4:14:4:17 | Exit |
| Test.java:3:14:3:17 | Entry | 0 | Test.java:3:14:3:17 | Entry |
| Test.java:3:14:3:17 | Entry | 1 | Test.java:3:14:3:17 | { ... } |
| Test.java:3:14:3:17 | Entry | 2 | Test.java:3:14:3:17 | Before super(...) |
| Test.java:3:14:3:17 | Entry | 3 | Test.java:3:14:3:17 | super(...) |
| Test.java:3:14:3:17 | Entry | 4 | Test.java:3:14:3:17 | After super(...) |
| Test.java:3:14:3:17 | Entry | 5 | Test.java:3:14:3:17 | After { ... } |
| Test.java:3:14:3:17 | Entry | 6 | Test.java:3:14:3:17 | Normal Exit |
| Test.java:3:14:3:17 | Entry | 7 | Test.java:3:14:3:17 | Exit |
| Test.java:4:14:4:17 | Entry | 0 | Test.java:4:14:4:17 | Entry |
| Test.java:4:14:4:17 | Entry | 1 | Test.java:4:21:76:2 | { ... } |
| Test.java:4:14:4:17 | Entry | 2 | Test.java:5:3:5:12 | var ...; |
| Test.java:4:14:4:17 | Entry | 3 | Test.java:5:7:5:11 | Before x |
| Test.java:4:14:4:17 | Entry | 4 | Test.java:5:11:5:11 | 0 |
| Test.java:4:14:4:17 | Entry | 5 | Test.java:5:7:5:11 | x |
| Test.java:4:14:4:17 | Entry | 6 | Test.java:5:7:5:11 | After x |
| Test.java:4:14:4:17 | Entry | 7 | Test.java:5:3:5:12 | After var ...; |
| Test.java:4:14:4:17 | Entry | 8 | Test.java:6:3:6:14 | var ...; |
| Test.java:4:14:4:17 | Entry | 9 | Test.java:6:8:6:13 | Before y |
| Test.java:4:14:4:17 | Entry | 10 | Test.java:6:12:6:13 | 50 |
| Test.java:4:14:4:17 | Entry | 11 | Test.java:6:8:6:13 | y |
| Test.java:4:14:4:17 | Entry | 12 | Test.java:6:8:6:13 | After y |
| Test.java:4:14:4:17 | Entry | 13 | Test.java:6:3:6:14 | After var ...; |
| Test.java:4:14:4:17 | Entry | 14 | Test.java:7:3:7:12 | var ...; |
| Test.java:4:14:4:17 | Entry | 15 | Test.java:7:7:7:11 | Before z |
| Test.java:4:14:4:17 | Entry | 16 | Test.java:7:11:7:11 | 0 |
| Test.java:4:14:4:17 | Entry | 17 | Test.java:7:7:7:11 | z |
| Test.java:4:14:4:17 | Entry | 18 | Test.java:7:7:7:11 | After z |
| Test.java:4:14:4:17 | Entry | 19 | Test.java:7:3:7:12 | After var ...; |
| Test.java:4:14:4:17 | Entry | 20 | Test.java:8:3:8:12 | var ...; |
| Test.java:4:14:4:17 | Entry | 21 | Test.java:8:7:8:11 | Before w |
| Test.java:4:14:4:17 | Entry | 22 | Test.java:8:11:8:11 | 0 |
| Test.java:4:14:4:17 | Entry | 23 | Test.java:8:7:8:11 | w |
| Test.java:4:14:4:17 | Entry | 24 | Test.java:8:7:8:11 | After w |
| Test.java:4:14:4:17 | Entry | 25 | Test.java:8:3:8:12 | After var ...; |
| Test.java:4:14:4:17 | Entry | 26 | Test.java:11:3:11:12 | if (...) |
| Test.java:4:14:4:17 | Entry | 27 | Test.java:11:7:11:11 | Before ... > ... |
| Test.java:4:14:4:17 | Entry | 28 | Test.java:11:7:11:7 | x |
| Test.java:4:14:4:17 | Entry | 29 | Test.java:11:11:11:11 | 0 |
| Test.java:4:14:4:17 | Entry | 30 | Test.java:11:7:11:11 | ... > ... |
| Test.java:4:14:4:17 | Normal Exit | 0 | Test.java:4:14:4:17 | Normal Exit |
| Test.java:4:21:76:2 | { ... } | 0 | Test.java:4:21:76:2 | { ... } |
| Test.java:4:21:76:2 | { ... } | 1 | Test.java:5:3:5:12 | var ...; |
| Test.java:4:21:76:2 | { ... } | 2 | Test.java:5:11:5:11 | 0 |
| Test.java:4:21:76:2 | { ... } | 3 | Test.java:5:7:5:11 | x |
| Test.java:4:21:76:2 | { ... } | 4 | Test.java:6:3:6:14 | var ...; |
| Test.java:4:21:76:2 | { ... } | 5 | Test.java:6:12:6:13 | 50 |
| Test.java:4:21:76:2 | { ... } | 6 | Test.java:6:8:6:13 | y |
| Test.java:4:21:76:2 | { ... } | 7 | Test.java:7:3:7:12 | var ...; |
| Test.java:4:21:76:2 | { ... } | 8 | Test.java:7:11:7:11 | 0 |
| Test.java:4:21:76:2 | { ... } | 9 | Test.java:7:7:7:11 | z |
| Test.java:4:21:76:2 | { ... } | 10 | Test.java:8:3:8:12 | var ...; |
| Test.java:4:21:76:2 | { ... } | 11 | Test.java:8:11:8:11 | 0 |
| Test.java:4:21:76:2 | { ... } | 12 | Test.java:8:7:8:11 | w |
| Test.java:4:21:76:2 | { ... } | 13 | Test.java:11:3:11:12 | if (...) |
| Test.java:4:21:76:2 | { ... } | 14 | Test.java:11:7:11:7 | x |
| Test.java:4:21:76:2 | { ... } | 15 | Test.java:11:11:11:11 | 0 |
| Test.java:4:21:76:2 | { ... } | 16 | Test.java:11:7:11:11 | ... > ... |
| Test.java:11:14:14:3 | { ... } | 0 | Test.java:11:14:14:3 | { ... } |
| Test.java:11:14:14:3 | { ... } | 1 | Test.java:12:4:12:10 | <Expr>; |
| Test.java:11:14:14:3 | { ... } | 2 | Test.java:12:8:12:9 | 20 |
| Test.java:11:14:14:3 | { ... } | 3 | Test.java:12:4:12:9 | ...=... |
| Test.java:11:14:14:3 | { ... } | 4 | Test.java:13:4:13:10 | <Expr>; |
| Test.java:11:14:14:3 | { ... } | 5 | Test.java:13:8:13:9 | 10 |
| Test.java:11:14:14:3 | { ... } | 6 | Test.java:13:4:13:9 | ...=... |
| Test.java:14:10:16:3 | { ... } | 0 | Test.java:14:10:16:3 | { ... } |
| Test.java:14:10:16:3 | { ... } | 1 | Test.java:15:4:15:10 | <Expr>; |
| Test.java:14:10:16:3 | { ... } | 2 | Test.java:15:8:15:9 | 30 |
| Test.java:14:10:16:3 | { ... } | 3 | Test.java:15:4:15:9 | ...=... |
| Test.java:18:3:18:8 | <Expr>; | 0 | Test.java:18:3:18:8 | <Expr>; |
| Test.java:18:3:18:8 | <Expr>; | 1 | Test.java:18:7:18:7 | 0 |
| Test.java:18:3:18:8 | <Expr>; | 2 | Test.java:18:3:18:7 | ...=... |
| Test.java:18:3:18:8 | <Expr>; | 3 | Test.java:21:3:21:11 | if (...) |
| Test.java:18:3:18:8 | <Expr>; | 4 | Test.java:21:6:21:6 | x |
| Test.java:18:3:18:8 | <Expr>; | 5 | Test.java:21:10:21:10 | 0 |
| Test.java:18:3:18:8 | <Expr>; | 6 | Test.java:21:6:21:10 | ... < ... |
| Test.java:22:4:22:10 | <Expr>; | 0 | Test.java:22:4:22:10 | <Expr>; |
| Test.java:22:4:22:10 | <Expr>; | 1 | Test.java:22:8:22:9 | 40 |
| Test.java:22:4:22:10 | <Expr>; | 2 | Test.java:22:4:22:9 | ...=... |
| Test.java:22:4:22:10 | <Expr>; | 3 | Test.java:27:3:27:9 | <Expr>; |
| Test.java:22:4:22:10 | <Expr>; | 4 | Test.java:27:7:27:8 | 10 |
| Test.java:22:4:22:10 | <Expr>; | 5 | Test.java:27:3:27:8 | ...=... |
| Test.java:22:4:22:10 | <Expr>; | 6 | Test.java:30:3:30:13 | if (...) |
| Test.java:22:4:22:10 | <Expr>; | 7 | Test.java:30:7:30:7 | x |
| Test.java:22:4:22:10 | <Expr>; | 8 | Test.java:30:12:30:12 | 0 |
| Test.java:22:4:22:10 | <Expr>; | 9 | Test.java:30:7:30:12 | ... == ... |
| Test.java:24:4:24:10 | return ... | 0 | Test.java:24:4:24:10 | return ... |
| Test.java:30:15:33:3 | { ... } | 0 | Test.java:30:15:33:3 | { ... } |
| Test.java:30:15:33:3 | { ... } | 1 | Test.java:31:4:31:10 | <Expr>; |
| Test.java:30:15:33:3 | { ... } | 2 | Test.java:31:8:31:9 | 60 |
| Test.java:30:15:33:3 | { ... } | 3 | Test.java:31:4:31:9 | ...=... |
| Test.java:30:15:33:3 | { ... } | 4 | Test.java:32:4:32:10 | <Expr>; |
| Test.java:30:15:33:3 | { ... } | 5 | Test.java:32:8:32:9 | 10 |
| Test.java:30:15:33:3 | { ... } | 6 | Test.java:32:4:32:9 | ...=... |
| Test.java:35:3:35:9 | <Expr>; | 0 | Test.java:35:3:35:9 | <Expr>; |
| Test.java:35:3:35:9 | <Expr>; | 1 | Test.java:35:7:35:8 | 20 |
| Test.java:35:3:35:9 | <Expr>; | 2 | Test.java:35:3:35:8 | ...=... |
| Test.java:35:3:35:9 | <Expr>; | 3 | Test.java:38:3:38:14 | while (...) |
| Test.java:38:9:38:9 | x | 0 | Test.java:38:9:38:9 | x |
| Test.java:38:9:38:9 | x | 1 | Test.java:38:13:38:13 | 0 |
| Test.java:38:9:38:9 | x | 2 | Test.java:38:9:38:13 | ... > ... |
| Test.java:38:16:41:3 | { ... } | 0 | Test.java:38:16:41:3 | { ... } |
| Test.java:38:16:41:3 | { ... } | 1 | Test.java:39:4:39:10 | <Expr>; |
| Test.java:38:16:41:3 | { ... } | 2 | Test.java:39:8:39:9 | 10 |
| Test.java:38:16:41:3 | { ... } | 3 | Test.java:39:4:39:9 | ...=... |
| Test.java:38:16:41:3 | { ... } | 4 | Test.java:40:4:40:7 | <Expr>; |
| Test.java:38:16:41:3 | { ... } | 5 | Test.java:40:4:40:4 | x |
| Test.java:38:16:41:3 | { ... } | 6 | Test.java:40:4:40:6 | ...-- |
| Test.java:43:3:43:9 | <Expr>; | 0 | Test.java:43:3:43:9 | <Expr>; |
| Test.java:43:3:43:9 | <Expr>; | 1 | Test.java:43:7:43:8 | 30 |
| Test.java:43:3:43:9 | <Expr>; | 2 | Test.java:43:3:43:8 | ...=... |
| Test.java:43:3:43:9 | <Expr>; | 3 | Test.java:46:3:46:29 | for (...;...;...) |
| Test.java:43:3:43:9 | <Expr>; | 4 | Test.java:46:15:46:15 | 0 |
| Test.java:43:3:43:9 | <Expr>; | 5 | Test.java:46:11:46:15 | j |
| Test.java:46:18:46:18 | j | 0 | Test.java:46:18:46:18 | j |
| Test.java:46:18:46:18 | j | 1 | Test.java:46:22:46:23 | 10 |
| Test.java:46:18:46:18 | j | 2 | Test.java:46:18:46:23 | ... < ... |
| Test.java:46:31:49:3 | { ... } | 0 | Test.java:46:31:49:3 | { ... } |
| Test.java:46:31:49:3 | { ... } | 1 | Test.java:47:4:47:9 | <Expr>; |
| Test.java:46:31:49:3 | { ... } | 2 | Test.java:47:8:47:8 | 0 |
| Test.java:46:31:49:3 | { ... } | 3 | Test.java:47:4:47:8 | ...=... |
| Test.java:46:31:49:3 | { ... } | 4 | Test.java:48:4:48:10 | <Expr>; |
| Test.java:46:31:49:3 | { ... } | 5 | Test.java:48:8:48:9 | 10 |
| Test.java:46:31:49:3 | { ... } | 6 | Test.java:48:4:48:9 | ...=... |
| Test.java:46:31:49:3 | { ... } | 7 | Test.java:46:26:46:26 | j |
| Test.java:46:31:49:3 | { ... } | 8 | Test.java:46:26:46:28 | ...++ |
| Test.java:51:3:51:9 | <Expr>; | 0 | Test.java:51:3:51:9 | <Expr>; |
| Test.java:51:3:51:9 | <Expr>; | 1 | Test.java:51:7:51:8 | 40 |
| Test.java:51:3:51:9 | <Expr>; | 2 | Test.java:51:3:51:8 | ...=... |
| Test.java:51:3:51:9 | <Expr>; | 3 | Test.java:54:3:54:29 | for (...;...;...) |
| Test.java:51:3:51:9 | <Expr>; | 4 | Test.java:54:15:54:15 | 0 |
| Test.java:51:3:51:9 | <Expr>; | 5 | Test.java:54:11:54:15 | j |
| Test.java:54:18:54:18 | j | 0 | Test.java:54:18:54:18 | j |
| Test.java:54:18:54:18 | j | 1 | Test.java:54:22:54:23 | 10 |
| Test.java:54:18:54:18 | j | 2 | Test.java:54:18:54:23 | ... < ... |
| Test.java:54:26:54:26 | j | 0 | Test.java:54:26:54:26 | j |
| Test.java:54:26:54:26 | j | 1 | Test.java:54:26:54:28 | ...++ |
| Test.java:54:31:68:3 | { ... } | 0 | Test.java:54:31:68:3 | { ... } |
| Test.java:54:31:68:3 | { ... } | 1 | Test.java:55:4:55:10 | <Expr>; |
| Test.java:54:31:68:3 | { ... } | 2 | Test.java:55:8:55:9 | 30 |
| Test.java:54:31:68:3 | { ... } | 3 | Test.java:55:4:55:9 | ...=... |
| Test.java:54:31:68:3 | { ... } | 4 | Test.java:56:4:56:12 | if (...) |
| Test.java:54:31:68:3 | { ... } | 5 | Test.java:56:7:56:7 | z |
| Test.java:54:31:68:3 | { ... } | 6 | Test.java:56:11:56:11 | 0 |
| Test.java:54:31:68:3 | { ... } | 7 | Test.java:56:7:56:11 | ... > ... |
| Test.java:57:5:57:13 | if (...) | 0 | Test.java:57:5:57:13 | if (...) |
| Test.java:57:5:57:13 | if (...) | 1 | Test.java:57:8:57:8 | y |
| Test.java:57:5:57:13 | if (...) | 2 | Test.java:57:12:57:12 | 0 |
| Test.java:57:5:57:13 | if (...) | 3 | Test.java:57:8:57:12 | ... > ... |
| Test.java:57:15:60:5 | { ... } | 0 | Test.java:57:15:60:5 | { ... } |
| Test.java:57:15:60:5 | { ... } | 1 | Test.java:58:6:58:11 | <Expr>; |
| Test.java:57:15:60:5 | { ... } | 2 | Test.java:58:10:58:10 | 0 |
| Test.java:57:15:60:5 | { ... } | 3 | Test.java:58:6:58:10 | ...=... |
| Test.java:57:15:60:5 | { ... } | 4 | Test.java:59:6:59:11 | break |
| Test.java:60:12:62:5 | { ... } | 0 | Test.java:60:12:62:5 | { ... } |
| Test.java:60:12:62:5 | { ... } | 1 | Test.java:61:6:61:12 | <Expr>; |
| Test.java:60:12:62:5 | { ... } | 2 | Test.java:61:10:61:11 | 20 |
| Test.java:60:12:62:5 | { ... } | 3 | Test.java:61:6:61:11 | ...=... |
| Test.java:60:12:62:5 | { ... } | 4 | Test.java:67:4:67:9 | <Expr>; |
| Test.java:60:12:62:5 | { ... } | 5 | Test.java:67:8:67:8 | 0 |
| Test.java:60:12:62:5 | { ... } | 6 | Test.java:67:4:67:8 | ...=... |
| Test.java:63:9:66:4 | { ... } | 0 | Test.java:63:9:66:4 | { ... } |
| Test.java:63:9:66:4 | { ... } | 1 | Test.java:64:5:64:11 | <Expr>; |
| Test.java:63:9:66:4 | { ... } | 2 | Test.java:64:9:64:10 | 10 |
| Test.java:63:9:66:4 | { ... } | 3 | Test.java:64:5:64:10 | ...=... |
| Test.java:63:9:66:4 | { ... } | 4 | Test.java:65:5:65:13 | continue |
| Test.java:70:3:70:9 | <Expr>; | 0 | Test.java:70:3:70:9 | <Expr>; |
| Test.java:70:3:70:9 | <Expr>; | 1 | Test.java:70:7:70:8 | 50 |
| Test.java:70:3:70:9 | <Expr>; | 2 | Test.java:70:3:70:8 | ...=... |
| Test.java:70:3:70:9 | <Expr>; | 3 | Test.java:74:3:74:9 | <Expr>; |
| Test.java:70:3:70:9 | <Expr>; | 4 | Test.java:74:7:74:8 | 40 |
| Test.java:70:3:70:9 | <Expr>; | 5 | Test.java:74:3:74:8 | ...=... |
| Test.java:70:3:70:9 | <Expr>; | 6 | Test.java:75:3:75:9 | return ... |
| Test.java:4:14:4:17 | Normal Exit | 1 | Test.java:4:14:4:17 | Exit |
| Test.java:11:3:11:12 | After if (...) | 0 | Test.java:11:3:11:12 | After if (...) |
| Test.java:11:3:11:12 | After if (...) | 1 | Test.java:18:3:18:8 | <Expr>; |
| Test.java:11:3:11:12 | After if (...) | 2 | Test.java:18:3:18:7 | Before ...=... |
| Test.java:11:3:11:12 | After if (...) | 3 | Test.java:18:3:18:3 | z |
| Test.java:11:3:11:12 | After if (...) | 4 | Test.java:18:7:18:7 | 0 |
| Test.java:11:3:11:12 | After if (...) | 5 | Test.java:18:3:18:7 | ...=... |
| Test.java:11:3:11:12 | After if (...) | 6 | Test.java:18:3:18:7 | After ...=... |
| Test.java:11:3:11:12 | After if (...) | 7 | Test.java:18:3:18:8 | After <Expr>; |
| Test.java:11:3:11:12 | After if (...) | 8 | Test.java:21:3:21:11 | if (...) |
| Test.java:11:3:11:12 | After if (...) | 9 | Test.java:21:6:21:10 | Before ... < ... |
| Test.java:11:3:11:12 | After if (...) | 10 | Test.java:21:6:21:6 | x |
| Test.java:11:3:11:12 | After if (...) | 11 | Test.java:21:10:21:10 | 0 |
| Test.java:11:3:11:12 | After if (...) | 12 | Test.java:21:6:21:10 | ... < ... |
| Test.java:11:7:11:11 | After ... > ... [false] | 0 | Test.java:11:7:11:11 | After ... > ... [false] |
| Test.java:11:7:11:11 | After ... > ... [false] | 1 | Test.java:14:10:16:3 | { ... } |
| Test.java:11:7:11:11 | After ... > ... [false] | 2 | Test.java:15:4:15:10 | <Expr>; |
| Test.java:11:7:11:11 | After ... > ... [false] | 3 | Test.java:15:4:15:9 | Before ...=... |
| Test.java:11:7:11:11 | After ... > ... [false] | 4 | Test.java:15:4:15:4 | y |
| Test.java:11:7:11:11 | After ... > ... [false] | 5 | Test.java:15:8:15:9 | 30 |
| Test.java:11:7:11:11 | After ... > ... [false] | 6 | Test.java:15:4:15:9 | ...=... |
| Test.java:11:7:11:11 | After ... > ... [false] | 7 | Test.java:15:4:15:9 | After ...=... |
| Test.java:11:7:11:11 | After ... > ... [false] | 8 | Test.java:15:4:15:10 | After <Expr>; |
| Test.java:11:7:11:11 | After ... > ... [false] | 9 | Test.java:14:10:16:3 | After { ... } |
| Test.java:11:7:11:11 | After ... > ... [true] | 0 | Test.java:11:7:11:11 | After ... > ... [true] |
| Test.java:11:7:11:11 | After ... > ... [true] | 1 | Test.java:11:14:14:3 | { ... } |
| Test.java:11:7:11:11 | After ... > ... [true] | 2 | Test.java:12:4:12:10 | <Expr>; |
| Test.java:11:7:11:11 | After ... > ... [true] | 3 | Test.java:12:4:12:9 | Before ...=... |
| Test.java:11:7:11:11 | After ... > ... [true] | 4 | Test.java:12:4:12:4 | y |
| Test.java:11:7:11:11 | After ... > ... [true] | 5 | Test.java:12:8:12:9 | 20 |
| Test.java:11:7:11:11 | After ... > ... [true] | 6 | Test.java:12:4:12:9 | ...=... |
| Test.java:11:7:11:11 | After ... > ... [true] | 7 | Test.java:12:4:12:9 | After ...=... |
| Test.java:11:7:11:11 | After ... > ... [true] | 8 | Test.java:12:4:12:10 | After <Expr>; |
| Test.java:11:7:11:11 | After ... > ... [true] | 9 | Test.java:13:4:13:10 | <Expr>; |
| Test.java:11:7:11:11 | After ... > ... [true] | 10 | Test.java:13:4:13:9 | Before ...=... |
| Test.java:11:7:11:11 | After ... > ... [true] | 11 | Test.java:13:4:13:4 | z |
| Test.java:11:7:11:11 | After ... > ... [true] | 12 | Test.java:13:8:13:9 | 10 |
| Test.java:11:7:11:11 | After ... > ... [true] | 13 | Test.java:13:4:13:9 | ...=... |
| Test.java:11:7:11:11 | After ... > ... [true] | 14 | Test.java:13:4:13:9 | After ...=... |
| Test.java:11:7:11:11 | After ... > ... [true] | 15 | Test.java:13:4:13:10 | After <Expr>; |
| Test.java:11:7:11:11 | After ... > ... [true] | 16 | Test.java:11:14:14:3 | After { ... } |
| Test.java:21:6:21:10 | After ... < ... [false] | 0 | Test.java:21:6:21:10 | After ... < ... [false] |
| Test.java:21:6:21:10 | After ... < ... [false] | 1 | Test.java:24:4:24:10 | Before return ... |
| Test.java:21:6:21:10 | After ... < ... [false] | 2 | Test.java:24:4:24:10 | return ... |
| Test.java:21:6:21:10 | After ... < ... [true] | 0 | Test.java:21:6:21:10 | After ... < ... [true] |
| Test.java:21:6:21:10 | After ... < ... [true] | 1 | Test.java:22:4:22:10 | <Expr>; |
| Test.java:21:6:21:10 | After ... < ... [true] | 2 | Test.java:22:4:22:9 | Before ...=... |
| Test.java:21:6:21:10 | After ... < ... [true] | 3 | Test.java:22:4:22:4 | y |
| Test.java:21:6:21:10 | After ... < ... [true] | 4 | Test.java:22:8:22:9 | 40 |
| Test.java:21:6:21:10 | After ... < ... [true] | 5 | Test.java:22:4:22:9 | ...=... |
| Test.java:21:6:21:10 | After ... < ... [true] | 6 | Test.java:22:4:22:9 | After ...=... |
| Test.java:21:6:21:10 | After ... < ... [true] | 7 | Test.java:22:4:22:10 | After <Expr>; |
| Test.java:21:6:21:10 | After ... < ... [true] | 8 | Test.java:21:3:21:11 | After if (...) |
| Test.java:21:6:21:10 | After ... < ... [true] | 9 | Test.java:27:3:27:9 | <Expr>; |
| Test.java:21:6:21:10 | After ... < ... [true] | 10 | Test.java:27:3:27:8 | Before ...=... |
| Test.java:21:6:21:10 | After ... < ... [true] | 11 | Test.java:27:3:27:3 | z |
| Test.java:21:6:21:10 | After ... < ... [true] | 12 | Test.java:27:7:27:8 | 10 |
| Test.java:21:6:21:10 | After ... < ... [true] | 13 | Test.java:27:3:27:8 | ...=... |
| Test.java:21:6:21:10 | After ... < ... [true] | 14 | Test.java:27:3:27:8 | After ...=... |
| Test.java:21:6:21:10 | After ... < ... [true] | 15 | Test.java:27:3:27:9 | After <Expr>; |
| Test.java:21:6:21:10 | After ... < ... [true] | 16 | Test.java:30:3:30:13 | if (...) |
| Test.java:21:6:21:10 | After ... < ... [true] | 17 | Test.java:30:7:30:12 | Before ... == ... |
| Test.java:21:6:21:10 | After ... < ... [true] | 18 | Test.java:30:7:30:7 | x |
| Test.java:21:6:21:10 | After ... < ... [true] | 19 | Test.java:30:12:30:12 | 0 |
| Test.java:21:6:21:10 | After ... < ... [true] | 20 | Test.java:30:7:30:12 | ... == ... |
| Test.java:30:3:30:13 | After if (...) | 0 | Test.java:30:3:30:13 | After if (...) |
| Test.java:30:3:30:13 | After if (...) | 1 | Test.java:35:3:35:9 | <Expr>; |
| Test.java:30:3:30:13 | After if (...) | 2 | Test.java:35:3:35:8 | Before ...=... |
| Test.java:30:3:30:13 | After if (...) | 3 | Test.java:35:3:35:3 | z |
| Test.java:30:3:30:13 | After if (...) | 4 | Test.java:35:7:35:8 | 20 |
| Test.java:30:3:30:13 | After if (...) | 5 | Test.java:35:3:35:8 | ...=... |
| Test.java:30:3:30:13 | After if (...) | 6 | Test.java:35:3:35:8 | After ...=... |
| Test.java:30:3:30:13 | After if (...) | 7 | Test.java:35:3:35:9 | After <Expr>; |
| Test.java:30:3:30:13 | After if (...) | 8 | Test.java:38:3:38:14 | while (...) |
| Test.java:30:7:30:12 | After ... == ... [false] | 0 | Test.java:30:7:30:12 | After ... == ... [false] |
| Test.java:30:7:30:12 | After ... == ... [true] | 0 | Test.java:30:7:30:12 | After ... == ... [true] |
| Test.java:30:7:30:12 | After ... == ... [true] | 1 | Test.java:30:15:33:3 | { ... } |
| Test.java:30:7:30:12 | After ... == ... [true] | 2 | Test.java:31:4:31:10 | <Expr>; |
| Test.java:30:7:30:12 | After ... == ... [true] | 3 | Test.java:31:4:31:9 | Before ...=... |
| Test.java:30:7:30:12 | After ... == ... [true] | 4 | Test.java:31:4:31:4 | y |
| Test.java:30:7:30:12 | After ... == ... [true] | 5 | Test.java:31:8:31:9 | 60 |
| Test.java:30:7:30:12 | After ... == ... [true] | 6 | Test.java:31:4:31:9 | ...=... |
| Test.java:30:7:30:12 | After ... == ... [true] | 7 | Test.java:31:4:31:9 | After ...=... |
| Test.java:30:7:30:12 | After ... == ... [true] | 8 | Test.java:31:4:31:10 | After <Expr>; |
| Test.java:30:7:30:12 | After ... == ... [true] | 9 | Test.java:32:4:32:10 | <Expr>; |
| Test.java:30:7:30:12 | After ... == ... [true] | 10 | Test.java:32:4:32:9 | Before ...=... |
| Test.java:30:7:30:12 | After ... == ... [true] | 11 | Test.java:32:4:32:4 | z |
| Test.java:30:7:30:12 | After ... == ... [true] | 12 | Test.java:32:8:32:9 | 10 |
| Test.java:30:7:30:12 | After ... == ... [true] | 13 | Test.java:32:4:32:9 | ...=... |
| Test.java:30:7:30:12 | After ... == ... [true] | 14 | Test.java:32:4:32:9 | After ...=... |
| Test.java:30:7:30:12 | After ... == ... [true] | 15 | Test.java:32:4:32:10 | After <Expr>; |
| Test.java:30:7:30:12 | After ... == ... [true] | 16 | Test.java:30:15:33:3 | After { ... } |
| Test.java:38:3:38:14 | [LoopHeader] while (...) | 0 | Test.java:38:3:38:14 | [LoopHeader] while (...) |
| Test.java:38:3:38:14 | [LoopHeader] while (...) | 1 | Test.java:38:9:38:13 | Before ... > ... |
| Test.java:38:3:38:14 | [LoopHeader] while (...) | 2 | Test.java:38:9:38:9 | x |
| Test.java:38:3:38:14 | [LoopHeader] while (...) | 3 | Test.java:38:13:38:13 | 0 |
| Test.java:38:3:38:14 | [LoopHeader] while (...) | 4 | Test.java:38:9:38:13 | ... > ... |
| Test.java:38:9:38:13 | After ... > ... [false] | 0 | Test.java:38:9:38:13 | After ... > ... [false] |
| Test.java:38:9:38:13 | After ... > ... [false] | 1 | Test.java:38:3:38:14 | After while (...) |
| Test.java:38:9:38:13 | After ... > ... [false] | 2 | Test.java:43:3:43:9 | <Expr>; |
| Test.java:38:9:38:13 | After ... > ... [false] | 3 | Test.java:43:3:43:8 | Before ...=... |
| Test.java:38:9:38:13 | After ... > ... [false] | 4 | Test.java:43:3:43:3 | z |
| Test.java:38:9:38:13 | After ... > ... [false] | 5 | Test.java:43:7:43:8 | 30 |
| Test.java:38:9:38:13 | After ... > ... [false] | 6 | Test.java:43:3:43:8 | ...=... |
| Test.java:38:9:38:13 | After ... > ... [false] | 7 | Test.java:43:3:43:8 | After ...=... |
| Test.java:38:9:38:13 | After ... > ... [false] | 8 | Test.java:43:3:43:9 | After <Expr>; |
| Test.java:38:9:38:13 | After ... > ... [false] | 9 | Test.java:46:3:46:29 | for (...;...;...) |
| Test.java:38:9:38:13 | After ... > ... [false] | 10 | Test.java:46:11:46:15 | Before j |
| Test.java:38:9:38:13 | After ... > ... [false] | 11 | Test.java:46:15:46:15 | 0 |
| Test.java:38:9:38:13 | After ... > ... [false] | 12 | Test.java:46:11:46:15 | j |
| Test.java:38:9:38:13 | After ... > ... [false] | 13 | Test.java:46:11:46:15 | After j |
| Test.java:38:9:38:13 | After ... > ... [true] | 0 | Test.java:38:9:38:13 | After ... > ... [true] |
| Test.java:38:9:38:13 | After ... > ... [true] | 1 | Test.java:38:16:41:3 | { ... } |
| Test.java:38:9:38:13 | After ... > ... [true] | 2 | Test.java:39:4:39:10 | <Expr>; |
| Test.java:38:9:38:13 | After ... > ... [true] | 3 | Test.java:39:4:39:9 | Before ...=... |
| Test.java:38:9:38:13 | After ... > ... [true] | 4 | Test.java:39:4:39:4 | y |
| Test.java:38:9:38:13 | After ... > ... [true] | 5 | Test.java:39:8:39:9 | 10 |
| Test.java:38:9:38:13 | After ... > ... [true] | 6 | Test.java:39:4:39:9 | ...=... |
| Test.java:38:9:38:13 | After ... > ... [true] | 7 | Test.java:39:4:39:9 | After ...=... |
| Test.java:38:9:38:13 | After ... > ... [true] | 8 | Test.java:39:4:39:10 | After <Expr>; |
| Test.java:38:9:38:13 | After ... > ... [true] | 9 | Test.java:40:4:40:7 | <Expr>; |
| Test.java:38:9:38:13 | After ... > ... [true] | 10 | Test.java:40:4:40:6 | Before ...-- |
| Test.java:38:9:38:13 | After ... > ... [true] | 11 | Test.java:40:4:40:4 | x |
| Test.java:38:9:38:13 | After ... > ... [true] | 12 | Test.java:40:4:40:6 | ...-- |
| Test.java:38:9:38:13 | After ... > ... [true] | 13 | Test.java:40:4:40:6 | After ...-- |
| Test.java:38:9:38:13 | After ... > ... [true] | 14 | Test.java:40:4:40:7 | After <Expr>; |
| Test.java:38:9:38:13 | After ... > ... [true] | 15 | Test.java:38:16:41:3 | After { ... } |
| Test.java:46:18:46:23 | After ... < ... [false] | 0 | Test.java:46:18:46:23 | After ... < ... [false] |
| Test.java:46:18:46:23 | After ... < ... [false] | 1 | Test.java:46:3:46:29 | After for (...;...;...) |
| Test.java:46:18:46:23 | After ... < ... [false] | 2 | Test.java:51:3:51:9 | <Expr>; |
| Test.java:46:18:46:23 | After ... < ... [false] | 3 | Test.java:51:3:51:8 | Before ...=... |
| Test.java:46:18:46:23 | After ... < ... [false] | 4 | Test.java:51:3:51:3 | z |
| Test.java:46:18:46:23 | After ... < ... [false] | 5 | Test.java:51:7:51:8 | 40 |
| Test.java:46:18:46:23 | After ... < ... [false] | 6 | Test.java:51:3:51:8 | ...=... |
| Test.java:46:18:46:23 | After ... < ... [false] | 7 | Test.java:51:3:51:8 | After ...=... |
| Test.java:46:18:46:23 | After ... < ... [false] | 8 | Test.java:51:3:51:9 | After <Expr>; |
| Test.java:46:18:46:23 | After ... < ... [false] | 9 | Test.java:54:3:54:29 | for (...;...;...) |
| Test.java:46:18:46:23 | After ... < ... [false] | 10 | Test.java:54:11:54:15 | Before j |
| Test.java:46:18:46:23 | After ... < ... [false] | 11 | Test.java:54:15:54:15 | 0 |
| Test.java:46:18:46:23 | After ... < ... [false] | 12 | Test.java:54:11:54:15 | j |
| Test.java:46:18:46:23 | After ... < ... [false] | 13 | Test.java:54:11:54:15 | After j |
| Test.java:46:18:46:23 | After ... < ... [true] | 0 | Test.java:46:18:46:23 | After ... < ... [true] |
| Test.java:46:18:46:23 | After ... < ... [true] | 1 | Test.java:46:31:49:3 | { ... } |
| Test.java:46:18:46:23 | After ... < ... [true] | 2 | Test.java:47:4:47:9 | <Expr>; |
| Test.java:46:18:46:23 | After ... < ... [true] | 3 | Test.java:47:4:47:8 | Before ...=... |
| Test.java:46:18:46:23 | After ... < ... [true] | 4 | Test.java:47:4:47:4 | y |
| Test.java:46:18:46:23 | After ... < ... [true] | 5 | Test.java:47:8:47:8 | 0 |
| Test.java:46:18:46:23 | After ... < ... [true] | 6 | Test.java:47:4:47:8 | ...=... |
| Test.java:46:18:46:23 | After ... < ... [true] | 7 | Test.java:47:4:47:8 | After ...=... |
| Test.java:46:18:46:23 | After ... < ... [true] | 8 | Test.java:47:4:47:9 | After <Expr>; |
| Test.java:46:18:46:23 | After ... < ... [true] | 9 | Test.java:48:4:48:10 | <Expr>; |
| Test.java:46:18:46:23 | After ... < ... [true] | 10 | Test.java:48:4:48:9 | Before ...=... |
| Test.java:46:18:46:23 | After ... < ... [true] | 11 | Test.java:48:4:48:4 | w |
| Test.java:46:18:46:23 | After ... < ... [true] | 12 | Test.java:48:8:48:9 | 10 |
| Test.java:46:18:46:23 | After ... < ... [true] | 13 | Test.java:48:4:48:9 | ...=... |
| Test.java:46:18:46:23 | After ... < ... [true] | 14 | Test.java:48:4:48:9 | After ...=... |
| Test.java:46:18:46:23 | After ... < ... [true] | 15 | Test.java:48:4:48:10 | After <Expr>; |
| Test.java:46:18:46:23 | After ... < ... [true] | 16 | Test.java:46:31:49:3 | After { ... } |
| Test.java:46:18:46:23 | After ... < ... [true] | 17 | Test.java:46:3:46:29 | [LoopHeader] for (...;...;...) |
| Test.java:46:18:46:23 | After ... < ... [true] | 18 | Test.java:46:26:46:28 | Before ...++ |
| Test.java:46:18:46:23 | After ... < ... [true] | 19 | Test.java:46:26:46:26 | j |
| Test.java:46:18:46:23 | After ... < ... [true] | 20 | Test.java:46:26:46:28 | ...++ |
| Test.java:46:18:46:23 | After ... < ... [true] | 21 | Test.java:46:26:46:28 | After ...++ |
| Test.java:46:18:46:23 | Before ... < ... | 0 | Test.java:46:18:46:23 | Before ... < ... |
| Test.java:46:18:46:23 | Before ... < ... | 1 | Test.java:46:18:46:18 | j |
| Test.java:46:18:46:23 | Before ... < ... | 2 | Test.java:46:22:46:23 | 10 |
| Test.java:46:18:46:23 | Before ... < ... | 3 | Test.java:46:18:46:23 | ... < ... |
| Test.java:54:3:54:29 | After for (...;...;...) | 0 | Test.java:54:3:54:29 | After for (...;...;...) |
| Test.java:54:3:54:29 | After for (...;...;...) | 1 | Test.java:70:3:70:9 | <Expr>; |
| Test.java:54:3:54:29 | After for (...;...;...) | 2 | Test.java:70:3:70:8 | Before ...=... |
| Test.java:54:3:54:29 | After for (...;...;...) | 3 | Test.java:70:3:70:3 | z |
| Test.java:54:3:54:29 | After for (...;...;...) | 4 | Test.java:70:7:70:8 | 50 |
| Test.java:54:3:54:29 | After for (...;...;...) | 5 | Test.java:70:3:70:8 | ...=... |
| Test.java:54:3:54:29 | After for (...;...;...) | 6 | Test.java:70:3:70:8 | After ...=... |
| Test.java:54:3:54:29 | After for (...;...;...) | 7 | Test.java:70:3:70:9 | After <Expr>; |
| Test.java:54:3:54:29 | After for (...;...;...) | 8 | Test.java:74:3:74:9 | <Expr>; |
| Test.java:54:3:54:29 | After for (...;...;...) | 9 | Test.java:74:3:74:8 | Before ...=... |
| Test.java:54:3:54:29 | After for (...;...;...) | 10 | Test.java:74:3:74:3 | w |
| Test.java:54:3:54:29 | After for (...;...;...) | 11 | Test.java:74:7:74:8 | 40 |
| Test.java:54:3:54:29 | After for (...;...;...) | 12 | Test.java:74:3:74:8 | ...=... |
| Test.java:54:3:54:29 | After for (...;...;...) | 13 | Test.java:74:3:74:8 | After ...=... |
| Test.java:54:3:54:29 | After for (...;...;...) | 14 | Test.java:74:3:74:9 | After <Expr>; |
| Test.java:54:3:54:29 | After for (...;...;...) | 15 | Test.java:75:3:75:9 | Before return ... |
| Test.java:54:3:54:29 | After for (...;...;...) | 16 | Test.java:75:3:75:9 | return ... |
| Test.java:54:3:54:29 | [LoopHeader] for (...;...;...) | 0 | Test.java:54:3:54:29 | [LoopHeader] for (...;...;...) |
| Test.java:54:3:54:29 | [LoopHeader] for (...;...;...) | 1 | Test.java:54:26:54:28 | Before ...++ |
| Test.java:54:3:54:29 | [LoopHeader] for (...;...;...) | 2 | Test.java:54:26:54:26 | j |
| Test.java:54:3:54:29 | [LoopHeader] for (...;...;...) | 3 | Test.java:54:26:54:28 | ...++ |
| Test.java:54:3:54:29 | [LoopHeader] for (...;...;...) | 4 | Test.java:54:26:54:28 | After ...++ |
| Test.java:54:18:54:23 | After ... < ... [false] | 0 | Test.java:54:18:54:23 | After ... < ... [false] |
| Test.java:54:18:54:23 | After ... < ... [true] | 0 | Test.java:54:18:54:23 | After ... < ... [true] |
| Test.java:54:18:54:23 | After ... < ... [true] | 1 | Test.java:54:31:68:3 | { ... } |
| Test.java:54:18:54:23 | After ... < ... [true] | 2 | Test.java:55:4:55:10 | <Expr>; |
| Test.java:54:18:54:23 | After ... < ... [true] | 3 | Test.java:55:4:55:9 | Before ...=... |
| Test.java:54:18:54:23 | After ... < ... [true] | 4 | Test.java:55:4:55:4 | y |
| Test.java:54:18:54:23 | After ... < ... [true] | 5 | Test.java:55:8:55:9 | 30 |
| Test.java:54:18:54:23 | After ... < ... [true] | 6 | Test.java:55:4:55:9 | ...=... |
| Test.java:54:18:54:23 | After ... < ... [true] | 7 | Test.java:55:4:55:9 | After ...=... |
| Test.java:54:18:54:23 | After ... < ... [true] | 8 | Test.java:55:4:55:10 | After <Expr>; |
| Test.java:54:18:54:23 | After ... < ... [true] | 9 | Test.java:56:4:56:12 | if (...) |
| Test.java:54:18:54:23 | After ... < ... [true] | 10 | Test.java:56:7:56:11 | Before ... > ... |
| Test.java:54:18:54:23 | After ... < ... [true] | 11 | Test.java:56:7:56:7 | z |
| Test.java:54:18:54:23 | After ... < ... [true] | 12 | Test.java:56:11:56:11 | 0 |
| Test.java:54:18:54:23 | After ... < ... [true] | 13 | Test.java:56:7:56:11 | ... > ... |
| Test.java:54:18:54:23 | Before ... < ... | 0 | Test.java:54:18:54:23 | Before ... < ... |
| Test.java:54:18:54:23 | Before ... < ... | 1 | Test.java:54:18:54:18 | j |
| Test.java:54:18:54:23 | Before ... < ... | 2 | Test.java:54:22:54:23 | 10 |
| Test.java:54:18:54:23 | Before ... < ... | 3 | Test.java:54:18:54:23 | ... < ... |
| Test.java:56:7:56:11 | After ... > ... [false] | 0 | Test.java:56:7:56:11 | After ... > ... [false] |
| Test.java:56:7:56:11 | After ... > ... [false] | 1 | Test.java:63:9:66:4 | { ... } |
| Test.java:56:7:56:11 | After ... > ... [false] | 2 | Test.java:64:5:64:11 | <Expr>; |
| Test.java:56:7:56:11 | After ... > ... [false] | 3 | Test.java:64:5:64:10 | Before ...=... |
| Test.java:56:7:56:11 | After ... > ... [false] | 4 | Test.java:64:5:64:5 | w |
| Test.java:56:7:56:11 | After ... > ... [false] | 5 | Test.java:64:9:64:10 | 10 |
| Test.java:56:7:56:11 | After ... > ... [false] | 6 | Test.java:64:5:64:10 | ...=... |
| Test.java:56:7:56:11 | After ... > ... [false] | 7 | Test.java:64:5:64:10 | After ...=... |
| Test.java:56:7:56:11 | After ... > ... [false] | 8 | Test.java:64:5:64:11 | After <Expr>; |
| Test.java:56:7:56:11 | After ... > ... [false] | 9 | Test.java:65:5:65:13 | Before continue |
| Test.java:56:7:56:11 | After ... > ... [false] | 10 | Test.java:65:5:65:13 | continue |
| Test.java:56:7:56:11 | After ... > ... [true] | 0 | Test.java:56:7:56:11 | After ... > ... [true] |
| Test.java:56:7:56:11 | After ... > ... [true] | 1 | Test.java:57:5:57:13 | if (...) |
| Test.java:56:7:56:11 | After ... > ... [true] | 2 | Test.java:57:8:57:12 | Before ... > ... |
| Test.java:56:7:56:11 | After ... > ... [true] | 3 | Test.java:57:8:57:8 | y |
| Test.java:56:7:56:11 | After ... > ... [true] | 4 | Test.java:57:12:57:12 | 0 |
| Test.java:56:7:56:11 | After ... > ... [true] | 5 | Test.java:57:8:57:12 | ... > ... |
| Test.java:57:8:57:12 | After ... > ... [false] | 0 | Test.java:57:8:57:12 | After ... > ... [false] |
| Test.java:57:8:57:12 | After ... > ... [false] | 1 | Test.java:60:12:62:5 | { ... } |
| Test.java:57:8:57:12 | After ... > ... [false] | 2 | Test.java:61:6:61:12 | <Expr>; |
| Test.java:57:8:57:12 | After ... > ... [false] | 3 | Test.java:61:6:61:11 | Before ...=... |
| Test.java:57:8:57:12 | After ... > ... [false] | 4 | Test.java:61:6:61:6 | w |
| Test.java:57:8:57:12 | After ... > ... [false] | 5 | Test.java:61:10:61:11 | 20 |
| Test.java:57:8:57:12 | After ... > ... [false] | 6 | Test.java:61:6:61:11 | ...=... |
| Test.java:57:8:57:12 | After ... > ... [false] | 7 | Test.java:61:6:61:11 | After ...=... |
| Test.java:57:8:57:12 | After ... > ... [false] | 8 | Test.java:61:6:61:12 | After <Expr>; |
| Test.java:57:8:57:12 | After ... > ... [false] | 9 | Test.java:60:12:62:5 | After { ... } |
| Test.java:57:8:57:12 | After ... > ... [false] | 10 | Test.java:57:5:57:13 | After if (...) |
| Test.java:57:8:57:12 | After ... > ... [false] | 11 | Test.java:56:4:56:12 | After if (...) |
| Test.java:57:8:57:12 | After ... > ... [false] | 12 | Test.java:67:4:67:9 | <Expr>; |
| Test.java:57:8:57:12 | After ... > ... [false] | 13 | Test.java:67:4:67:8 | Before ...=... |
| Test.java:57:8:57:12 | After ... > ... [false] | 14 | Test.java:67:4:67:4 | x |
| Test.java:57:8:57:12 | After ... > ... [false] | 15 | Test.java:67:8:67:8 | 0 |
| Test.java:57:8:57:12 | After ... > ... [false] | 16 | Test.java:67:4:67:8 | ...=... |
| Test.java:57:8:57:12 | After ... > ... [false] | 17 | Test.java:67:4:67:8 | After ...=... |
| Test.java:57:8:57:12 | After ... > ... [false] | 18 | Test.java:67:4:67:9 | After <Expr>; |
| Test.java:57:8:57:12 | After ... > ... [false] | 19 | Test.java:54:31:68:3 | After { ... } |
| Test.java:57:8:57:12 | After ... > ... [true] | 0 | Test.java:57:8:57:12 | After ... > ... [true] |
| Test.java:57:8:57:12 | After ... > ... [true] | 1 | Test.java:57:15:60:5 | { ... } |
| Test.java:57:8:57:12 | After ... > ... [true] | 2 | Test.java:58:6:58:11 | <Expr>; |
| Test.java:57:8:57:12 | After ... > ... [true] | 3 | Test.java:58:6:58:10 | Before ...=... |
| Test.java:57:8:57:12 | After ... > ... [true] | 4 | Test.java:58:6:58:6 | w |
| Test.java:57:8:57:12 | After ... > ... [true] | 5 | Test.java:58:10:58:10 | 0 |
| Test.java:57:8:57:12 | After ... > ... [true] | 6 | Test.java:58:6:58:10 | ...=... |
| Test.java:57:8:57:12 | After ... > ... [true] | 7 | Test.java:58:6:58:10 | After ...=... |
| Test.java:57:8:57:12 | After ... > ... [true] | 8 | Test.java:58:6:58:11 | After <Expr>; |
| Test.java:57:8:57:12 | After ... > ... [true] | 9 | Test.java:59:6:59:11 | Before break |
| Test.java:57:8:57:12 | After ... > ... [true] | 10 | Test.java:59:6:59:11 | break |

View File

@@ -1,6 +1,3 @@
| Test.java:3:14:3:17 | { ... } | Test.java:3:14:3:17 | Exit |
| Test.java:4:14:4:17 | Normal Exit | Test.java:4:14:4:17 | Exit |
| Test.java:4:21:76:2 | { ... } | Test.java:4:14:4:17 | Exit |
| Test.java:4:21:76:2 | { ... } | Test.java:4:14:4:17 | Normal Exit |
| Test.java:4:21:76:2 | { ... } | Test.java:11:14:14:3 | { ... } |
| Test.java:4:21:76:2 | { ... } | Test.java:14:10:16:3 | { ... } |
@@ -23,7 +20,6 @@
| Test.java:4:21:76:2 | { ... } | Test.java:60:12:62:5 | { ... } |
| Test.java:4:21:76:2 | { ... } | Test.java:63:9:66:4 | { ... } |
| Test.java:4:21:76:2 | { ... } | Test.java:70:3:70:9 | <Expr>; |
| Test.java:18:3:18:8 | <Expr>; | Test.java:4:14:4:17 | Exit |
| Test.java:18:3:18:8 | <Expr>; | Test.java:4:14:4:17 | Normal Exit |
| Test.java:18:3:18:8 | <Expr>; | Test.java:22:4:22:10 | <Expr>; |
| Test.java:18:3:18:8 | <Expr>; | Test.java:24:4:24:10 | return ... |

View File

@@ -1,6 +1,7 @@
import java
import semmle.code.java.controlflow.Dominance
import utils.test.BasicBlock
from BasicBlock b, BasicBlock b2
where b.strictlyDominates(b2)
select b, b2
select getFirstAstNode(b), getFirstAstNode(b2)

View File

@@ -1,16 +1,13 @@
| Test.java:3:14:3:17 | Exceptional Exit | Test.java:3:14:3:17 | Exit |
| Test.java:3:14:3:17 | { ... } | Test.java:3:14:3:17 | Exit |
| Test.java:4:14:4:17 | Exceptional Exit | Test.java:4:14:4:17 | Exit |
| Test.java:4:14:4:17 | Normal Exit | Test.java:4:14:4:17 | Exit |
| Test.java:4:21:76:2 | { ... } | Test.java:11:14:14:3 | { ... } |
| Test.java:4:21:76:2 | { ... } | Test.java:14:10:16:3 | { ... } |
| Test.java:11:14:14:3 | { ... } | Test.java:18:3:18:8 | <Expr>; |
| Test.java:14:10:16:3 | { ... } | Test.java:18:3:18:8 | <Expr>; |
| Test.java:18:3:18:8 | <Expr>; | Test.java:22:4:22:10 | <Expr>; |
| Test.java:18:3:18:8 | <Expr>; | Test.java:24:4:24:10 | return ... |
| Test.java:22:4:22:10 | <Expr>; | Test.java:30:7:30:12 | After ... == ... [false] |
| Test.java:22:4:22:10 | <Expr>; | Test.java:30:15:33:3 | { ... } |
| Test.java:22:4:22:10 | <Expr>; | Test.java:35:3:35:9 | <Expr>; |
| Test.java:24:4:24:10 | return ... | Test.java:4:14:4:17 | Normal Exit |
| Test.java:30:7:30:12 | After ... == ... [false] | Test.java:35:3:35:9 | <Expr>; |
| Test.java:30:15:33:3 | { ... } | Test.java:35:3:35:9 | <Expr>; |
| Test.java:35:3:35:9 | <Expr>; | Test.java:38:9:38:9 | x |
| Test.java:38:9:38:9 | x | Test.java:38:16:41:3 | { ... } |
@@ -21,8 +18,9 @@
| Test.java:46:18:46:18 | j | Test.java:51:3:51:9 | <Expr>; |
| Test.java:46:31:49:3 | { ... } | Test.java:46:18:46:18 | j |
| Test.java:51:3:51:9 | <Expr>; | Test.java:54:18:54:18 | j |
| Test.java:54:18:54:18 | j | Test.java:54:18:54:23 | After ... < ... [false] |
| Test.java:54:18:54:18 | j | Test.java:54:31:68:3 | { ... } |
| Test.java:54:18:54:18 | j | Test.java:70:3:70:9 | <Expr>; |
| Test.java:54:18:54:23 | After ... < ... [false] | Test.java:70:3:70:9 | <Expr>; |
| Test.java:54:26:54:26 | j | Test.java:54:18:54:18 | j |
| Test.java:54:31:68:3 | { ... } | Test.java:57:5:57:13 | if (...) |
| Test.java:54:31:68:3 | { ... } | Test.java:63:9:66:4 | { ... } |

View File

@@ -1,5 +1,6 @@
import java
import utils.test.BasicBlock
from BasicBlock b, BasicBlock b2
where b.getASuccessor() = b2
select b, b2
select getFirstAstNodeOrSynth(b), getFirstAstNodeOrSynth(b2)

View File

@@ -17,5 +17,6 @@ predicate dominanceCounterExample(ControlFlowNode entry, ControlFlowNode dom, Co
from Callable c, ControlFlowNode dom, ControlFlowNode node
where
strictlyDominates(dom, node) and
dominanceCounterExample(c.getBody().getControlFlowNode(), dom, node)
dominanceCounterExample(any(ControlFlow::EntryNode entry | entry.getEnclosingCallable() = c), dom,
node)
select c, dom, node

View File

@@ -1,176 +1,33 @@
| Test.java:2:32:72:2 | { ... } | Test.java:3:3:3:8 | var ...; |
| Test.java:3:3:3:8 | var ...; | Test.java:3:7:3:7 | j |
| Test.java:3:7:3:7 | j | Test.java:4:3:4:14 | var ...; |
| Test.java:4:3:4:14 | var ...; | Test.java:4:12:4:13 | 50 |
| Test.java:4:8:4:13 | y | Test.java:7:3:7:12 | if (...) |
| Test.java:4:12:4:13 | 50 | Test.java:4:8:4:13 | y |
| Test.java:7:3:7:12 | if (...) | Test.java:7:7:7:7 | x |
| Test.java:7:7:7:7 | x | Test.java:7:11:7:11 | 0 |
| Test.java:7:7:7:11 | ... > ... | Test.java:7:14:10:3 | { ... } |
| Test.java:7:7:7:11 | ... > ... | Test.java:10:10:12:3 | { ... } |
| Test.java:7:7:7:11 | ... > ... | Test.java:14:3:14:20 | <Expr>; |
| Test.java:7:11:7:11 | 0 | Test.java:7:7:7:11 | ... > ... |
| Test.java:7:14:10:3 | { ... } | Test.java:8:4:8:10 | <Expr>; |
| Test.java:8:4:8:9 | ...=... | Test.java:9:4:9:10 | <Expr>; |
| Test.java:8:4:8:10 | <Expr>; | Test.java:8:8:8:9 | 20 |
| Test.java:8:8:8:9 | 20 | Test.java:8:4:8:9 | ...=... |
| Test.java:9:4:9:10 | <Expr>; | Test.java:9:8:9:9 | 10 |
| Test.java:9:8:9:9 | 10 | Test.java:9:4:9:9 | ...=... |
| Test.java:10:10:12:3 | { ... } | Test.java:11:4:11:10 | <Expr>; |
| Test.java:11:4:11:10 | <Expr>; | Test.java:11:8:11:9 | 30 |
| Test.java:11:8:11:9 | 30 | Test.java:11:4:11:9 | ...=... |
| Test.java:14:3:14:19 | ...=... | Test.java:17:3:17:12 | if (...) |
| Test.java:14:3:14:20 | <Expr>; | Test.java:14:14:14:14 | x |
| Test.java:14:7:14:19 | (...)... | Test.java:14:3:14:19 | ...=... |
| Test.java:14:14:14:14 | x | Test.java:14:18:14:18 | y |
| Test.java:14:14:14:18 | ... + ... | Test.java:14:7:14:19 | (...)... |
| Test.java:14:18:14:18 | y | Test.java:14:14:14:18 | ... + ... |
| Test.java:17:3:17:12 | if (...) | Test.java:17:7:17:7 | x |
| Test.java:17:7:17:7 | x | Test.java:17:11:17:11 | 0 |
| Test.java:17:7:17:11 | ... < ... | Test.java:2:6:2:9 | Normal Exit |
| Test.java:17:7:17:11 | ... < ... | Test.java:18:4:18:10 | <Expr>; |
| Test.java:17:7:17:11 | ... < ... | Test.java:20:11:20:11 | z |
| Test.java:17:11:17:11 | 0 | Test.java:17:7:17:11 | ... < ... |
| Test.java:18:4:18:9 | ...=... | Test.java:23:3:23:9 | <Expr>; |
| Test.java:18:4:18:10 | <Expr>; | Test.java:18:8:18:9 | 40 |
| Test.java:18:8:18:9 | 40 | Test.java:18:4:18:9 | ...=... |
| Test.java:20:11:20:11 | z | Test.java:20:4:20:12 | return ... |
| Test.java:23:3:23:8 | ...=... | Test.java:26:3:26:13 | if (...) |
| Test.java:23:3:23:9 | <Expr>; | Test.java:23:7:23:8 | 10 |
| Test.java:23:7:23:8 | 10 | Test.java:23:3:23:8 | ...=... |
| Test.java:26:3:26:13 | if (...) | Test.java:26:7:26:7 | x |
| Test.java:26:7:26:7 | x | Test.java:26:12:26:12 | 0 |
| Test.java:26:7:26:12 | ... == ... | Test.java:26:15:29:3 | { ... } |
| Test.java:26:7:26:12 | ... == ... | Test.java:31:3:31:9 | <Expr>; |
| Test.java:26:12:26:12 | 0 | Test.java:26:7:26:12 | ... == ... |
| Test.java:26:15:29:3 | { ... } | Test.java:27:4:27:10 | <Expr>; |
| Test.java:27:4:27:9 | ...=... | Test.java:28:4:28:10 | <Expr>; |
| Test.java:27:4:27:10 | <Expr>; | Test.java:27:8:27:9 | 60 |
| Test.java:27:8:27:9 | 60 | Test.java:27:4:27:9 | ...=... |
| Test.java:28:4:28:10 | <Expr>; | Test.java:28:8:28:9 | 10 |
| Test.java:28:8:28:9 | 10 | Test.java:28:4:28:9 | ...=... |
| Test.java:31:3:31:3 | z | Test.java:31:8:31:8 | x |
| Test.java:31:3:31:8 | ...+=... | Test.java:34:3:34:15 | while (...) |
| Test.java:31:3:31:9 | <Expr>; | Test.java:31:3:31:3 | z |
| Test.java:31:8:31:8 | x | Test.java:31:3:31:8 | ...+=... |
| Test.java:34:3:34:15 | while (...) | Test.java:34:10:34:10 | x |
| Test.java:34:10:34:10 | x | Test.java:34:14:34:14 | 0 |
| Test.java:34:10:34:14 | ... > ... | Test.java:34:17:37:3 | { ... } |
| Test.java:34:10:34:14 | ... > ... | Test.java:39:3:39:9 | <Expr>; |
| Test.java:34:14:34:14 | 0 | Test.java:34:10:34:14 | ... > ... |
| Test.java:34:17:37:3 | { ... } | Test.java:35:4:35:10 | <Expr>; |
| Test.java:35:4:35:9 | ...=... | Test.java:36:4:36:7 | <Expr>; |
| Test.java:35:4:35:10 | <Expr>; | Test.java:35:8:35:9 | 10 |
| Test.java:35:8:35:9 | 10 | Test.java:35:4:35:9 | ...=... |
| Test.java:36:4:36:4 | x | Test.java:36:4:36:6 | ...-- |
| Test.java:36:4:36:7 | <Expr>; | Test.java:36:4:36:4 | x |
| Test.java:39:3:39:3 | z | Test.java:39:8:39:8 | y |
| Test.java:39:3:39:8 | ...+=... | Test.java:42:3:42:26 | for (...;...;...) |
| Test.java:39:3:39:9 | <Expr>; | Test.java:39:3:39:3 | z |
| Test.java:39:8:39:8 | y | Test.java:39:3:39:8 | ...+=... |
| Test.java:42:3:42:26 | for (...;...;...) | Test.java:42:12:42:12 | 0 |
| Test.java:42:8:42:12 | ...=... | Test.java:42:15:42:15 | j |
| Test.java:42:12:42:12 | 0 | Test.java:42:8:42:12 | ...=... |
| Test.java:42:15:42:15 | j | Test.java:42:19:42:20 | 10 |
| Test.java:42:15:42:20 | ... < ... | Test.java:42:28:45:3 | { ... } |
| Test.java:42:15:42:20 | ... < ... | Test.java:47:3:47:9 | <Expr>; |
| Test.java:42:19:42:20 | 10 | Test.java:42:15:42:20 | ... < ... |
| Test.java:42:23:42:23 | j | Test.java:42:23:42:25 | ...++ |
| Test.java:42:28:45:3 | { ... } | Test.java:43:4:43:9 | <Expr>; |
| Test.java:43:4:43:8 | ...=... | Test.java:44:4:44:10 | <Expr>; |
| Test.java:43:4:43:9 | <Expr>; | Test.java:43:8:43:8 | 0 |
| Test.java:43:8:43:8 | 0 | Test.java:43:4:43:8 | ...=... |
| Test.java:44:4:44:9 | ...=... | Test.java:42:23:42:23 | j |
| Test.java:44:4:44:10 | <Expr>; | Test.java:44:8:44:9 | 10 |
| Test.java:44:8:44:9 | 10 | Test.java:44:4:44:9 | ...=... |
| Test.java:47:3:47:3 | z | Test.java:47:8:47:8 | w |
| Test.java:47:3:47:8 | ...+=... | Test.java:50:3:50:26 | for (...;...;...) |
| Test.java:47:3:47:9 | <Expr>; | Test.java:47:3:47:3 | z |
| Test.java:47:8:47:8 | w | Test.java:47:3:47:8 | ...+=... |
| Test.java:50:3:50:26 | for (...;...;...) | Test.java:50:12:50:12 | 0 |
| Test.java:50:8:50:12 | ...=... | Test.java:50:15:50:15 | j |
| Test.java:50:12:50:12 | 0 | Test.java:50:8:50:12 | ...=... |
| Test.java:50:15:50:15 | j | Test.java:50:19:50:20 | 10 |
| Test.java:50:15:50:20 | ... < ... | Test.java:50:28:64:3 | { ... } |
| Test.java:50:15:50:20 | ... < ... | Test.java:66:3:66:17 | <Expr>; |
| Test.java:50:19:50:20 | 10 | Test.java:50:15:50:20 | ... < ... |
| Test.java:50:23:50:23 | j | Test.java:50:23:50:25 | ...++ |
| Test.java:50:28:64:3 | { ... } | Test.java:51:4:51:10 | <Expr>; |
| Test.java:51:4:51:9 | ...=... | Test.java:52:4:52:13 | if (...) |
| Test.java:51:4:51:10 | <Expr>; | Test.java:51:8:51:9 | 30 |
| Test.java:51:8:51:9 | 30 | Test.java:51:4:51:9 | ...=... |
| Test.java:52:4:52:13 | if (...) | Test.java:52:8:52:8 | z |
| Test.java:52:8:52:8 | z | Test.java:52:12:52:12 | 0 |
| Test.java:52:8:52:12 | ... > ... | Test.java:50:23:50:23 | j |
| Test.java:52:8:52:12 | ... > ... | Test.java:53:5:53:14 | if (...) |
| Test.java:52:8:52:12 | ... > ... | Test.java:59:9:62:4 | { ... } |
| Test.java:52:12:52:12 | 0 | Test.java:52:8:52:12 | ... > ... |
| Test.java:53:5:53:14 | if (...) | Test.java:53:9:53:9 | y |
| Test.java:53:9:53:9 | y | Test.java:53:13:53:13 | 0 |
| Test.java:53:9:53:13 | ... > ... | Test.java:53:16:56:5 | { ... } |
| Test.java:53:9:53:13 | ... > ... | Test.java:56:12:58:5 | { ... } |
| Test.java:53:13:53:13 | 0 | Test.java:53:9:53:13 | ... > ... |
| Test.java:53:16:56:5 | { ... } | Test.java:54:6:54:11 | <Expr>; |
| Test.java:54:6:54:10 | ...=... | Test.java:55:6:55:11 | break |
| Test.java:54:6:54:11 | <Expr>; | Test.java:54:10:54:10 | 0 |
| Test.java:54:10:54:10 | 0 | Test.java:54:6:54:10 | ...=... |
| Test.java:56:12:58:5 | { ... } | Test.java:57:6:57:12 | <Expr>; |
| Test.java:57:6:57:11 | ...=... | Test.java:63:4:63:9 | <Expr>; |
| Test.java:57:6:57:12 | <Expr>; | Test.java:57:10:57:11 | 20 |
| Test.java:57:10:57:11 | 20 | Test.java:57:6:57:11 | ...=... |
| Test.java:59:9:62:4 | { ... } | Test.java:60:5:60:11 | <Expr>; |
| Test.java:60:5:60:10 | ...=... | Test.java:61:5:61:13 | continue |
| Test.java:60:5:60:11 | <Expr>; | Test.java:60:9:60:10 | 10 |
| Test.java:60:9:60:10 | 10 | Test.java:60:5:60:10 | ...=... |
| Test.java:63:4:63:9 | <Expr>; | Test.java:63:8:63:8 | 0 |
| Test.java:63:8:63:8 | 0 | Test.java:63:4:63:8 | ...=... |
| Test.java:66:3:66:3 | z | Test.java:66:8:66:8 | x |
| Test.java:66:3:66:16 | ...+=... | Test.java:70:3:70:9 | <Expr>; |
| Test.java:66:3:66:17 | <Expr>; | Test.java:66:3:66:3 | z |
| Test.java:66:8:66:8 | x | Test.java:66:12:66:12 | y |
| Test.java:66:8:66:12 | ... + ... | Test.java:66:16:66:16 | w |
| Test.java:66:8:66:16 | ... + ... | Test.java:66:3:66:16 | ...+=... |
| Test.java:66:12:66:12 | y | Test.java:66:8:66:12 | ... + ... |
| Test.java:66:16:66:16 | w | Test.java:66:8:66:16 | ... + ... |
| Test.java:70:3:70:8 | ...=... | Test.java:71:10:71:10 | w |
| Test.java:70:3:70:9 | <Expr>; | Test.java:70:7:70:8 | 40 |
| Test.java:70:7:70:8 | 40 | Test.java:70:3:70:8 | ...=... |
| Test.java:71:10:71:10 | w | Test.java:71:3:71:11 | return ... |
| Test.java:74:19:91:2 | { ... } | Test.java:76:3:76:8 | var ...; |
| Test.java:76:3:76:8 | var ...; | Test.java:76:7:76:7 | b |
| Test.java:76:7:76:7 | b | Test.java:77:3:77:8 | var ...; |
| Test.java:77:3:77:8 | var ...; | Test.java:77:7:77:7 | c |
| Test.java:77:7:77:7 | c | Test.java:78:3:78:8 | <Expr>; |
| Test.java:78:3:78:7 | ...=... | Test.java:79:3:79:13 | while (...) |
| Test.java:78:3:78:8 | <Expr>; | Test.java:78:7:78:7 | 0 |
| Test.java:78:7:78:7 | 0 | Test.java:78:3:78:7 | ...=... |
| Test.java:79:3:79:13 | while (...) | Test.java:79:9:79:12 | true |
| Test.java:79:9:79:12 | true | Test.java:79:15:89:3 | { ... } |
| Test.java:79:15:89:3 | { ... } | Test.java:80:4:80:10 | <Expr>; |
| Test.java:80:4:80:9 | ...=... | Test.java:81:4:81:15 | if (...) |
| Test.java:80:4:80:10 | <Expr>; | Test.java:80:8:80:9 | 10 |
| Test.java:80:8:80:9 | 10 | Test.java:80:4:80:9 | ...=... |
| Test.java:81:4:81:15 | if (...) | Test.java:81:8:81:8 | a |
| Test.java:81:8:81:8 | a | Test.java:81:12:81:14 | 100 |
| Test.java:81:8:81:14 | ... > ... | Test.java:81:17:84:4 | { ... } |
| Test.java:81:8:81:14 | ... > ... | Test.java:85:4:85:15 | if (...) |
| Test.java:81:12:81:14 | 100 | Test.java:81:8:81:14 | ... > ... |
| Test.java:81:17:84:4 | { ... } | Test.java:82:5:82:11 | <Expr>; |
| Test.java:82:5:82:10 | ...=... | Test.java:83:5:83:10 | <Expr>; |
| Test.java:82:5:82:11 | <Expr>; | Test.java:82:9:82:10 | 10 |
| Test.java:82:9:82:10 | 10 | Test.java:82:5:82:10 | ...=... |
| Test.java:83:5:83:10 | <Expr>; | Test.java:83:9:83:9 | c |
| Test.java:83:9:83:9 | c | Test.java:83:5:83:9 | ...=... |
| Test.java:85:4:85:15 | if (...) | Test.java:85:8:85:8 | a |
| Test.java:85:8:85:8 | a | Test.java:85:13:85:14 | 10 |
| Test.java:85:8:85:14 | ... == ... | Test.java:74:6:74:10 | Normal Exit |
| Test.java:85:8:85:14 | ... == ... | Test.java:86:5:86:10 | break |
| Test.java:85:8:85:14 | ... == ... | Test.java:87:4:87:15 | if (...) |
| Test.java:85:13:85:14 | 10 | Test.java:85:8:85:14 | ... == ... |
| Test.java:86:5:86:10 | break | Test.java:90:10:90:10 | b |
| Test.java:87:4:87:15 | if (...) | Test.java:87:8:87:8 | a |
| Test.java:87:8:87:8 | a | Test.java:87:13:87:14 | 20 |
| Test.java:87:8:87:14 | ... == ... | Test.java:88:12:88:12 | c |
| Test.java:87:13:87:14 | 20 | Test.java:87:8:87:14 | ... == ... |
| Test.java:88:12:88:12 | c | Test.java:88:5:88:13 | return ... |
| Test.java:90:10:90:10 | b | Test.java:90:3:90:11 | return ... |
| Test.java:2:32:72:2 | { ... } | Test.java:7:14:10:3 | { ... } |
| Test.java:2:32:72:2 | { ... } | Test.java:10:10:12:3 | { ... } |
| Test.java:2:32:72:2 | { ... } | Test.java:14:3:14:20 | <Expr>; |
| Test.java:14:3:14:20 | <Expr>; | Test.java:2:6:2:9 | Normal Exit |
| Test.java:14:3:14:20 | <Expr>; | Test.java:18:4:18:10 | <Expr>; |
| Test.java:14:3:14:20 | <Expr>; | Test.java:20:11:20:11 | z |
| Test.java:18:4:18:10 | <Expr>; | Test.java:26:7:26:12 | After ... == ... [false] |
| Test.java:18:4:18:10 | <Expr>; | Test.java:26:15:29:3 | { ... } |
| Test.java:18:4:18:10 | <Expr>; | Test.java:31:3:31:9 | <Expr>; |
| Test.java:31:3:31:9 | <Expr>; | Test.java:34:10:34:10 | x |
| Test.java:34:10:34:10 | x | Test.java:34:17:37:3 | { ... } |
| Test.java:34:10:34:10 | x | Test.java:39:3:39:9 | <Expr>; |
| Test.java:39:3:39:9 | <Expr>; | Test.java:42:15:42:15 | j |
| Test.java:42:15:42:15 | j | Test.java:42:28:45:3 | { ... } |
| Test.java:42:15:42:15 | j | Test.java:47:3:47:9 | <Expr>; |
| Test.java:47:3:47:9 | <Expr>; | Test.java:50:15:50:15 | j |
| Test.java:50:15:50:15 | j | Test.java:50:15:50:20 | After ... < ... [false] |
| Test.java:50:15:50:15 | j | Test.java:50:28:64:3 | { ... } |
| Test.java:50:15:50:15 | j | Test.java:66:3:66:17 | <Expr>; |
| Test.java:50:28:64:3 | { ... } | Test.java:50:23:50:23 | j |
| Test.java:50:28:64:3 | { ... } | Test.java:53:5:53:14 | if (...) |
| Test.java:50:28:64:3 | { ... } | Test.java:59:9:62:4 | { ... } |
| Test.java:53:5:53:14 | if (...) | Test.java:53:16:56:5 | { ... } |
| Test.java:53:5:53:14 | if (...) | Test.java:56:12:58:5 | { ... } |
| Test.java:74:19:91:2 | { ... } | Test.java:79:9:79:12 | true |
| Test.java:79:9:79:12 | true | Test.java:81:8:81:14 | After ... > ... [false] |
| Test.java:79:9:79:12 | true | Test.java:81:17:84:4 | { ... } |
| Test.java:79:9:79:12 | true | Test.java:85:4:85:15 | if (...) |
| Test.java:85:4:85:15 | if (...) | Test.java:74:6:74:10 | Normal Exit |
| Test.java:85:4:85:15 | if (...) | Test.java:86:5:86:10 | break |
| Test.java:85:4:85:15 | if (...) | Test.java:87:4:87:15 | if (...) |
| Test.java:87:4:87:15 | if (...) | Test.java:87:8:87:14 | After ... == ... [false] |
| Test.java:87:4:87:15 | if (...) | Test.java:88:12:88:12 | c |

View File

@@ -1,9 +1,9 @@
import default
import semmle.code.java.controlflow.Dominance
import java
import utils.test.BasicBlock
from Method func, ControlFlowNode dominator, ControlFlowNode node
from Method func, BasicBlock dominator, BasicBlock bb
where
iDominates(dominator, node) and
dominator.getEnclosingStmt().getEnclosingCallable() = func and
dominator.immediatelyDominates(bb) and
dominator.getEnclosingCallable() = func and
func.getDeclaringType().hasName("Test")
select dominator, node
select getFirstAstNodeOrSynth(dominator), getFirstAstNodeOrSynth(bb)

View File

@@ -7,5 +7,5 @@ where
iDominates(dom1, node) and
iDominates(dom2, node) and
dom1 != dom2 and
func = node.getEnclosingStmt().getEnclosingCallable()
func = node.getEnclosingCallable()
select func, node, dom1, dom2

View File

@@ -16,8 +16,8 @@
| A.java:21:11:21:13 | "B" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:15:16:15:16 | a : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:15:16:15:22 | get(...) : String |
| A.java:21:11:21:13 | "B" : String | A.java:20:5:20:15 | SSA phi(s) : String |
| A.java:21:11:21:13 | "B" : String | A.java:21:7:21:13 | ...=... : String |
| A.java:21:11:21:13 | "B" : String | A.java:25:5:25:26 | SSA phi(s) : String |
| A.java:21:11:21:13 | "B" : String | A.java:28:11:38:5 | String s : String |
| A.java:21:11:21:13 | "B" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [String s] |
@@ -32,8 +32,8 @@
| A.java:23:11:23:13 | "C" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:15:16:15:16 | a : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:15:16:15:22 | get(...) : String |
| A.java:23:11:23:13 | "C" : String | A.java:20:5:20:15 | SSA phi(s) : String |
| A.java:23:11:23:13 | "C" : String | A.java:23:7:23:13 | ...=... : String |
| A.java:23:11:23:13 | "C" : String | A.java:25:5:25:26 | SSA phi(s) : String |
| A.java:23:11:23:13 | "C" : String | A.java:28:11:38:5 | String s : String |
| A.java:23:11:23:13 | "C" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [String s] |

View File

@@ -48,34 +48,34 @@ public class EntryPointTypesTest {
private static void sink(String sink) {}
public static void test(TestObject source) {
sink(source.field1); // $hasTaintFlow
sink(source.getField2()); // $hasTaintFlow
sink(source.getField3().field4); // $hasTaintFlow
sink(source.getField3().getField5()); // $hasTaintFlow
sink(source.field1); // $ hasTaintFlow
sink(source.getField2()); // $ hasTaintFlow
sink(source.getField3().field4); // $ hasTaintFlow
sink(source.getField3().getField5()); // $ hasTaintFlow
}
public static void testParameterized(
ParameterizedTestObject<TestObject, AnotherTestObject> source) {
sink(source.field6); // $hasTaintFlow
sink(source.field7.field1); // $hasTaintFlow
sink(source.field7.getField2()); // $hasTaintFlow
sink(source.getField8().field4); // $hasTaintFlow
sink(source.getField8().getField5()); // $hasTaintFlow
sink(source.field6); // $ hasTaintFlow
sink(source.field7.field1); // $ hasTaintFlow
sink(source.field7.getField2()); // $ hasTaintFlow
sink(source.getField8().field4); // $ hasTaintFlow
sink(source.getField8().getField5()); // $ hasTaintFlow
}
public static void testSubtype(ParameterizedTestObject<?, ?> source) {
ChildObject subtypeSource = (ChildObject) source;
sink(subtypeSource.field6); // $hasTaintFlow
sink(subtypeSource.field7.field1); // $hasTaintFlow
sink(subtypeSource.field7.getField2()); // $hasTaintFlow
sink((String) subtypeSource.getField8()); // $hasTaintFlow
sink((String) subtypeSource.field9); // $hasTaintFlow
sink(subtypeSource.field6); // $ hasTaintFlow
sink(subtypeSource.field7.field1); // $ hasTaintFlow
sink(subtypeSource.field7.getField2()); // $ hasTaintFlow
sink((String) subtypeSource.getField8()); // $ hasTaintFlow
sink((String) subtypeSource.field9); // $ hasTaintFlow
// Ensure that we are not tainting every subclass of Object
UnrelatedObject unrelated = (UnrelatedObject) subtypeSource.getField8();
sink(unrelated.safeField); // Safe
}
public static void testArray(ArrayElemObject[] source) {
sink(source[0].field); // $hasTaintFlow
sink(source[0].field); // $ hasTaintFlow
}
}

View File

@@ -42,31 +42,31 @@ public class Test {
public static void test1() {
Test t = new Test();
t.fluentNoop().fluentSet(source()).fluentNoop();
sink(t.get()); // $hasValueFlow
sink(t.get()); // $ hasValueFlow
}
public static void test2() {
Test t = new Test();
Test.identity(t).fluentNoop().fluentSet(source()).fluentNoop();
sink(t.get()); // $hasValueFlow
sink(t.get()); // $ hasValueFlow
}
public static void test3() {
Test t = new Test();
t.indirectlyFluentNoop().fluentSet(source()).fluentNoop();
sink(t.get()); // $hasValueFlow
sink(t.get()); // $ hasValueFlow
}
public static void testModel1() {
Test t = new Test();
t.indirectlyFluentNoop().modelledFluentMethod().fluentSet(source()).fluentNoop();
sink(t.get()); // $hasValueFlow
sink(t.get()); // $ hasValueFlow
}
public static void testModel2() {
Test t = new Test();
Test.modelledIdentity(t).indirectlyFluentNoop().modelledFluentMethod().fluentSet(source()).fluentNoop();
sink(t.get()); // $hasValueFlow
sink(t.get()); // $ hasValueFlow
}
}

View File

@@ -34,22 +34,22 @@ class Test {
ObjectMapper om = new ObjectMapper();
File file = new File("testFile");
om.writeValue(file, s);
sink(file); //$hasTaintFlow
sink(file); // $ hasTaintFlow
OutputStream out = new FileOutputStream(file);
om.writeValue(out, s);
sink(file); //$hasTaintFlow
sink(file); // $ hasTaintFlow
Writer writer = new StringWriter();
om.writeValue(writer, s);
sink(writer); //$hasTaintFlow
sink(writer); // $ hasTaintFlow
JsonGenerator generator = new JsonFactory().createGenerator(new StringWriter());
om.writeValue(generator, s);
sink(generator); //$hasTaintFlow
sink(generator); // $ hasTaintFlow
String t = om.writeValueAsString(s);
sink(t); //$hasTaintFlow
sink(t); // $ hasTaintFlow
byte[] bs = om.writeValueAsBytes(s);
String reconstructed = new String(bs, "utf-8");
sink(bs); //$hasTaintFlow
sink(reconstructed); //$hasTaintFlow
sink(bs); // $ hasTaintFlow
sink(reconstructed); // $ hasTaintFlow
}
public static void jacksonObjectWriter() throws Exception {
@@ -57,44 +57,44 @@ class Test {
ObjectWriter ow = new ObjectWriter();
File file = new File("testFile");
ow.writeValue(file, s);
sink(file); //$hasTaintFlow
sink(file); // $ hasTaintFlow
OutputStream out = new FileOutputStream(file);
ow.writeValue(out, s);
sink(out); //$hasTaintFlow
sink(out); // $ hasTaintFlow
Writer writer = new StringWriter();
ow.writeValue(writer, s);
sink(writer); //$hasTaintFlow
sink(writer); // $ hasTaintFlow
JsonGenerator generator = new JsonFactory().createGenerator(new StringWriter());
ow.writeValue(generator, s);
sink(generator); //$hasTaintFlow
sink(generator); // $ hasTaintFlow
String t = ow.writeValueAsString(s);
sink(t); //$hasTaintFlow
sink(t); // $ hasTaintFlow
byte[] bs = ow.writeValueAsBytes(s);
String reconstructed = new String(bs, "utf-8");
sink(bs); //$hasTaintFlow
sink(reconstructed); //$hasTaintFlow
sink(bs); // $ hasTaintFlow
sink(reconstructed); // $ hasTaintFlow
}
public static void jacksonObjectReader() throws java.io.IOException {
String s = taint();
ObjectMapper om = new ObjectMapper();
ObjectReader reader = om.readerFor(Potato.class);
sink(reader.readValue(s)); //$hasTaintFlow
sink(reader.readValue(s, Potato.class).name); //$hasTaintFlow
sink(reader.readValue(s, Potato.class).getName()); //$hasTaintFlow
sink(reader.readValue(s)); // $ hasTaintFlow
sink(reader.readValue(s, Potato.class).name); // $ hasTaintFlow
sink(reader.readValue(s, Potato.class).getName()); // $ hasTaintFlow
}
public static void jacksonObjectReaderIterable() throws java.io.IOException {
String s = taint();
ObjectMapper om = new ObjectMapper();
ObjectReader reader = om.readerFor(Potato.class);
sink(reader.readValues(s)); //$hasTaintFlow
sink(reader.readValues(s)); // $ hasTaintFlow
Iterator<Potato> pIterator = reader.readValues(s);
while(pIterator.hasNext()) {
Potato p = pIterator.next();
sink(p); //$hasTaintFlow
sink(p.name); //$hasTaintFlow
sink(p.getName()); //$hasTaintFlow
sink(p); // $ hasTaintFlow
sink(p.name); // $ hasTaintFlow
sink(p.getName()); // $ hasTaintFlow
}
}
@@ -104,9 +104,9 @@ class Test {
taintedParams.put("name", s);
ObjectMapper om = new ObjectMapper();
JsonNode jn = om.valueToTree(taintedParams);
sink(jn); //$hasTaintFlow
sink(jn); // $ hasTaintFlow
Potato p = om.convertValue(jn, Potato.class);
sink(p); //$hasTaintFlow
sink(p.getName()); //$hasTaintFlow
sink(p); // $ hasTaintFlow
sink(p.getName()); // $ hasTaintFlow
}
}

Some files were not shown because too many files have changed in this diff Show More