mirror of
https://github.com/github/codeql.git
synced 2026-03-30 20:28:15 +02:00
Merge branch 'main' of https://github.com/github/codeql into oscarsj/merge-back-rc-3.21
This commit is contained in:
@@ -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
|
||||
|
||||
2
java/ql/consistency-queries/CfgConsistency.ql
Normal file
2
java/ql/consistency-queries/CfgConsistency.ql
Normal file
@@ -0,0 +1,2 @@
|
||||
import java
|
||||
import ControlFlow::Consistency
|
||||
16
java/ql/lib/change-notes/2026-02-18-cfg.md
Normal file
16
java/ql/lib/change-notes/2026-02-18-cfg.md
Normal 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.
|
||||
4
java/ql/lib/change-notes/2026-03-04-binary-assignment.md
Normal file
4
java/ql/lib/change-notes/2026-03-04-binary-assignment.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The class `Assignment` now extends `BinaryExpr`. Uses of `BinaryExpr` may in some cases need slight adjustment.
|
||||
@@ -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.
|
||||
@@ -815,6 +815,7 @@ when_branch_else(unique int id: @whenbranch ref);
|
||||
| @geexpr
|
||||
| @eqexpr
|
||||
| @neexpr
|
||||
| @assignment
|
||||
| @valueeqexpr
|
||||
| @valueneexpr;
|
||||
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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 }
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(...)" }
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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 }
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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`. */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -0,0 +1,2 @@
|
||||
description: Expand @binaryexpr union to include @assignment
|
||||
compatibility: full
|
||||
28
java/ql/lib/utils/test/AstCfg.qll
Normal file
28
java/ql/lib/utils/test/AstCfg.qll
Normal 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) }
|
||||
40
java/ql/lib/utils/test/BasicBlock.qll
Normal file
40
java/ql/lib/utils/test/BasicBlock.qll
Normal 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
|
||||
)
|
||||
}
|
||||
@@ -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."
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>; |
|
||||
|
||||
@@ -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 | { ... } |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>; |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -41,4 +41,5 @@ MaybeElement rhs(BinaryExpr e) {
|
||||
}
|
||||
|
||||
from Expr e
|
||||
where not e instanceof Assignment
|
||||
select e, lhs(e), rhs(e)
|
||||
|
||||
@@ -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>; |
|
||||
|
||||
@@ -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 | { ... } |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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>; |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -41,4 +41,5 @@ MaybeElement rhs(BinaryExpr e) {
|
||||
}
|
||||
|
||||
from Expr e
|
||||
where not e instanceof Assignment
|
||||
select e, lhs(e), rhs(e)
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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 ... |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 | { ... } |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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] |
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user